Как организовать передачу остатков из 1С:Торговля 10.3 на самописный сайт по запросу через HTTP-сервисы

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

Интеграция 1С с веб-сайтами — одна из самых востребованных задач. В данной статье мы разберем ситуацию, когда инициатором обмена выступает сайт: он отправляет запрос в 1С, а программа должна в режиме реального времени (или близком к нему) вернуть актуальные остатки по товарам. Мы проанализируем архитектурные подходы, вопросы производительности при передаче нескольких тысяч позиций и технические нюансы реализации на платформе 8.3 для конфигураций на обычных формах (таких как УТ 10.3).

Выбор технологии: Web-сервисы vs HTTP-сервисы

Первым делом определимся с протоколом обмена. В системе 1С существуют два основных механизма:

  1. Web-сервисы (SOAP): Работают на основе строгого описания (WSDL). Они удобны, если сайт умеет работать с объектами XDTO и требует строгой типизации данных.
  2. HTTP-сервисы (REST): Более современные и легковесные. Они позволяют обмениваться данными в форматах JSON или XML. Для большинства современных сайтов JSON является стандартом де-факто из-за его компактности и простоты парсинга.

Учитывая, что сайт самописный, мы рекомендуем остановиться на HTTP-сервисах. Они создают меньшую нагрузку на сеть и проще в отладке.

Оценка объема данных и производительности

Рассмотрим вопрос автора о передаче 5 000 позиций. На первый взгляд, это кажется большим объемом, но в реальности JSON-пакет на такое количество строк будет весить примерно от 500 КБ до 1.5 МБ. Для современных каналов связи и серверов 1С это незначительная нагрузка. Однако здесь кроется другая проблема — время формирования данных.

Проанализируем ситуацию: если при каждом запросе сайта 1С будет выполнять тяжелый запрос к базе данных (например, обращаться к виртуальной таблице ОстаткиИОбороты), время ответа может превысить 30 секунд. Это приведет к тому, что веб-сервер (IIS или Apache) разорвет соединение по тайм-ауту (Error 504).

Чтобы избежать этой проблемы, применим стратегию буферизации данных:

  1. Создадим в 1С специальный РегистрСведений (например, «ОстаткиДляСайта»).
  2. Настроим РегламентныеЗадания, которые будут обновлять этот регистр раз в 10–15 минут.
  3. HTTP-сервис будет просто считывать готовые данные из этого регистра. Это обеспечит моментальный ответ (менее 1 секунды).

Реализация формирования JSON в 1С

Разберем, как технически подготовить данные. Если ваша платформа 1С версии 8.3.6 и выше, используйте встроенный объект ЗаписьJSON. Это работает значительно быстрее, чем ручное формирование строки.

Рассмотрим пример кода для формирования ответа в HTTP-сервисе:


Функция ПолучитьОстатки(Запрос)
    
    ЗаписьJSON = Новый ЗаписьJSON;
    ПараметрыЗаписи = Новый ПараметрыЗаписиJSON(,,, ЭкранированиеСимволовJSON.Нет);
    ЗаписьJSON.УстановитьСтроку(ПараметрыЗаписи);
    
    // Начинаем формирование массива объектов
    ЗаписьJSON.ЗаписатьНачалоМассива();
    
    ЗапросКБД = Новый Запрос;
    ЗапросКБД.Текст = 
        "ВЫБРАТЬ
        |   Остатки.Номенклатура.Артикул КАК Артикул,
        |   Остатки.Номенклатура.Наименование КАК Наименование,
        |   Остатки.КоличествоОстаток КАК Остаток
        |ИЗ
        |   РегистрНакопления.ТоварыНаСкладах.Остатки КАК Остатки";
    
    Выборка = ЗапросКБД.Выполнить().Выбрать();
    
    Пока Выборка.Следующий() Цикл
        ЗаписьJSON.ЗаписатьНачалоОбъекта();
        ЗаписьJSON.ЗаписатьИмяСвойства("sku");
        ЗаписьJSON.ЗаписатьЗначение(Выборка.Артикул);
        ЗаписьJSON.ЗаписатьИмяСвойства("name");
        ЗаписьJSON.ЗаписатьЗначение(Выборка.Наименование);
        ЗаписьJSON.ЗаписатьИмяСвойства("stock");
        ЗаписьJSON.ЗаписатьЗначение(Выборка.Остаток);
        ЗаписьJSON.ЗаписатьКонецОбъекта();
    КонецЦикла;
    
    ЗаписьJSON.ЗаписатьКонецМассива();
    
    РезультатСтрока = ЗаписьJSON.Закрыть();
    
    Ответ = Новый HTTPСервисОтвет(200);
    Ответ.УстановитьТелоИзСтроки(РезультатСтрока, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
    Ответ.Заголовки.Вставить("Content-Type", "application/json");
    
    Возврат Ответ;
    
КонецФункции

Масштабирование: Пагинация и Инкрементальная выгрузка

Если в будущем количество товаров вырастет до 50 000+, передача одним куском станет неэффективной. Выясним, как это предотвратить с помощью пагинации.

Внедрите в HTTP-сервис параметры limit (количество записей) и offset (смещение). Сайт будет запрашивать данные порциями:

Еще более продвинутый метод — инкрементальная выгрузка (дельта). С помощью механизма ПланыОбмена в 1С можно фиксировать только те позиции, по которым были движения. В этом случае сайт при запросе передает номер последней синхронизации, а 1С возвращает только измененные остатки.

Безопасность и публикация сервиса

Поскольку мы открываем доступ к базе из интернета, необходимо обеспечить безопасность:

  1. Авторизация: Используйте Basic Auth. Создайте в 1С отдельного пользователя с именем, например, «WebExchange», и задайте ему сложный пароль.
  2. Минимальные права: Назначьте этому пользователю роль, у которой есть права только на запуск конкретного HTTP-сервиса и чтение необходимых справочников. Полный доступ (права Администратора) категорически запрещен.
  3. Ограничение по IP: Настройте веб-сервер (IIS или Apache) так, чтобы он принимал запросы только с IP-адреса вашего сайта.
  4. SSL: Обязательно используйте протокол HTTPS, чтобы логин и пароль не были перехвачены в открытом виде.

Обработка ошибок

Важно, чтобы сервис возвращал корректные HTTP-статусы. Это позволит разработчику сайта быстро понять, что пошло не так:

Разберем пример обработки исключения в коде 1С:


Попытка
    // Основная логика получения данных
Исключение
    ТекстОшибки = ОписаниеОшибки();
    ЗаписьЖурналаРегистрации("ОбменССайтом", УровеньЖурналаРегистрации.Ошибка,,, ТекстОшибки);
    
    Ответ = Новый HTTPСервисОтвет(500);
    Ответ.УстановитьТелоИзСтроки("Внутренняя ошибка сервера 1С");
    Возврат Ответ;
КонецПопытки;

Подводя итог, можно сказать, что передача остатков через HTTP-сервис в формате JSON является оптимальным решением для 1С:Торговля 10.3. При правильном подходе с использованием буферных таблиц и ограничением прав доступа, система будет работать стабильно и быстро даже при значительном росте номенклатуры.

← На главную