Как реализовать генерацию HTML на стороне 1С и создавать полноценные веб-интерфейсы?

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

Многие разработчики привыкли воспринимать платформу 1С исключительно как учетную систему со стандартным, жестко заданным интерфейсом. Однако современные версии платформы предоставляют колоссальную гибкость. Используя HTTP-сервисы и механизмы генерации текстовых данных, мы можем превратить 1С в полноценный веб-бэкенд (CMS), который самостоятельно формирует HTML-страницы и отдает их конечным пользователям в браузер.

Разберем подробно, почему этот подход становится все более популярным, как устроена его архитектура, и проанализируем практические примеры реализации генерации HTML-кода непосредственно внутри 1С.

Зачем генерировать веб-страницы на стороне 1С?

Прежде чем переходить к коду, определим ключевые преимущества такого подхода по сравнению с классической интеграцией (например, связкой 1С с Битриксом или другими CMS):

  1. Сложные расчеты в реальном времени. Логика расчета цен, зависящих от индивидуальных соглашений контрагентов, скидок от объема, или остатков по характеристикам на нескольких складах в 1С бывает чрезвычайно запутанной. Переносить эти алгоритмы на сторону стороннего сайта долго, дорого и небезопасно. Проще и надежнее вычислять все прямо в 1С и сразу отдавать готовую верстку.
  2. Отсутствие сложного обмена данными. Больше не нужно настраивать регулярную синхронизацию каталогов, цен и заказов. База данных 1С сама выступает источником контента для сайта в режиме реального времени.
  3. Экономия на лицензиях. Лицензирование веб-клиентов 1С накладывает свои ограничения. Собственный легкий веб-интерфейс, работающий через HTTP-сервисы, обходится без постоянных сеансов, что существенно снижает требования к лицензиям и нагрузку на сервер.

---

Простейшие методы генерации HTML в 1С

Рассмотрим самые простые способы получения HTML-кода из платформы. Самый очевидный инструмент для выгрузки готовых отчетов — это использование объекта ТабличныйДокумент.

Мы можем программно заполнить табличный документ данными, настроить оформление и сохранить его в файл формата HTML всего одной строкой кода:


ТабДок = Новый ТабличныйДокумент;
// Заполнение табличного документа макетами или программно...
ТабДок.Записать("C:\temp\report.html", ТипФайлаТабличногоДокумента.HTML);

Однако для создания интерактивного сайта или личного кабинета дилера такой подход не подойдет: нам нужен чистый, адаптивный и легко управляемый HTML-код. В этом случае мы используем шаблонизацию.

Посмотрим на пример из практики, когда структура веб-страницы описывается в виде многострочной строки, а динамические данные подставляются с помощью встроенной функции СтрШаблон(). Разберем следующую функцию:


Функция ПолучитьТелоСтраницы()
    Тело = "
    |
    |
    |
    |    %1
    |    
    |    
    |    
    |    
    |
    |
    |    
|
|

%1

|
|
| %2 |
|
| |"; Возврат Тело; КонецФункции

В данном шаблоне маркеры %1 и %2 резервируют места под заголовок страницы и ее основное содержимое. Теперь напишем алгоритм, который будет заполнять этот шаблон данными из справочника номенклатуры:


Заголовок = "Каталог доступных товаров";
ТаблицаТоваров = "";
ТаблицаТоваров = ТаблицаТоваров + "";

Выборка = Справочники.Номенклатура.Выбрать();
Пока Выборка.Следующий() Цикл
    // Предположим, цена получается из регистра сведений
    ЦенаНоменклатуры = ПолучитьЦену(Выборка.Ссылка); 
    ТаблицаТоваров = ТаблицаТоваров + СтрШаблон("", Выборка.Наименование, ЦенаНоменклатуры);
КонецЦикла;

ТаблицаТоваров = ТаблицаТоваров + "
НаименованиеЦена
%1%2 руб.
"; // Объединяем шаблон страницы с нашими данными ИтоговыйHTML = СтрШаблон(ПолучитьТелоСтраницы(), Заголовок, ТаблицаТоваров);

---

Архитектура веб-решения на базе HTTP-сервисов

Чтобы сгенерированный HTML-код попал к пользователю в браузер, базу 1С необходимо опубликовать на веб-сервере (IIS или Apache) и настроить в конфигурации HTTPСервисы. Проанализируем по шагам, как настроить маршрутизацию запросов:

  1. В дереве метаданных конфигурации создаем новый объект HTTP-сервис с именем ВебПортал.
  2. Указываем корневой URL (например, portal).
  3. Создаем шаблон URL вида /catalog и добавляем к нему метод GET, связав его с процедурой в модуле HTTP-сервиса.

Рассмотрим пример обработчика GET-запроса, который возвращает пользователю сформированную HTML-страницу:


Функция КаталогПолучить(Запрос)
    Ответ = Новый HTTPСервисОтвет(200);
    
    // Формируем контент
    Заголовок = "Наш оптовый каталог";
    Содержимое = СформироватьHTMLТаблицыТоваров(); // Вызывает логику сборки HTML
    HTMLСтраница = СтрШаблон(ПолучитьТелоСтраницы(), Заголовок, Содержимое);
    
    // Передаем HTML-строку в тело ответа веб-сервера
    Ответ.УстановитьТелоИзСтроки(HTMLСтраница, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
    
    // Указываем браузеру правильный тип содержимого
    Ответ.Заголовки.Вставить("Content-Type", "text/html; charset=utf-8");
    
    Возврат Ответ;
КонецФункции

---

Где лучше хранить HTML-шаблоны?

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

---

Интерактивность на клиенте: использование AJAX и библиотеки HTMX

Главная сложность при генерации страниц силами 1С — это интерактивность на стороне клиента (реагирование на нажатие кнопок без полной перезагрузки страницы).

Существует два основных архитектурных пути решения этой задачи:

Вариант 1. Классический подход (JavaScript + JSON)

Клиентский JS-скрипт отправляет асинхронный AJAX-запрос к HTTP-сервису 1С, получает оттуда структурированные данные в формате JSON и динамически перерисовывает элементы веб-интерфейса. Это требует от 1С-разработчика хорошего знания JavaScript на стороне фронтенда.

Вариант 2. Современный подход с использованием HTMX (Server-Side Rendering)

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С.

Для обеспечения безопасности и снижения нагрузки на основную базу данных рекомендуется использовать следующую схему публикации:

  1. Проксирование запросов. База 1С никогда не должна «смотреть» напрямую в интернет. Используйте обратный прокси-сервер (например, Nginx) для кэширования статических ресурсов (картинок, стилей, JS-файлов) и перенаправления динамических запросов в 1С.
  2. Разделение баз данных. Полноценный публичный интернет-магазин или крупный B2B-портал лучше разворачивать на отдельной («веб») базе 1С, которая обменивается данными с основной рабочей базой (ERP, УТ) в фоновом режиме.
← На главную