При миграции данных между конфигурациями 1С, например, из Комплексной автоматизации (КА) в Зарплату и управление персоналом (ЗУП), разработчики часто сталкиваются с проблемой: документ ПереносДанных после загрузки остается пустым. Вроде бы файл обмена содержит данные, и «скелет» документа создается, но привычных цифр по НДФЛ или взносам внутри нет. Рассмотрим, почему это происходит, и разберем пошагово, как решить эту задачу с помощью Конвертации данных 2.1 (КД 2.1).
Прежде чем приступать к коду, давайте проанализируем ситуацию. В 1С:ЗУП 3.1 документ ПереносДанных — это технический объект-контейнер. В отличие от обычных документов, он практически не хранит значимой информации в своих реквизитах или явных табличных частях. Его главная задача — выступать в роли регистратора для огромного количества регистров накопления и сведений.
Если мы просто создадим ПКО (Правило конвертации объектов) для самого документа, мы перенесем только его «шапку» (дату, номер, организацию). Но данные в ЗУП отображаются только тогда, когда по этому документу существуют записи в регистрах. Более того, у этого документа есть служебная табличная часть (часто называемая ТаблицаРегистров), где перечислены метаданные всех регистров, по которым сделаны движения. Без заполнения этой таблицы документ может выглядеть пустым даже при наличии физических записей в базе данных.
Начнем с выгрузки структур данных. Для этого используем обработки MD82Exp.epf или MD83Exp.epf. Проанализируем важный момент: при выгрузке описания структуры метаданных из исходной базы (КА) необходимо обязательно установить флажки в чекбоксах, отвечающих за регистры. Если мы этого не сделаем, в КД2 мы просто не увидим нужных нам объектов для настройки правил.
Важно: убедимся, что в целевой конфигурации (ЗУП) у документа ПереносДанных в составе движений отмечены те регистры, которые мы собираемся переносить. В противном случае платформа просто не даст записать движения по «чужому» регистратору.
Стандартная выгрузка «по ссылке» здесь работает плохо, так как нам нужно собрать данные из множества источников. Рассмотрим наиболее гибкий способ — использование Правила выгрузки данных (ПВД) с произвольным алгоритмом. Выясним причину, по которой это эффективнее: мы можем сами сформировать структуру документа и его движений программно.
В ПВД выставим способ выборки данных — «Произвольный алгоритм». Напишем код в обработчике «Перед выгрузкой данных».
Рассмотрим пример формирования данных:
// Создаем структуру, которая будет передана в ПКО документа
СформированныеДанные = Новый Структура();
СформированныеДанные.Вставить("Дата", Выборка.Дата);
СформированныеДанные.Вставить("Номер", Выборка.Номер);
СформированныеДанные.Вставить("Организация", Выборка.Организация);
СформированныеДанные.Вставить("ПериодРегистрации", Выборка.ПериодРегистрации);
// Если у документа есть табличная часть с именами регистров (служебная)
ТЗ_Регистры = Новый ТаблицаЗначений;
ТЗ_Регистры.Колонки.Добавить("Имя");
// Заполняем ТЗ именами регистров, которые будем выгружать
НоваяСтрока = ТЗ_Регистры.Добавить();
НоваяСтрока.Имя = "ЗарплатаКВыплате";
СформированныеДанные.Вставить("ТаблицаРегистров", ТЗ_Регистры);
// Вызываем выгрузку по конкретному ПКО
ВыгрузитьПоПравилу(,, СформированныеДанные,, "ПереносДанных");
Разберем подробнее, как передать данные регистров. В КД2 движения документа можно передавать как через ПКО самого документа (закладка «Движения»), так и формируя входящие данные для ТЧ. Посмотрим на пример из практики, когда мы формируем таблицу движений вручную:
// В обработчике ПВД или в ПКО (Перед выгрузкой)
// Создаем ТЗ для имитации движений или ТЧ документа
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("Сотрудник");
ТЗ.Колонки.Добавить("Результат");
ТЗ.Колонки.Добавить("ВидРасчета");
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Регистр.Сотрудник,
| Регистр.Результат,
| Регистр.ВидРасчета
|ИЗ
| РегистрНакопления.Начисления КАК Регистр
|ГДЕ
| Регистр.Регистратор = &Регистратор";
Запрос.УстановитьПараметр("Регистратор", Объект.Ссылка);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
НС = ТЗ.Добавить();
ЗаполнитьЗначенияСвойств(НС, Выборка);
КонецЦикла;
// Добавляем таблицу в структуру данных
СформированныеДанные.Вставить("Начисления", ТЗ);
В самом ПКО (Правиле конвертации объектов) для документа на закладке «Настройка ПКС» для соответствующей табличной части (или набора записей регистра) нужно установить флаг «Получить из входящих данных».
Когда данные попадают в ЗУП, обработка УниверсальныйОбменДаннымиXML должна правильно их интерпретировать. Проанализируем критические моменты:
ПереносДанных не является проводимым в классическом смысле. Он делает движения при записи. Поэтому в правилах или при загрузке нужно убедиться, что объект записывается.Recorder (Регистратор), ссылающийся на наш документ. КД2 делает это автоматически, если ПКО регистра настроено как движение документа.Сотрудники, ФизическиеЛица и Организации. Если ссылка на сотрудника не будет найдена (битая ссылка), запись в регистре может просто не создаться, и документ в интерфейсе будет выглядеть пустым.Самый надежный способ в КД 2.1 — это создать отдельные ПКО для наборов записей регистров. В правиле конвертации документа на вкладке «Движения» мы просто перечисляем нужные регистры и указываем соответствующие ПКО для их наборов записей. Это позволяет системе автоматически сопоставить поля ФизическоеЛицо, Период и другие измерения, даже если их структура в КА и ЗУП немного отличается.
Подведем итог: для успешного переноса нам нужно не просто «перекинуть» документ, а программно собрать все его движения, упаковать их в структуру СформированныеДанные и передать в ПКО, не забыв заполнить служебную таблицу имен регистров. Только тогда документ «оживет» в целевой базе ЗУП.