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