Интеграция 1С с сайтом: публикация веб-сервисов и обмен данными

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

Два способа интеграции 1С с сайтом

  • HTTP-сервис 1С — 1С публикуется на веб-сервере и отдаёт/принимает данные по HTTP (JSON/XML). Подходит для обмена данными с сайтом на любом стеке: PHP, Django, Nuxt, WordPress.
  • Встраивание веб-клиента в iframe — сама форма 1С показывается внутри страницы сайта, а обмен сообщениями идёт через глобальный контекст платформы. Доступно начиная с версии 8.3.16.

Способ 1. HTTP-сервис 1С для обмена данными с сайтом

Это основной способ, когда сайту нужны не формы 1С, а именно данные — остатки, цены, статусы заказов.

Шаг 1. Создать HTTP-сервис в конфигураторе

В дереве конфигурации создаётся объект «HTTP-сервис», у него задаётся корневой URL (например, ex) и шаблоны URL для методов — GET, POST, PUT. Каждому шаблону соответствует функция-обработчик в модуле сервиса:

Функция ПолучитьТовар(Запрос) Экспорт
    Ответ = Новый HTTPСервисОтвет(200);
    Ответ.УстановитьТелоИзСтроки(ТекстJSON, "UTF-8", ИспользованиеByteOrderMark.НеИспользовать);
    Ответ.Заголовки.Вставить("Content-Type", "application/json");
    Возврат Ответ;
КонецФункции

Шаг 2. Опубликовать информационную базу на веб-сервере

В конфигураторе: «Администрирование» → «Публикация на веб-сервере», выбрать Apache или IIS, указать имя публикации и разрешить нужные HTTP-сервисы галочкой. Подробный порядок настройки веб-сервера — в официальной документации 1С на ИТС.

Шаг 3. Проверить публикацию

Опубликованный сервис доступен по адресу вида https://host/base/hs/ex/product. На этом шаге сразу стоит закрыть публикацию HTTPS-сертификатом и базовой или токен-аутентификацией — HTTP-сервис 1С без авторизации, торчащий наружу, это открытая дыра в базу.

Шаг 4. Настроить обмен данными с сайтом

Сайт делает обычные HTTP-запросы к сервису (fetch, curl, requests) и получает JSON — дальше это стандартная интеграция, без специфики 1С на стороне сайта. Разбор синтаксиса HTTP-сервисов и типовых ошибок — в статьях на Инфостарт.

Если нагрузка на публичном сайте непредсказуемая (рекламные всплески, SPA с большим количеством запросов), HTTP-сервис 1С стоит прятать не за фронтендом напрямую, а за отдельным backend-слоем, который берёт пиковую нагрузку на себя и обращается к 1С уже из внутренней сети. Когда такой слой нужен, а когда 1С справляется сама — разобрано с цифрами нагрузочного теста в статье «1С backend для web? Да вы смеетесь».

Способ 2. Встраивание веб-клиента в iframe (начиная с 8.3.16)

Начиная с платформы 8.3.16 возможна и обратная схема: не 1С забирает данные с сайта через HTTP-сервис, а веб-клиент 1С встраивается прямо в страницу сайта внутри <iframe>, и стороны обмениваются сообщениями напрямую.

Подобное встраивание предполагает выполнение следующих действий:

  • Выделение на странице сайта области, в которой будет исполняться веб-клиент.
  • Реализация на встроенном языке 1С интерфейса, который отвечает за обмен данными с сайтом, куда встраивается решение, плюс настройка режима основного окна и прав доступа к нему.
  • Реализация на стороне сайта интерфейса на JavaScript, который сообщает веб-клиенту нужный режим работы и обменивается с ним данными.

Общие требования к такой интеграции:

  • Прикладное решение должно быть опубликовано на веб-сервере и доступно через веб-клиент.
  • Веб-сервер должен быть корректно настроен для встраивания решения в сайт.
  • Для работы с сайтом, в который встроен веб-клиент, нужно использовать только поддерживаемые платформой браузеры.

У прикладного решения есть свойство глобального контекста ОкноВнешнегоСайта. Через него решение получает интерфейс к сайту, если оно в этот сайт встроено. Интерфейс даёт три действия:

  • Проверить, что веб-клиент работает внутри сайта — свойство ОкноВнешнегоСайта.Доступно. Все дальнейшие обращения к ОкноВнешнегоСайта стоит выполнять только после проверки, что это свойство равно Истина.
  • Получать сообщения от сайта — метод ОкноВнешнегоСайта.ПодключитьОбработчикСообщений(), отключить приём — ОкноВнешнегоСайта.ОтключитьОбработчикСообщений().
  • Отправлять сообщения сайту — метод ОкноВнешнегоСайта.ОтправитьСообщение().

Со стороны 1С обмен с встроенной страницей и вообще любой JavaScript-код удобно держать в поле HTML-документа формы: как связать 1С и JS в обе стороны (поле HTML документа, вызов JS из 1С и обратно) — подробно разобрано в статье «Интеграция 1С с JavaScript и Node.js».

Надёжный обмен через очередь событий

HTTP-сервис из способа 1 отдаёт данные по запросу — этого хватает для чтения. Но для боевого двустороннего обмена нужно другое: чтобы 1С сама знала, что именно изменилось, и не выгружала весь каталог на каждый чих. Классический паттерн для этого — очередь исходящих изменений на подписках событий. Покажу на реальном обмене УТ 11 с интернет-магазином на Django.

Первый кирпич — подписка на событие ПриЗаписи. При записи любого объекта, участвующего в обмене, она находит связанные ссылки (у номенклатуры это её группа, вид, характеристики) и ставит их в регистр-очередь:

Процедура ns_РегистрацияОбменаПриЗаписи(Источник, Отказ) Экспорт
    УстановитьПривилегированныйРежим(Истина);
    Попытка
        ИмяСправочника = Источник.Метаданные().Имя;
        СвязныеСсылки = Справочники[ИмяСправочника].ПолучитьСвязныеСсылки(Источник.Ссылка);
        Для каждого ТекущаяСсылка Из СвязныеСсылки Цикл
            РегистрыСведений.ns_СписокОбменаССайтом.ДобавитьЗапись(ТекущаяСсылка);
        КонецЦикла;
    Исключение
        ЗаписьЖурналаРегистрации("Django", УровеньЖурналаРегистрации.Ошибка, , , ОписаниеОшибки());
    КонецПопытки;
    УстановитьПривилегированныйРежим(Ложь);
КонецПроцедуры

Второй кирпич — отдельный проход по очереди (по расписанию или вручную), который выгружает накопленные изменения. Здесь важен приём: диспетчер не знает, как выгружать конкретную сущность, — он по метаданным определяет тип и полиморфно вызывает одноимённый метод менеджер-модуля объекта. Каждый справочник и документ сам «умеет» отправлять себя на сайт:

Для каждого ТекущийЭлемент Из СписокОбмена Цикл
    МетаданныеЭлемента = ТекущийЭлемент.СсылкаНаОбъект.Метаданные();
    ПолноеИмя = МетаданныеЭлемента.ПолноеИмя();
    ИмяЭлемента = МетаданныеЭлемента.Имя;

    Если СтрНайти(ПолноеИмя, "Справочник") > 0 Тогда
        Результат = Справочники[ИмяЭлемента].ОтправитьНаСайт(ТекущийЭлемент.СсылкаНаОбъект, ПолнаяВыгрузка);
    ИначеЕсли СтрНайти(ПолноеИмя, "Документ") > 0 Тогда
        Результат = Документы[ИмяЭлемента].ОтправитьНаСайт(ТекущийЭлемент.СсылкаНаОбъект, ПолнаяВыгрузка);
    КонецЕсли;
КонецЦикла;

Что это даёт на практике: изменения не теряются (подписка ловит каждую запись), обмен идемпотентен, а добавление новой сущности в обмен = реализовать пару функций ОтправитьНаСайт / ПолучитьСвязныеСсылки в её менеджер-модуле — без правки самого диспетчера. Это и отличает боевой обмен от «выгрузим всё по кнопке».

Частные случаи: WooCommerce, MySQL и Bitrix

Способы выше — универсальные: они одинаково работают с сайтом на любом движке, потому что со стороны сайта это просто HTTP-запросы или JavaScript. Но если задача уже сузилась до конкретной пары «1С + WooCommerce» — синхронизация каталога, остатков и заказов интернет-магазина на WordPress, — писать HTTP-сервис и клиентскую часть с нуля избыточно: там есть свои нюансы работы с WooCommerce REST API и типовые сценарии синхронизации, которые разобраны отдельно в статье «WooCommerce и 1С». Общий подход из этой статьи (HTTP-сервис плюс обмен JSON) — это то, что использует любая точечная интеграция под конкретную CMS внутри себя.

Тот же принцип — под другие частные случаи. Если сайту нужна общая с 1С база — смотрите «Интеграция 1С с MySQL» (установка и подключение СУБД). Если интегрируетесь с порталом на Bitrix24 по OAuth 2.0 — разбор в статье «Интеграция 1С с Bitrix24 через OAuth 2.0».

Где научиться собирать такую интеграцию руками

Если нужен не просто HTTP-сервис для обмена данными, а полноценный веб-сервис на базе 1С с очередями и личным кабинетом — на курсе «B2B-сервис для 1С» на Django разбирается связка 1С и backend на Django. Фронтенд поверх такой архитектуры — на курсе «NuxtJS + 1С». Если с HTTP-сервисами 1С ещё не работали вообще, стартовая точка — курс «HTTP в 1С для начинающих», без него оба способа выше будут скорее теорией, чем рабочим навыком.

Конфигурация и html страница из видео — скачать.

Чтобы не пропустить выход новых видео подписывайся на канал, а мы приступаем.