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

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

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

Разбор типичной ошибки: почему не работает метод ВыбратьЭлементы()

Рассмотрим ситуацию, когда разработчик пытается использовать привычный синтаксис «семерки» для работы с объектом «восьмерки». Попытка выполнить следующий код:


Заказчик = База8.Справочники.Заказчики; 
Заказчик.ВыбратьЭлементы("01.01.2016", ТекущаяДата);

приводит к ошибке выполнения: «Поле агрегатного объекта не обнаружено (ВыбратьЭлементы)». Выясним причину этой проблемы:

  1. Синтаксис целевой базы: При подключении к 1С 8 через COM-соединение мы работаем с объектами 1С 8. Это значит, что код 1С 7.7 должен использовать исключительно правила, методы и свойства конфигурации 1С 8.
  2. Отсутствие периодических справочников: В 1С 7.7 существовало понятие периодических реквизитов справочника, для выборки которых требовалось указывать даты в методе ВыбратьЭлементы(). В платформе 1С 8 периодических справочников нет — вся история изменений хранится в регистрах сведений. Соответственно, метод Выбрать() в 1С 8 не принимает параметры дат начала и окончания периода.

Реализация базовой выборки справочника через COM

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


// Получаем менеджер справочника из COM-соединения
Выборка = База8.Справочники.Заказчики.Выбрать();

// Обходим элементы выборки
Пока Выборка.Следующий() <> 0 Цикл
    Сообщить(Выборка.Наименование);
КонецЦикла;

Обратите внимание на конструкцию цикла. В оригинальном синтаксисе 1С 8 мы пишем просто Пока Выборка.Следующий() Цикл. Однако в 1С 7.7 такая запись вызовет ошибку «Выражение должно иметь логический тип». Это связано с особенностями обработки типов данных OLE/COM.

Особенность работы с булевым типом (Истина / Ложь) в COM-соединении

Проанализируем важнейшую деталь: в платформе 1С 7.7 отсутствует встроенный тип данных Булево. Вместо него используются числа (1 — Истина, 0 — Ложь). При передаче булевых значений из 1С 8 через COM-порт происходят следующие преобразования:

Именно поэтому попытка написать Пока Выборка.Следующий() = 1 Цикл приведет к тому, что цикл просто не выполнится — метод вернет значение -1, которое не равно 1. Чтобы избежать этой проблемы, мы рекомендуем использовать проверку на неравенство нулю:


Пока Выборка.Следующий() <> 0 Цикл
    // Код будет успешно выполняться для каждого найденного элемента
    Сообщить("Элемент: " + Выборка.Наименование);
КонецЦикла;

Этот способ универсален, не мозолит глаза отрицательными числами и стабильно работает во всех версиях операционных систем.

Передача булевых значений из 1С 7.7 в 1С 8

Если вам требуется не просто прочитать данные, а записать булево значение обратно в базу 1С 8 (например, установить признак «ПометкаУдаления» или провести документ), прямое присвоение чисел 1 или -1 вызовет ошибку несоответствия типов. Решить эту задачу можно двумя путями:

Способ 1. Использование внутреннего представления XML-сериализации

В платформе 1С 8 булевы значения можно воссоздать через чтение системной строки XML. Посмотрим на пример:


Истина8 = База8.ЗначениеИзСтрокиВнутр("{""B"",1}");
Ложь8   = База8.ЗначениеИзСтрокиВнутр("{""B"",0}");

// Теперь передаем эти переменные в реквизиты объекта 1С 8:
НовыйЭлемент = База8.Справочники.Заказчики.СоздатьЭлемент();
НовыйЭлемент.Наименование = "Новый контрагент";
НовыйЭлемент.ПометкаУдаления = Ложь8; // Передали "Ложь" в формате 1С 8
НовыйЭлемент.Записать();

Способ 2. Функции-обертки в конфигурации 1С 8

Если у вас есть доступ к изменению конфигурации 1С 8, вы можете создать в общем модуле (с флагом «Внешнее соединение») простую экспортную функцию:


Функция ПолучитьБулевоЗначение(ЗначениеЧислом) Экспорт
    Возврат ?(ЗначениеЧислом = 1, Истина, Ложь);
КонецФункции

В коде 1С 7.7 вызов этой функции будет выглядеть так: Объект8.Реквизит = База8.ИмяМодуля.ПолучитьБулевоЗначение(1);.

Оптимизация: Использование запросов 1С 8 из 1С 7.7

Использование метода Выбрать() для получения данных через COM-соединение сильно нагружает систему, так как при этом через сеть передаются тяжелые ссылочные объекты. Гораздо эффективнее и быстрее использовать механизм запросов 1С 8.

Поскольку в 1С 7.7 нет ключевого слова Новый для создания объектов внешней базы, мы задействуем метод NewObject(). Посмотрим на пример реализации запроса:


// Инициализируем объект запроса в контексте 1С 8
Запрос = База8.NewObject("Запрос");

// Пишем текст запроса по правилам синтаксиса 1С 8
Запрос.Текст = "
|ВЫБРАТЬ
|    Заказчики.Код КАК Код,
|    Заказчики.Наименование КАК Наименование
|ИЗ
|    Справочник.Заказчики КАК Заказчики
|ГДЕ
|    Заказчики.ПометкаУдаления = ЛОЖЬ";

// Выполняем и обходим выборку результатов
Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() <> 0 Цикл
    Сообщить("Код: " + Выборка.Код + " | Наименование: " + Выборка.Наименование);
КонецЦикла;

Важное ограничение: Мы настоятельно не рекомендуем выгружать результат запроса в ТаблицаЗначений методом Выгрузить(), если планируете обрабатывать её на стороне 1С 7.7. Передача сложных типов коллекций через COM-соединение работает крайне медленно и нестабильно. Обход выборки через Следующий() в цикле — самый надежный и быстрый вариант.

Настройка подключения и частые ошибки окружения

При инициализации подключения разработчики часто сталкиваются с ошибкой «Класс не зарегистрирован» при попытке создать объект V83.COMConnector.

Разберем причины возникновения этой проблемы и методы устранения:

  1. Разрядность платформ (x86 vs x64): Платформа 1С:Предприятие 7.7 является строго 32-битным (x86) приложением. Она физически не способна загрузить 64-битную библиотеку COM-соединения 1С 8. Чтобы исправить это, на компьютере (или сервере), где запускается «семерка», обязательно должен быть установлен 32-битный клиент платформы 1С 8.
  2. Регистрация библиотеки: Необходимо вручную зарегистрировать нужную библиотеку в операционной системе. Запустите командную строку Windows от имени администратора и выполните команду: regsvr32 "C:\Program Files (x86)\1cv8\<РелизПлатформы>\bin\comcntr.dll"
  3. Настройка COM+ на серверах x64: Если выгрузка происходит на стороне 64-битного сервера приложений, вам потребуется настроить суррогатный процесс COM+ в утилите «Службы компонентов» Windows. Это позволит связать 32-битный процесс 1С 7.7 с 64-битной библиотекой 1С 8 через специальный системный мост.
← На главную