При выполнении технического слияния баз, например, при переносе данных из одной организации в 18 различных информационных баз 1С:Бухгалтерия предприятия 3.0, разработчики часто сталкиваются с проблемой рассинхронизации предопределенных данных. Типичная ситуация: в источнике и приемнике справочники имеют одинаковые наименования, но разные внутренние идентификаторы (UUID). Если в конфигурации установлен глобальный запрет на выгрузку предопределенных элементов (чтобы избежать дублей), стандартный поиск по идентификатору не срабатывает, и реквизиты документов остаются пустыми или заполняются некорректно. Разберем подробно, как решить эту задачу в рамках Конвертации данных 2.0 (КД 2.0).
По умолчанию КД 2.0 пытается найти объект в приемнике по внутреннему идентификатору. Если объект является предопределенным и выгрузка самих предопределенных элементов запрещена (чтобы не перетереть свойства в приемнике), то в файл выгрузки попадает только ссылка. При загрузке документа система видит ссылку, не находит её в базе-приемнике по UUID и, если не настроены дополнительные поля поиска, оставляет реквизит незаполненным. Нам необходимо заставить систему выполнять поиск по иным критериям, таким как Наименование или, что более надежно, ИмяПредопределенныхДанных.
Использование Наименования для поиска не всегда надежно, так как пользователи могут изменить название статьи ДДС или другого справочника в пользовательском режиме. Однако внутреннее имя (заданное в конфигураторе) остается неизменным. Проанализируем, как передать это имя через обработчики.
В правилах конвертации свойств (ПКС) документа для нужного реквизита (например, СтатьяРасходов) в обработчике Перед выгрузкой можно принудительно передать имя предопределенного элемента. Рассмотрим программный код:
// В обработчике ПКС "СтатьяРасходов" Перед выгрузкой
Если ЗначениеЗаполнено(Источник.СтатьяРасходов) Тогда
Если Источник.СтатьяРасходов.Предопределенный Тогда
Значение = Источник.СтатьяРасходов.ИмяПредопределенныхДанных;
КонецЕсли;
КонецЕсли;
Или еще более лаконичный вариант, предложенный участниками обсуждения:
Значение = Источник.СтатьяДДС.ИмяПредопределенныхДанных;
Этот подход требует, чтобы в правилах конвертации объекта (ПКО) для данного справочника на закладке Настройки поиска был включен поиск по свойству ИмяПредопределенныхДанных.
Если программный код писать не хочется, можно воспользоваться штатными настройками ПКО справочника. Рассмотрим этот вариант по шагам:
СтатьиДвиженияДенежныхСредств).Наименование (или ИмяПредопределенныхДанных, если оно выгружается в ПКС).Важно помнить: если вы используете поиск по наименованию, убедитесь, что в приемнике нет дублей с таким же названием, иначе система может выбрать первый попавшийся элемент.
Для предопределенных данных в КД 2.0 существует специализированный механизм — Конвертация значений. Это самый «чистый» способ сопоставления с точки зрения архитектуры обмена. Проанализируем алгоритм настройки:
В настройках ПКО перейдем на закладку Конвертация значений. Нажмем кнопку Заполнить. Система проанализирует конфигурации источника и приемника и выведет список предопределенных элементов. Здесь можно вручную сопоставить элемент источника «Оплата поставщику» с соответствующим элементом в приемнике. В этом случае, какой бы UUID ни был у элемента, КД 2.0 передаст его внутренний идентификатор значения, и приемник однозначно определит нужный объект.
Если необходимо выполнить поиск непосредственно в момент загрузки самого документа, не полагаясь на настройки ПКО справочника, можно воспользоваться обработчиком После загрузки в ПКС документа. Рассмотрим ситуацию, когда нам нужно найти статью по наименованию:
// В обработчике ПКС реквизита документа "При загрузке"
СтатьяНаименование = "Оплата труда"; // Значение, переданное в данных
НайденнаяСсылка = Справочники.СтатьиДвиженияДенежныхСредств.НайтиПоНаименованию(СтатьяНаименование);
Если Не НайденнаяСсылка.Пустая() Тогда
Объект.СтатьяРасходов = НайденнаяСсылка;
КонецЕсли;
Однако такой подход менее предпочтителен, так как он обходит стандартные механизмы конвертации и усложняет поддержку правил.
Разберем важный нюанс, специфичный для Бухгалтерии предприятия 3.0. Некоторые справочники (например, статьи ДДС или статьи затрат) могут заполняться программно при первом запуске базы. Технически такие элементы не являются предопределенными (у них пустое поле ИмяПредопределенныхДанных), хотя для пользователя они выглядят как системные.
В этом случае поиск по ИмениПредопределенныхДанных не сработает. Рекомендуется:
Наименование + Код.ВидДвиженияДенежныхСредств), если он заполнен и уникален для этих элементов.Чтобы гарантированно избежать появления дублей при техническом слиянии, в ПКС документа для ссылочного реквизита можно установить флаг Выгружать объект в значение Ложь. Посмотрим, что это дает: в файл выгрузки попадет информация, достаточная для поиска (поля поиска), но сам XML-пакет с описанием объекта справочника создан не будет. Приемник попытается найти объект в своей базе, и если не найдет — просто оставит реквизит пустым (или выдаст предупреждение), но не создаст «мусорный» элемент.
Для программной реализации этого в обработчике Перед выгрузкой ПКС используйте:
ВыгрузитьОбъект = Ложь;
Это заставит систему работать только в режиме поиска существующего значения в базе-приемнике.