При организации обмена данными между 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");
Так как ссылки на объекты 8.x (например, на СправочникСсылка) нельзя «скопировать» в переменные семерки для полноценной работы, нам нужно привести результат запроса к примитивным типам прямо в коде запроса 1С 8.x. Вместо того чтобы пытаться вытащить весь объект, запрашивайте только нужные поля.
Используйте ЛЕВОЕ СОЕДИНЕНИЕ в запросе 1С 8.x, чтобы вытянуть данные из табличных частей или реквизитов сразу в плоскую структуру:
// Текст запроса на стороне 1С 8.x
"ВЫБРАТЬ
| Графики.Сотрудник КАК Сотрудник,
| Графики.График.Наименование КАК НаименованиеГрафика,
| Графики.ЗначениеПоказателя КАК Показатель
|ИЗ
| РегистрСведений.ГрафикиСотрудников.СрезПоследних(&ДатаСреза, ) КАК Графики"
После выполнения запроса на стороне 8.x, мы получаем РезультатЗапроса. Его удобно выгрузить в ТаблицуЗначений, чтобы затем последовательно обойти её средствами 1С 7.7. Рассмотрим, как это сделать:
ТаблицуЗначений.
Результат = Запрос.Выполнить();
ТЗ8 = Результат.Выгрузить();
Для инд = 0 По ТЗ8.Количество() - 1 Цикл
ТекСтрока = ТЗ8.Получить(инд);
// Обращаемся к данным как к примитивным типам
Сообщить("Сотрудник: " + ТекСтрока.Сотрудник + ", График: " + ТекСтрока.НаименованиеГрафика);
КонецЦикла;
Помните, что каждый вызов свойств объекта через COM — это отдельный сетевой запрос. Если ТаблицаЗначений содержит тысячи строк, перебор через цикл в 7.7 будет работать медленно.
Если данных очень много, рекомендуем:
ЗначениеВСтрокуВнутр (на стороне 8.x) и ЗначениеИзСтрокиВнутр (на стороне 7.7) для передачи сложных структур данных, если они требуются в неизменном виде.Следуя этим рекомендациям, вы сможете эффективно интегрировать системы, избегая проблем с несовместимостью типов и низкой производительностью COM-соединения.