Как передать данные из 1С на веб-страницу сторонней системы без прямого доступа к базе данных SQL?

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

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

Почему стоит отказаться от прямой записи в SQL?

Прежде чем перейти к технологиям интеграции, выясним причину, почему прямой доступ к СУБД (через ADO или внешние источники данных) считается плохим тоном в веб-разработке. Дело в том, что современное веб-приложение — это не просто база данных, а сложный комплекс бизнес-правил. Запись напрямую в таблицу SQL обходит все валидации, триггеры, проверки прав доступа и механизмы кэширования веб-сервера. В результате веб-страница может отображать некорректные данные или вовсе перестать работать. Поэтому интеграцию всегда следует строить на уровне прикладных интерфейсов (API).

Способ 1. Использование HTTP-сервисов в 1С (Pull-модель)

Рассмотрим подробнее сценарий, при котором сторонняя веб-система сама обращается в 1С за необходимыми данными. Начиная с платформы 8.3, в 1С реализован удобный механизм создания собственных HTTP-сервисов.

Как это работает: мы создаем в конфигурации 1С объект HTTPСервис, определяем для него шаблоны URL и методы (GET, POST). При публикации базы на веб-сервере (IIS или Apache) у нашей базы появляется собственный REST API. Веб-приложение отправляет запрос к 1С и получает структурированный ответ, чаще всего в формате JSON.

Разберем по шагам пример создания простейшего HTTP-сервиса в 1С, который отдает список имущества в формате JSON:


Функция ПолучитьСписокИмущества(Запрос)
    
    // Устанавливаем безопасный режим при необходимости
    УстановитьПривилегированныйРежим(Истина);
    
    // Формируем выборку данных
    Выборка = Справочники.Имущество.Выбрать();
    МассивИмущества = Новый Массив;
    
    Пока Выборка.Следующий() Цикл
        СтруктураЭлемента = Новый Структура;
        СтруктураЭлемента.Вставить("ID", Выборка.Код);
        СтруктураЭлемента.Вставить("Name", Выборка.Наименование);
        СтруктураЭлемента.Вставить("Status", Строка(Выборка.Статус));
        
        МассивИмущества.Добавить(СтруктураЭлемента);
    КонецЦикла;
    
    // Сериализуем данные в JSON
    ЗаписьJSON = Новый ЗаписьJSON;
    ЗаписьJSON.УстановитьСтроку();
    ЗаписатьJSON(ЗаписьJSON, МассивИмущества);
    СтрокаJSON = ЗаписьJSON.Закрыть();
    
    // Формируем HTTP-ответ
    Ответ = Новый HTTPСервисОтвет(200);
    Ответ.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
    Ответ.УстановитьТелоИзСтроки(СтрокаJSON, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
    
    Возврат Ответ;
    
КонецФункции

Этот способ идеален, если разработчики внешней системы готовы настроить интеграцию на своей стороне и периодически запрашивать обновления из 1С.

Способ 2. Отправка HTTP-запросов из 1С на веб-сайт (Push-модель)

Если внешняя веб-система уже имеет готовое веб-API для приема данных, мы можем настроить передачу инициативного пакета из 1С при возникновении любого события (например, при проведении документа по учету имущества).

Для реализации этого подхода проанализируем возможности объектов HTTPСоединение и HTTPЗапрос в 1С. Посмотрим на практический пример отправки данных об объекте имущества на внешний веб-сервер:


Процедура ОтправитьДанныеНаСайт(ОбъектИмущества)
    
    // Настройки подключения к внешнему серверу
    Сервер = "api.externalsystem.ru";
    Порт = 443;
    ИспользоватьSSL = Новый ЗащищенноеСоединениеOpenSSL();
    
    Соединение = Новый HTTPСоединение(Сервер, Порт,,,,, ИспользоватьSSL);
    
    // Создаем запрос к эндпоинту приема данных
    Запрос = Новый HTTPЗапрос("/v1/property/update");
    Запрос.Заголовки.Вставить("Content-Type", "application/json");
    Запрос.Заголовки.Вставить("Authorization", "Bearer Token_String"); // Пример авторизации
    
    // Формируем тело запроса
    ТелоЗапроса = Новый Структура;
    ТелоЗапроса.Вставить("id", ОбъектИмущества.Код);
    ТелоЗапроса.Вставить("title", ОбъектИмущества.Наименование);
    ТелоЗапроса.Вставить("cost", ОбъектИмущества.Стоимость);
    
    ЗаписьJSON = Новый ЗаписьJSON;
    ЗаписьJSON.УстановитьСтроку();
    ЗаписатьJSON(ЗаписьJSON, ТелоЗапроса);
    СтрокаJSON = ЗаписьJSON.Закрыть();
    
    Запрос.УстановитьТелоИзСтроки(СтрокаJSON, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
    
    Попытка
        Ответ = Соединение.ОтправитьДляОбработки(Запрос);
        Если Ответ.КодСостояния = 200 Тогда
            ЗаписьЖурналаРегистрации("Интеграция", УровеньЖурналаРегистрации.Информация,,, "Данные успешно отправлены.");
        Иначе
            ЗаписьЖурналаРегистрации("Интеграция", УровеньЖурналаРегистрации.Предупреждение,,, "Код ошибки: " + Ответ.КодСостояния);
        КонецЕсли;
    Исключение
        ЗаписьЖурналаРегистрации("Интеграция", УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки());
    КонецПопытки;
    
КонецПроцедуры

Способ 3. Публикация стандартного REST API (OData)

Существует еще более простой вариант интеграции, который вообще не требует написания программного кода в 1С. Платформа «1С:Предприятие 8» поддерживает стандартный протокол OData.

Для его активации выполните следующие шаги:

  1. Откройте окно публикации информационной базы на веб-сервере.
  2. Перейдите на вкладку «REST-интерфейс».
  3. Установите флажок «Публиковать стандартный интерфейс OData».
  4. В коде или настройках выберите справочники и документы, к которым разрешен доступ.

После этого внешняя веб-система сможет выполнять стандартные операции с данными 1С (создание, чтение, обновление, удаление) по протоколу HTTP, используя формат JSON. Права доступа при этом полностью регулируются ролями пользователей 1С.

Способ 4. Двусторонний обмен через WebSockets

Если веб-странице требуется мгновенно реагировать на изменения в 1С без постоянных опросов сервера по таймеру, традиционные HTTP-запросы могут оказаться неэффективными. В современных версиях платформы реализован объект WebSocketКлиентСоединения.

Используя этот протокол, 1С и веб-страница устанавливают одно постоянное соединение, по которому могут передавать данные в обе стороны в режиме реального времени. Как только в 1С меняется статус имущества, платформа отправляет короткое текстовое или JSON-сообщение в сокет, и веб-интерфейс мгновенно обновляет информацию на экране пользователя.

Способ 5. Интеграция через встроенный Chromium (Поле HTML-документа)

Если сторонний разработчик не выходит на контакт, а API у веб-системы отсутствует, можно использовать визуальный метод интеграции. В старых версиях 1С встроенный веб-браузер работал на устаревшем движке Internet Explorer, что делало этот вариант крайне нестабильным. Однако в современных версиях 1С (начиная с 8.3.14) рендеринг веб-страниц переведен на современный движок Chromium.

Используя элемент формы ПолеHTMLДокумента, мы можем загрузить веб-страницу сторонней системы прямо в форму 1С. С помощью выполнения кода JavaScript на странице мы можем программно заполнять поля формы сайта и имитировать нажатие кнопок отправки данных:


// Пример выполнения JS в Поле HTML Документа для заполнения поля ввода на сайте
Элементы.ПолеHTML.Документ.defaultView.eval("document.getElementById('property-input').value = 'Новое имущество';");
Элементы.ПолеHTML.Документ.defaultView.eval("document.getElementById('submit-btn').click();");

Важно: этот способ считается «костылем» и должен применяться только в крайнем случае, так как любое изменение дизайна или верстки стороннего сайта приведет к поломке интеграции.

Способ 6. Использование RPA и безголовых браузеров

Когда требуется фоновая автоматизация без открытия окон внутри 1С, а сторонний сайт защищен сложными JS-сценариями авторизации, отличным решением станет вызов скриптов RPA (например, на Node.js с использованием библиотек Puppeteer или Playwright). 1С может выгружать данные во временный JSON-файл и запускать внешний системный скрипт командной строки, который в фоновом режиме откроет браузер, зайдет на сайт, залогинится, внесет данные об имуществе и вернет результат обратно в 1С.

Рекомендации по выбору архитектуры

Подводя итоги, сопоставим рассмотренные методы интеграции в виде структурированных рекомендаций:

← На главную