Как исправить ошибку веб-интерфейса 1С при работе с параметрами сеанса и настроить Универсальный отчет в веб-клиенте

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

Публикация информационной базы 1С на веб-сервере (под управлением IIS или Apache) — это отличный способ предоставить пользователям удобный доступ к системе через обычный интернет-браузер. Однако в процессе первой публикации разработчики часто сталкиваются со специфическими ошибками, которые не возникали при тестировании в тонком или толстом клиенте. В рамках данной статьи мы подробно разберем две критические проблемы, упомянутые в обсуждении: ошибку инициализации параметров сеанса на клиенте и неработоспособность «Универсального отчета» в веб-интерфейсе.

Проблема 1: Ошибка обращения к параметрам сеанса в веб-клиенте

Рассмотрим ситуацию, когда сразу после ввода логина и пароля в окне браузера система выдает ошибку, указывающую на строку кода:

глПроверитьЗначение(ПараметрыСеанса.ТекстОшибки, СокрЛП(ВхТекстОшибки));

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

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

Анализ решения с флагом «Внешнее соединение»

В ходе обсуждения автор темы сообщил, что проблема решилась установкой галочки «Внешнее соединение» в свойствах общего модуля. Проанализируем, почему это решение является иллюзорным и небезопасным.

Установка флага «Внешнее соединение» лишь разрешает компиляцию кода модуля при подключении к базе через COM-соединение. Если этот же общий модуль имеет включенный флаг «Клиент (управляемое приложение)» и вызывается из браузера, то обращение к ПараметрыСеанса.ТекстОшибки на клиенте все равно рано или поздно приведет к аварийному завершению работы веб-клиента. Скорее всего, в процессе тестирования автора вызов процедуры временно сместился в серверный контекст, либо конфигурация была запущена в режиме, отличном от чистого веб-клиента.

Правильные архитектурные решения (Best Practices)

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

Вариант 1. Использование инструкций препроцессора (экранирование кода)

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


#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
    глПроверитьЗначение(ПараметрыСеанса.ТекстОшибки, СокрЛП(ВхТекстОшибки));
#КонецЕсли

В этом случае компилятор веб-клиента просто проигнорирует данную строку кода, что предотвратит возникновение синтаксических и runtime-ошибок в браузере.

Вариант 2. Вынос логики на сервер (Server Call)

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

Внутри этого модуля создадим экспортную функцию, которая будет считывать параметр на сервере и возвращать его на клиент:


Функция ПолучитьТекстОшибкиИзСеанса() Экспорт
    Возврат ПараметрыСеанса.ТекстОшибки;
КонецФункции

Теперь на стороне веб-клиента мы можем безопасно вызвать эту функцию:


ТекстОшибкиСеанса = ОбщегоНазначенияВызовСервера.ПолучитьТекстОшибкиИзСеанса();
глПроверитьЗначение(ТекстОшибкиСеанса, СокрЛП(ВхТекстОшибки));

Вариант 3. Однократное кэширование на клиенте при запуске

Поскольку каждое обращение к серверу через веб-клиент генерирует HTTP-запрос и снижает общую производительность системы, рекомендуется кэшировать часто используемые параметры сеанса (например, текущего пользователя или его настройки) в модуле управляемого приложения при начале работы системы, сохраняя их в глобальные переменные клиента.

---

Проблема 2: Почему «Универсальный отчет» не работает в веб-клиенте, а СКД работает?

Второй вопрос автора касается ситуации, когда отчет, построенный на базе Системы компоновки данных (СКД), успешно формируется в браузере, в то время как «Универсальный отчет» не выводит данные или вообще не открывается. Проанализируем технические причины этого поведения.

Причина 1: Конфликт Обычных и Управляемых форм

В старых конфигурациях или самописных базах «Универсальный отчет» представляет собой обработку, построенную на обычных формах. Платформа 1С:Предприятие в режиме веб-клиента принципиально не способна отображать обычные формы, так как они используют механизмы рендеринга операционной системы Windows (Win32 API) и ActiveX, недоступные в веб-браузерах.

Почему при этом работает СКД: Схема компоновки данных является декларативным описанием структуры отчета. Если у отчета на базе СКД отсутствует жестко привязанная форма (или создана управляемая форма), платформа 1С автоматически генерирует интерфейс управляемой формы «на лету». Этот автогенерируемый интерфейс полностью адаптирован под веб-клиент и прекрасно рендерится в браузере в виде HTML и CSS.

Причина 2: Использование синхронных методов

В коде старых версий «Универсального отчета» часто встречаются синхронные модальные вызовы интерактивных функций, такие как:

Современные веб-браузеры в целях безопасности блокируют любые попытки выполнения синхронного JavaScript-кода, останавливающего поток выполнения. Если в коде отчета присутствует такой метод, веб-клиент аварийно прекратит работу программы.

Для корректной работы в веб-интерфейсе весь интерактивный код должен быть переписан с использованием асинхронных аналогов. Рассмотрим пример адаптации кода:

Было (не работает в веб-клиенте):

Предупреждение("Отчет сформирован успешно!");

Стало (работает везде):

ПоказатьПредупреждение(Новый ОписаниеОповещения, "Отчет сформирован успешно!");

Причина 3: Лимиты веб-сервера на объем передаваемых данных

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

Если размер отчета превышает лимиты веб-сервера (например, настройки LimitRequestBody в Apache или maxAllowedContentLength в IIS), веб-сервер вернет ошибку (например, HTTP: Expectation failed 417 или 500 Internal Server Error), и отчет не будет выведен на экран.

Как решить проблему с Универсальным отчетом?

Для исправления работы отчетов в веб-интерфейсе рекомендуем выполнить следующие шаги:

  1. Интеграция БСП: Перенесите современный вариант «Универсального отчета» из актуальной версии Библиотеки стандартных подсистем (БСП). Он полностью написан на управляемых формах, не использует устаревшие синхронные вызовы и оптимизирован для работы в любых веб-браузерах.
  2. Перевод отчетов на чистый СКД: По возможности откажитесь от использования громоздких внешних обработок отчетов. Перепишите логику получения данных на чистую Систему компоновки данных. Платформа 1С самостоятельно позаботится об отрисовке настроек, группировок, отборов и условного оформления в веб-интерфейсе без написания сложного кода.
  3. Настройка веб-сервера: Если ваши отчеты содержат большие объемы данных, обязательно увеличьте лимиты на размер принимаемых POST-запросов в конфигурационных файлах вашего веб-сервера IIS или Apache.
← На главную