Как передать параметры в запрос из 1С 7.7 в 1С 8.1 и прочитать результат через COM-соединение?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

При организации обмена данными между 1С 7.7 и 1С 8.1 с использованием COM-соединения, программисты часто сталкиваются с трудностями при передаче параметров и получении сложных объектов. В этой статье мы подробно разберем, как правильно выстроить взаимодействие между двумя базами, чтобы запрос отрабатывал корректно, а данные были доступны в привычном для 7.7 виде.

Понимание архитектуры взаимодействия

Первое, что необходимо уяснить: 1С 7.7 и 1С 8.x — это две разные среды исполнения. Данные, существующие в одной базе (например, ссылки на справочники 8.x), не могут быть напрямую «переданы» в 7.7 как объекты. При попытке это сделать вы получите лишь указатель на COM-объект, чьи свойства и методы будут доступны только при обращении к серверу 8.x.

Ключевое правило интеграции: между системами можно передавать только примитивные типы данных: Строка, Число, Дата, Булево. Все сложные манипуляции с объектами должны происходить на стороне 8.x.

Передача параметров даты и фильтров

При передаче даты из 1С 7.7 в параметр запроса 1С 8.x важно помнить, что в восьмерке тип Дата всегда содержит время. Если вы передаете дату без времени, она интерпретируется как начало дня (00:00:00). Если ваш запрос должен захватывать данные за текущую дату, результат может оказаться пустым из-за этого несоответствия.

Рассмотрим пример правильной установки параметров:


// На стороне 1С 7.7:
Запрос = v8.NewObject("Запрос");
Запрос.Текст = "... ИЗ ... ГДЕ Дата >= &ДатаСреза";

// Передаем текущую дату, при необходимости добавляя сутки для полного охвата
ДатаПараметр = ТекущаяДата();
Запрос.УстановитьПараметр("ДатаСреза", ДатаПараметр);
Запрос.УстановитьПараметр("ТабНом", "980");

Как получить результат запроса в 1С 7.7

Так как ссылки на объекты 8.x (например, на СправочникСсылка) нельзя «скопировать» в переменные семерки для полноценной работы, нам нужно привести результат запроса к примитивным типам прямо в коде запроса 1С 8.x. Вместо того чтобы пытаться вытащить весь объект, запрашивайте только нужные поля.

Используйте ЛЕВОЕ СОЕДИНЕНИЕ в запросе 1С 8.x, чтобы вытянуть данные из табличных частей или реквизитов сразу в плоскую структуру:


// Текст запроса на стороне 1С 8.x
"ВЫБРАТЬ
|   Графики.Сотрудник КАК Сотрудник,
|   Графики.График.Наименование КАК НаименованиеГрафика,
|   Графики.ЗначениеПоказателя КАК Показатель
|ИЗ
|   РегистрСведений.ГрафикиСотрудников.СрезПоследних(&ДатаСреза, ) КАК Графики"

Работа с результатами через таблицу значений

После выполнения запроса на стороне 8.x, мы получаем РезультатЗапроса. Его удобно выгрузить в ТаблицуЗначений, чтобы затем последовательно обойти её средствами 1С 7.7. Рассмотрим, как это сделать:

  1. Выполните запрос на стороне 8.x.
  2. Выгрузите результат в ТаблицуЗначений.
  3. Организуйте цикл перебора строк на стороне 7.7.

Результат = Запрос.Выполнить();
ТЗ8 = Результат.Выгрузить();

Для инд = 0 По ТЗ8.Количество() - 1 Цикл
    ТекСтрока = ТЗ8.Получить(инд);
    // Обращаемся к данным как к примитивным типам
    Сообщить("Сотрудник: " + ТекСтрока.Сотрудник + ", График: " + ТекСтрока.НаименованиеГрафика);
КонецЦикла;

Советы по оптимизации

Помните, что каждый вызов свойств объекта через COM — это отдельный сетевой запрос. Если ТаблицаЗначений содержит тысячи строк, перебор через цикл в 7.7 будет работать медленно.

Если данных очень много, рекомендуем:

Следуя этим рекомендациям, вы сможете эффективно интегрировать системы, избегая проблем с несовместимостью типов и низкой производительностью COM-соединения.

← На главную