Как перенести текущие документы из ЗУП 2.5 в ЗУП 3.1 при параллельном ведении учета?

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

При переходе с конфигурации «Зарплата и управление персоналом», редакция 2.5 на редакцию 3.1 часто применяется сценарий параллельного ведения баз в течение одного или нескольких расчетных периодов. Если начальный перенос остатков уже выполнен (например, с помощью штатного упрощенного механизма), у специалистов регулярно возникает задача догрузить отдельные текущие кадровые и расчетные документы, введенные в старой базе.

Разберем основные архитектурные сложности такого переноса и проанализируем проверенные практические подходы к решению этой задачи.

Почему прямой перенос документов вызывает сложности

Просто выгрузить документы «один в один» не удается из-за фундаментальных различий в архитектуре двух редакций:

  1. Разная методология учета НДФЛ и взносов: В ЗУП 2.5 налог и взносы рассчитывались централизованно в конце месяца. В ЗУП 3.1 расчет НДФЛ встроен непосредственно в межрасчетные документы (отпуска, больничные листы, разовые начисления) и жестко привязан к реквизиту ПланируемаяДатаВыплаты.
  2. Несовпадение ссылочных идентификаторов (GUID): Штатный упрощенный перенос остатков создает новые элементы справочников (Сотрудники, Подразделения, Должности). Поиск по внутреннему идентификатору при последующей загрузке документов работать не будет — необходимо сопоставлять данные по бизнес-полям.
  3. Механизмы проведения: Попытка загрузить готовые движения регистров расчета из 2.5 в 3.1 приведет к ошибкам в отчетах. В редакции 3.1 документы должны формировать движения по собственным алгоритмам конфигурации.

Вариант 1. Разработка правил обмена в «Конвертации данных 2.1» (КД 2.1)

Использование конфигурации «Конвертация данных», редакция 2.1 является стандартным инструментом 1С для настройки XML-обмена между различными конфигурациями.

Рассмотрим порядок действий при создании правил переноса:

  1. Выгрузим структуры метаданных обеих конфигураций с помощью обработки MD82Exp.epf (для 2.5) и MD83Exp.epf (для 3.1) и загрузим их в базу «Конвертации данных 2.1».
  2. Настроим правила конвертации объектов (ПКО) для необходимых документов и сопутствующих справочников.
  3. Для справочников ФизическиеЛица и Сотрудники обязательно снимем флаг поиска по внутреннему идентификатору. Настроим поиск по полям: СНИЛС, ИНН или комбинации ТабельныйНомер + ФизическоеЛицо.
  4. Загрузку документов в целевую базу следует выполнять в непроведенном виде, перенося только исходные параметры (сотрудник, период, начисление, процент/сумма), а итоговый расчет и проведение выполнять штатными механизмами редакции 3.1.

Вариант 2. Разработка внешней обработки прямой загрузки через COM-соединение

Для разового или периодического переноса ограниченного списка документов (например, больничных листов или кадровых приказов) быстрее и проще написать собственную внешнюю обработку, подключающуюся к ЗУП 2.5 через COMConnector.

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


// Создаем COM-соединение с исходной базой ЗУП 2.5
V83COM = Новый COMОбъект("V83.COMConnector");
ПараметрыПодключения = "Srvr=""ServerName"";Ref=""zup25_base"";Usr=""Admin"";Pwd=""Password"";";

Попытка
    БазаИсточник = V83COM.Connect(ПараметрыПодключения);
Исключение
    Сообщить("Ошибка подключения к ЗУП 2.5: " + ОписаниеОшибки());
    Возврат;
КонецПопытки;

// Выполняем выборку документов в базе-источнике
Запрос = БазаИсточник.NewObject("Запрос");
Запрос.Текст = 
    "ВЫБРАТЬ
    |	Док.Ссылка КАК Ссылка,
    |	Док.Дата КАК Дата,
    |	Док.Организация.ИНН КАК ОрганизацияИНН,
    |	Док.Сотрудник.Код КАК ТабельныйНомер,
    |	Док.Сотрудник.Физлицо.СтраховойНомерПФР КАК СНИЛС,
    |	Док.ДатаНачала КАК ДатаНачала,
    |	Док.ДатаОкончания КАК ДатаОкончания
    |ИЗ
    |	Документ.НачислениеПоБольничномуЛисту КАК Док
    |ГДЕ
    |	Док.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
    |	И Док.Проведен = ИСТИНА";

Запрос.УстановитьПараметр("ДатаНачала", НачалоПериода);
Запрос.УстановитьПараметр("ДатаОкончания", КонецПериода);

Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
    // Поиск физического лица и сотрудника в текущей базе ЗУП 3.1 по СНИЛС и табельному номеру
    ФизЛицо = Справочники.ФизическиеЛица.НайтиПоРеквизиту("СтраховойНомерПФР", Выборка.СНИЛС);
    
    Если ЗначениеЗаполнено(ФизЛицо) Тогда
        // Создание черновика документа в ЗУП 3.1
        НовыйДок = Документы.БольничныйЛист.СоздатьДокумент();
        НовыйДок.Дата = ТекущаяДата();
        НовыйДок.ФизическоеЛицо = ФизЛицо;
        НовыйДок.ДатаНачала = Выборка.ДатаНачала;
        НовыйДок.ДатаОкончания = Выборка.ДатаОкончания;
        
        // Заполнение расчетных реквизитов типовыми процедурами
        НовыйДок.Записать(РежимЗаписиДокумента.Запись);
    КонецЕсли;
КонецЦикла;

Альтернативные подходы

Проанализируем другие способы организации обмена данными между базами:

  1. Перенос через промежуточные файлы (JSON или XML): В ЗУП 2.5 пишется простая обработка выгрузки шапок и табличных частей документов в файл обмена, а в ЗУП 3.1 — обработка чтения файла и программного создания документов через метод СоздатьДокумент(). Этот способ исключает проблемы с несовпадением разрядности COM-библиотек (32/64 бит) на сервере.
  2. Сдвиг даты перехода: Если параллельный учет велся недолго, наиболее надежным решением часто является отказ от переноса отдельных текущих документов. Проще довести расчетный период до конца месяца в ЗУП 2.5, после чего повторно запустить штатный мастер переноса остатков на новую дату среза.
← На главную