При переходе с платформы 1С 7.7 на современные конфигурации 1С:Предприятие 8.3 многие разработчики сталкиваются с необходимостью пересмотра архитектуры интеграции с интернет-магазином. В старых системах часто практиковался подход с прямым чтением и записью таблиц СУБД через SQL-запросы. Однако в современных версиях платформы 1С 8.3 такой подход не только нарушает лицензионное соглашение и нарушает целостность данных, но и создает серьезные риски сбоев при обновлении конфигураций.
Разберем, какие штатные и архитектурные решения позволяют реализовать моментальное получение остатков, цен, создание заказов и резервирование товаров в реальном времени без задержек и потери стабильности.
Платформа 1С 8.3 предоставляет несколько стандартных технологий для взаимодействия с внешними веб-системами без использования файлового обмена:
Проанализируем типичную ошибку: когда сайт при каждом добавлении товара в корзину или оформлении заказа сразу обращается к 1С и пытается оперативно провести документ с резервированием остатков в регистрах накопления. В высоконагруженном интернет-магазине это приводит к следующим критическим проблемам:
Для достижения максимальной скорости отклика сайта и гарантированной стабильности 1С применим проверенные архитектурные паттерны.
Рассмотрим, как разделить потоки информации:
Чтобы изолировать учетную систему от всплесков веб-трафика, между интернет-магазином и 1С внедряется брокер сообщений (например, RabbitMQ). Сайт мгновенно помещает заказ в очередь и возвращает клиенту номер заказа. 1С с заданной периодичностью или постоянным слушателем вычитывает сообщения из очереди и создает документы без риска перегрузки базы.
Создание документа разделяется на два этапа:
ЗаказКлиента или СчетНаОплату в статусе «Не проведен» (без наложения тяжелых блокировок на регистры накопления).Посмотрим на практический пример программного кода метода HTTP-сервиса, который принимает заказ в формате JSON и создает документ в информационной базе:
Функция ПринятьЗаказPOST(Запрос)
Ответ = Новый HTTPСервисОтвет(200);
Ответ.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
ТелоСтрокой = Запрос.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(ТелоСтрокой);
ДанныеЗаказа = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
// Создаем документ в базе без немедленного тяжелого проведения
ДокументЗаказ = Документы.ЗаказПокупателя.СоздатьДокумент();
ДокументЗаказ.Дата = ТекущаяДатаСеанса();
ДокументЗаказ.Контрагент = Справочники.Контрагенты.НайтиПоРеквизиту("ИдентификаторСайта", ДанныеЗаказа.ИДКлиента);
Для Каждого Стр Из ДанныеЗаказа.Товары Цикл
НоваяСтрока = ДокументЗаказ.Товары.Добавить();
НоваяСтрока.Номенклатура = Справочники.Номенклатура.НайтиПоРеквизиту("Артикул", Стр.Артикул);
НоваяСтрока.Количество = Стр.Количество;
НоваяСтрока.Цена = Стр.Цена;
НоваяСтрока.Сумма = Стр.Количество * Стр.Цена;
КонецЦикла;
Попытка
ДокументЗаказ.Записать(РежимЗаписиДокумента.Запись);
СтруктураОтвета = Новый Структура;
СтруктураОтвета.Вставить("Успех", Истина);
СтруктураОтвета.Вставить("Номер1С", ДокументЗаказ.Номер);
СтруктураОтвета.Вставить("Идентификатор", Строка(ДокументЗаказ.Ссылка.УникальныйИдентификатор()));
Исключение
Ответ.КодСостояния = 500;
СтруктураОтвета = Новый Структура;
СтруктураОтвета.Вставить("Успех", Ложь);
СтруктураОтвета.Вставить("Ошибка", ОписаниеОшибки());
КонецПопытки;
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, СтруктураОтвета);
Ответ.УстановитьТелоИзСтроки(ЗаписьJSON.Закрыть(), КодировкаТекста.UTF8);
Возврат Ответ;
КонецФункции
При организации обмена через HTTP- и Web-сервисы важно учитывать правила лицензирования платформы 1С: