Как настроить получение актуальных цен из 1С по запросу с сайта

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Интеграция интернет-магазина или внешнего портала с учетной системой 1С для получения актуальных остатков и цен — одна из самых распространенных задач. Часто возникает необходимость отдавать посетителю сайта точную стоимость товара с учетом динамических скидок, типа цен или объема заказа.

Рассмотрим, как правильно организовать взаимодействие между сайтом и 1С, какие инструменты платформы для этого предназначены и как избежать критических ошибок в производительности и безопасности.

Почему нельзя обращаться напрямую к базе данных 1С через SQL

Попытка отправлять прямые SQL-запросы в СУБД в обход сервера 1С — грубая архитектурная ошибка. Выясним основные причины, почему так делать категорически не рекомендуется:

  1. Нарушение целостности и структуры данных: внутренняя структура таблиц 1С оптимизирована под механизмы платформы. Имена таблиц и полей хранятся в зашифрованном или служебном виде, а логика срезов регистров, итогов и расчетов реализована на уровне сервера приложений.
  2. Отсутствие бизнес-логики: прямой запрос к таблице не учитывает модули ценообразования, персональные скидки, условия договоров и маркетинговые акции.
  3. Риск взаимных блокировок: некорректно составленный внешний SQL-запрос может заблокировать таблицы базы и полностью парализовать работу пользователей предприятия.

Использование HTTP-сервисов 1С: основной и рекомендуемый механизм

Начиная с версии платформы 8.3, основным и наиболее производительным способом онлайн-взаимодействия с внешними системами являются встроенные HTTP-сервисы. В отличие от тяжеловесных SOAP Web-сервисов, обмен по протоколу HTTP позволяет передавать компактные данные в формате JSON, что обеспечивает высокую скорость обработки.

Разберем по шагам, как устроен этот процесс:

  1. В дереве метаданных конфигурации создается объект HTTPСервис с заданным корневым шаблоном URL.
  2. В составе сервиса настраиваются методы (например, GET для запроса цены конкретного товара или POST для пакетного расчета корзины).
  3. В обработчике метода пишется модуль на встроенном языке 1С, который принимает объект 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):

  1. Выполняем публикацию сервисов через конфигуратор или утилиту командной строки. В каталоге публикации создается конфигурационный файл default.vrd.
  2. В файле default.vrd настраиваются параметры пула соединений: минимальное и максимальное количество сеансов, а также время жизни неиспользуемых подключений. Это исключает задержку на инициализацию сеанса при каждом новом запросе.
  3. Если сервер 1С и сервер сайта находятся в разных сетях, на сетевом оборудовании настраивается перенаправление портов (Port Forwarding) либо организуется защищенный туннель.
  4. В целях безопасности сервер 1С закрывают обратным прокси-сервером (Reverse Proxy) с шифрованием по HTTPS/TLS, ограничением доступа по IP-адресам бэкенда сайта и лимитом на количество запросов в секунду.

Лицензирование и управление сеансами

Проанализируем вопрос выделения лицензий при работе через HTTP-сервисы. Каждое активное подключение к опубликованному сервису платформы требует наличия клиентской лицензии. Сервер 1С берет лицензию на время удержания сеанса в пуле веб-сервера. Если пул лицензий исчерпан, сервис вернет ошибку отсутствия свободных лицензий.

Для оптимизации расхода лицензий и ресурсов базы необходимо настроить пул соединений в файле default.vrd так, чтобы неиспользуемые соединения оперативно закрывались.

Оптимизация архитектуры: как не положить сервер 1С

Отправлять запрос в 1С при каждом открытии карточки товара или обновлении каталога тысячами посетителей — неверное решение. 1С не предназначена для роли высоконагруженного веб-сервера при непредсказуемых всплесках трафика. Чтобы система работала стабильно и быстро, применим правильные архитектурные подходы:

  1. Асинхронные запросы: на стороне сайта запросы к 1С выполняются асинхронно, чтобы не блокировать и не замедлять генерацию основного HTML-кода страницы.
  2. Кэширование на стороне сайта: сайт сохраняет полученные цены в собственную базу данных или быструю оперативную память (in-memory кэш) на определенное время (например, на 10–30 минут) и отдает пользователям данные из кэша.
  3. Пакетная обработка корзины: онлайн-расчет цен в 1С целесообразно вызывать только на этапе оформления заказа (Checkout), когда требуется рассчитать сложную итоговую скидку от суммы или способа оплаты. В 1С передается единый POST-запрос со всем списком товаров, а не отдельный запрос на каждую позицию.
  4. Событийная модель (Webhooks): при изменении цен в 1С (например, при проведении документов установки цен) система сама отправляет обновленный пакет данных на веб-сервер с помощью объекта HTTPСоединение, обновляя кэш сайта без входящих запросов.
← На главную