Многие разработчики привыкли воспринимать платформу 1С исключительно как учетную систему со стандартным, жестко заданным интерфейсом. Однако современные версии платформы предоставляют колоссальную гибкость. Используя HTTP-сервисы и механизмы генерации текстовых данных, мы можем превратить 1С в полноценный веб-бэкенд (CMS), который самостоятельно формирует HTML-страницы и отдает их конечным пользователям в браузер.
Разберем подробно, почему этот подход становится все более популярным, как устроена его архитектура, и проанализируем практические примеры реализации генерации HTML-кода непосредственно внутри 1С.
Прежде чем переходить к коду, определим ключевые преимущества такого подхода по сравнению с классической интеграцией (например, связкой 1С с Битриксом или другими CMS):
---
Рассмотрим самые простые способы получения HTML-кода из платформы. Самый очевидный инструмент для выгрузки готовых отчетов — это использование объекта ТабличныйДокумент.
Мы можем программно заполнить табличный документ данными, настроить оформление и сохранить его в файл формата HTML всего одной строкой кода:
ТабДок = Новый ТабличныйДокумент;
// Заполнение табличного документа макетами или программно...
ТабДок.Записать("C:\temp\report.html", ТипФайлаТабличногоДокумента.HTML);
Однако для создания интерактивного сайта или личного кабинета дилера такой подход не подойдет: нам нужен чистый, адаптивный и легко управляемый HTML-код. В этом случае мы используем шаблонизацию.
Посмотрим на пример из практики, когда структура веб-страницы описывается в виде многострочной строки, а динамические данные подставляются с помощью встроенной функции СтрШаблон(). Разберем следующую функцию:
Функция ПолучитьТелоСтраницы()
Тело = "
|
|
|
| %1
|
|
|
|
|
|
|
|
| %1
|
|
| %2
|
|
|
|";
Возврат Тело;
КонецФункции
В данном шаблоне маркеры %1 и %2 резервируют места под заголовок страницы и ее основное содержимое. Теперь напишем алгоритм, который будет заполнять этот шаблон данными из справочника номенклатуры:
Заголовок = "Каталог доступных товаров";
ТаблицаТоваров = "";
ТаблицаТоваров = ТаблицаТоваров + "Наименование Цена ";
Выборка = Справочники.Номенклатура.Выбрать();
Пока Выборка.Следующий() Цикл
// Предположим, цена получается из регистра сведений
ЦенаНоменклатуры = ПолучитьЦену(Выборка.Ссылка);
ТаблицаТоваров = ТаблицаТоваров + СтрШаблон("%1 %2 руб. ", Выборка.Наименование, ЦенаНоменклатуры);
КонецЦикла;
ТаблицаТоваров = ТаблицаТоваров + "
";
// Объединяем шаблон страницы с нашими данными
ИтоговыйHTML = СтрШаблон(ПолучитьТелоСтраницы(), Заголовок, ТаблицаТоваров);
---
Чтобы сгенерированный HTML-код попал к пользователю в браузер, базу 1С необходимо опубликовать на веб-сервере (IIS или Apache) и настроить в конфигурации HTTPСервисы. Проанализируем по шагам, как настроить маршрутизацию запросов:
ВебПортал.portal)./catalog и добавляем к нему метод GET, связав его с процедурой в модуле HTTP-сервиса.Рассмотрим пример обработчика GET-запроса, который возвращает пользователю сформированную HTML-страницу:
Функция КаталогПолучить(Запрос)
Ответ = Новый HTTPСервисОтвет(200);
// Формируем контент
Заголовок = "Наш оптовый каталог";
Содержимое = СформироватьHTMLТаблицыТоваров(); // Вызывает логику сборки HTML
HTMLСтраница = СтрШаблон(ПолучитьТелоСтраницы(), Заголовок, Содержимое);
// Передаем HTML-строку в тело ответа веб-сервера
Ответ.УстановитьТелоИзСтроки(HTMLСтраница, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
// Указываем браузеру правильный тип содержимого
Ответ.Заголовки.Вставить("Content-Type", "text/html; charset=utf-8");
Возврат Ответ;
КонецФункции
---
Зашивать длинные HTML-теги и CSS-стили непосредственно в модули 1С в виде многострочных строк крайне неудобно. Разработчику сложно читать код и поддерживать верстку. Выясним, где эффективнее хранить структуру шаблонов:
ВебШаблоны) с реквизитом типа «Строка неограниченной длины» дает возможность менять дизайн сайта и структуру страниц «на лету» прямо в режиме «1С:Предприятие», избегая необходимости динамического обновления конфигурации и отключения пользователей.---
Главная сложность при генерации страниц силами 1С — это интерактивность на стороне клиента (реагирование на нажатие кнопок без полной перезагрузки страницы).
Существует два основных архитектурных пути решения этой задачи:
Клиентский JS-скрипт отправляет асинхронный AJAX-запрос к HTTP-сервису 1С, получает оттуда структурированные данные в формате JSON и динамически перерисовывает элементы веб-интерфейса. Это требует от 1С-разработчика хорошего знания JavaScript на стороне фронтенда.
HTMX — это легкая JS-библиотека, которая позволяет отправлять AJAX-запросы прямо из HTML-атрибутов без написания JS-кода. При таком подходе 1С выступает классическим SSR-движком. Браузер запрашивает у 1С не чистые данные, а готовые кусочки (фрагменты) HTML-кода, которые HTMX автоматически вставляет в нужную часть страницы.
Рассмотрим пример. Допустим, нам нужно динамически обновлять количество товаров в корзине при нажатии на кнопку «Добавить». В шаблоне нашей страницы мы прописываем элемент отображения корзины и кнопку добавления:
Товаров в корзине: 0
При нажатии кнопки библиотека HTMX перехватит событие и отправит POST-запрос в 1С по указанному пути. Наш HTTP-сервис обработает запрос, добавит товар в корзину в базе данных и вернет простой фрагмент HTML. Разберем код обработчика в 1С:
Функция КорзинаДобавитьТовар(Запрос)
ИдентификаторТовара = Запрос.ПараметрыЗапроса.Получить("id");
// Логика добавления товара в корзину текущего сеанса пользователя...
КоличествоТоваров = ПолучитьТекущееКоличествоВКорзине();
Ответ = Новый HTTPСервисОтвет(200);
// Возвращаем только текстовую строчку для замены содержимого контейнера
НовоеСодержимое = СтрШаблон("Товаров в корзине: %1", КоличествоТоваров);
Ответ.УстановитьТелоИзСтроки(НовоеСодержимое, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
Ответ.Заголовки.Вставить("Content-Type", "text/html; charset=utf-8");
Возврат Ответ;
КонецФункции
HTMX самостоятельно примет ответ от 1С и мгновенно заменит содержимое элемента #cart-info на присланный текст. Это избавляет от необходимости писать сложные фронтенд-скрипты, оставляя всю логику управления интерфейсом на стороне 1С.
---
Многие специалисты выражают скепсис относительно нагрузочной способности 1С в роли веб-сервера. Однако практика показывает обратное. Сеансы HTTP-сервисов в 1С работают в режиме stateless (без сохранения состояния). Обработав запрос за сотые доли секунды, 1С моментально закрывает сеанс и освобождает ресурсы.
Нагрузочное тестирование показывает, что сервер средней мощности при использовании HTTP-сервисов способен стабильно обслуживать более 100 активно работающих пользователей одновременно, что потребляет в разы меньше оперативной памяти, чем запуск аналогичного количества сессий тонкого или веб-клиента 1С.
Для обеспечения безопасности и снижения нагрузки на основную базу данных рекомендуется использовать следующую схему публикации: