При переходе на новые версии программных продуктов фирмы «1С» часто возникает ситуация, когда расчет зарплаты и кадровый учет уже перенесены в современную конфигурацию 1С:Зарплата и Управление Персоналом 3 (ЗУП), а весь остальной регламентированный и производственный учет по-прежнему ведется в 1С:Управление производственным предприятием 1.3 (УПП). Настройка стабильной синхронизации между ними — задача нетривиальная. В этой статье мы подробно разберем, как автоматизировать этот процесс, обойти ограничения типовых механизмов и настроить регулярный обмен по расписанию.
При попытке связать две эти системы разработчики часто сталкиваются с системным сообщением о том, что обмен с данной конфигурацией не предусмотрен. Давайте разберем, почему так происходит. Современная 1С:ЗУП 3 ориентирована на работу по новому универсальному формату обмена EnterpriseData (технология Конвертация данных 3.0). В свою очередь, старая 1С:УПП 1.3 этот формат «из коробки» не поддерживает. Внедрять БСП (Библиотеку стандартных подсистем) новой версии и XDTO-пакеты в УПП крайне трудоемко и экономически нецелесообразно.
Иногда возникает путаница с понятием EDT (Enterprise Development Tools). Важно разделять: EDT — это среда разработки, которая действительно поддерживает УПП с конца 2018 года, но к самому обмену данными она не имеет отношения. Единственным надежным и проверенным решением для обмена ЗУП 3 и УПП 1.3 остается использование классической технологии Конвертации данных 2.0 (XML). Однако типовой функционал не предлагает готового регламентного задания для регулярного выполнения такого обмена. Ниже мы детально рассмотрим три наиболее эффективных способа автоматизации этого процесса.
Поскольку ЗУП 3 построена на управляемых формах и содержит в себе актуальную версию БСП, мы можем задействовать штатный механизм Дополнительные отчеты и обработки для запуска выгрузки по расписанию без изменения конфигурации. Для этого нам понадобится написать внешнюю обработку, которая будет программно обращаться к типовому механизму XML-обмена.
Давайте разберем пошаговый алгоритм реализации этого метода:
УниверсальныйОбменДаннымиXML.Проанализируем пример программного кода для выгрузки данных из источника (ЗУП 3):
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.2.2.1");
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительноеРегламентноеЗадание();
ПараметрыРегистрации.Наименование = "Автоматический обмен ЗУП -> УПП";
ПараметрыРегистрации.БезопасныйРежим = Ложь;
НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
НоваяКоманда.Представление = "Запустить выгрузку данных";
НоваяКоманда.Идентификатор = "ЗапускВыгрузки";
НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода();
Возврат ПараметрыРегистрации;
КонецФункции
Процедура ВыполнитьКоманду(ИдентификаторКоманды, СопутствующиеПараметры) Экспорт
If ИдентификаторКоманды = "ЗапускВыгрузки" Тогда
ВыгрузитьДанныеВФайл();
КонецЕсли;
КонецПроцедуры
Процедура ВыгрузитьДанныеВФайл()
ОбработкаОбмена = Обработки.УниверсальныйОбменДаннымиXML.Создать();
ОбработкаОбмена.РежимОбмена = "Выгрузка";
ОбработкаОбмена.ИмяФайлаПравилОбмена = "C:\Exchange\Rules_ZUP_UPP.xml";
ОбработкаОбмена.ИмяФайлаОбмена = "C:\Exchange\data_transfer.xml";
// Загружаем правила и выполняем выгрузку
ОбработкаОбмена.ЗагрузитьПравилаОбмена();
ОбработкаОбмена.ВыполнитьВыгрузку();
КонецПроцедуры
Теперь рассмотрим, как настроить автоматическую загрузку этих данных на стороне приемника (УПП 1.3). В УПП мы можем создать аналогичное регламентное задание в самой конфигурации или запустить внешнюю обработку через планировщик Windows. Пример кода для загрузки данных в УПП выглядит следующим образом:
Процедура ВыполнитьЗагрузкуДанных() Экспорт
ОбработкаЗагрузки = Обработки.УниверсальныйОбменДаннымиXML.Создать();
ОбработкаЗагрузки.РежимОбмена = "Загрузка";
ОбработкаЗагрузки.ИмяФайлаОбмена = "C:\Exchange\data_transfer.xml";
// Оптимизируем настройки для работы в фоновом режиме
ОбработкаЗагрузки.ЗагружатьДанныеВРежимеОбмена = Истина;
ОбработкаЗагрузки.ЗаписыватьРегистрыНаборамиЗаписей = Истина;
ОбработкаЗагрузки.ЗаписыватьВИнформационнуюБазуТолькоИзмененныеОбъекты = Истина;
ОбработкаЗагрузки.ВыполнитьЗагрузку();
КонецПроцедуры
Если мы будем просто запускать регламентную выгрузку за фиксированный период, система каждый раз будет перезаписывать множество документов. Это создаст избыточную нагрузку на дисковую подсистему и базу данных. Чтобы выгружать исключительно новые и измененные объекты, мы рекомендуем использовать механизм Планов обмена.
Выполним оптимизацию по шагам:
РегистрацияДляУПП). Чтобы сохранить конфигурацию на поддержке, этот план обмена можно создать в рамках расширения.ФизическиеЛица, ПодразделенияОрганизаций, документы ОтражениеЗарплатыВБухучете и другие).Рассмотрим пример кода, связывающего правила обмена КД 2.0 с узлом плана обмена:
Процедура ВыгрузитьИзмененияПоПлануОбмена()
УзелОбмена = ПланыОбмена.РегистрацияДляУПП.НайтиПоКоду("УПП");
Если УзелОбмена.Пустая() Тогда
ВызватьИсключение "Не найден узел обмена для УПП!";
КонецЕсли;
ОбработкаОбмена = Обработки.УниверсальныйОбменДаннымиXML.Создать();
ОбработкаОбмена.РежимОбмена = "Выгрузка";
ОбработкаОбмена.ИмяФайлаПравилОбмена = "C:\Exchange\Rules_ZUP_UPP.xml";
ОбработкаОбмена.ИмяФайлаОбмена = "C:\Exchange\data_changes.xml";
ОбработкаОбмена.ЗагрузитьПравилаОбмена();
// Привязываем правила выгрузки к узлу плана обмена
Для Каждого СтрокаПравил Из ОбработкаОбмена.ТаблицаПравилВыгрузки.Строки Цикл
СтрокаПравил.СсылкаНаУзелОбмена = УзелОбмена;
КонецЦикла;
ОбработкаОбмена.ВыполнитьВыгрузку();
// Очищаем зарегистрированные изменения после успешной выгрузки
ПланыОбмена.УдалитьРегистрациюИзменений(УзелОбмена);
КонецПроцедуры
Для того чтобы полностью исключить необходимость создания промежуточных файлов обмена (которые могут теряться, не дописываться из-за сетевых сбоев или требовать настройки FTP-серверов), мы можем применить технологию прямого COM-соединения между базами.
Чаще всего инициатором такого обмена выступает база-приемник (УПП). Из регламентного задания в УПП программно создается подключение к ЗУП, запускается выгрузка по правилам во временный файл в памяти и сразу же загружается в приемник. Посмотрим на практический пример реализации такой схемы:
Процедура ВыполнитьОбменЧерезCOM()
// Параметры подключения к базе ЗУП 3
СтрокаПодключения = "Srvr=""Server1C"";Ref=""zup_prod"";Usr=""ExchangeUser"";Pwd=""Password123"";";
Connector = Новый COMОбъект("V83.COMConnector");
Попытка
СоединениеЗУП = Connector.Connect(СтрокаПодключения);
Исключение
ЗаписатьЛогСобытия("Ошибка подключения к ЗУП: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
// Код дальнейшего взаимодействия с COM-объектом базы ЗУП
// и вызова процедур экспорта данных напрямую в память
КонецПроцедуры
При использовании COM-соединения важно помнить о разрядности сервера 1С. Если сервер УПП работает под управлением 64-разрядной операционной системы, на нем должен быть зарегистрирован соответствующий 64-битный COM-коннектор.
При переносе данных между ЗУП 3 и УПП 1.3 с помощью правил КД 2.0 обязательно обратите внимание на ключевые справочники, структура которых принципиально отличается:
ФИО + ДатаРождения или по уникальным кодам СНИЛС / ИНН.1С:ЗУП 3 постоянно развивается и обновляется фирмой «1С». Изменение состава реквизитов и структуры метаданных может нарушить работу правил КД 2.0. Регулярно выгружайте структуру метаданных ЗУП с помощью внешней обработки MD80Exp.epf и пересобирайте правила обмена в базе «Конвертация данных» при каждом крупном обновлении.