При интеграции баз данных 1С посредством COM-соединения часто возникают ситуации, когда стандартные механизмы запросов ведут себя непредсказуемо, особенно если речь заходит об объектах, созданных в расширениях конфигурации. Разберем, почему возникает ситуация, при которой поля справочника из расширения приходят пустыми, и как обойти это ограничение.
Когда мы выполняем запрос через БазаИсточник.NewObject("Запрос"), платформа 1С пытается выполнить этот запрос в контексте базы-источника. Если нужный объект (справочник) находится в расширении, при попытке передачи результатов через COM-соединение в базу-приемник механизм сериализации может столкнуться с тем, что тип данных или структура метаданных расширения не распознаются корректно на стороне вызывающей базы.
Важно понимать, что обращение БазаИсточник.Справочники.ИмяСправочника.НайтиПоКоду() работает, потому что это прямое обращение к менеджеру объекта через COM-интерфейс. В этом случае мы получаем полноценный COM-объект, существующий в памяти удаленной базы. Однако в Запросе данные проходят стадию формирования выборки, где поля справочника из расширения могут терять свою привязку к метаданным при маршаллинге (передаче данных через границы процессов).
Рассмотрим несколько эффективных подходов к решению этой задачи, которые помогут избежать пустых значений в выборке.
Самый надежный способ, который рекомендуют опытные разработчики — это отказ от попыток передать «Ссылку» на объект из расширения напрямую. Вместо этого мы передаем уникальный идентификатор или код, по которому объект можно однозначно идентифицировать в базе-приемнике.
Разберем алгоритм по шагам:
Код или Наименование (как строку).Пример реализации на стороне базы-приемника:
// В запросе выбираем поле Код
Запрос.Текст = "ВЫБРАТЬ Код КАК КодДоговора ...";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
// Очищаем код от лишних пробелов для точного поиска
КодДоговора = СокрЛП(Выборка.Код);
// Выполняем поиск в базе-приемнике или получаем объект через COM
НайденныйОбъект = БазаИсточник.Справочники.ДоговораФизическихЛиц.НайтиПоКоду(КодДоговора);
Если ЗначениеЗаполнено(НайденныйОбъект) Тогда
// Работаем с найденным объектом
КонецЕсли;
КонецЦикла;
При получении данных из COM-запроса часто возникают проблемы с типизацией строк. Иногда поле Код может передаваться с избыточными пробелами, что мешает корректному поиску. Всегда используйте функцию СокрЛП при обработке результатов, полученных из COM-соединения.
Если вы столкнулись с тем, что данные «пустые», убедитесь, что вы не используете в запросе конструкцию ВЫБРАТЬ РАЗРЕШЕННЫЕ, если у пользователя, под которым происходит соединение, недостаточно прав на объекты расширения. Иногда удаление этого ключевого слова позволяет «увидеть» данные, которые ранее блокировались системой прав.
Если вам необходимо передать большой объем данных, структура которых сложна (например, когда справочник расширения содержит много реквизитов), оптимальным решением будет сериализация данных в JSON внутри базы-источника.
Порядок действий:
Массив или Структуру с данными.JSON, используя ЗаписьJSON.Этот метод исключает ошибки маршаллинга типов COM, так как вы работаете с простым текстовым форматом, который платформа гарантированно доставит корректно.
Проанализировав ситуацию, мы пришли к выводу, что работа с расширениями через COM-запросы имеет свои особенности сериализации. Чтобы ваша интеграция работала стабильно:
СокрЛП.COM-соединения — отсутствие прав на расширение является частой скрытой причиной пустых результатов.Применяя эти простые рекомендации, вы сможете наладить надежный обмен данными между базами, даже если часть функционала вынесена в расширения.