Как перенести движения регистра накопления вместе с документом в 1С:Конвертация данных 2.1

Программист 1С v8.3 (Управляемые формы) 1С:Зарплата и Управление Персоналом IT и автоматизация бизнеса
← На главную

При настройке обмена данными между конфигурациями 1С часто возникает задача переноса не только самих документов, но и их движений. Это особенно актуально для конфигураций типа ЗУП (Зарплата и управление персоналом), где расчетные механизмы сложны, а перепроведение документов в базе-приемнике может привести к изменению результатов расчета. В этой статье мы разберем, как правильно настроить правила конвертации данных (КД 2.1) для успешного переноса движений регистра накопления НачисленияУдержанияПоСотрудникам, проанализируем типичные ошибки и рассмотрим лучшие практики.

Разбор типичной ошибки: почему не работает программная установка флага Записывать

Часто программисты пытаются заставить систему выгружать движения, используя обработчики событий. Например, в обработчике ПослеВыгрузки ПКО документа пишут код:

Объект.Движения.НачисленияУдержанияПоСотрудникам.Записывать = Истина;

Проанализируем, почему этот подход ошибочен. Во-первых, на стороне выгрузки (в базе-источнике) в КД 2.1 переменная Объект не определена. Вместо нее следует использовать переменную Источник. Ошибка "Переменная не определена (Объект)" возникает именно из-за путаницы в контекстах выгрузки и загрузки. Чтобы не путаться в доступных переменных, можно использовать конфигурацию «Конвертация данных» со встроенными подсказками по обработчикам.

Во-вторых, даже если исправить код на Источник.Движения..., это не даст результата. Установка флага Записывать влияет на поведение документа при его записи в самой базе, но механизм конвертации данных работает иначе. Конвертация выгружает только те данные, для которых явно прописаны Правила конвертации свойств (ПКС). Если в правилах документа нет ссылки на регистр, программа просто проигнорирует его движения при формировании XML-файла.

Основное решение: Настройка ПКС для движений регистра

Рассмотрим самый надежный и простой способ переноса движений, который не требует написания сложного кода в обработчиках. В КД 2.1 движения документа можно представить как виртуальную коллекцию, аналогичную табличной части. Выполним следующие шаги:

  1. Откроем Правила конвертации объектов (ПКО) для нашего документа-регистратора.
  2. Перейдем на закладку "Конвертация свойств".
  3. Добавим новую строку (ПКС).
  4. В поле "Свойство-источник" выберем наш регистр накопления (например, НачисленияУдержанияПоСотрудникам).
  5. В поле "Свойство-приемник" выберем этот же регистр.
  6. Для этого ПКС обязательно нужно создать или выбрать Правило конвертации объекта (ПКО), созданное специально для этого регистра накопления.

После такой настройки при выгрузке документа система автоматически обратится к коллекции его движений по указанному регистру и выгрузит их в файл обмена. Для проверки структуры и содержимого сформированного XML-файла подойдёт обработка для анализа состава выгруженных данных.

Настройка ПКО для регистра накопления

Чтобы движения корректно загрузились в приемнике, нам необходимо правильно настроить ПКО для самого регистра. Выясним важные нюансы:

Поскольку записи регистра накопления не имеют уникального идентификатора (GUID), как справочники или документы, система сопоставляет их по набору ключевых полей. Обычно это Регистратор, НомерСтроки, Период и измерения регистра.

В ПКО регистра на закладке "Настройки" часто рекомендуется включить флаг "Не замещать существующие объекты в приемнике, а только создавать новые", если вы уверены в чистоте данных, или оставить стандартные настройки поиска по ключевым полям. Однако чаще всего для движений поиск как таковой не требуется в классическом понимании — они всегда перезаписываются вместе с владельцем-документом.

Обеспечение сохранности движений при загрузке

Одной из главных проблем после успешной выгрузки является "исчезновение" движений в базе-приемнике. Это происходит потому, что по умолчанию 1С пытается провести загруженный документ. При проведении старые (загруженные из файла) движения удаляются, а новые формируются по алгоритмам базы-приемника. Если эти алгоритмы отличаются или в базе-приемнике не хватает связанных данных, движения могут не сформироваться или измениться.

Рассмотрим, как заставить систему просто записать движения без перепроведения документа:

  1. В ПКО документа перейдем в обработчик ПослеЗагрузки.
  2. Пропишем код, который запретит проведение и принудительно установит режим записи:

РежимЗаписи = "Запись"; 
Объект.Движения.НачисленияУдержанияПоСотрудникам.Записывать = Истина;

Таким образом, мы указываем платформе, что движения, пришедшие в пакете данных, являются легитимными и их нужно просто сохранить в базе данных.

Использование обработчика ПередВыгрузкой в ПКС

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


// В переменной Значение должна оказаться коллекция движений
Значение = Источник.Движения.НачисленияУдержанияПоСотрудникам;

Это гарантирует, что конвертация обратится именно к набору записей, связанному с текущим документом в памяти.

Когда стоит переносить движения?

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

Перенос движений обязателен, если:

Можно отказаться от переноса движений, если:

Проанализировав ситуацию, мы видим, что ключ к успеху лежит в использовании стандартного механизма ПКС (Правил конвертации свойств) для коллекций, а не в попытках "ручного" управления записью через объектную модель в неподходящих обработчиках. Правильная настройка ПКС и режима записи в приемнике обеспечит точность переноса данных в любых сложных случаях.

← На главную