Переход или регулярный обмен данными между устаревшей конфигурацией «Бухгалтерия предприятия 2.0» и современной «Бухгалтерия предприятия 3.0» — классическая задача для разработчика 1С. Особенно часто сложности возникают, когда историческая база БП 2.0 сильно доработана, правила обмена написаны на классической «Конвертации данных 2.1» (КД 2.1), а в БП 3.0 стандартный интерфейс синхронизации предлагает только современный формат EnterpriseData.
В этой статье мы подробно разберем, как автоматизировать процесс загрузки данных в БП 3.0 по расписанию без снятия конфигурации-приемника с поддержки, как настроить обратную квитанцию для снятия регистрации изменений в БП 2.0, а также выясним причины распространенной проблемы, когда документы загружаются, но не проводятся, а справочники «теряются».
---
Сначала проанализируем ситуацию, с которой часто сталкиваются программисты при запуске автоматического обмена. При ручном использовании обработки УниверсальныйОбменДаннымиXML все работает прекрасно: документы проводятся, аналитика заполняется. Но стоит запустить процесс через План обмена в автоматическом режиме, как документы остаются просто записанными (непроведенными), а в реквизитах справочников (номенклатура, договоры, контрагенты) появляются пустые значения.
Разберем детально физику этого процесса в Библиотеке стандартных подсистем (БСП) конфигурации БП 3.0:
ОбменДанными.Загрузка = Истина):
При автоматическом обмене через БСП запись всех XML-данных происходит с установленным признаком Загрузка = Истина. Это штатное поведение платформы «1С:Предприятие», предназначенное для того, чтобы избежать коллизий при переносе данных. В этом режиме отключаются стандартные платформенные проверки, подписки на события ПередЗаписью и ПриЗаписи, а также полностью блокируется автоматическое проведение документов при записи. Система считает, что данные переносятся «как есть» из другой базы, где они уже были проверены.Отложенные движения документов.
Для того чтобы эти документы в итоге провелись, в БП 3.0 должно быть активно и корректно настроено типовое регламентное задание «Выполнение отложенных движений документов». Если оно выключено, зависло или выполняется под пользователем с недостаточными правами, документы так и останутся лежать в базе мертвым грузом без проводок.
Номенклатура, Контрагенты, ДоговорыКонтрагентов и т.д.), то при чтении XML-сообщения БСП может просто проигнорировать эти типы данных или записать их некорректно.---
Для реализации полноценного двустороннего обмена с формированием файлов-квитанций (ответов) нам потребуется План обмена на стороне БП 3.0. Чтобы сохранить базу на поддержке и не усложнять последующие обновления конфигурации, добавим этот план обмена через механизм расширения конфигурации.
Выполним этот процесс по шагам:
Откроем конфигуратор БП 3.0, перейдем в меню Конфигурация -> Расширения конфигурации, добавим новое расширение. В расширении создадим новый объект типа План обмена. Назовем его, например, _ДемоОбменБП2БП3.
В свойствах созданного плана обмена обязательно настроим:
В режиме «1С:Предприятие» в БП 3.0 создадим узлы для нашего нового плана обмена. Нам понадобятся два узла:
Поскольку мы используем КД 2.1, нам необходимо загрузить правила обмена (файл Rules.xml) в созданный план обмена. Обычно в типовых планах обмена для этого используется регистр сведений ПравилаДляОбменаДанными. Нам нужно прописать регистрацию нашего нового плана обмена в общих модулях БСП, отвечающих за обмен данными, либо воспользоваться стандартной обработкой по загрузке правил конвертации для нашего узла.
После настройки обмена через расширение запуск загрузки будет происходить по расписанию через стандартные регламентные задания БСП. При этом система автоматически сформирует файл ответа с номером принятого сообщения, который при следующей итерации в БП 2.0 снимет с регистрации успешно перенесенные объекты.
---
Если вы принципиально не хотите использовать расширения и добавлять новые планы обмена в структуру базы данных БП 3.0, существует изящное альтернативное решение. Мы можем полностью автоматизировать процесс загрузки XML-файла и отправки подтверждения с помощью внешней обработки, запускаемой по расписанию через встроенный механизм БСП.
В БП 3.0 предусмотрена возможность выполнения кода внешних обработок на сервере по расписанию (раздел Администрирование -> Печатные формы, отчеты и обработки -> Дополнительные отчеты и обработки).
Рассмотрим по шагам, как реализовать такую обработку.
Создадим в конфигураторе новую внешнюю обработку. В модуле объекта нашей обработки напишем программный код, который будет использовать стандартный объект Обработки.УниверсальныйОбменДаннымиXML, уже встроенный в БП 3.0.
Ниже представлен готовый к использованию шаблон кода серверного метода внешней обработки:
Процедура ВыполнитьЗагрузкуДанныхПоРасписанию() Экспорт
// Определяем пути к файлам на сервере
ПутьКФайлуИмпорта = "C:\Exchange\from_BP2.xml";
ПутьКФайлуКвитанции = "C:\Exchange\to_BP2.xml";
ФайлОбмена = Новый Файл(ПутьКФайлуИмпорта);
Если Не ФайлОбмена.Существует() Тогда
ЗаписьЖурналаРегистрации("Обмен данными БП 2.0 - БП 3.0",
УровеньЖурналаРегистрации.Предупреждение, , ,
"Файл загрузки не найден по пути: " + ПутьКФайлуИмпорта);
Возврат;
КонецЕсли;
// Инициализируем стандартную обработку обмена XML
ОбработкаЗагрузки = Обработки.УниверсальныйОбменДаннымиXML.Создать();
ОбработкаЗагрузки.ИмяФайлаОбмена = ПутьКФайлуИмпорта;
ОбработкаЗагрузки.РежимОбмена = "Загрузка";
// ВНИМАНИЕ: Решаем проблему непроведения документов!
// Если установить этот флаг в Ложь, загрузка пойдет в обычном режиме (не в режиме обмена).
// Платформа будет сразу выполнять проведение документов и стандартные проверки "ПриЗаписи".
// Используйте Ложь, только если уверены, что все связанные справочники уже есть в базе,
// иначе процесс может замедлиться из-за транзакционности.
ОбработкаЗагрузки.ЗагружатьДанныеВРежимеОбмена = Истина;
// Дополнительные параметры для повышения стабильности и скорости работы
ОбработкаЗагрузки.ОптимизированнаяЗаписьОбъектов = Истина;
ОбработкаЗагрузки.ЗаписыватьРегистрыНаборамиЗаписей = Истина;
ОбработкаЗагрузки.ВыводитьВПротоколСообщенияОбОшибках = Истина;
Попытка
ОбработкаЗагрузки.ВыполнитьЗагрузку();
ЗаписьЖурналаРегистрации("Обмен данными БП 2.0 - БП 3.0",
УровеньЖурналаРегистрации.Информация, , ,
"Загрузка данных успешно завершена.");
// После успешной загрузки формируем квитанцию для БП 2.0
СформироватьФайлПодтверждения(ПутьКФайлуИмпорта, ПутьКФайлуКвитанции);
// Удаляем обработанный файл импорта, чтобы не загружать его повторно
УдалитьФайлы(ПутьКФайлуИмпорта);
Исключение
ЗаписьЖурналаРегистрации("Обмен данными БП 2.0 - БП 3.0",
УровеньЖурналаРегистрации.Ошибка, , ,
"Ошибка при загрузке данных: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Для того чтобы БП 2.0 поняла, что сообщение принято, и очистила таблицу зарегистрированных изменений для узла обмена, нам нужно создать ответный XML-файл определенной структуры. Проанализируем пример кода, считывающий номер сообщения из входящего файла и записывающий квитанцию:
Процедура СформироватьФайлПодтверждения(Знач ПутьКВходящемуФайлу, Знач ПутьКФайлуОтвета)
НомерПринятогоСообщения = 0;
КодОтправителя = "";
КодПолучателя = "";
// Читаем заголовок входящего файла, чтобы узнать номер сообщения
ЧтениеXML = Новый ЧтениеXML;
Попытка
ЧтениеXML.ОткрытьФайл(ПутьКВходящемуФайлу);
Пока ЧтениеXML.Прочитать() Цикл
Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента И ЧтениеXML.Имя = "MessageHeader" Тогда
// Здесь парсим атрибуты заголовка сообщения КД 2.1
// Обычно структура содержит НомерСообщения, Отправитель, Получатель
НомерПринятогоСообщения = ЧтениеXML.ПолучитьАтрибут("MessageNo");
КодОтправителя = ЧтениеXML.ПолучитьАтрибут("Sender");
КодПолучателя = ЧтениеXML.ПолучитьАтрибут("Recipient");
Прервать;
КонецЕсли;
КонецЦикла;
ЧтениеXML.Закрыть();
Исключение
// Если прочитать заголовок не удалось, запишем дефолтные значения
НомерПринятогоСообщения = 1;
ЧтениеXML.Закрыть();
КонецПопытки;
Если ЗначениеЗаполнено(НомерПринятогоСообщения) Тогда
// Формируем XML-файл подтверждения
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл(ПутьКФайлуОтвета, "UTF-8");
ЗаписьXML.ЗаписатьОбъявлениеXML();
// Формируем корневой элемент квитанции, понятный для БСП и планов обмена БП 2.0
ЗаписьXML.ЗаписатьНачалоЭлемента("v8msg:Response");
ЗаписьXML.ЗаписатьСоответствиеГраницПространствИмен("v8msg", "http://v8.1c.ru/messages");
ЗаписьXML.ЗаписатьНачалоЭлемента("Header");
ЗаписьXML.ЗаписатьЭлемент("To", КодОтправителя); // Адресат - отправитель исходного файла
ЗаписьXML.ЗаписатьЭлемент("From", КодПолучателя); // Отправитель квитанции - наша БП 3.0
ЗаписьXML.ЗаписатьЭлемент("ReceivedNo", СокрЛП(НомерПринятогоСообщения)); // Номер подтверждаемого сообщения
ЗаписьXML.ЗаписатьКонецЭлемента(); // Header
ЗаписьXML.ЗаписатьКонецЭлемента(); // v8msg:Response
ЗаписьXML.Закрыть();
КонецЕсли;
КонецПроцедуры
Для интеграции нашей обработки в справочник дополнительных обработок БСП необходимо добавить в модуль объекта стандартную функцию описания:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработкеКонфигурации("2.2.2.1");
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка();
ПараметрыРегистрации.Версия = "1.0";
ПараметрыРегистрации.Наименование = "Автоматическая загрузка данных из БП 2.0 (КД 2.1)";
ПараметрыРегистрации.Информация = "Регулярная загрузка данных по расписанию с формированием квитанции";
ПараметрыРегистрации.БезопасныйРежим = Ложь; // Требуется Ложь для работы с файловой системой сервера
НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
НоваяКоманда.Представление = "Запустить загрузку данных из БП 2.0";
НоваяКоманда.Идентификатор = "ВыполнитьЗагрузкуДанныхПоРасписанию";
НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипЗапускаВызовСерверногоМетода();
НоваяКоманда.ПоказыватьОповещение = Истина;
Возврат ПараметрыРегистрации;
КонецФункции
Сохраните обработку как внешний файл .epf, перейдите в БП 3.0 в меню Администрирование -> Печатные формы, отчеты и обработки -> Дополнительные отчеты и обработки, нажмите кнопку «Добавить из файла» и выберите сохраненный файл. После этого во вкладке команд настройте необходимое расписание запуска (например, каждые 15 минут или раз в сутки ночью).
---
Мы рассмотрели два надежных и кардинально отличающихся подхода к автоматизации обмена между конфигурациями БП 2.0 и БП 3.0 по правилам КД 2.1:
Выбирайте подходящий вам метод исходя из требований к архитектуре вашей системы и наслаждайтесь стабильным и автоматизированным обменом данными без рутинных ручных операций!