При доработке типовых конфигураций, таких как Управление торговлей 10.3, часто возникает необходимость расширить состав данных, записываемых в регистры при проведении документа. Главная сложность заключается в том, чтобы внести изменения, не нарушив существующий механизм проведения и не «затерев» результаты работы стандартных алгоритмов.
Прежде чем приступать к написанию кода, давайте разберем, как устроено проведение в данной конфигурации. Процесс формирования движений обычно разбит на несколько этапов:
ПодготовитьТаблицыДокумента).ДвиженияПоРегистрамУпр.Если вы решите изменить стандартный код в модуле объекта, вы рискуете усложнить дальнейшее обновление конфигурации. Поэтому использование подписки на событие является более гибким решением. Однако здесь кроется ловушка: если в подписке просто обратиться к регистру и начать запись, велика вероятность полной очистки движений, которые создали стандартные механизмы 1С.
Для того чтобы не «затереть» старые записи, необходимо придерживаться стратегии чтения-дополнения-записи. Рассмотрим алгоритм действий по шагам.
В конфигураторе создайте новую Подписку на событие. В поле Событие укажите ОбработкаПроведения, а в поле Источник выберите ваш документ, например РеализацияТоваровУслуг. Назначьте процедуру в общем модуле, где будет исполняться ваш код.
Внутри процедуры подписки важно правильно работать с набором записей регистра. Рассмотрим пример того, как это должно выглядеть программно:
// Получаем набор записей, которые уже были сформированы стандартным проведением
НаборЗаписей = Источник.Движения.Продажи;
// Чтобы не затереть существующие движения, мы выгружаем их в таблицу значений
ТаблицаДвижений = НаборЗаписей.Выгрузить();
// Теперь мы можем дополнить эту таблицу новыми данными из табличной части документа
Для Каждого СтрокаТЧ Из Источник.Товары Цикл
НоваяСтрока = ТаблицаДвижений.Добавить();
НоваяСтрока.Период = Источник.Дата;
НоваяСтрока.Регистратор = Источник.Ссылка;
// ... здесь заполняем остальные необходимые поля ...
НоваяСтрока.Бонус = СтрокаТЧ.Бонус;
КонецЦикла;
// Загружаем модифицированную таблицу обратно в набор записей
НаборЗаписей.Загрузить(ТаблицаДвижений);
// Обязательно устанавливаем флаг записи
НаборЗаписей.Записывать = Истина;
При написании кода обратите внимание на следующие нюансы:
НаборЗаписей.Очистить(). Если вы ранее прописывали эту команду, ее нужно удалить.Источник: Помните, что в обработчике подписки параметр Источник — это и есть сам объект документа. Поэтому обращение Источник.Движения.Продажи является абсолютно корректным и достаточным.Записывать: Свойство Записывать = Истина сообщает платформе 1С, что в конце транзакции проведения текущий набор записей должен быть сохранен в базу данных. Это ключевой момент, без которого ваши изменения не будут применены.Использование метода Выгрузить() и Загрузить() позволяет нам работать с данными в памяти, что значительно быстрее и безопаснее, чем выполнение прямых запросов к таблицам регистров. Кроме того, такой подход оставляет стандартную логику проведения 1С нетронутой: мы лишь «докидываем» свои строки в уже существующий набор данных, сформированный системой.
Совет: После внесения правок обязательно протестируйте проведение документа в режиме «1С:Предприятие». Откройте движения документа после проведения и убедитесь, что колонка Бонус заполнена для нужных позиций, а стандартные показатели (количество, сумма, себестоимость) остались на своих местах и не были удалены.