Интеграция устаревших конфигураций на обычных формах (таких как 1С:Бухгалтерия предприятия 1.6) с современными флагманскими решениями вроде 1С:ERP Управление предприятием 2 — задача нетривиальная. Основная сложность заключается в колоссальном технологическом разрыве между конфигурациями. БП 1.6 создавалась во времена платформы 1С 8.1, в то время как ERP 2 базируется на современных стандартах БСП, управляемых формах и формате обмена EnterpriseData (КД 3).
В этой статье мы подробно разберем, как решить проблему двустороннего обмена, не допуская критического разрастания файлов обмена, и как правильно реализовать механизм квитирования (подтверждения доставки сообщений) с использованием планов обмена. Мы детально проанализируем подходы с использованием Конвертации данных 2.1 и Конвертации данных 3.0.
---
Частой ошибкой при настройке обмена через КД 2.1 является выгрузка всех данных без учета их изменений в базе-источнике (как описано в сообщении 8). Это приводит к тому, что файл обмена ежедневно разрастается, а время его загрузки увеличивается в геометрической прогрессии. Чтобы избежать этого, мы применим стандартный механизм платформы 1С — инфраструктуру сообщений обмена на базе планов обмена.
Суть механизма квитирования (подтверждения получения) заключается в следующем:
НомерОтправленного = 10).НомерПринятого = 10.Рассмотрим, как реализовать этот процесс программно на стороне БП 1.6 с использованием обработки УниверсальныйОбменДаннымиXML.
Для выгрузки данных с фиксацией номера сообщения используем следующий код:
Процедура ВыгрузитьДанныеСКвитированием(УзелСсылка, ПутьКФайлуОбмена, ПутьКПравилам) Экспорт
// Создаем запись XML и связываем её с файлом
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл(ПутьКФайлуОбмена, "UTF-8");
// Инициализируем запись сообщения обмена для конкретного узла плана обмена
ЗаписьСообщения = ПланыОбмена.СоздатьЗаписьСообщения();
ЗаписьСообщения.НачатьЗапись(ЗаписьXML, УзелСсылка);
// Инициализируем обработку "Универсальный обмен данными XML"
ОбработкаОбмена = Обработки.УниверсальныйОбменДаннымиXML.Создать();
ОбработкаОбмена.РежимОбмена = "Выгрузка";
ОбработкаОбмена.ИмяФайлаПравилОбмена = ПутьКПравилам;
ОбработкаОбмена.ЗагрузитьПравилаОбмена();
// Важно: передаем подготовленный XML-поток внутрь обработки
ОбработкаОбмена.ЗаписыватьВходныеПараметрыВЛог = Ложь;
ОбработкаОбмена.УзелДляОбмена = УзелСсылка;
ОбработкаОбмена.ВыгружатьТолькоРегистрированные = Истина;
// Передаем открытый поток записи XML, чтобы обработка писала данные внутрь сообщения
ОбработкаОбмена.ВыполнитьВыгрузкуПотоком(ЗаписьXML);
// Завершаем запись сообщения обмена и закрываем файлы
ЗаписьСообщения.ЗакончитьЗапись();
ЗаписьXML.Закрыть();
Сообщить("Выгрузка успешно завершена. Сформирован пакет № " + ЗаписьСообщения.НомерОтправленного);
КонецПроцедуры
Теперь разберем, как принять ответный файл в БП 1.6 и автоматически подтвердить получение данных в ERP (снять объекты с регистрации):
Процедура ЗагрузитьДанныеСПодтверждением(УзелСсылка, ПутьКФайлуОбмена) Экспорт
// Инициализируем чтение XML файла
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(ПутьКФайлуОбмена);
// Создаем объект чтения сообщения обмена
ЧтениеСообщения = ПланыОбмена.СоздатьЧтениеСообщения();
ЧтениеСообщения.НачатьЧтение(ЧтениеXML, УзелСсылка);
// Инициализируем обработку загрузки
ОбработкаОбмена = Обработки.УниверсальныйОбменДаннымиXML.Создать();
ОбработкаОбмена.РежимОбмена = "Загрузка";
ОбработкаОбмена.ЗаписыватьВИнформационнуюБазуТолькоИзмененныеОбъекты = Истина;
ОбработкаОбмена.ЗагружатьДанныеВРежимеОбмена = Истина;
// Запускаем загрузку данных из открытого потока XML
ОбработкаОбмена.ВыполнитьЗагрузкуПотоком(ЧтениеXML);
// Завершаем чтение сообщения.
// В этот момент платформа автоматически удаляет регистрацию изменений,
// подтвержденную номером принятого сообщения из заголовка файла.
ЧтениеСообщения.ЗакончитьЧтение();
ЧтениеXML.Закрыть();
Сообщить("Загрузка завершена. Подтвержден прием нашего пакета № " + ЧтениеСообщения.НомерПринятого);
КонецПроцедуры
---
Если вы хотите настроить обмен в режиме реального времени "источник-приемник" без промежуточных файлов (БП -> ERP напрямую через COM), то квитирование необходимо реализовать программным способом в рамках единой транзакции.
Рассмотрим алгоритм реализации прямого обмена с контролем транзакций:
Истина.Пример программной реализации отправки данных через COM с очисткой регистрации:
Процедура ВыполнитьПрямойОбменЧерезCOM(УзелСсылка, ИмяСервера, ИмяБазы, Пользователь, Пароль) Экспорт
// 1. Устанавливаем COM-соединение с базой ERP
COMConnector = Новый COMObject("V83.COMConnector");
Попытка
СоединениеERP = COMConnector.Connect("Srvr=""" + ИмяСервера + """;Ref=""" + ИмяБазы + """;Usr=""" + Пользователь + """;Pwd=""" + Пароль + """;");
Исключение
Предупреждение("Не удалось установить соединение с ERP: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
// 2. Выбираем измененные объекты, зарегистрированные на узле
ВыборкаИзменений = ПланыОбмена.ВыбратьИзменения(УзелСсылка, ВыборкаИзмененийНомерСообщения);
МассивОбъектов = Новый Массив;
Пока ВыборкаИзменений.Следующий() Цикл
МассивОбъектов.Добавить(ВыборкаИзменений.Получить());
КонецЦикла;
Если МассивОбъектов.Количество() = 0 Тогда
Сообщить("Нет зарегистрированных изменений для выгрузки.");
Возврат;
КонецЕсли;
// 3. Выгружаем данные во временный XML-файл в памяти
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xml");
ОбработкаОбмена = Обработки.УниверсальныйОбменДаннымиXML.Создать();
ОбработкаОбмена.РежимОбмена = "Выгрузка";
ОбработкаОбмена.ИмяФайлаПравилОбмена = "C:\Rules\Rules_BP_ERP.xml";
ОбработкаОбмена.ЗагрузитьПравилаОбмена();
ОбработкаОбмена.УзелДляОбмена = УзелСсылка;
ОбработкаОбмена.ВыгружатьТолькоРегистрированные = Истина;
ОбработкаОбмена.ИмяФайлаОбмена = ИмяВременногоФайла;
ОбработкаОбмена.ВыполнитьВыгрузку();
// Читаем сформированный XML в строку
ТекстовыйДокумент = Новый ТекстовыйДокумент;
ТекстовыйДокумент.Прочитать(ИмяВременногоФайла, КодировкаТекста.UTF8);
ДанныеДляПередачи = ТекстовыйДокумент.ПолучитьТекст();
// 4. Передаем данные в ERP через COM
Попытка
// На стороне ERP должна быть создана общая функция ЗагрузитьДанныеИзБП в общем модуле
РезультатЗагрузки = СоединениеERP.ОбменДаннымиСервер.ЗагрузитьДанныеИзБП(ДанныеДляПередачи);
Исключение
РезультатЗагрузки = Ложь;
Сообщить("Ошибка вызова метода в ERP: " + ОписаниеОшибки());
КонецПопытки;
// 5. Квитирование: если ERP подтверждает успешный импорт, снимаем регистрацию в БП
Если РезультатЗагрузки Тогда
НачатьТранзакцию();
Попытка
ПланыОбмена.УдалитьРегистрациюИзменений(УзелСсылка, МассивОбъектов);
ЗафиксироватьТранзакцию();
Сообщить("Данные успешно доставлены в ERP, регистрация изменений очищена.");
Исключение
ОтменитьТранзакцию();
Сообщить("Ошибка очистки регистрации изменений: " + ОписаниеОшибки());
КонецПопытки;
Иначе
Сообщить("Загрузка на стороне ERP завершилась ошибкой. Регистрация изменений сохранена.");
EndIf;
// Очищаем временные файлы
УдалитьФайлы(ИмяВременногоФайла);
КонецПроцедуры
---
Идея внедрить современный формат обмена EnterpriseData (ED) в БП 1.6 выглядит крайне привлекательно, поскольку ERP уже имеет встроенные механизмы для работы с этим стандартом. Однако при реализации этого пути на практике мы неизбежно столкнемся с серьезными техническими препятствиями:
Как обойти ограничения с помощью внешней обработки-адаптера:
Если внедрять полноценную БСП для интеграции КД 3 в БП 1.6 нецелесообразно, можно применить подход внешнего адаптера. Для этого используется внешняя обработка, которая эмулирует работу механизмов EnterpriseData:
ЗаписьXML).---
Проанализируем обе технологии и примем взвешенное решение на основе жизненного цикла ваших систем:
| Критерий сравнения | Конвертация данных 2.1 (XML-формат) | Конвертация данных 3.0 (EnterpriseData) |
|---|---|---|
| Сложность внедрения на БП 1.6 | Низкая. Требуется минимальная доработка существующих планов обмена. Работает на любых версиях платформы и совместимости. | Очень высокая. Требуется адаптация XDTO-схем, перенос общих модулей БСП или покупка/разработка внешнего адаптера. |
| Стабильность при обновлениях ERP | Средняя. При изменении метаданных ERP правила в КД 2.1 придется обновлять вручную. | Высокая. ERP поддерживает формат EnterpriseData "из коробки" и обеспечивает обратную совместимость версий формата. |
| Производительность | Высокая при использовании планов обмена и механизмов квитирования. | Высокая за счет оптимизированных механизмов БСП, но требует больших ресурсов процессора на сериализацию. |
Наш вердикт: