При настройке правил обмена между конфигурациями «Управление торговлей», редакция 10.1 (источник) и «Управление торговлей», редакция 10.3 (приемник) разработчики часто сталкиваются с ситуацией, когда контактная информация контрагентов не выгружается, а запрос к регистру сведений возвращает пустой результат. Кроме того, в процессе отладки правил может возникать ошибка Получение элемента по индексу для значения не определено. Разберем по шагам причины этих проблем и способы их устранения.
Проанализируем структуру метаданных обеих конфигураций, чтобы понять, почему прямой запрос к регистру сведений по ссылке на контрагента не возвращает записей:
Контрагенты, а к подчиненным справочникам ЮридическиеЛица или ФизическиеЛица. Ссылка на контрагента хранится в реквизите Контрагент этих справочников, а в регистре сведений КонтактнаяИнформация в измерении Объект указывается ссылка именно на юр. лицо или физ. лицо.Контрагенты (а также организаций, пользователей и т. д.), а отдельные справочники юридических и физических лиц для контрагентов отсутствуют.Таким образом, чтобы получить контактные данные контрагента из базы-источника (УТ 10.1), необходимо сначала найти связанное юридическое или физическое лицо, а затем передать его в качестве параметра запроса к регистру.
Выясним причину ошибки, возникающей при включенном режиме отладки обработчиков выгрузки. В коде выгрузки часто используют следующий вызов:
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
ВыгрузитьПоПравилу(Выборка, , , , "КонтактнаяИнформация");
КонецЦикла;
В режиме формирования модуля отладки обработчиков конфигурация «Конвертация данных» генерирует код, который обращается к свойствам переданного источника через квадратные скобки: Источник[ИмяРеквизита]. Объект платформы ВыборкаИзРезультатаЗапроса не поддерживает обращение по индексу или имени колонки через оператор [], в отличие от структуры, строки таблицы значений или объекта 1С. В результате возникает исключение.
Чтобы исключить эту ошибку и обеспечить стабильную работу как в обычном режиме, так и в режиме отладки, необходимо передавать данные в виде структуры либо строки таблицы значений.
Разберем правильный алгоритм переноса контактных данных в правиле конвертации объектов (ПКО) справочника Контрагенты.
Вместо выполнения нескольких отдельных запросов объединим выборку по юридическим и физическим лицам в единый запрос и выгрузим результат в таблицу значений или структуру:
Если Не Источник.ЭтоГруппа И Не Источник.ПометкаУдаления Тогда
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| КИ.Тип КАК Тип,
| КИ.Вид КАК Вид,
| КИ.Представление КАК Представление,
| КИ.Поле1 КАК Поле1,
| КИ.Поле2 КАК Поле2,
| КИ.Поле3 КАК Поле3,
| КИ.Поле4 КАК Поле4,
| КИ.Поле5 КАК Поле5,
| КИ.Поле6 КАК Поле6,
| КИ.Поле7 КАК Поле7,
| КИ.Поле8 КАК Поле8,
| КИ.Поле9 КАК Поле9,
| КИ.Поле10 КАК Поле10,
| КИ.Комментарий КАК Комментарий,
| &КонтрагентСсылка КАК Объект
|ИЗ
| РегистрСведений.КонтактнаяИнформация КАК КИ
|ГДЕ
| КИ.Объект В (
| ВЫБРАТЬ ЮЛ.Ссылка ИЗ Справочник.ЮридическиеЛица КАК ЮЛ ГДЕ ЮЛ.Контрагент = &КонтрагентСсылка
| ОБЪЕДИНИТЬ ВСЕ
| ВЫБРАТЬ ФЛ.Ссылка ИЗ Справочник.ФизическиеЛица КАК ФЛ ГДЕ ФЛ.Контрагент = &КонтрагентСсылка
| )";
Запрос.УстановитьПараметр("КонтрагентСсылка", Источник.Ссылка);
ТЗ = Запрос.Выполнить().Выгрузить();
Для Каждого Стр Из ТЗ Цикл
ВходящиеДанныеДляКИ = Новый Структура;
Для Каждого Колонка Из ТЗ.Колонки Цикл
ВходящиеДанныеДляКИ.Вставить(Колонка.Имя, Стр[Колонка.Имя]);
КонецЦикла;
ВыгрузитьПоПравилу(Неопределено, , ВходящиеДанныеДляКИ, , "КонтактнаяИнформация");
КонецЦикла;
КонецЕсли;
В ПКО регистра сведений устанавливаем флаг «Не замещать существующие объекты при загрузке» (или настраиваем запись набора по необходимости). Для всех правил конвертации свойств (ПКС) включаем флаг «Получать из входящих данных», так как мы передаем значения через структуру ВходящиеДанные.
Для ПКС измерения Объект указываем в качестве правила конвертации ПКО справочника Контрагенты. Значение берется из ВходящиеДанные.Объект (в котором уже лежит ссылка на самого контрагента).
В источнике справочник/перечисление ВидыОбъектовКонтактнойИнформации содержит значения Юридические лица и Физические лица, тогда как в приемнике используется значение Контрагенты. Для корректной синхронизации необходимо:
ВидыОбъектовКонтактнойИнформации сопоставить значения источника ЮридическиеЛица и ФизическиеЛица с единым значением приемника Контрагенты.Вид настроить поиск соответствий по наименованию или сопоставить предопределенные элементы справочника ВидыКонтактнойИнформации (например, «Юридический адрес физ. лица» и «Юридический адрес юр. лица» перенаправить на «Юридический адрес контрагента»).Такой подход полностью решает проблему несоответствия типов данных между УТ 10.1 и УТ 10.3, обеспечивает корректную работу интерактивной отладки и предотвращает дублирование запросов к базе данных.