В практике интеграции систем часто возникает задача настроить обмен данными или программно подключиться к базе 1С, которая находится на удаленном веб-сервере. При этом стандартные веб- или HTTP-сервисы в конфигурации могут быть не опубликованы, а пользователю доступна лишь обычная авторизация через логин и пароль в веб-клиенте. Как поступить в такой ситуации? Существуют ли программные аналоги привычного COM-соединения для работы через веб-протоколы?
В этой статье мы подробно разберем все возможные технические подходы к решению данной задачи: от использования специального COM-объекта тонкого клиента до активации стандартного REST API (OData) и создания собственных легковесных HTTP-сервисов в расширениях.
Многие разработчики привыкли использовать объект V83.COMConnector для быстрого прямого подключения к базам данных. Однако этот объект представляет собой полноценный толстый клиент, который работает исключительно по протоколам прямого доступа к СУБД или кластеру серверов 1С (через параметры Srvr или File). Работать по протоколам HTTP/HTTPS через веб-сервер он не умеет.
Для решения этой проблемы в платформе 1С:Предприятие предусмотрен альтернативный OLE-объект — тонкий клиент V83C.Application (обратите внимание на букву C, означающую Client). Этот объект умеет подключаться к базе через веб-сервер.
Рассмотрим по шагам, как настроить и использовать такое подключение:
На том компьютере, где будет выполняться внешний скрипт инициализации подключения, обязательно должен быть установлен тонкий клиент 1С той же версии, что и на сервере. Его необходимо зарегистрировать в операционной системе в качестве OLE-сервера. Для этого запустите командную строку от имени Администратора и выполните команду:
1cv8c.exe /RegServer
В отличие от локального подключения, строка соединения должна использовать параметр ws (Web-Service), указывающий на URL-адрес публикации вашей базы на веб-сервере (IIS или Apache).
Проанализируем пример кода на встроенном языке 1С, который инициализирует такое подключение:
ПутьКПубликации = "https://my-web-server.ru/trade_base";
ИмяПользователя = "Администратор";
ПарольПользователя = "SuperPassword123";
СтрокаПодключения = "ws=""" + ПутьКПубликации + """;Usr=""" + ИмяПользователя + """;Pwd=""" + ПарольПользователя + """;";
Попытка
ТонкийКлиентCOM = Новый COMОбъект("V83C.Application");
СоединениеУспешно = ТонкийКлиентCOM.Connect(СтрокаПодключения);
Исключение
ЗаписьЖурналаРегистрации("ОшибкаПодключения", УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки());
ВызватьИсключение "Не удалось подключиться к базе через веб-сервер: " + ОписаниеОшибки();
КонецПопытки;
Важное ограничение метода: Поскольку подключение выполняется в контексте Тонкого клиента, вы столкнетесь с жесткими ограничениями на работу с метаданными. Например, попытка напрямую обратиться к менеджерам данных на клиенте вызовет ошибку "Method 'Справочники' not supported by automation object". Напрямую создавать, читать или записывать элементы справочников и документов через такой COM-объект нельзя.
Выясним, как обойти это ограничение. Для работы с данными вам придется вызывать экспортные процедуры и функции из общих модулей конфигурации, у которых установлены свойства "Клиент (управляемое приложение)" и "Вызов сервера". Внутри этих процедур вы сможете передавать простые структуры данных или сериализованные строки XML/JSON, обрабатывая их на стороне сервера 1С.
Использование COM-технологий постепенно уходит в прошлое из-за привязки к операционной системе Windows, жестких требований к совпадению версий платформы и сложностей с производительностью. Гораздо более современным подходом является использование стандартного интерфейса OData (REST API), предоставляемого платформой 1С по умолчанию.
Многие ошибочно полагают, что для активации OData требуется изменять саму конфигурацию 1С и заново публиковать базу. На самом деле, этот интерфейс генерируется платформой автоматически и включается простой корректировкой файла описания публикации default.vrd на вашем веб-сервере.
Разберем по шагам, как включить OData:
Перейдите в каталог на веб-сервере, куда опубликована ваша база данных (например, C:\inetpub\wwwroot\trade_base\ для IIS или соответствующую директорию для Apache).
Откройте файл default.vrd в любом текстовом редакторе.
Найдите корневой тег <point> и добавьте внутрь него дочерний XML-элемент <rest>, разрешающий работу стандартного интерфейса:
<point xmlns="http://v8.1c.ru/8.2/virtual-resource-system" ...>
<ws>
<!-- Здесь ваши стандартные веб-сервисы -->
</ws>
<rest>
<standardOData enable="true"/>
</rest>
</point>
Сохраните файл и перезапустите ваш веб-сервер (например, выполнив команду iisreset в консоли Windows).
После этого вы можете отправлять стандартные HTTP-запросы из любого внешнего приложения (написанного на Python, C#, JavaScript, PHP или используя утилиту curl) к объектам вашей базы данных 1С. Для авторизации используются те же учетные данные пользователей 1С (поддерживается как Basic-авторизация, так и OpenID).
Пример HTTP GET-запроса для получения списка номенклатуры из базы данных:
GET https://my-web-server.ru/trade_base/odata/standard.odata/Catalog_Номенклатура?$format=json
Authorization: Basic Base64(Логин:Пароль)
Платформа автоматически вернет структурированный ответ в формате JSON. Этот метод невероятно быстр, безопасен, не требует доработки конфигурации и работает на любых операционных системах.
Если вам требуется реализовать сложную логику обработки данных при обмене, оптимальным решением станет создание собственного HTTP-сервиса. Самое главное преимущество этого подхода заключается в том, что его можно реализовать в **расширении конфигурации**. Это позволит вам не снимать основную конфигурацию 1С с поддержки.
Рассмотрим алгоритм создания такого решения:
Создайте новое расширение конфигурации в дереве метаданных и добавьте в него новый объект HTTP-сервисы.
Задайте имя сервиса (например, ExternalIntegration) и корневой шаблон (например, /v1).
Создайте шаблон URL (например, /getdata или /savedata) и определите для него HTTP-метод (GET или POST).
В модуле HTTP-сервиса напишите обработчик запроса. Посмотрим на практический пример кода, который принимает POST-запрос с JSON-пакетом данных и создает новый элемент в справочнике:
Функция СохранитьДанныеPOST(Запрос)
Ответ = Новый HTTPСервисОтвет(200);
Ответ.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
// Получаем тело запроса в виде строки
СтрокаДанных = Запрос.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
// Десериализуем JSON во временную структуру
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(СтрокаДанных);
Данные = ПрочитатьJSON(Чтение);
Чтение.Закрыть();
// Выполняем запись данных в транзакции
НачатьТранзакцию();
Попытка
НовыйЭлемент = Справочники.Номенклатура.СоздатьЭлемент();
НовыйЭлемент.Наименование = Данные.Наименование;
НовыйЭлемент.Артикул = Данные.Артикул;
НовыйЭлемент.Записать();
ЗафиксироватьТранзакцию();
// Формируем успешный JSON-ответ
Запись = Новый ЗаписьJSON;
Запись.УстановитьСтроку();
СтруктураРезультата = Новый Структура("success, id", Истина, Строка(НовыйЭлемент.Ссылка.УникальныйИдентификатор()));
ЗаписатьJSON(Запись, СтруктураРезультата);
СтрокаОтвета = Запись.Закрыть();
Ответ.УстановитьТелоИзСтроки(СтрокаОтвета, КодировкаТекста.UTF8);
Исключение
ОтменитьТранзакцию();
Ответ.КодСостояния = 500;
Запись = Новый ЗаписьJSON;
Запись.УстановитьСтроку();
СтруктураОшибки = Новый Структура("success, error", Ложь, ОписаниеОшибки());
ЗаписатьJSON(Запись, СтруктураОшибки);
СтрокаОшибки = Запись.Закрыть();
Ответ.УстановитьТелоИзСтроки(СтрокаОшибки, КодировкаТекста.UTF8);
КонецПопытки;
Возврат Ответ;
КонецФункции
После написания кода обновите публикацию на веб-сервере через конфигуратор (меню Администрирование -> Публикация на веб-сервере), убедившись, что в списке публикуемых HTTP-сервисов отмечено галочкой ваше расширение.
Бывают исключительные ситуации, когда у вас полностью отсутствуют права администрирования веб-сервера (вы не можете отредактировать default.vrd для OData), а конфигурация закрыта для внесения изменений (нельзя добавить расширение с HTTP-сервисом). При этом вам доступен только штатный веб-клиент в браузере.
В этом случае на помощь приходят современные системы робототехнической автоматизации процессов (RPA) или инструменты тестирования веб-интерфейсов, такие как Selenium WebDriver, Playwright или Puppeteer.
Используя библиотеки автоматизации на языках Python или Node.js, вы можете написать скрипт, который будет выполнять следующие действия:
Преимущества метода: Абсолютная независимость от настроек сервера 1С. Вам не нужны никакие дополнительные права доступа, кроме прав обычного пользователя.
Недостатки метода: Веб-клиент 1С имеет крайне сложную динамическую структуру DOM. При выходе новых минорных релизов платформы верстка элементов интерфейса может незначительно меняться, что потребует регулярной отладки и обновления вашего автоматизированного скрипта.
Проанализировав все доступные варианты, мы можем сделать следующие выводы:
default.vrd. Это дает мощный и стандартизированный REST API без программирования в 1С.V83C.Application с параметром строки подключения ws.