Интеграция интернет-магазина или внешнего портала с учетной системой 1С для получения актуальных остатков и цен — одна из самых распространенных задач. Часто возникает необходимость отдавать посетителю сайта точную стоимость товара с учетом динамических скидок, типа цен или объема заказа.
Рассмотрим, как правильно организовать взаимодействие между сайтом и 1С, какие инструменты платформы для этого предназначены и как избежать критических ошибок в производительности и безопасности.
Попытка отправлять прямые SQL-запросы в СУБД в обход сервера 1С — грубая архитектурная ошибка. Выясним основные причины, почему так делать категорически не рекомендуется:
Начиная с версии платформы 8.3, основным и наиболее производительным способом онлайн-взаимодействия с внешними системами являются встроенные HTTP-сервисы. В отличие от тяжеловесных SOAP Web-сервисов, обмен по протоколу HTTP позволяет передавать компактные данные в формате JSON, что обеспечивает высокую скорость обработки.
Разберем по шагам, как устроен этот процесс:
HTTPСервис с заданным корневым шаблоном URL.GET для запроса цены конкретного товара или POST для пакетного расчета корзины).HTTPСервисЗапрос, выполняет выборку данных и возвращает HTTPСервисОтвет.Посмотрим на пример простого обработчика для отдачи цены товара по его коду:
Функция ПолучитьЦенуТовара(Запрос)
ПараметрыURL = Запрос.ПараметрыЗапроса;
КодТовара = ПараметрыURL.Получить("code");
Если Не ЗначениеЗаполнено(КодТовара) Тогда
Возврат Новый HTTPСервисОтвет(400); // Некорректный запрос
КонецЕсли;
ЗапросКБД = Новый Запрос;
ЗапросКБД.Текст =
"ВЫБРАТЬ
| Цены.Цена КАК Цена,
| Цены.Валюта.Код КАК Валюта
|ИЗ
| РегистрСведений.ЦеныНоменклатуры.СрезПоследних(
| ,
| Номенклатура.Код = &Код
| И ВидЦены = &ВидЦены) КАК Цены";
ЗапросКБД.УстановитьПараметр("Код", КодТовара);
ЗапросКБД.УстановитьПараметр("ВидЦены", Справочники.ВидыЦен.НайтиПоНаименованию("Розничная"));
Выборка = ЗапросКБД.Выполнить().Выбрать();
СтруктураОтвета = Новый Структура;
Если Выборка.Следующий() Тогда
СтруктураОтвета.Вставить("Цена", Выборка.Цена);
СтруктураОтвета.Вставить("Валюта", Выборка.Валюта);
СтруктураОтвета.Вставить("Статус", "Успешно");
Иначе
СтруктураОтвета.Вставить("Статус", "ТоварИлиЦенаНеНайдены");
КонецЕсли;
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, СтруктураОтвета);
СтрокаJSON = ЗаписьJSON.Закрыть();
Ответ = Новый HTTPСервисОтвет(200);
Ответ.УстановитьТелоИзСтроки(СтрокаJSON, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
Ответ.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
Возврат Ответ;
КонецФункции
Чтобы внешние запросы с сайта могли доходить до базы 1С, необходимо настроить публикацию интерфейсов базы на поддерживаемом веб-сервере (Apache HTTP Server или Microsoft IIS):
default.vrd.default.vrd настраиваются параметры пула соединений: минимальное и максимальное количество сеансов, а также время жизни неиспользуемых подключений. Это исключает задержку на инициализацию сеанса при каждом новом запросе.Проанализируем вопрос выделения лицензий при работе через HTTP-сервисы. Каждое активное подключение к опубликованному сервису платформы требует наличия клиентской лицензии. Сервер 1С берет лицензию на время удержания сеанса в пуле веб-сервера. Если пул лицензий исчерпан, сервис вернет ошибку отсутствия свободных лицензий.
Для оптимизации расхода лицензий и ресурсов базы необходимо настроить пул соединений в файле default.vrd так, чтобы неиспользуемые соединения оперативно закрывались.
Отправлять запрос в 1С при каждом открытии карточки товара или обновлении каталога тысячами посетителей — неверное решение. 1С не предназначена для роли высоконагруженного веб-сервера при непредсказуемых всплесках трафика. Чтобы система работала стабильно и быстро, применим правильные архитектурные подходы:
HTTPСоединение, обновляя кэш сайта без входящих запросов.