Разработка и запуск интернет-магазина с нуля в экосистеме 1С сегодня занимает считанные минуты, если использовать готовые шаблоны и конструкторы. Но на практике интеграторы часто сталкиваются с ситуацией, когда у клиента уже есть успешно работающий сайт, созданный сторонними разработчиками на произвольной CMS или даже на полностью самописном движке (фреймворке). Теперь перед бизнесом стоит задача: связать этот ресурс с 1С (например, с конфигурацией «1С:Управление нашей фирмой») для автоматической передачи заказов, контроля остатков товаров и управления производством.
В этой статье мы подробно разберем, как правильно организовать архитектуру такого обмена, какие технологические решения использовать, как распределить зоны ответственности между 1С-программистом и веб-разработчиком, а также проанализируем специфику интеграции на примере жесткого бизнес-кейса — службы доставки фастфуда.
Когда перед нами встает задача подружить сторонний веб-ресурс с 1С, мы должны сразу отбросить иллюзию о наличии «волшебной кнопки». Нам предстоит выбрать один из трех классических путей интеграции. Давайте детально проанализируем каждый из них.
1. Стандартный протокол CommerceML (CML)
Это классический формат обмена, разработанный фирмами «1С» и «Microsoft» на базе XML. Он поддерживается «из коробки» практически всеми типовыми конфигурациями 1С (включая УНФ, УТ, КА, ERP) и популярными коммерческими CMS (например, 1С-Битрикс, OpenCart, WooCommerce).
Если сайт клиента работает на известной платформе, мы можем использовать готовые модули интеграции. Обмен происходит файлами по протоколу HTTP/HTTPS. 1С выступает в роли инициатора: она отправляет файлы импорта/экспорта на веб-сервер сайта.
Однако у CommerceML есть серьезные недостатки:
2. Использование готовых плагинов и модулей для CMS
Если сайт написан на популярной CMS, в первую очередь нужно проверить наличие официальных или сторонних плагинов обмена с 1С. В этом случае на стороне сайта устанавливается плагин, который умеет эмулировать протокол CommerceML или имеет собственный API для связи с 1С. Это существенно сокращает трудозатраты. Задача 1С-специалиста здесь сводится к стандартной настройке узла обмена в 1С:УНФ и передаче веб-мастеру адреса скрипта-обработчика.
3. Разработка собственного API через HTTP-сервисы 1С (REST API на JSON)
Это наиболее современный, гибкий и профессиональный подход для работы с нестандартными или самописными сайтами. Вместо того чтобы подстраивать сайт под тяжелый XML-формат 1С, мы разворачиваем внутри 1С полноценный веб-сервер, который будет принимать легкие и понятные JSON-пакеты.
Платформа 1С:Предприятие 8.3 позволяет создавать собственные HTTP-сервисы буквально за несколько часов. Как только на сайте совершается заказ, скрипт сайта отправляет мгновенный POST-запрос на специальный URL-адрес нашей базы 1С. Наша база принимает JSON, мгновенно разбирает его и создает документ ЗаказПокупателя в режиме реального времени.
Давайте разберем по шагам, как выглядит создание простейшего HTTP-сервиса на стороне 1С для интеграции с сайтом. Нам необходимо принять от сайта JSON-пакет с информацией о заказе и создать документ в базе.
Сначала в конфигураторе 1С мы создаем новый объект метаданных HTTPСервисы. Назовем его, например, ИнтеграцияС Сайтом. Задаем корневой шаблон (например, /v1) и добавляем шаблон URL: /orders с методом POST. Для этого метода назначаем обработчик в модуле HTTP-сервиса.
Рассмотрим пример программного кода, который принимает JSON от сайта, парсит его и создает заказ покупателя:
Функция ordersPOST(Запрос)
// Устанавливаем тип ответа по умолчанию
Ответ = Новый HTTPСервисныйОтвет(200);
Ответ.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
// Получаем тело запроса в виде строки JSON
СтрокаJSON = Запрос.ПолучитьТелоКакСтроку("UTF-8");
Если ПустаяСтрока(СтрокаJSON) Тогда
Ответ.КодСостояния = 400;
Ответ.УстановитьТелоИзСтроки("{""error"": ""Пустое тело запроса""}");
Возврат Ответ;
КонецЕсли;
// Чтение и десериализация JSON
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(СтрокаJSON);
Попытка
ДанныеЗаказа = ПрочитатьJSON(Чтение);
Чтение.Закрыть();
Исключение
Чтение.Закрыть();
Ответ.КодСостояния = 400;
Ответ.УстановитьТелоИзСтроки("{""error"": ""Ошибка парсинга JSON""}");
Возврат Ответ;
КонецПопытки;
// Начинаем транзакцию для безопасной записи документов
НачатьТранзакцию();
Попытка
// Создаем Заказ покупателя в 1С:УНФ
НовыйЗаказ = Документы.ЗаказПокупателя.СоздатьДокумент();
НовыйЗаказ.Дата = ТекущаяДата();
НовыйЗаказ.Организация = Справочники.Организации.НайтиПоРеквизиту("ИНН", ДанныеЗаказа.ИНН_Организации);
// Поиск или создание контрагента по телефону
Контрагент = Справочники.Контрагенты.НайтиПоРеквизиту("Телефон", ДанныеЗаказа.ТелефонКлиента);
Если Контрагент.Пустая() Тогда
НовыйКонтрагент = Справочники.Контрагенты.СоздатьЭлемент();
НовыйКонтрагент.Наименование = ДанныеЗаказа.ИмяКлиента;
НовыйКонтрагент.Телефон = ДанныеЗаказа.ТелефонКлиента;
НовыйКонтрагент.Записать();
Контрагент = НовыйКонтрагент.Ссылка;
КонецЕсли;
НовыйЗаказ.Контрагент = Контрагент;
// Заполняем табличную часть товары
Для Каждого СтрокаТовара Из ДанныеЗаказа.Товары Цикл
НоваяСтрока = НовыйЗаказ.Запасы.Добавить();
// Поиск номенклатуры по UUID, который хранится на сайте
НоваяСтрока.Номенклатура = Справочники.Номенклатура.ПолучитьСсылку(Новый УникальныйИдентификатор(СтрокаТовара.ID_1С));
НоваяСтрока.Количество = СтрокаТовара.Количество;
НоваяСтрока.Цена = СтрокаТовара.Цена;
НоваяСтрока.Сумма = СтрокаТовара.Количество * СтрокаТовара.Цена;
КонецЦикла;
НовыйЗаказ.СуммаДокумента = ДанныеЗаказа.ИтоговаяСумма;
НовыйЗаказ.Записать(РежимЗаписиДокумента.Проведение);
ЗафиксироватьТранзакцию();
// Формируем успешный ответ для сайта
Результат = Новый Структура;
Результат.Вставить("status", "success");
Результат.Вставить("order_id_1c", Строка(НовыйЗаказ.Ссылка.УникальныйИдентификатор()));
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, Результат);
Ответ.УстановитьТелоИзСтроки(ЗаписьJSON.Закрыть());
Исключение
ОтменитьТранзакцию();
Ответ.КодСостояния = 500;
Ответ.УстановитьТелоИзСтроки("{""error"": ""Ошибка создания документа в 1С: " + ОписаниеОшибки() + """}");
КонецПопытки;
Возврат Ответ;
КонецФункции
Используя объект платформы HTTPСервисныйОтвет, мы гарантируем, что сайт сразу получит подтверждение об успешном создании заказа с его внутренним номером в 1С. Это исключает риски потери заказов.
Одной из главных проблем, озвученных на форуме, является страх 1С-разработчика «застрять» в изучении чужого, возможно, некачественного кода сайта. Чтобы этого не произошло, необходимо жестко разграничить зоны ответственности на самом старте проекта.
Выясним по шагам, как должен строиться процесс взаимодействия:
POST-запрос на предоставленный нами URL-адрес базы 1С. Как устроен код сайта, 1С-ника волновать не должно.Контекст задачи кардинально меняется в зависимости от специфики бизнеса. Рассмотрим кейс доставки фастфуда (пицца, бургеры, суши), упомянутый в обсуждении. Этот бизнес накладывает жесточайшие требования к архитектуре ИТ-системы.
Проанализируем ключевые особенности автоматизации фастфуда в связке с 1С:УНФ:
1. Требование Real-Time (Мгновенный обмен)
В доставке еды скорость решает все. Заказ должен оказаться на кухне в течение 1–2 минут после оплаты клиентом на сайте. Стандартный обмен файлами через CommerceML по расписанию здесь полностью не пригоден. Здесь применима только мгновенная отправка данных по REST API со стороны сайта сразу в момент подтверждения заказа покупателем.
2. Спецификации и калькуляция производства в 1С:УНФ
«1С:Управление нашей фирмой» идеально подходит для автоматизации небольших производств, к которым относится и кухня фастфуда. В УНФ настраиваются Спецификации (рецептуры блюд). Например, для блюда «Бургер классический» в спецификации указывается: булочка кунжутная (1 шт.), котлета говяжья (1 шт.), соус фирменный (30 г), томаты (20 г). Как только заказ с сайта загружается в УНФ:
ЗаказПокупателя.Производство (или ЗаказНаПроизводство).3. Модуль доставки и обратный обмен статусами
После приготовления блюдо нужно передать курьеру. В 1С:УНФ есть встроенный инструмент управления доставкой. Логист распределяет заказы по курьерам, печатает маршрутные листы. Очень важно отправлять статусы заказа (например, "Готовится", "Передан курьеру", "Доставлен") обратно на сайт. Это реализуется обратным запросом из 1С на вебхук (Webhook) сайта в момент изменения статуса документа ЗаказПокупателя в базе 1С.
Чтобы не потратить кучу времени на заведомо убыточный проект интеграции, перед стартом работ обязательно задайте клиенту следующие вопросы:
Подводя итог, можно сказать: связка стороннего сайта с 1С:УНФ через HTTP-сервисы — это надежное, быстрое и современное решение. Оно позволяет автоматизировать даже такие сложные процессы, как учет производства фастфуда в реальном времени, повышая скорость обслуживания клиентов и прозрачность складского учета.