Интеграция 1С с веб-сайтами — одна из самых востребованных задач. В данной статье мы разберем ситуацию, когда инициатором обмена выступает сайт: он отправляет запрос в 1С, а программа должна в режиме реального времени (или близком к нему) вернуть актуальные остатки по товарам. Мы проанализируем архитектурные подходы, вопросы производительности при передаче нескольких тысяч позиций и технические нюансы реализации на платформе 8.3 для конфигураций на обычных формах (таких как УТ 10.3).
Первым делом определимся с протоколом обмена. В системе 1С существуют два основных механизма:
XDTO и требует строгой типизации данных.JSON или XML. Для большинства современных сайтов JSON является стандартом де-факто из-за его компактности и простоты парсинга.Учитывая, что сайт самописный, мы рекомендуем остановиться на HTTP-сервисах. Они создают меньшую нагрузку на сеть и проще в отладке.
Рассмотрим вопрос автора о передаче 5 000 позиций. На первый взгляд, это кажется большим объемом, но в реальности JSON-пакет на такое количество строк будет весить примерно от 500 КБ до 1.5 МБ. Для современных каналов связи и серверов 1С это незначительная нагрузка. Однако здесь кроется другая проблема — время формирования данных.
Проанализируем ситуацию: если при каждом запросе сайта 1С будет выполнять тяжелый запрос к базе данных (например, обращаться к виртуальной таблице ОстаткиИОбороты), время ответа может превысить 30 секунд. Это приведет к тому, что веб-сервер (IIS или Apache) разорвет соединение по тайм-ауту (Error 504).
Чтобы избежать этой проблемы, применим стратегию буферизации данных:
РегистрСведений (например, «ОстаткиДляСайта»).РегламентныеЗадания, которые будут обновлять этот регистр раз в 10–15 минут.Разберем, как технически подготовить данные. Если ваша платформа 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 (смещение). Сайт будет запрашивать данные порциями:
/hs/stocks?limit=1000&offset=0/hs/stocks?limit=1000&offset=1000Еще более продвинутый метод — инкрементальная выгрузка (дельта). С помощью механизма ПланыОбмена в 1С можно фиксировать только те позиции, по которым были движения. В этом случае сайт при запросе передает номер последней синхронизации, а 1С возвращает только измененные остатки.
Поскольку мы открываем доступ к базе из интернета, необходимо обеспечить безопасность:
Basic Auth. Создайте в 1С отдельного пользователя с именем, например, «WebExchange», и задайте ему сложный пароль.HTTPS, чтобы логин и пароль не были перехвачены в открытом виде.Важно, чтобы сервис возвращал корректные HTTP-статусы. Это позволит разработчику сайта быстро понять, что пошло не так:
200 OK — запрос успешно обработан.401 Unauthorized — неверный логин или пароль пользователя 1С.400 Bad Request — сайт передал некорректные параметры (например, дату в неверном формате).500 Internal Server Error — произошла ошибка в коде 1С (рекомендуется записывать текст ошибки в ЖурналРегистрации для последующего анализа).Разберем пример обработки исключения в коде 1С:
Попытка
// Основная логика получения данных
Исключение
ТекстОшибки = ОписаниеОшибки();
ЗаписьЖурналаРегистрации("ОбменССайтом", УровеньЖурналаРегистрации.Ошибка,,, ТекстОшибки);
Ответ = Новый HTTPСервисОтвет(500);
Ответ.УстановитьТелоИзСтроки("Внутренняя ошибка сервера 1С");
Возврат Ответ;
КонецПопытки;
Подводя итог, можно сказать, что передача остатков через HTTP-сервис в формате JSON является оптимальным решением для 1С:Торговля 10.3. При правильном подходе с использованием буферных таблиц и ограничением прав доступа, система будет работать стабильно и быстро даже при значительном росте номенклатуры.