При настройке обмена данными между современными конфигурациями на платформе 1С:Предприятие 8 и устаревшими, но все еще актуальными базами на 1С:Предприятие 7.7, разработчики часто сталкиваются с ограничениями механизма поиска. Одной из типичных задач является реализация «умного» поиска: если контрагент — юридическое лицо, его нужно искать по ИНН, а если физическое лицо — по Коду. В этой статье мы подробно разберем, как решить эту задачу в конфигурации «Конвертация данных 2.1», учитывая специфику платформы 7.7.
В платформе 8.3 мы привыкли использовать событие Поля поиска в ПКО (Правилах конвертации объектов). Это гибкий инструмент, позволяющий программно описывать логику сопоставления объектов. Однако при выгрузке в 1С 7.7 этот механизм не работает в привычном виде. Обработка загрузки для 7.7 (V77Imp.ert) имеет жестко заданный алгоритм, который ориентируется на галочки «Поиск», проставленные у свойств в ПКО. Нам нужно найти способ обойти это ограничение.
Рассмотрим самый надежный и простой в реализации способ — разделение правил конвертации для разных типов контрагентов. Вместо того чтобы пытаться заставить одно правило работать по-разному, мы создадим два специализированных правила.
Шаг 1. Создание ПКО
Проанализируем структуру справочника Контрагенты и создадим два правила:
Контрагенты_ЮрЛица: В настройках этого правила у свойства ИНН установим флаг «Поиск». Все остальные флаги поиска (включая Код и Наименование) должны быть сняты.Контрагенты_ФизЛица: Здесь, наоборот, установим флаг «Поиск» только у свойства Код.Шаг 2. Программное переключение правил
Теперь выясним, как заставить систему выбирать нужное правило. В тех местах, где контрагент используется как свойство (например, в документах или других справочниках), нам нужно зайти в ПКС (Правила конвертации свойств) для этого реквизита. В обработчике Перед выгрузкой пропишем следующий код:
// Проверяем тип контрагента в источнике (1С 8)
Если Источник.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ЮрЛицо Тогда
ИмяПКО = "Контрагенты_ЮрЛица";
Иначе
ИмяПКО = "Контрагенты_ФизЛица";
КонецЕсли;
Этот подход гарантирует, что при загрузке в 7.7 система будет использовать именно те поля поиска, которые определены в выбранном ПКО.
Если по каким-то причинам плодить ПКО нежелательно (например, из-за сложной иерархии или большого количества зависимых правил), мы можем реализовать поиск кодом на языке 1С 7.7. Важно помнить, что в момент загрузки в 7.7 у нас нет доступа к Источнику (объекту 8-ки), но у нас есть данные, которые пришли в файле.
Алгоритм действий:
Контрагенты в обработчике При загрузке (который выполняется на стороне 7.7) напишем код поиска.Пример кода для обработчика При загрузке (синтаксис 7.7):
// Объект — это создаваемый или найденный элемент справочника в 7.7
// ПараметрыОбъекта — структура с переданными данными
СпрК = СоздатьОбъект("Справочник.Контрагенты");
Если ПараметрыОбъекта.Получить("ЭтоЮрЛицо") = 1 Тогда
// Пытаемся найти по ИНН
Если СпрК.НайтиПоРеквизиту("ИНН", ПараметрыОбъекта.Получить("ИНН"), 1) = 1 Тогда
Объект = СпрК.ТекущийОбъект();
КонецЕсли;
Иначе
// Пытаемся найти по коду
Если СпрК.НайтиПоКоду(ПараметрыОбъекта.Получить("Код"), 0) = 1 Тогда
Объект = СпрК.ТекущийОбъект();
КонецЕсли;
КонецЕсли;
Чтобы стандартный поиск 7.7 не перезаписал наш результат, можно использовать флаги управления загрузкой, предусмотренные в обработке V77Imp.ert.
Рассмотрим специфические моменты, которые могут помешать корректному поиску, даже если код написан правильно:
ИНН часто хранится в одной строке с КПП через дробь (1234567890/123456789). В 1С 8 это разные реквизиты. Перед поиском в 7.7 убедитесь, что вы сравниваете данные в правильном формате. Рекомендуем «склеивать» ИНН и КПП в 8-ке перед выгрузкой в ПКС.НайтиПоКоду может зависеть от того, является ли справочник иерархическим и какой установлен режим поиска (во всем справочнике или внутри группы). Проанализируем настройки справочника в конфигураторе 7.7 перед написанием правил.ВыгрузитьПоПравилу(Источник, , , , "Контрагенты_ЮрЛица"). Это позволит вам жестко задать алгоритм конвертации для конкретного экземпляра объекта.Для реализации сложного поиска при обмене с 7.7 мы рекомендуем использовать метод разделения ПКО. Это наиболее «чистый» способ с точки зрения архитектуры Конвертации данных 2.1. Он позволяет избежать написания сложного кода на языке 7.7 и делает правила обмена более прозрачными для отладки. Посмотрим на ситуацию еще раз: разделяя логику на уровне выбора ПКО, мы используем штатные возможности платформы 7.7 по поиску, что минимизирует риск ошибок при загрузке данных.