Как выгрузить таблицу значений из COM-объекта в 1С?

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

Работа с внешними базами данных через COM-соединение — это стандартная задача для разработчика 1С. Часто возникает необходимость выполнить сложный запрос во внешней базе и получить результат в виде ТаблицыЗначений для дальнейшей обработки. Однако при прямом обращении к COM-объекту мы получаем не саму таблицу, а ссылку на объект внешней базы. Разберем, как эффективно передать данные на «нашу» сторону.

Почему не стоит использовать поштучный перебор?

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


// Пример итерационного перебора через COM
Пока Выборка.Следующий Цикл
    Стр = ИзРарус.Добавить;
    стр.КодРарус = Выборка.КодРарус;
    стр.НоменклатураРарус = Выборка.НаименованиеРарус;
    // ... и так далее
КонецЦикла;

Хотя этот метод рабочий, он крайне неэффективен при больших объемах данных. Каждое обращение к полю Выборка.НаименованиеРарус через COM-интерфейс — это отдельный сетевой вызов. Если в таблице тысячи строк, процесс будет идти очень долго. Поэтому мы рекомендуем использовать методы сериализации.

Решение: сериализация таблицы через ValueToStringInternal

Самый быстрый и надежный способ «вытянуть» таблицу целиком — это преобразовать её в строку во внешней базе и восстановить локально. Этот метод превращает таблицу в строковое представление, передает через COM-канал как единый пакет и восстанавливает объект в памяти локальной базы.

Разберем этот процесс по шагам:

  1. Выполняем запрос во внешней базе. Для последующего контроля проводок и поиска расхождений после загрузки данных можно использовать автоматическую сверку данных через COM-соединение.
  2. Методом Выгрузить() преобразуем результат в ТаблицуЗначений.
  3. Используем метод ValueToStringInternal(), чтобы сериализовать таблицу во внешнюю строку.
  4. Передаем полученную строку в локальную базу. Чтобы избежать проблем с невалидными ссылками при миграции, можно сопоставить объекты по произвольным полям поиска.
  5. Десериализуем строку обратно в ТаблицуЗначений функцией ЗначениеИзСтрокиВнутр().

Пример реализации:


// Код для выполнения на стороне локальной базы
// ВнешняяБД - это установленное COM-соединение
// Запрос - объект, созданный через ВнешняяБД.NewObject("Запрос")

СтрокаРезультат = ВнешняяБД.ValueToStringInternal(Запрос.Выполнить().Выгрузить());
ТабВнешняя = ЗначениеИзСтрокиВнутр(СтрокаРезультат);

Важные нюансы работы с типами данных

При использовании этого «хака» важно помнить о некоторых ограничениях:

Альтернативы для больших данных

Если объем передаваемой информации исчисляется сотнями тысяч строк, сериализация в строку может вызвать переполнение оперативной памяти. В таких случаях мы рекомендуем автоматизировать регулярный обмен данными по расписанию или:

  1. Использование JSON: В современных версиях платформы 1С лучше использовать сериализацию в JSON через ЗаписьJSON на стороне источника. Это стандарт, который позволяет более гибко работать с типами данных.
  2. Временные файлы: Выгружайте результат запроса в XML или ТабличныйДокумент во внешней базе, сохраняйте во временный файл на диске, а затем читайте его локально. Это значительно снижает нагрузку на оперативную память COM-процесса.

Используя предложенные методы, вы значительно ускорите взаимодействие между базами данных и сделаете свой код чище и профессиональнее. Не забывайте всегда закрывать соединение, присваивая переменной Соединение = Неопределено после завершения всех манипуляций.

← На главную