Как настроить поиск предопределенных элементов справочников в реквизитах документов при использовании Конвертации данных 2.0

Программист 1С v8.3 (Обычные формы) 1C:Бухгалтерия Бухгалтерский учет IT и автоматизация бизнеса
← На главную

При выполнении технического слияния баз, например, при переносе данных из одной организации в 18 различных информационных баз 1С:Бухгалтерия предприятия 3.0, разработчики часто сталкиваются с проблемой рассинхронизации предопределенных данных. Типичная ситуация: в источнике и приемнике справочники имеют одинаковые наименования, но разные внутренние идентификаторы (UUID). Если в конфигурации установлен глобальный запрет на выгрузку предопределенных элементов (чтобы избежать дублей), стандартный поиск по идентификатору не срабатывает, и реквизиты документов остаются пустыми или заполняются некорректно. Разберем подробно, как решить эту задачу в рамках Конвертации данных 2.0 (КД 2.0).

Анализ проблемы: почему стандартный поиск не работает

По умолчанию КД 2.0 пытается найти объект в приемнике по внутреннему идентификатору. Если объект является предопределенным и выгрузка самих предопределенных элементов запрещена (чтобы не перетереть свойства в приемнике), то в файл выгрузки попадает только ссылка. При загрузке документа система видит ссылку, не находит её в базе-приемнике по UUID и, если не настроены дополнительные поля поиска, оставляет реквизит незаполненным. Нам необходимо заставить систему выполнять поиск по иным критериям, таким как Наименование или, что более надежно, ИмяПредопределенныхДанных.

Способ 1. Синхронизация по Имени предопределенных данных

Использование Наименования для поиска не всегда надежно, так как пользователи могут изменить название статьи ДДС или другого справочника в пользовательском режиме. Однако внутреннее имя (заданное в конфигураторе) остается неизменным. Проанализируем, как передать это имя через обработчики.

В правилах конвертации свойств (ПКС) документа для нужного реквизита (например, СтатьяРасходов) в обработчике Перед выгрузкой можно принудительно передать имя предопределенного элемента. Рассмотрим программный код:


// В обработчике ПКС "СтатьяРасходов" Перед выгрузкой
Если ЗначениеЗаполнено(Источник.СтатьяРасходов) Тогда
    Если Источник.СтатьяРасходов.Предопределенный Тогда
        Значение = Источник.СтатьяРасходов.ИмяПредопределенныхДанных;
    КонецЕсли;
КонецЕсли;

Или еще более лаконичный вариант, предложенный участниками обсуждения:

Значение = Источник.СтатьяДДС.ИмяПредопределенныхДанных;

Этот подход требует, чтобы в правилах конвертации объекта (ПКО) для данного справочника на закладке Настройки поиска был включен поиск по свойству ИмяПредопределенныхДанных.

Способ 2. Настройка ПКО для поиска по наименованию и запрет создания дублей

Если программный код писать не хочется, можно воспользоваться штатными настройками ПКО справочника. Рассмотрим этот вариант по шагам:

  1. Откроем ПКО нужного справочника (например, СтатьиДвиженияДенежныхСредств).
  2. На закладке Настройки поиска установим флаг Продолжить поиск по полям поиска, если не найден объект по идентификатору.
  3. В списке полей поиска отметим Наименование (или ИмяПредопределенныхДанных, если оно выгружается в ПКС).
  4. Чтобы система не создавала новые элементы, если они не найдены, в обработчике При загрузке или в настройках правила можно установить флаг Не замещать существующие объекты в приемнике.

Важно помнить: если вы используете поиск по наименованию, убедитесь, что в приемнике нет дублей с таким же названием, иначе система может выбрать первый попавшийся элемент.

Способ 3. Таблица «Конвертация значений»

Для предопределенных данных в КД 2.0 существует специализированный механизм — Конвертация значений. Это самый «чистый» способ сопоставления с точки зрения архитектуры обмена. Проанализируем алгоритм настройки:

В настройках ПКО перейдем на закладку Конвертация значений. Нажмем кнопку Заполнить. Система проанализирует конфигурации источника и приемника и выведет список предопределенных элементов. Здесь можно вручную сопоставить элемент источника «Оплата поставщику» с соответствующим элементом в приемнике. В этом случае, какой бы UUID ни был у элемента, КД 2.0 передаст его внутренний идентификатор значения, и приемник однозначно определит нужный объект.

Способ 4. Программная подстановка при загрузке документа

Если необходимо выполнить поиск непосредственно в момент загрузки самого документа, не полагаясь на настройки ПКО справочника, можно воспользоваться обработчиком После загрузки в ПКС документа. Рассмотрим ситуацию, когда нам нужно найти статью по наименованию:


// В обработчике ПКС реквизита документа "При загрузке"
СтатьяНаименование = "Оплата труда"; // Значение, переданное в данных
НайденнаяСсылка = Справочники.СтатьиДвиженияДенежныхСредств.НайтиПоНаименованию(СтатьяНаименование);

Если Не НайденнаяСсылка.Пустая() Тогда
    Объект.СтатьяРасходов = НайденнаяСсылка;
КонецЕсли;

Однако такой подход менее предпочтителен, так как он обходит стандартные механизмы конвертации и усложняет поддержку правил.

Особенности БП 3.0: «Ложные» предопределенные элементы

Разберем важный нюанс, специфичный для Бухгалтерии предприятия 3.0. Некоторые справочники (например, статьи ДДС или статьи затрат) могут заполняться программно при первом запуске базы. Технически такие элементы не являются предопределенными (у них пустое поле ИмяПредопределенныхДанных), хотя для пользователя они выглядят как системные.

В этом случае поиск по ИмениПредопределенныхДанных не сработает. Рекомендуется:

Предотвращение создания лишних объектов

Чтобы гарантированно избежать появления дублей при техническом слиянии, в ПКС документа для ссылочного реквизита можно установить флаг Выгружать объект в значение Ложь. Посмотрим, что это дает: в файл выгрузки попадет информация, достаточная для поиска (поля поиска), но сам XML-пакет с описанием объекта справочника создан не будет. Приемник попытается найти объект в своей базе, и если не найдет — просто оставит реквизит пустым (или выдаст предупреждение), но не создаст «мусорный» элемент.

Для программной реализации этого в обработчике Перед выгрузкой ПКС используйте:

ВыгрузитьОбъект = Ложь;

Это заставит систему работать только в режиме поиска существующего значения в базе-приемнике.

← На главную