При настройке обмена данными между конфигурациями (например, при переходе с ЗБУ 1.0 на БГУ 2.0) специалисты часто сталкиваются с ситуацией, когда некоторые предопределенные элементы справочников выгружаются некорректно. Основным симптомом проблемы является отсутствие в файле выгрузки (XML) специального свойства ИмяПредопределенногоЭлемента. Без этого признака база-приемник не может идентифицировать объект как предопределенный, что приводит к ошибкам загрузки или созданию дублей, которые невозможно использовать в логике программы. Рассмотрим подробно причины возникновения этой ошибки и алгоритм ее устранения.
Прежде чем приступать к исправлению, проанализируем, как платформа 1С формирует файл обмена. Когда мы используем "1С:Конвертация данных 2.0", признак предопределенности передается не как обычный реквизит, а как системная информация. В XML-файле это выглядит следующим образом:
<Объект Тип="СправочникСсылка.ВидыОпераций" ИмяПредопределенногоЭлемента="ЗП_Отчисления_СтраховыеВзносы">
<Ссылка>
<Свойство Имя="{УникальныйИдентификатор}">
<Значение>00000000-0000-0000-0000-000000000000</Значение>
</Свойство>
</Ссылка>
...
</Объект>
Если в вашем файле выгрузки отсутствует атрибут ИмяПредопределенногоЭлемента, база-приемник будет пытаться найти объект по УникальномуИдентификатору или по полям поиска (например, по Наименованию). Для справочников типа "Виды операций", где бизнес-логика жестко завязана на программные имена, это критично.
Самая распространенная причина, по которой изменения в правилах (ПКО или ПКС) не отражаются на результате выгрузки, — это использование системой устаревших правил. В современных конфигурациях на базе БСП (Библиотека стандартных подсистем), таких как БГУ 2.0, правила обмена хранятся не только в файле, который вы загружаете в план обмена, но и кэшируются в специальных регистрах.
Проанализируем ситуацию: вы редактируете правила в конфигурации "Конвертация данных", сохраняете их в XML, загружаете в узел плана обмена в базе-источнике, но выгрузка продолжает идти по старому сценарию. Это происходит потому, что система берет правила из регистра сведений Правила для обмена данными.
Пошаговый алгоритм решения:
В типовых конфигурациях, связанных с расчетом заработной платы и страховых взносов (ЗБУ, ЗУП), имена предопределенных элементов могут быть чрезвычайно длинными. Например: ЗП_Отчисления_СтраховыеВзносы_ПФРЗаЗанятыхНаТяжелыхИПрочихРаботахСпецОценка.
Проанализируем ситуацию с точки зрения платформы. Длина идентификатора объекта метаданных ограничена 128 символами, но при выгрузке через План обмена могут срабатывать ограничения в 50 или 100 символов, если в правилах прописаны дополнительные проверки или используется поиск по наименованию. Если "хвост" имени обрезается, система перестает понимать, что перед ней предопределенный элемент.
Посмотрим, как проверить целостность данных в базе-источнике. Иногда визуально элемент кажется предопределенным (в списке стоит соответствующая иконка), но его внутреннее имя в базе данных (поле ИмяПредопределенныхДанных) пустое или повреждено. Для исправления выполните следующие действия:
Для диагностики проблемы крайне полезно сравнить результаты выгрузки штатным средством (через План обмена) и внешней обработкой. Рассмотрим пошагово, как это сделать:
Если в файле, полученном через обработку, тег ИмяПредопределенногоЭлемента присутствует, а в файле из Плана обмена — нет, значит, проблема однозначно в кэшировании правил в регистре (см. Причину №1). Если же его нет и там, нужно проверять настройку "Конвертации значений" в ПКО.
Для справочников, состоящих только из предопределенных данных, в правилах конвертации объектов (ПКО) рекомендуется использовать закладку "Конвертация значений". Разберем, как правильно ее заполнить:
ПФР_ТяжелыеУсловия в источнике должна соответствовать СтраховыеВзносыТяжелыеУсловия в приемнике.Если вы хотите убедиться, что платформа "видит" имя предопределенного элемента перед выгрузкой, можно добавить отладочный код в обработчик ПКО "Перед выгрузкой":
Если Источник.Предопределенный Тогда
ИмяПредопределенного = Источник.Метаданные().ИмяПредопределенныхДанных(Источник);
Если ПустаяСтрока(ИмяПредопределенного) Тогда
Сообщить("Внимание! У элемента '" + Источник + "' не заполнено системное имя!");
Иначе
Сообщить("Выгружается предопределенный: " + ИмяПредопределенного);
КонецЕсли;
КонецЕсли;
Этот код позволит вам при выгрузке сразу увидеть, какие элементы "теряют" свою идентичность. Если в окне сообщений вы видите пустое имя, значит, проблема в самой базе данных и требуется процедура ТестированиеИИсправление.
Проблема отсутствия свойства ИмяПредопределенногоЭлемента обычно решается в два этапа: сначала мы исключаем "зависание" старых правил в регистре сведений конфигурации, а затем проверяем корректность самих данных в базе-источнике. Использование "Универсального обмена" как эталонного инструмента позволяет быстро локализовать место ошибки и убедиться в работоспособности ваших правил конвертации.