Как получить данные из другой базы 1С при различии версий платформ

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

При работе в распределенных системах или при необходимости интеграции различных прикладных решений на базе 1С мы часто сталкиваемся с проблемой несовместимости версий платформ. Стандартное решение через COM-соединение часто выдает ошибку, если версии сервера 1С:Предприятие на стороне источника и приемника различаются. Это происходит из-за того, что операционная система пытается использовать зарегистрированную библиотеку comcntrl.dll, которая может не соответствовать версии удаленного сервера. Разберем подробно, как обойти это ограничение и какие альтернативные способы передачи данных существуют.

Использование HTTP-сервисов и Web-сервисов

Это самый современный и рекомендуемый способ интеграции, который полностью снимает вопрос совместимости версий платформ. Поскольку обмен происходит по протоколу 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-соединения через приложение COM+

Если проект требует использования именно COM-технологии, мы можем применить механизм «изоляции» версии библиотеки. Проблема обычного подключения заключается в том, что в системе может быть зарегистрирована только одна библиотека comcntrl.dll. Чтобы использовать разные версии одновременно, создадим приложение в службе компонентов Windows.

Разберем этот процесс по шагам:

  1. Откройте «Службы компонентов» (Component Services) в администрировании Windows.
  2. Создайте новое пустое приложение COM+. Дайте ему понятное имя, например, 1C_Connector_8_3_23.
  3. В ветке «Компоненты» добавьте новый компонент. Выберите файл comcntrl.dll из папки конкретного релиза платформы 1С.
  4. В свойствах созданного приложения на вкладке «Удостоверение» укажите пользователя, от имени которого будет запускаться библиотека (обычно это администратор или учетная запись службы 1С).

Теперь при обращении через V83.COMConnector система будет использовать изолированную версию библиотеки, настроенную в COM+, что позволит избежать конфликта версий сервера.

Использование стандартного интерфейса OData

Платформа 1С предоставляет встроенный механизм OData (REST API), который позволяет обращаться к объектам базы данных без написания кода на стороне источника. Выясним, как его задействовать. Нам достаточно опубликовать базу на веб-сервере и включить стандартный интерфейс OData в синонимах объектов или программно через УстановитьСоставСоставаСтандартногоИнтерфейсаOData().

После публикации мы можем получать данные обычными GET-запросами. Например, чтобы получить список контрагентов, достаточно обратиться по адресу: http://server/base/odata/standard.odata/Catalog_Контрагенты. Это идеальный вариант, когда нужно быстро «вытянуть» данные из справочников или регистров без изменения конфигурации источника.

Внешние источники данных (SQL)

Если обе базы используют клиент-серверный вариант работы (на MS SQL Server или PostgreSQL), мы можем подключить таблицы одной базы к другой напрямую. Выберем в дереве конфигурации объект ВнешниеИсточникиДанных и настроим строку подключения к базе-источнику. Платформа 1С позволит работать с таблицами другой базы почти так же, как с собственными справочниками. При этом версии платформ 1С вообще не играют роли, так как взаимодействие идет на уровне СУБД.

Универсальный обмен через «Конвертацию данных»

Рассмотрим вариант асинхронного обмена. Если данные не нужны «сию секунду» в интерактивном режиме, оптимально использовать Конвертацию данных (КД 2.0 или 3.0). Мы создаем правила обмена, выгружаем данные в файл XML или JSON из одной базы и загружаем в другую. Современная Конвертация данных 3.0 использует технологию EnterpriseData, которая унифицирует формат обмена и делает его независимым от структуры метаданных и версий программ.

Работа через ADO (ActiveX Data Objects)

Посмотрим на пример использования 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С лучше всего подойдут внешние источники данных.

← На главную