Как при проведении документа в 1С:УТ 10.3 добавить данные в регистр, не удалив при этом старые записи?

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

При доработке типовых конфигураций, таких как Управление торговлей 10.3, часто возникает необходимость расширить состав данных, записываемых в регистры при проведении документа. Главная сложность заключается в том, чтобы внести изменения, не нарушив существующий механизм проведения и не «затерев» результаты работы стандартных алгоритмов.

Разбор архитектуры проведения в УТ 10.3

Прежде чем приступать к написанию кода, давайте разберем, как устроено проведение в данной конфигурации. Процесс формирования движений обычно разбит на несколько этапов:

  1. Подготовка таблиц с данными (процедура ПодготовитьТаблицыДокумента).
  2. Формирование движений по регистрам, где вызываются специализированные процедуры, например ДвиженияПоРегистрамУпр.

Если вы решите изменить стандартный код в модуле объекта, вы рискуете усложнить дальнейшее обновление конфигурации. Поэтому использование подписки на событие является более гибким решением. Однако здесь кроется ловушка: если в подписке просто обратиться к регистру и начать запись, велика вероятность полной очистки движений, которые создали стандартные механизмы 1С.

Решение задачи: дополнение движений через подписку на событие

Для того чтобы не «затереть» старые записи, необходимо придерживаться стратегии чтения-дополнения-записи. Рассмотрим алгоритм действий по шагам.

Шаг 1: Создание подписки

В конфигураторе создайте новую Подписку на событие. В поле Событие укажите ОбработкаПроведения, а в поле Источник выберите ваш документ, например РеализацияТоваровУслуг. Назначьте процедуру в общем модуле, где будет исполняться ваш код.

Шаг 2: Реализация логики дополнения движений

Внутри процедуры подписки важно правильно работать с набором записей регистра. Рассмотрим пример того, как это должно выглядеть программно:


// Получаем набор записей, которые уже были сформированы стандартным проведением
НаборЗаписей = Источник.Движения.Продажи;

// Чтобы не затереть существующие движения, мы выгружаем их в таблицу значений
ТаблицаДвижений = НаборЗаписей.Выгрузить();

// Теперь мы можем дополнить эту таблицу новыми данными из табличной части документа
Для Каждого СтрокаТЧ Из Источник.Товары Цикл
    НоваяСтрока = ТаблицаДвижений.Добавить();
    НоваяСтрока.Период = Источник.Дата;
    НоваяСтрока.Регистратор = Источник.Ссылка;
    // ... здесь заполняем остальные необходимые поля ...
    НоваяСтрока.Бонус = СтрокаТЧ.Бонус; 
КонецЦикла;

// Загружаем модифицированную таблицу обратно в набор записей
НаборЗаписей.Загрузить(ТаблицаДвижений);

// Обязательно устанавливаем флаг записи
НаборЗаписей.Записывать = Истина;

Важные замечания по реализации

При написании кода обратите внимание на следующие нюансы:

Почему это лучший способ?

Использование метода Выгрузить() и Загрузить() позволяет нам работать с данными в памяти, что значительно быстрее и безопаснее, чем выполнение прямых запросов к таблицам регистров. Кроме того, такой подход оставляет стандартную логику проведения 1С нетронутой: мы лишь «докидываем» свои строки в уже существующий набор данных, сформированный системой.

Совет: После внесения правок обязательно протестируйте проведение документа в режиме «1С:Предприятие». Откройте движения документа после проведения и убедитесь, что колонка Бонус заполнена для нужных позиций, а стандартные показатели (количество, сумма, себестоимость) остались на своих местах и не были удалены.

← На главную