Как настроить обмен данными между ЗУП 3.1 и УПП 1.3 без изменения типовой конфигурации?

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

Перенос расчета заработной платы из устаревшей конфигурации УПП 1.3 (Управление производственным предприятием) в современную ЗУП 3.1 (Зарплата и управление персоналом) — частая практика. Законодательство по регламентированному учету кадров и зарплаты меняется стремительно, и поддерживать эти изменения в старой УПП становится слишком трудозатратно. Однако само производство, склады и основной бухгалтерский учет зачастую остаются в УПП, которая к тому же за многие годы обросла уникальными кастомными доработками.

В такой ситуации возникает необходимость настроить регулярный обмен данными. Чаще всего требуется переносить справочники физических лиц, сотрудников, контрагентов, способов отражения, а также документы Отражение зарплаты в бухучете и Ведомость в банк. При этом крайне желательно оставить конфигурацию ЗУП 3.1 полностью типовой, чтобы обновлять ее безболезненно в автоматическом режиме.

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

Анализ возможных вариантов интеграции

Рассмотрим подробнее три основных подхода к интеграции этих систем, их преимущества и недостатки:

  1. Использование универсального формата EnterpriseData (ED / КД 3). Хотя ЗУП 3.1 ориентирована на современные стандарты обмена через формат ED, на стороне УПП 1.3 этот механизм отсутствует «из коробки». Внедрение Библиотеки стандартных подсистем (БСП) нужной версии в старую УПП под толстым клиентом — это колоссальный труд, который повлечет за собой множество конфликтов в кодовой базе и сделает конфигурацию практически не обновляемой. Использовать сторонние парсеры для ED в УПП целесообразно только при масштабных обменах, для нашей задачи это избыточно.
  2. Обмен через правила конвертации КД 2 (Конвертация данных 2). Это классический и самый гибкий вариант. Вопреки расхожему мнению, ЗУП 3.1 сохранила под капотом полную поддержку традиционного обмена XML по правилам КД 2. Мы можем разработать правила обмена в Конвертации данных 2.1, загрузить их в стандартную обработку выгрузки и автоматизировать процесс.
  3. Интеграция через COM-соединение (без изменения ЗУП). При этом подходе вся логика интеграции переносится на сторону УПП. Регламентное задание в УПП по расписанию подключается к ЗУП через COM-объект, считывает нужные данные напрямую из базы ЗУП по API или посредством запросов, сопоставляет объекты и создает документы в УПП. Конфигурация ЗУП при этом остается на 100% типовой и вообще не знает о существовании обмена.

Выясним подробнее, как реализовать на практике два наиболее жизнеспособных сценария: обмен через правила КД 2 с автоматизацией и прямое COM-соединение.

Решение 1. Автоматический обмен по правилам КД 2 без снятия ЗУП с поддержки

Для реализации этого сценария нам потребуются правила обмена, разработанные в базе «Конвертация данных 2.1». Поскольку структура ЗУП 3.1 и УПП 1.3 сильно различается (например, учет взаиморасчетов и аналитика отражения в учете имеют разную глубину детализации), правила КД 2 позволят гибко настроить сопоставление реквизитов.

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

Разберем по шагам схему автоматизации выгрузки через внешнюю обработку:

Шаг 1. Пишем внешнюю обработку для ЗУП 3.1, которая будет запускаться в фоновом режиме регламентным заданием. В модуле объекта обработки прописываем процедуру выгрузки, использующую типовую обработку УниверсальныйОбменДаннымиXML, которая встроена в ЗУП.

Пример программного вызова выгрузки по правилам КД 2:


Процедура ВыполнитьВыгрузкуДанных() Экспорт
    
    ПутьКФайлуПравил = "C:\Exchange\Rules_ZUP_UPP.xml";
    ПутьКФайлуДанных = "C:\Exchange\ExportData.xml";
    
    ОбработкаВыгрузки = Обработки.УниверсальныйОбменДаннымиXML.Создать();
    ОбработкаВыгрузки.ИмяФайлаПравилОбмена = ПутьКФайлуПравил;
    ОбработкаВыгрузки.ИмяФайлаВыгрузки = ПутьКФайлуДанных;
    ОбработкаВыгрузки.РежимОбмена = "Выгрузка";
    
    // При необходимости передаем параметры в правила
    ОбработкаВыгрузки.Параметры.Вставить("ОрганизацияВыгрузки", Справочники.Организации.НайтиПоРеквизиту("ИНН", "7701010101"));
    
    ОбработкаВыгрузки.ЗагрузитьПравилаОбмена();
    
    // Настраиваем построитель отбора, если нужно ограничить выборку документов
    // Например, выгружаем только документы за текущий месяц
    ОбработкаВыгрузки.ВыполнитьВыгрузку();
    
    ЗаписьЖурналаРегистрации("Обмен Данными ЗУП - УПП",
        УровеньЖурналаРегистрации.Информация, , ,
        "Выгрузка данных успешно завершена в файл: " + ПутьКФайлуДанных);
        
КонецПроцедуры

Шаг 2. Подключаем данную обработку в базу ЗУП через меню «Администрирование» — «Печатные формы, отчеты и обработки» — «Дополнительные отчеты и обработки». В настройках указываем выполнение по расписанию. Теперь выгрузка будет выполняться в фоне на сервере 1С без участия пользователей.

Шаг 3. На стороне УПП настраиваем аналогичное регламентное задание, которое будет забирать файл ExportData.xml и загружать его с помощью аналогичной обработки УниверсальныйОбменДаннымиXML.

Решение 2. Реализация обмена через COM-соединение со стороны УПП

Если вы хотите полностью исключить любые регламентные процессы и хранение файлов на стороне ЗУП 3.1, идеальным выбором будет организация пула регламентных задач на стороне УПП. УПП сама будет инициировать сессию, забирать новые данные и создавать у себя объекты.

Проанализируем пример кода на стороне УПП, который подключается к ЗУП 3.1 через COM-соединение, находит проведенные документы отражения зарплаты за указанный период и переносит их структуру:


Процедура ВыполнитьИмпортИзЗУПЧерезCOM() Экспорт
    
    // 1. Инициализируем COM-соединение
    ПараметрыПодключения = "Srvr=""Server1C"";Ref=""zup_production"";Usr=""ExchangeUser"";Pwd=""StrongPassword"";";
    COMСоединитель = Новый COMОбъект("V83.COMConnector");
    
    Попытка
        БазаЗУП = COMСоединитель.Connect(ПараметрыПодключения);
    Исключение
        ЗаписьЖурналаРегистрации("Обмен_COM", УровеньЖурналаРегистрации.Ошибка, , , 
            "Не удалось подключиться к ЗУП: " + ОписаниеОшибки());
        Возврат;
    КонецПопытки;
    
    // 2. Формируем запрос к базе ЗУП для поиска документов отражения
    ЗапросЗУП = БазаЗУП.NewObject("Запрос");
    ЗапросЗУП.Текст = 
        "ВЫБРАТЬ
        |	Отражение.Ссылка КАК Ссылка
        |ИЗ
        |	Документ.ОтражениеЗарплатыВБухучете КАК Отражение
        |ГДЕ
        |	Отражение.Проведен = ИСТИНА
        |	И Отражение.Дата МЕЖДУ &НачалоПериода И &КонецПериода";
        
    ЗапросЗУП.SetParameter("НачалоПериода", НачалоМесяца(ТекущаяДата()));
    ЗапросЗУП.SetParameter("КонецПериода", КонецМесяца(ТекущаяДата()));
    
    РезультатЗапроса = ЗапросЗУП.Execute();
    Выборка = РезультатЗапроса.Select();
    
    Пока Выборка.Next() Цикл
        
        ДокументЗУП = Выборка.Ссылка;
        
        // Создаем или находим аналогичный документ в УПП
        ДокументУПП = Документы.ОтражениеЗарплатыВРеглУчете.СоздатьДокумент();
        ДокументУПП.Дата = ДокументЗУП.Дата;
        ДокументУПП.Организация = Справочники.Организации.НайтиПоРеквизиту("ИНН", ДокументЗУП.Организация.ИНН);
        
        // Переносим табличную часть "Отражение в учете"
        Для Каждого СтрокаЗУП Из ДокументЗУП.Начисления Цикл
            НоваяСтрока = ДокументУПП.ОтражениеВУчете.Добавить();
            НоваяСтрока.Сумма = СтрокаЗУП.Результат;
            
            // Находим или создаем физическое лицо по СНИЛС/ИНН
            ФизЛицоЗУП = СтрокаЗУП.ФизическоеЛицо;
            НоваяСтрока.ФизЛицо = НайтиСоздатьФизлицоПоCOM(ФизЛицоЗУП);
            
            // Сопоставляем способы отражения
            СпособЗУП = СтрокаЗУП.СпособОтражения;
            НоваяСтрока.СпособОтражения = НайтиСпособОтражения(СпособЗУП.Наименование);
        КонецЦикла;
        
        Попытка
            ДокументУПП.Записать(РежимЗаписиДокумента.Запись);
        Исключение
            ЗаписьЖурналаРегистрации("Обмен_COM", УровеньЖурналаРегистрации.Предупреждение, , ,
                "Ошибка записи документа в УПП: " + ОписаниеОшибки());
        КонецПопытки;
        
    КонецЦикла;
    
КонецПроцедуры

Важно помнить, что при работе с COM-соединением все вызовы методов и получение реквизитов объектов удаленной базы происходят через сетевые вызовы. Чтобы ускорить процесс переноса больших объемов данных (например, табличных частей на десятки тысяч строк), рекомендуется минимизировать обращения к свойствам COM-объектов в цикле. Вместо этого лучше выгружать результаты запросов на стороне ЗУП во временные таблицы (например, в структуры или массивы соответствий) и передавать их в УПП за один вызов.

Важные методологические нюансы при переносе данных

Вне зависимости от того, какой технический способ интеграции вы выберете, вы обязательно столкнетесь со структурными различиями между базами ЗУП 3.1 и УПП 1.3. Проанализируем критически важные аспекты, на которые нужно обратить внимание:

Подводя итог, можно утверждать: интеграция ЗУП 3.1 и сильно кастомизированной УПП 1.3 вполне реализуема стандартными средствами платформы. Использование правил КД 2, запускаемых регламентными заданиями, либо написание прямого COM-коннектора на стороне УПП позволит вам автоматизировать обмен без необходимости снимать ЗУП 3.1 с поддержки и усложнять её дальнейшее сопровождение.

← На главную