Как подключиться из 1С 8.3 к 1С 7.7 на сервере?

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

При разработке интеграционных решений часто возникает задача получить данные из старой базы 1С 7.7 в новой системе на платформе 1С 8.3. Если код выполняется на клиенте, создание COM-объекта обычно не вызывает проблем. Но при попытке выполнить тот же код на сервере, например, в регламентном задании, можно столкнуться с ошибками "Интерфейс не поддерживается" или "Класс не зарегистрирован".

Рассмотрим два основных способа решения этой задачи: настройка COM-соединения и прямое подключение к базе данных SQL, которое является более предпочтительным и надежным.

Способ 1: Настройка COM-соединения для 1С 7.7

Этот способ заключается в том, чтобы заставить сервер 1С 8.3 "увидеть" и запустить приложение 1С 7.7 через COM. Ошибки при создании объекта Новый COMObject("v77.Application") на сервере почти всегда связаны с конфликтом разрядности и правами доступа.

Выясним причину проблемы: Сервер 1С:Предприятие 8.3 — это 64-битный процесс (rphost.exe), в то время как платформа 1С 7.7 — это 32-битное приложение. По умолчанию 64-битный процесс не может напрямую создать и взаимодействовать с 32-битным COM-объектом. Для успешной работы необходимо выполнить несколько шагов.

Разберем по шагам, что нужно сделать:

  1. Полноценная установка 1С 7.7 на сервере. Простое копирование каталога с программой недостаточно. Необходимо выполнить установку с дистрибутива, чтобы все компоненты, включая COM-объект, были корректно зарегистрированы в операционной системе. Если официальный дистрибутив не устанавливается на современной 64-битной ОС, можно найти неофициальные сборки, адаптированные для этого.
  2. Правильная регистрация 32-битной компоненты. На 64-битной Windows существуют две утилиты regsvr32.exe. Нам нужна та, что работает с 32-битными библиотеками. Она находится в папке C:\Windows\SysWOW64\. Запустите командную строку от имени администратора и выполните команду: C:\Windows\SysWOW64\regsvr32.exe "C:\Program Files (x86)\1Cv77\BIN\v77.exe"

    Путь к файлу v77.exe может отличаться в вашей системе.

  3. Настройка прав пользователя службы сервера 1С. Часто служба сервера 1С 8.3 работает от имени специального пользователя с ограниченными правами, например, USR1CV8. Этот пользователь может не иметь разрешений на запуск и взаимодействие с COM-объектами, зарегистрированными для других пользователей. Чтобы это исправить, нужно либо изменить пользователя, от имени которого запускается служба "Агент сервера 1С:Предприятия 8.3", на пользователя с достаточными правами (например, того, из-под которого вы успешно регистрировали компоненту), либо настроить права для текущего пользователя службы. Важно: изменение пользователя службы может повлиять на безопасность системы.
  4. Настройка DCOM (в крайнем случае). Если предыдущие шаги не помогли, можно проверить настройки DCOM. Запустите оснастку "Службы компонентов" (dcomcnfg), перейдите в Компьютеры -> Мой компьютер -> Настройка DCOM. Найдите в списке объект "1C:V7.7 Application", откройте его свойства и на вкладке "Безопасность" предоставьте права на "Запуск и активацию" и "Доступ" для пользователя, от имени которого работает сервер 1С 8.

Этот метод может быть сложным в настройке и не всегда стабилен в работе. Он оправдан только в тех случаях, когда вам нужно не просто получить данные, а выполнить какие-то методы или бизнес-логику, заложенную в конфигурации 1С 7.7.

Способ 2: Прямое подключение к SQL-базе 1С 7.7 (Рекомендуемый)

Если ваша база 1С 7.7 работает на Microsoft SQL Server, то самым быстрым, стабильным и производительным способом получения данных будет прямое подключение к её таблицам из 1С 8.3. Этот метод не требует установки и регистрации 1С 7.7 на сервере 1С 8.3.

Для подключения будем использовать технологию ADO (ActiveX Data Objects).

Посмотрим на пример подключения и получения данных:

Сначала необходимо создать COM-объекты для работы с ADO и установить соединение с базой данных.


// Создаем объекты для работы с ADODB
Connection = Новый COMОбъект("ADODB.Connection");
RecordSet = Новый COMОбъект("ADODB.Recordset");

// Формируем строку подключения к SQL-серверу
// Замените параметры на свои
ИмяСервераSQL = "SERVER_NAME"; // Имя или IP-адрес SQL-сервера
ИмяБазыSQL = "BASE_77_NAME";   // Имя базы данных 1С 7.7 в SQL
ПользовательSQL = "sa";         // Логин пользователя SQL
ПарольSQL = "YourPassword";   // Пароль пользователя SQL

СтрПодключения = "Provider=sqloledb;Server=" + ИмяСервераSQL 
    + ";Database=" + ИмяБазыSQL 
    + ";UID=" + ПользовательSQL 
    + ";PWD=" + ПарольSQL + ";";

// Устанавливаем таймаут и открываем соединение
Попытка
    Connection.CommandTimeout = 180; // Таймаут выполнения команды в секундах
    Connection.ConnectionString = СтрПодключения;
    Connection.Open();
Исключение
    Сообщить("Не удалось подключиться к базе 7.7! " + ОписаниеОшибки());
    Возврат;
КонецПопытки;

// Соединение установлено. Теперь можно выполнять запросы.

После установки соединения можно выполнять запросы на языке T-SQL к таблицам базы 1С 7.7. Названия таблиц и полей в 1С 7.7 не совпадают с именами объектов метаданных. Например, справочник "Номенклатура" может храниться в таблице SC152, а его реквизиты — в полях SP159, SP160 и т.д. Узнать соответствие можно, проанализировав файл 1Cv7.MD или воспользовавшись специальными утилитами.

Пример выполнения запроса и обработки результата:


// Формируем текст прямого SQL-запроса к таблицам 1С 7.7
// ВАЖНО: здесь используется "чистый" T-SQL, а не язык запросов 1С
// В данном примере SC152 - это таблица справочника "Номенклатура"
ТекстЗапроса = "
|SELECT
|   Номенклатура.ID as Идентификатор,
|   Номенклатура.Descr as Наименование,
|   Номенклатура.IsFolder as ЭтоГруппа,
|   Номенклатура.IsMark as ПометкаУдаления
|FROM
|   sc152 as Номенклатура
|WHERE
|   Номенклатура.IsFolder = 0"; // Выбираем только элементы, а не группы
    
// Выполняем запрос
Попытка
    RecordSet = Connection.Execute(ТекстЗапроса);
Исключение
    Сообщить("Ошибка выполнения запроса: " + ОписаниеОшибки());
    Connection.Close();
    Возврат;
КонецПопытки;

// Обрабатываем полученный результат
ТаблицаРезультат = Новый ТаблицаЗначений;
ТаблицаРезультат.Колонки.Добавить("Наименование");
ТаблицаРезультат.Колонки.Добавить("ЭтоГруппа");

Пока НЕ RecordSet.EOF() Цикл
    НоваяСтрока = ТаблицаРезультат.Добавить();
    НоваяСтрока.Наименование = RecordSet.Fields("Наименование").Value;
    НоваяСтрока.ЭтоГруппа = ?(RecordSet.Fields("ЭтоГруппа").Value = 1, Истина, Ложь);
    
    RecordSet.MoveNext();
КонецЦикла;

// ВАЖНО: всегда закрывайте соединение после использования
RecordSet.Close();
Connection.Close();

// Теперь данные находятся в ТаблицеЗначений и готовы к использованию
Для Каждого Строка Из ТаблицаРезультат Цикл
    Сообщить(Строка.Наименование);
КонецЦикла;

Можно ли использовать синтаксис 1С++ для запросов?

Нет, напрямую из 1С 8.3 использовать привычный синтаксис 1С++ (например, $Справочник.Номенклатура или $РегистрОстатки.ОстаткиТМЦ) невозможно. Компонента 1С++ работает только внутри среды 1С 7.7. Она перехватывает запрос со своими метаименами, анализирует метаданные текущей базы 7.7 и преобразует его в обычный T-SQL-запрос, который уже отправляется на SQL-сервер. Внешнее приложение, такое как 1С 8.3, не имеет доступа к этому механизму преобразования.

Для получения сложных данных, например, остатков по регистрам на определенную дату, потребуется написать сложный T-SQL запрос к таблицам итогов (RGxxxx, RAxxxx) и движений. В качестве альтернативы можно создать в базе 1С 7.7 регламентное задание, которое будет с помощью 1С++ рассчитывать нужные данные и складывать их в простую промежуточную SQL-таблицу. А уже из этой таблицы 1С 8.3 сможет легко и быстро забирать готовую информацию.

В заключение: для интеграции 1С 8.3 с базой 1С 7.7 на сервере настоятельно рекомендуется использовать прямое подключение к SQL. Этот метод значительно быстрее, надежнее и проще в поддержке, чем настройка капризного COM-взаимодействия между 32-битными и 64-битными приложениями. При необходимости обойтись без прямого соединения для обмена данными можно использовать обработку для переноса данных из 1С 7.7 в конфигурации 1С 8.3.

← На главную