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