При администрировании и настройке интеграций в решениях на платформе 1С:Предприятие 8.3 специалисты часто сталкиваются с ситуацией, когда привычные механизмы обмена данными перестают работать после очередного обновления конфигурации. Особенно остро эта проблема проявляется в конфигурации 1С:Бухгалтерия предприятия 3.0 (БП 3.0), где разработчики планомерно выводят из эксплуатации устаревшие планы обмена, работающие по технологии КД2 (Конвертация данных редакции 2), заменяя их на современный Универсальный формат обмена (EnterpriseData, КД3).
В этой статье мы подробно разберем, почему возникает ошибка План обмена ... не используется для синхронизации данных, правила не обновлены, детально проанализируем внутренние механизмы Библиотеки стандартных подсистем (БСП), блокирующие загрузку правил, и рассмотрим несколько практических путей решения этой проблемы — от простых обходных путей до надежных архитектурных альтернатив.
Для того чтобы понять природу ошибки, обратимся к логике работы подсистемы обмена данными, встроенной в БСП. При попытке интерактивно загрузить новые правила конвертации через регистр сведений ПравилаДляОбменаДанными или при обновлении конфигурации, система обращается к списку зарегистрированных в БСП планов обмена.
Этот список формируется программно в общем модуле ОбменДаннымиПереопределяемый. Начиная с релиза БП 3.0.44, фирма «1С» перевела типовой обмен с конфигурацией «1С:Управление торговлей 11» на новые рельсы. Старый план обмена ОбменУправлениеТорговлейБухгалтерияПредприятия30 был признан устаревшим и исключен из списка поддерживаемых в процедуре ПолучитьПланыОбмена(). В результате БСП классифицирует данный план обмена как неактивный и блокирует любые операции с его правилами в регистре, выдавая предупреждение пользователю.
Для более глубокого понимания ситуации давайте проанализируем, почему разработчики фирмы «1С» принимают столь радикальные меры, вплоть до принудительного отключения старых планов обмена в коде БСП. Технология КД2, верой и правдой служившая многие годы, имеет фундаментальный недостаток — жесткую связанность метаданных двух обменивающихся конфигураций. Правила конвертации XML жестко привязаны к конкретным реквизитам, типам данных и структуре таблиц обеих баз. Стоит разработчикам изменить тип реквизита в БП 3.0 или удалить устаревший справочник, как правила обмена мгновенно «ломаются», вызывая критические ошибки при синхронизации.
Универсальный формат обмена (EnterpriseData / КД3) решает эту проблему за счет введения промежуточного стандартизированного XML/JSON слоя. Каждая конфигурация отвечает только за свою часть обмена:
Документ.РеализацияТоваровУслуг формата EnterpriseData).Благодаря этому, изменения структуры метаданных в «1С:Бухгалтерии» никак не влияют на работоспособность выгрузки в «1С:Управление торговлей», если обе конфигурации поддерживают одну и ту же версию формата EnterpriseData. Именно поэтому поддержка старых планов обмена КД2 прекращается, и разработчикам приходится искать обходные пути.
Если вам требуется срочно восстановить работоспособность старого обмена и загрузить правила конвертации, мы можем вручную вернуть исключенный план обмена в список поддерживаемых подсистемой БСП. Давайте разберем, как это сделать шаг за шагом:
ОбменДаннымиПереопределяемый.ПолучитьПланыОбмена(ПланыОбменаПодсистемы) Экспорт.
Процедура ПолучитьПланыОбмена(ПланыОбменаПодсистемы) Экспорт
// Добавляем старый план обмена в список разрешенных планов подсистемы БСП
ПланыОбменаПодсистемы.Добавить(Метаданные.ПланыОбмена.ОбменУправлениеТорговлейБухгалтерияПредприятия30);
КонецПроцедуры
После сохранения изменений в конфигурации база позволит вам зайти в форму настройки синхронизации и успешно загрузить правила конвертации из внешнего XML-файла. Однако помните, что этот метод имеет существенный недостаток: при первом же автоматическом обновлении конфигурации внесенные изменения в общий модуль будут затерты, и ошибку придется исправлять заново. Более того, начиная с релизов БП 3.0.65 и выше, этот способ перестает помогать полностью, так как БСП выполняет более глубокие проверки состояния настройки обмена.
При переходе на более современные версии БП (3.0.65 и далее) разработчики «1С» усложнили проверки. Даже если зарегистрировать план обмена в переопределяемом модуле, система выдает ошибку Настройка не завершена. Это происходит по двум причинам:
Удалить...), из них удаляются обработчики событий, формы узлов и сопутствующий программный код интеграции.Если заказчик настаивает на использовании правил КД2 и не готов оплачивать дорогостоящую миграцию на EnterpriseData, наиболее надежным решением будет создание собственного плана обмена в конфигурации. Фирма «1С» при обновлениях не затрагивает нетиповые объекты метаданных, что гарантирует стабильность работы обмена.
Рассмотрим алгоритм реализации этого подхода:
_Демо_ОбменУТБП).ПолучитьПланыОбмена() общего модуля ОбменДаннымиПереопределяемый:
Процедура ПолучитьПланыОбмена(ПланыОбменаПодсистемы) Экспорт
ПланыОбменаПодсистемы.Добавить(Метаданные.ПланыОбмена._Демо_ОбменУТБП);
КонецПроцедуры
Создайте правила конвертации (в программе "Конвертация данных 2.0") именно для вашего нового плана обмена _Демо_ОбменУТБП. Поскольку данный план обмена уникален, БСП без проблем позволит загрузить для него внешние правила и выполнять синхронизацию в штатном режиме, а автоматические обновления 1С больше не будут приводить к сбоям.
Если вам не требуется сложная регистрация изменений на узлах, расписания БСП и постоянный мониторинг, можно полностью отказаться от подсистемы синхронизации БСП. Вместо этого мы можем использовать прямое чтение и запись XML-файлов по правилам КД2 с помощью встроенной обработки УниверсальныйОбменДаннымиXML.
Давайте разберем, как автоматизировать этот процесс программно. Мы можем написать небольшую процедуру, которая будет запускаться по регламентному заданию или через планировщик Windows и выполнять обмен в фоновом режиме:
Процедура ВыполнитьАвтоматическийОбмен() Экспорт
ПутьКПравилам = "C:\Exchange\Rules_UT_BP.xml";
ПутьКФайлуДанных = "C:\Exchange\Data_Export.xml";
// Инициализируем типовую обработку обмена
ОбработкаОбмена = Обработки.УниверсальныйОбменДаннымиXML.Создать();
ОбработкаОбмена.ИмяФайлаПравилОбмена = ПутьКПравилам;
ОбработкаОбмена.ИмяФайлаДанных = ПутьКФайлуДанных;
ОбработкаОбмена.РежимРаботы = "Выгрузка";
// Настраиваем параметры выгрузки
ОбработкаОбмена.ВыгружатьТолькоРазрешенные = Истина;
// Запуск процесса
Попытка
ОбработкаОбмена.ВыполнитьВыгрузку();
ЗаписьЖурналаРегистрации("ОбменДанными", УровеньЖурналаРегистрации.Информация, , , "Выгрузка успешно завершена.");
Исключение
ИнформацияОбОшибке = ОписаниеОшибки();
ЗаписьЖурналаРегистрации("ОбменДанными", УровеньЖурналаРегистрации.Ошибка, , , "Ошибка выгрузки: " + ИнформацияОбОшибке);
КонецПопытки;
КонецПроцедуры
Аналогичный код с режимом работы Загрузка настраивается на стороне принимающей базы. Этот способ гарантирует абсолютную независимость обмена от обновлений конфигурации БП 3.0 и изменений в БСП.
В случаях, когда план обмена физически присутствует в конфигурации, но интерфейс БСП блокирует интерактивную загрузку правил через регистр ПравилаДляОбменаДанными, мы можем обойти эту проверку программным путем. Мы запишем бинарные данные файла правил напрямую в базу данных.
Для этого воспользуемся внешней обработкой, в которой выполним следующий код:
Процедура ЗагрузитьПравилаВОбходИнтерфейса(ИмяПланаОбмена, ПутьКФайлуПравил)
// Считываем файл правил в двоичные данные
ДвоичныеДанныеПравил = Новый ДвоичныеДанные(ПутьКФайлуПравил);
ХранилищеПравил = Новый ХранилищеЗначения(ДвоичныеДанныеПравил, Новый СжатиеДанных(9));
// Обращаемся к регистру сведений ПравилаДляОбменаДанными
НаборЗаписей = РегистрыСведений.ПравилаДляОбменаДанными.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.ИмяПланаОбмена.Установить(ИмяПланаОбмена);
НаборЗаписей.Прочитать();
Если НаборЗаписей.Количество() = 0 Тогда
НоваяЗапись = НаборЗаписей.Добавить();
НоваяЗапись.ИмяПланаОбмена = ИмяПланаОбмена;
Иначе
НоваяЗапись = НаборЗаписей[0];
// Очищаем старые зачитанные правила
НоваяЗапись.ПравилаЗачитанные = Неопределено;
КонецЕсли;
// Заполняем реквизиты записи регистра
НоваяЗапись.ПравилаЗачитанные = ХранилищеПравил;
НоваяЗапись.ИмяФайлаПравил = "ExchangeRules.xml";
НоваяЗапись.ПравилаШаблон = Ложь;
НоваяЗапись.ИспользоватьСлужебныйМакет = Ложь;
Попытка
НаборЗаписей.Записать();
Сообщить("Правила конвертации успешно записаны напрямую в регистр для: " + ИмяПланаОбмена);
Исключение
ВызватьИсключение "Не удалось записать правила: " + ОписаниеОшибки();
КонецПопытки;
КонецПроцедуры
При выполнении этого кода БСП при очередном сеансе обмена считает правила непосредственно из регистра ПравилаДляОбменаДанными и успешно применит их при выгрузке/загрузке. Стоит учитывать, что этот метод является временным решением, поскольку при обновлении конфигурации или выполнении регламентных процедур очистки неактуальных обменов БСП может автоматически очистить эту запись регистра.
Мы рассмотрели различные варианты борьбы с ошибкой блокировки старых планов обмена в 1С:Бухгалтерии 3.0. Подводя итог, можно дать следующие рекомендации: