УдалитьДвиженияУДокумента (БСП)

Автор: 1С
ОбщийМодуль.ОбменДаннымиСервер
БСП

Удалить движения документа. Процедура удаления существующих движений документа при перепроведении (отмене проведения).

// Процедура удаления существующих движений документа при перепроведении (отмене проведения).
//
// Параметры:
//   ДокументОбъект - ДокументОбъект - документ, движения которого требуется удалить.
//
Процедура УдалитьДвиженияУДокумента(ДокументОбъект) Экспорт
	
	МассивОбрабатываемыхСтрокТаблицыДвижений = Новый Массив();
	
	// Получение списка регистров, по которым существуют движения.
	ТаблицаДвижений = ОпределитьНаличиеДвиженийПоДокументу(ДокументОбъект.Ссылка);
	ТаблицаДвижений.Колонки.Добавить("НаборЗаписей");
	ТаблицаДвижений.Колонки.Добавить("БезусловноеУдаление", Новый ОписаниеТипов("Булево"));
		
	Для Каждого СтрокаДвижения Из ТаблицаДвижений Цикл
		// Имя регистра передается как значение, полученное с помощью
		// функции ПолноеИмя() метаданных регистра.
		ПозицияТочки = СтрНайти(СтрокаДвижения.Имя, ".");
		ТипРегистра = Лев(СтрокаДвижения.Имя, ПозицияТочки - 1);
		ИмяРегистра = СокрП(Сред(СтрокаДвижения.Имя, ПозицияТочки + 1));

		МассивОбрабатываемыхСтрокТаблицыДвижений.Добавить(СтрокаДвижения);
		
		Если ТипРегистра = "РегистрНакопления" Тогда
			Набор = РегистрыНакопления[ИмяРегистра].СоздатьНаборЗаписей();
		ИначеЕсли ТипРегистра = "РегистрБухгалтерии" Тогда
			Набор = РегистрыБухгалтерии[ИмяРегистра].СоздатьНаборЗаписей();
		ИначеЕсли ТипРегистра = "РегистрСведений" Тогда
			Набор = РегистрыСведений[ИмяРегистра].СоздатьНаборЗаписей();
		ИначеЕсли ТипРегистра = "РегистрРасчета" Тогда
			Набор = РегистрыРасчета[ИмяРегистра].СоздатьНаборЗаписей();
		КонецЕсли;
		
		Если Не ПравоДоступа("Изменение", Набор.Метаданные()) Тогда
			// Отсутствуют права на всю таблицу регистра.
			ТекстИсключения = НСтр("ru = 'Нарушение прав доступа: %1'");
			ТекстИсключения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстИсключения, СтрокаДвижения.Имя);
			ВызватьИсключение ТекстИсключения;
		КонецЕсли;

		Набор.Отбор.Регистратор.Установить(ДокументОбъект.Ссылка);

		// Набор не записывается сразу, чтобы не откатывать транзакцию, если впоследствии
		// выяснится, что на один из регистров не хватает прав.
		СтрокаДвижения.НаборЗаписей = Набор;
		
	КонецЦикла;
	
	ПропуститьПроверкуЗапретаИзменения();
	
	Для Каждого СтрокаДвижения Из МассивОбрабатываемыхСтрокТаблицыДвижений Цикл		
		Попытка
			СтрокаДвижения.НаборЗаписей.Записать();
		Исключение
			// Возможно «сработало» ограничение на уровне записей или подсистема даты запрета изменения.
			ТекстИсключения = НСтр("ru = 'Операция не выполнена: %1
				|%2'");
			ТекстИсключения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстИсключения, СтрокаДвижения.Имя, КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
			ВызватьИсключение ТекстИсключения;
		КонецПопытки;
	КонецЦикла;
	
	ПропуститьПроверкуЗапретаИзменения(Ложь);
	
	Для Каждого Движение Из ДокументОбъект.Движения Цикл
		Если Движение.Количество() > 0 Тогда
			Движение.Очистить();
		КонецЕсли;
	КонецЦикла;
	
	// Удаление записей регистрации из всех последовательностей.
	Если ДокументОбъект.Метаданные().ЗаполнениеПоследовательностей = Метаданные.СвойстваОбъектов.ЗаполнениеПоследовательностей.ЗаполнятьАвтоматически Тогда
		ТекстЗапроса = "";
		
		Для Каждого Последовательность Из ДокументОбъект.ПринадлежностьПоследовательностям Цикл
			// В запросе получаем имена последовательностей, в которых документ зарегистрирован.
			ТекстЗапроса = ТекстЗапроса + "
			|" + ?(ТекстЗапроса = "", "", "ОБЪЕДИНИТЬ ВСЕ ") + "
			|ВЫБРАТЬ """ + Последовательность.Метаданные().Имя
			+  """ КАК Имя ИЗ " + Последовательность.Метаданные().ПолноеИмя()
			+ " ГДЕ Регистратор = &Регистратор";
			
		КонецЦикла;
		
		Если ТекстЗапроса = "" Тогда
			ТаблицаРегистраций = Новый ТаблицаЗначений();
		Иначе
			Запрос = Новый Запрос(ТекстЗапроса);
			Запрос.УстановитьПараметр("Регистратор", ДокументОбъект.Ссылка);
			ТаблицаРегистраций = Запрос.Выполнить().Выгрузить();
		КонецЕсли;
		
		// Получение списка последовательностей в которых зарегистрирован документ.
		КоллекцияПоследовательностей = ДокументОбъект.ПринадлежностьПоследовательностям;
		Для Каждого НаборЗаписейРегистрацииВПоследовательности Из КоллекцияПоследовательностей Цикл
			Если (НаборЗаписейРегистрацииВПоследовательности.Количество() > 0)
				ИЛИ (НЕ ТаблицаРегистраций.Найти(НаборЗаписейРегистрацииВПоследовательности.Метаданные().Имя,"Имя") = Неопределено) Тогда
				НаборЗаписейРегистрацииВПоследовательности.Очистить();
			КонецЕсли;
		КонецЦикла;
	КонецЕсли;

КонецПроцедуры

///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2019, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

Рекомендации

Похожие публикации

ПриОпределенииРегистровСДвижениями (БСП)

Очищает записи наборов из коллекции Движения и проставляет флаг Записывать наборам, по которым документ уже имеет движения

Как изменить реквизит в движениях документа?

ПриПодготовкеНабораДанных (БСП)

Как удалить префикс и лидирующие нули?

Добавить движение в регистр накопления

Удалить элемент массива

ОтметитьРегистраторыКОбработке (БСП)

ВыбратьРегистраторыРегистраДляОбработки (БСП)

TurboConf ИР адаптер 2.63