Как организовать бесшовную интеграцию между 1С 7.7 и 1С 8.3?

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

При построении взаимодействия между системами на платформах 1С:Предприятие 7.7 и 1С:Предприятие 8.3 разработчики сталкиваются с рядом технических ограничений. К ним относятся разность архитектур (32-разрядная 7.7 и 64-разрядный сервер 8.3), особенности передачи прикладных типов данных (булево, неопределено, null, дата со временем) через OLE, а также совместимость устаревших платформ с современными СУБД MS SQL Server. В этом материале мы подробнее разберем практические способы реализации бесшовной связки двух систем.

1. Организация OLE/COM-соединения и преодоление разрядности

Самым популярным способом взаимодействия остается прямое вызововое COM-соединение. При передаче стандартных реквизитов документов (номера, даты, числа и строки) OLE-соединение работает стабильно. Однако важным нюансом является разрядность процессов:

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

Рассмотрим пример подключения из 1С 7.7 к базе 1С 8.3 через COM-соединение:


V83 = СоздатьОбъект("V83.COMConnector");
СтрокаПодключения = "Srvr=""Server1C"";Ref=""Base83"";Usr=""Admin"";Pwd=""Secret"";";
Соединение83 = V83.Connect(СтрокаПодключения);
Если ПустоеЗначение(Соединение83) = 0 Тогда
    // Вызов функции экспортного модуля 8.3
    Результат = Соединение83.ОбменДаннымиСервер.ПолучитьДанные(Параметры);
КонецЕсли;

2. Передача сложных типов данных и времени через JSON

При передаче данных через OLE могут возникать коллизии: тип Булево из 8.3 в 7.7 приводится к числовому значению (0 или 1), при этом невозможно корректно передать значение Неопределено или NULL, а также время в составе даты.

Разберем эффективный способ решения этой проблемы — сериализацию данных в формат JSON. Вместо передачи составных типов 1С 7.7 выгружает или принимает текстовую строку JSON, которая однозначно трактуется обеими системами.

Рассмотрим пример отправки JSON-структуры из 1С 7.7 с помощью системного COM-объекта WinHttp.WinHttpRequest.5.1:


HTTP = СоздатьОбъект("WinHttp.WinHttpRequest.5.1");
HTTP.Open("POST", "http://server-83/base/hs/exchange/put_data", 0);
HTTP.SetRequestHeader("Content-Type", "application/json; charset=utf-8");

// Формируем JSON-строку
ТекстJSON = "{""DocDate"": ""2023-10-25T14:30:00"", ""IsProcessed"": true, ""NullValue"": null}";
HTTP.Send(ТекстJSON);

ОтветСтатус = HTTP.Status;
ОтветТекст = HTTP.ResponseText;

На стороне 1С 8.3 полученный текст легко преобразуется во внутренние типы платформы с помощью встроенных средств ЧтениеJSON и ПрочитатьJSON().

3. Использование HTTP-сервисов и OData без COM-соединений

Для создания полноценной бесшовной связки рекомендуется отказаться от прямого COM-соединения в пользу архитектуры REST API. В 1С 8.3 создается HTTP-сервис или включается стандартный REST-интерфейс OData. Платформа 1С 7.7 обращается к HTTP-сервису через WinHttp.WinHttpRequest.5.1 или MSXML2.ServerXMLHTTP.

Основные преимущества такого подхода:

  1. Отсутствие зависимости от разрядности приложений (32-bit vs 64-bit).
  2. Отсутствие жесткой привязки к COM-регистрации библиотек Windows на серверах.
  3. Высокая скорость обработки запросов в фоновых потоках 1С 8.3.

4. Прямой доступ к базе данных 1С 7.7 через ADO/ODBC

Если задача заключается в оперативном сборе данных из 1С 7.7 на стороне 1С 8.3 без запуска пользовательского сеанса 7.7, проанализируем вариант с ADO-подключением. Платформа 1С 8.3 с помощью объекта ADODB.Connection обращается напрямую к таблицам MS SQL (например, _1CJOURN для журнала документов) или к файлам DBF.

Посмотрим на пример чтения списка документов из базы 1С 7.7 напрямую из кода 1С 8.3:


Соединение = Новый COMОбъект("ADODB.Connection");
Соединение.ConnectionString = "Provider=SQLOLEDB;Data Source=SQLSERVER;Initial Catalog=Base77;User ID=sa;Password=Pass;";
Соединение.Open();

ЗапросADO = Новый COMОбъект("ADODB.Recordset");
ТекстSQL = "SELECT IDDOC, DOCNO, DATE_TIME_IDDOC FROM _1CJOURN WHERE CLOSED = 1";
ЗапросADO.Open(ТекстSQL, Соединение);

Пока ЗапросADO.EOF() = 0 Цикл
    НомерДокумента = СокрЛП(ЗапросADO.Fields("DOCNO").Value);
    ЗапросADO.MoveNext();
КонецЦикла;

ЗапросADO.Close();
Соединение.Close();

5. Совместимость с версиями MS SQL Server и операционными системами

Выясним вопрос совместимости с новыми версиями СУБД. Штатная платформа 1C 7.7 ограничена поддержкой старых версий MS SQL (до MS SQL 2000/2005). Для работы 7.7 на современных MS SQL Server (2012, 2016, 2019 и новее) применяются специализированные патчи и исправления для bkend.dll (так называемый «секретный релиз»), либо база 7.7 размещается в отдельной виртуальной машине со старым окружением. При этом связь с 8.3 настраивается асинхронно через HTTP-сервисы или очереди сообщений.

← На главную