При построении взаимодействия между системами на платформах 1С:Предприятие 7.7 и 1С:Предприятие 8.3 разработчики сталкиваются с рядом технических ограничений. К ним относятся разность архитектур (32-разрядная 7.7 и 64-разрядный сервер 8.3), особенности передачи прикладных типов данных (булево, неопределено, null, дата со временем) через OLE, а также совместимость устаревших платформ с современными СУБД MS SQL Server. В этом материале мы подробнее разберем практические способы реализации бесшовной связки двух систем.
Самым популярным способом взаимодействия остается прямое вызововое COM-соединение. При передаче стандартных реквизитов документов (номера, даты, числа и строки) OLE-соединение работает стабильно. Однако важным нюансом является разрядность процессов:
rphost.exe вызывает ошибку. Для решения проблемы на сервере настраивают выделенное приложение COM+ в Службе компонентов Windows (процесс dllhost.exe), которое выступает мостом между 64-битной 8.3 и 32-битной 7.7.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.ОбменДаннымиСервер.ПолучитьДанные(Параметры);
КонецЕсли;
При передаче данных через 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().
Для создания полноценной бесшовной связки рекомендуется отказаться от прямого COM-соединения в пользу архитектуры REST API. В 1С 8.3 создается HTTP-сервис или включается стандартный REST-интерфейс OData. Платформа 1С 7.7 обращается к HTTP-сервису через WinHttp.WinHttpRequest.5.1 или MSXML2.ServerXMLHTTP.
Основные преимущества такого подхода:
Если задача заключается в оперативном сборе данных из 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();
Выясним вопрос совместимости с новыми версиями СУБД. Штатная платформа 1C 7.7 ограничена поддержкой старых версий MS SQL (до MS SQL 2000/2005). Для работы 7.7 на современных MS SQL Server (2012, 2016, 2019 и новее) применяются специализированные патчи и исправления для bkend.dll (так называемый «секретный релиз»), либо база 7.7 размещается в отдельной виртуальной машине со старым окружением. При этом связь с 8.3 настраивается асинхронно через HTTP-сервисы или очереди сообщений.