При работе в распределенных системах или при необходимости интеграции различных прикладных решений на базе 1С мы часто сталкиваемся с проблемой несовместимости версий платформ. Стандартное решение через COM-соединение часто выдает ошибку, если версии сервера 1С:Предприятие на стороне источника и приемника различаются. Это происходит из-за того, что операционная система пытается использовать зарегистрированную библиотеку comcntrl.dll, которая может не соответствовать версии удаленного сервера. Разберем подробно, как обойти это ограничение и какие альтернативные способы передачи данных существуют.
Это самый современный и рекомендуемый способ интеграции, который полностью снимает вопрос совместимости версий платформ. Поскольку обмен происходит по протоколу HTTP, базам абсолютно «все равно», на каких релизах платформы они работают. Проанализируем, как это реализовать.
В базе-источнике (откуда нужно получить данные) создается HTTP-сервис. Мы определяем шаблон URL и методы (GET, POST), которые будут возвращать данные, например, в формате JSON или XML. В базе-приемнике мы используем объект HTTPСоединение для вызова этого сервиса.
Рассмотрим пример кода для получения данных через HTTP в базе-приемнике:
Соединение = Новый HTTPСоединение("server-name", , "user", "password");
Запрос = Новый HTTPЗапрос("/base_name/hs/v1/get_data?param=value");
Ответ = Соединение.Получить(Запрос);
Если Ответ.КодСостояния = 200 Тогда
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());
Данные = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
КонецЕсли;
Если проект требует использования именно COM-технологии, мы можем применить механизм «изоляции» версии библиотеки. Проблема обычного подключения заключается в том, что в системе может быть зарегистрирована только одна библиотека comcntrl.dll. Чтобы использовать разные версии одновременно, создадим приложение в службе компонентов Windows.
Разберем этот процесс по шагам:
1C_Connector_8_3_23.comcntrl.dll из папки конкретного релиза платформы 1С.Теперь при обращении через V83.COMConnector система будет использовать изолированную версию библиотеки, настроенную в COM+, что позволит избежать конфликта версий сервера.
Платформа 1С предоставляет встроенный механизм OData (REST API), который позволяет обращаться к объектам базы данных без написания кода на стороне источника. Выясним, как его задействовать. Нам достаточно опубликовать базу на веб-сервере и включить стандартный интерфейс OData в синонимах объектов или программно через УстановитьСоставСоставаСтандартногоИнтерфейсаOData().
После публикации мы можем получать данные обычными GET-запросами. Например, чтобы получить список контрагентов, достаточно обратиться по адресу: http://server/base/odata/standard.odata/Catalog_Контрагенты. Это идеальный вариант, когда нужно быстро «вытянуть» данные из справочников или регистров без изменения конфигурации источника.
Если обе базы используют клиент-серверный вариант работы (на MS SQL Server или PostgreSQL), мы можем подключить таблицы одной базы к другой напрямую. Выберем в дереве конфигурации объект ВнешниеИсточникиДанных и настроим строку подключения к базе-источнику. Платформа 1С позволит работать с таблицами другой базы почти так же, как с собственными справочниками. При этом версии платформ 1С вообще не играют роли, так как взаимодействие идет на уровне СУБД.
Рассмотрим вариант асинхронного обмена. Если данные не нужны «сию секунду» в интерактивном режиме, оптимально использовать Конвертацию данных (КД 2.0 или 3.0). Мы создаем правила обмена, выгружаем данные в файл XML или JSON из одной базы и загружаем в другую. Современная Конвертация данных 3.0 использует технологию EnterpriseData, которая унифицирует формат обмена и делает его независимым от структуры метаданных и версий программ.
Посмотрим на пример использования ADO, когда нам нужно выполнить прямой запрос к базе данных, минуя механизмы 1С. Это часто быстрее, чем COM, и позволяет избежать проблем с лицензиями клиентских соединений при чтении данных.
Connection = Новый COMОбъект("ADODB.Connection");
ConnectionString = "Driver={SQL Server};Server=MYSERVER;Database=MYBASE;Uid=sa;Pwd=password;";
Connection.Open(ConnectionString);
Command = Новый COMОбъект("ADODB.Command");
Command.ActiveConnection = Connection;
Command.CommandText = "SELECT TOP 10 _Description FROM _Reference15"; // Пример обращения к таблице справочника
RecordSet = Command.Execute();
Пока НЕ RecordSet.EOF Цикл
Сообщить(RecordSet.Fields("_Description").Value);
RecordSet.MoveNext();
КонецЦикла;
Connection.Close();
Важно помнить, что при использовании ADO или SQL мы работаем с внутренними именами таблиц (типа _Reference15), поэтому предварительно нужно выяснить соответствие имен через метод ПолучитьСтруктуруХраненияБазыДанных().
Подводя итог, проанализируем ситуацию: если вам нужно надежное и масштабируемое решение, выбирайте HTTP-сервисы. Если необходимо быстро исправить ошибку существующего кода на COM-соединении — используйте изоляцию в COM+. Для прямого доступа к таблицам без участия сервера 1С лучше всего подойдут внешние источники данных.