v8: Добавление и правка движений в конце проведения документов Ключевые слова: ОбработкаПроведения,проведение,движения
При сопровождении типовых конфигураций часто возникает потребность вмешиваться в схему проводок, которые формируются при проведении документа.
Иногда наиболее удобным местом обработки таких проводок являетяся момент после проведения документа, когда проводки уже сформированы.
Такой код вставляется в конец процедуры ОбработкаПроведения.
Однако есть один маленький нюанс - документы восьмерки могут делать движения по регистрам как в коллекцию Движения документа, так и непосредственно записывая движения в соответствующий регистр. Как определить, где хранятся нужные движения, не анализируя код проведения документа?
Оказывается, очень просто. При окончании проведения автоматически записаны будут только те наборы записей из коллекции Движения, которые были модифицированы.
Проверяем свойство Модифицированность() набора записей регистра в коллеции Движения. Если набор записей модифицирован, то при окончании транзакции движения будут записаны именно из этого набора записей и нам нужно изменять этот набор записей. Если же набор записей не модифицирован, то движений или не было, или они были сделаны непосредственно в регистр.
Таким образом функция по получению набора записей движений нужного регистра может быть таким:
Функция п_НаборДвиженийДокументаПолучить(Объект, ИмяРегистра)
Если НЕ Объект.Движения[ИмяРегистра].Модифицированность() Тогда
НЗ=Объект.Движения[ИмяРегистра];
НЗ.Отбор.Регистратор.Установить(П.Ссылка);
НЗ.Прочитать();
КонецЕсли;
Возврат Объект.Движения[ИмяРегистра];
КонецФункции
Для внесения изменений никакого дополнительного кода не надо. Достаточно оставить набор записей модифицированным и он запишется. Кроме того, процедуру чтения набора записей можно вызывать многократно, например если у вас есть множество корректирующих обработчиков движений регистров.
Вот конкретный пример, где используется данная процедура:
//Замена счета кредита 76.Н на 68.02
НаборДвижений=п_НаборДвиженийДокументаПолучить(Объект, "Хозрасчетный");
ТЗ=НаборДвижений.Выгрузить(); Модифицированность=ложь;
Для Каждого Стр из ТЗ Цикл
Если Стр.СчетКт=ПланыСчетов.Хозрасчетный.РасчетыПоНДСотложенномуДляУплатыВБюджет Тогда //76.Н
Стр.СчетКт=ПланыСчетов.Хозрасчетный.НДС; //68.02
Стр.ВидСубконтоКт1=ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.ВидыПлатежейВГосБюджет;
Стр.СубконтоКт1=Перечисления.ВидыПлатежейВГосБюджет.Налог;
Стр.СубконтоКт2=Неопределено;
Стр.ВидСубконтоКт2=Неопределено;
Модифицированность=истина;
КонецЕсли;
КонецЦикла;
Если Модифицированность Тогда
НаборДвижений.Загрузить(ТЗ);
КонецЕсли;
//Дублирование движений по регистру НДС Продажи (реализация дублируется как оплата)
НаборДвижений=п_НаборДвиженийДокументаПолучить(О, "НДСПродажи");
ТЗ=НаборДвижений.Выгрузить(); Модифицированность=ложь;
МассивСтрок=Новый Массив();
Для Каждого Стр из ТЗ Цикл
Если Стр.Событие=Перечисления.СобытияПоНДСПродажи.Реализация Тогда
МассивСтрок.Добавить(Стр);
Модифицированность=истина;
КонецЕсли;
КонецЦикла;
Для Каждого Стр из МассивСтрок Цикл
НоваяСтр=ТЗ.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтр, Стр);
Стр.Событие=Перечисления.СобытияПоНДСПродажи.Оплата;
Стр.СчетФактура=П.Ссылка;
КонецЦикла;
Если Модифицированность Тогда
НаборДвижений.Загрузить(ТЗ);
КонецЕсли;
Важно!!! Существует более простой метод добавления записей.
Для этого можно использовать метод Записать(ложь) по набору записей. Он не очищает записи по регистратору, а добавляет записи к уже имеющимся записям по регистратору.
Обсуждение: http://www.forum.mista.ru/topic.php?id=175370 |