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