При настройке обмена данными между конфигурациями на платформе 1С (например, между двумя базами 1С:Комплексная автоматизация 2) разработчики часто используют конфигурацию «Конвертация данных 2.1» (КД2). Стандартный сценарий выглядит просто: выгрузить структуру метаданных, автоматически сгенерировать правила обмена в КД2 «для всех объектов», проверить выгрузку через обработку УниверсальныйОбменДаннымиXML и загрузить готовые правила в План обмена БСП (Библиотеки стандартных подсистем).
Однако именно на этапе загрузки правил в План обмена БСП часто возникает критическая ошибка. Программа прерывает загрузку и выдает в журнал регистрации сообщения следующего вида:
В этой статье мы подробно разберем, почему возникает этот конфликт между КД2 и БСП, проанализируем внутренние механизмы платформы и рассмотрим несколько эффективных способов решения этой проблемы.
Для того чтобы понять природу ошибки, проанализируем разницу в поведении двух инструментов — внешней обработки УниверсальныйОбменДаннымиXML и встроенного в БСП механизма загрузки правил.
Внешняя обработка «Универсальный обмен данными XML» ориентирована на непосредственное выполнение обмена. Она не производит жесткой предварительной валидации структуры правил на стопроцентное соответствие физическим метаданным. Если в правилах описано свойство, которого нет в объекте, обработка может просто проигнорировать его при выгрузке или выдать предупреждение в процессе работы, но сам процесс импорта правил в нее проходит без проблем.
В свою очередь, БСП (Библиотека стандартных подсистем) при импорте правил в План обмена (через регистр сведений ПравилаОбменаДанными) запускает алгоритмы строгой проверки. В общем модуле ОбменДаннымиСервер (или аналогичном в вашей версии БСП) происходит сопоставление каждого правила конвертации свойства (ПКС) с реальной структурой метаданных конфигурации. Если БСП обнаруживает в правилах реквизит, существование которого она не может подтвердить программно, процесс загрузки немедленно прерывается с ошибкой.
Рассмотрим подробнее две самые частые ошибки валидации:
НачислениеЗарплатыИВзносов) есть реальная табличная часть Удержания, и при этом существует одноименный регистр, в который документ делает движения, КД2 объединяет или путает эти сущности. Реквизит Активность является стандартным свойством набора записей регистра. Физически в табличной части документа его нет. Валидатор БСП анализирует метаданные табличной части документа, не находит там реквизита Активность и блокирует загрузку правил.
Хозрасчетный. Поля ВалютаДт, ВалютаКт, ПодразделениеДт и им подобные являются динамическими (стандартными) полями регистра бухгалтерии. Платформа 1С генерирует их «на лету» на основе признаков учета субконто или измерений. В физических метаданных регистра (в ветках «Реквизиты» или «Измерения») этих полей в явном виде нет. Прямолинейный алгоритм проверки БСП обращается к коллекции метаданных напрямую, не находит физического реквизита с именем ВалютаДт в объекте СписаниеБезналичныхДенежныхСредств и выдает ошибку.
Теперь, когда причины понятны, рассмотрим по шагам, как решить эту проблему.
---
В методологии разработки 1С перенос документов вместе с их движениями (записями регистров) считается архитектурным антипаттерном. Правильный и самый надежный подход — переносить только сами документы (их реквизиты и табличные части), а в базе-приемнике запускать их проведение. Это гарантирует актуальность движений и исключает возникновение коллизий в регистрах.
Для реализации этого подхода выполним следующие действия в конфигурации «Конвертация данных 2.1»:
Хозрасчетный у документа СписаниеБезналичныхДенежныхСредств и регистра Удержания у документа НачислениеЗарплатыИВзносов).Для того чтобы документы автоматически проводились в базе-приемнике после загрузки, мы можем использовать стандартный механизм БСП или прописать обработчик в КД2. Например, в ПКО нужного документа на вкладке «После загрузки» можно написать следующий код:
// Режим записи документа при загрузке
РежимЗаписи = РежимЗаписиДокумента.Проведение;
Или, если вы хотите использовать стандартные возможности БСП, установите соответствующий флаг автоматического проведения в настройках узла плана обмена в самой базе данных.
---
Если в вашей бизнес-логике перенос движений документов является критически важным (например, переносятся ручные операции, корректировки записей регистров или документы, которые нельзя проводить в приемнике «задним числом»), нам придется оставить выгрузку движений, но точечно отключить проблемные свойства.
Разберем этот процесс по шагам:
СписаниеБезналичныхДенежныхСредств).Хозрасчетный).ВалютаДт и ВалютаКт. Нам нужно либо полностью снять с них флаг активности, либо установить для них свойство «Отключить».НачислениеЗарплатыИВзносов: найдем виртуальную ТЧ Удержания (которая относится к движениям регистра) и отключим ПКС для свойства Активность.Если значения этих полей критически важны для переноса, мы можем заполнить их на стороне приемника в обработчике ПослеЗагрузки, обратившись к метаданным напрямую, либо передать их через параметры (исходящие данные) и обработать программно, минуя стандартное сопоставление ПКС.
---
Часто корни проблемы лежат в самом начале работы — на этапе выгрузки метаданных из конфигурации-источника. Если вы используете стандартную обработку MD83Exp.epf (Выгрузка описания конфигурации), по умолчанию она выгружает абсолютно все объекты со всеми связями.
Для такой огромной конфигурации, как 1С:Комплексная автоматизация 2, автоматическая генерация правил «для всего подряд» создает колоссальный объем избыточных и некорректных связей. Проанализируем, как сделать «чистую» выгрузку:
MD83Exp.epf в нашей информационной базе..xml).Этот подход не только избавит вас от ошибок БСП при загрузке правил, но и существенно повысит скорость работы самого обмена за счет оптимизации XML-схемы.
---
Если вам необходимо срочно запустить обмен через БСП, а времени на переделку правил в КД2 нет, можно временно отключить строгую проверку ПКС в самом коде БСП. Рассмотрим, как это сделать (обратите внимание, что данный способ требует изменения конфигурации или создания расширения):
ОбменДаннымиСервер, процедура ПроверитьПравилаОбменаПриЗагрузке или аналогичная).
// Примерный фрагмент кода БСП, вызывающий ошибку:
Если Не МетаданныеОбъектаСодержитРеквизит Тогда
ВызватьИсключение НСтр("ru = 'Реквизит не существует в табличной части...'");
КонецЕсли;
Важное предупреждение: Данный способ является временным решением (костылем). Отключение проверки на уровне БСП может привести к тому, что реальные ошибки в правилах обмена не будут обнаружены вовремя, что вызовет сбои непосредственно в момент выполнения трансляции данных.
---
Если вы хотите избежать сложностей интеграции КД2 в механизмы БСП, можно применить комбинированный подход, который часто используют опытные разработчики. Мы разделяем План обмена и сами Правила:
УниверсальныйОбменДаннымиXML.Пример программного запуска выгрузки по плану обмена с использованием обработки УниверсальныйОбменДаннымиXML:
ОбработкаОбмена = Обработки.УниверсальныйОбменДаннымиXML.Создать();
ОбработкаОбмена.ИмяФайлаПравилОбмена = "C:\Rules\ExchangeRules.xml";
ОбработкаОбмена.ИмяФайлаДанных = "C:\Exchange\DataOut.xml";
ОбработкаОбмена.РежимОбмена = "Выгрузка";
// Настраиваем отбор по плану обмена
ОбработкаОбмена.ИспользоватьОтборПоПлануОбмена = Истина;
ОбработкаОбмена.ПланОбменаДляОтбора = ПланыОбмена.МойНовыйПланОбмена.НайтиПоКоду("001");
ОбработкаОбмена.ВыполнитьВыгрузку();
Этот способ позволяет использовать всю гибкость и простоту обработки УниверсальныйОбменДаннымиXML, не сталкиваясь с жесткими ограничениями валидации БСП, и при этом сохраняет регистрацию изменений для оптимизации объема выгружаемых данных.
Мы подробно проанализировали проблему валидации правил обмена КД2 в планах обмена БСП. Основная причина ошибок кроется в попытке автоматического переноса движений документов, которые КД2 представляет в виде виртуальных табличных частей, а БСП пытается сопоставить с реальной структурой метаданных. Наиболее правильным и методологически верным решением является отказ от переноса движений (Решение 1) и проведение документов на стороне базы-приемника. В качестве альтернативы отлично себя показывает схема с разделением регистрации изменений на плане обмена и выгрузки через внешнюю обработку (Решение 5).