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