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

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

При разработке сложных систем часто возникает задача получения данных из одной базы 1С в другую в режиме реального времени. При этом часто ставится условие: не загромождать базу-приемник лишними данными через регулярные обмены и избежать использования устаревших или платформенно-зависимых технологий, таких как V83.ComConnector. В рамках данной статьи мы подробно разберем, как реализовать подключение к удаленной базе 1С, используя внешние источники данных, протокол OData и веб-сервисы.

Вариант 1: Использование протокола OData (REST API)

Проанализируем наиболее современный и простой в настройке способ — стандартный интерфейс OData. Платформа 1С:Предприятие позволяет опубликовать базу таким образом, что любой её объект станет доступен по HTTP-протоколу. Это решение идеально подходит, если нам нужно просто "читать" данные без сложной логики на стороне источника.

Разберем по шагам, как активировать и использовать этот механизм:

  1. Публикация базы: При публикации информационной базы на веб-сервере (Apache или IIS) необходимо установить галочку "Публиковать стандартный интерфейс OData".
  2. Настройка состава: С помощью встроенного языка 1С мы можем ограничить состав объектов, доступных через OData. Рассмотрим пример кода для настройки доступа к справочнику Номенклатура:

МассивОбъектов = Новый Массив;
МассивОбъектов.Добавить(Метаданные.Справочники.Номенклатура);
УстановитьСоставСтандартногоИнтерфейсаOData(МассивОбъектов);

Для обращения к данным мы используем простые HTTP-запросы. Например, чтобы получить данные о номенклатуре, достаточно отправить GET-запрос по адресу: http://server/base/odata/standard.odata/Catalog_Номенклатура?$format=json.

Преимущества OData:

Важные нюансы: Помните, что OData возвращает данные постранично (обычно по 1000 записей). Если вам нужно прочитать огромный объем данных, придется реализовать механизм обработки ссылок "next", которые приходят в ответе.

Вариант 2: Внешние источники данных (ВИД)

Если нам требуется максимальная скорость при работе с огромными таблицами, рассмотрим использование механизма Внешние источники данных. Этот метод позволяет подключиться напрямую к таблицам SQL базы-источника.

Проанализируем ситуацию: работа через ВИД идет в обход программного слоя 1С. Это дает колоссальный прирост в скорости, но накладывает ряд ограничений:

  1. Сложность структуры: Вы не увидите привычных названий "Справочник.Контрагенты". Вам придется работать с именами таблиц типа _Reference45. Выясним причину такого именования: 1С хранит метаданные в своей внутренней структуре, и соответствие имен можно найти через консоль запросов или программно через метод ПолучитьСтруктуруХраненияБазыДанных().
  2. Отсутствие представлений: В SQL-таблице вместо наименования связанного объекта (например, единицы измерения) будет храниться UUID (ссылка). Чтобы вывести пользователю читаемые данные, нам придется программно или в запросе соединять (JOIN) основную таблицу с таблицей единиц измерения.
  3. Безопасность: Механизм прав доступа (RLS) базы-источника здесь не работает. Пользователь получит доступ ко всему, что разрешено учетной записи SQL, под которой установлено соединение.

Пример настройки подключения к внешней таблице через код:


ПараметрыСоединения = Новый ПараметрыСоединенияВнешнегоИсточникаДанных;
ПараметрыСоединения.СтрокаСоединения = "Driver={SQL Server};Server=MyServer;Database=WorkBase;Uid=sa;Pwd=password;";
ВнешниеИсточникиДанных.ИмяВашегоИсточника.УстановитьОбщиеПараметрыСоединения(ПараметрыСоединения);

Вариант 3: Создание собственных Web или HTTP-сервисов

Когда стандартного функционала OData недостаточно или требуется сложная фильтрация данных на стороне источника, оптимально создать собственный HTTP-сервис. Это позволяет инкапсулировать логику получения данных внутри базы-источника.

Разберем преимущества этого подхода:

Рассмотрим пример простейшего HTTP-сервиса, возвращающего остаток товара:


Функция ПолучитьОстаток(Запрос)
    ТоварСсылка = Справочники.Номенклатура.НайтиПоКоду(Запрос.ПараметрыURL.Получить("Код"));
    Остаток = РегистрыНакопления.ТоварыНаСкладах.Остаток(ТоварСсылка);
    
    Ответ = Новый HTTPСервисОтвет(200);
    Ответ.УстановитьТелоИзСтроки(Строка(Остаток));
    Возврат Ответ;
КонецФункции

Сравнение и выбор решения

Выясним, какой метод выбрать в зависимости от ваших задач:

  1. Нужно быстро и "для всех объектов": Однозначно выбираем OData. Это минимум трудозатрат и отсутствие привязки к COM-компонентам.
  2. Нужна максимальная производительность на миллионах строк: Выбираем Внешние источники данных. Однако будьте готовы к ручному сопоставлению имен таблиц в SQL и трудностям с обновлением конфигурации.
  3. Нужна сложная логика и высокая безопасность: Реализуем HTTP-сервисы. Это потребует больше времени на разработку, но обеспечит максимальную гибкость.

Важное замечание по лицензированию: Помните, что каждое активное соединение через Web-сервис или OData потребляет одну сессию (и, соответственно, одну клиентскую лицензию) в момент выполнения запроса. Если вы планируете массовое использование таких запросов от многих пользователей, заранее проанализируйте объем доступных лицензий на сервере 1С.

Подводя итог, можно сказать, что для современных систем на базе 1С 8.3 наиболее предпочтительным является использование OData для простых задач и HTTP-сервисов для сложных интеграций. Это полностью снимает зависимость от операционной системы и необходимости регистрации библиотек типа comcntr.dll.

← На главную