Интеграция 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 страница из видео — скачать.
Чтобы не пропустить выход новых видео подписывайся на канал, а мы приступаем.