Как скрыть элемент формы при работе через веб-клиент в 1С?

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

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

Выясняем причину: почему директива #Если ВебКлиент не работает на сервере

Для начала проанализируем ситуацию, с которой часто сталкиваются начинающие разработчики. Попытка написать в серверной процедуре ПриСозданииНаСервере код вида:


#Если ВебКлиент Тогда
    Элементы.ДобавитьКартинку.Видимость = Ложь;
#Иначе
    Элементы.ДобавитьКартинку.Видимость = Истина;
#КонецЕсли

приводит к тому, что при запуске через браузер картинка все равно остается видимой. Почему так происходит?

Дело в том, что директивы препроцессора (конструкции, начинающиеся с символа #) отрабатывают на этапе компиляции модуля на сервере, а не в процессе выполнения кода (рантайме). Когда сервер 1С подготавливает код процедуры ПриСозданииНаСервере к выполнению, он анализирует окружение самого сервера. Поскольку сервер не является веб-клиентом, условие #Если ВебКлиент для него всегда ложно. В результате компилятор сервера просто выбрасывает «клиентскую» ветку кода, оставляя только код из секции #Иначе. До веб-клиента этот код доходит уже в жестко скомпилированном виде, где видимости присваивается значение Истина.

Директивы препроцессора эффективны только в тех модулях или процедурах, которые физически компилируются и исполняются на стороне клиента (например, в процедурах с директивой &НаКлиенте).

Ниже мы подробно разберем четыре надежных способа, как обойти это ограничение платформы и корректно управлять видимостью элементов в веб-клиенте.

Способ 1. Управление видимостью на клиенте

Самый простой и очевидный способ — перенести логику управления видимостью в клиентский контекст, где директива препроцессора отработает именно так, как ожидает разработчик. Мы можем использовать обработчик события формы ПриОткрытии, который выполняется исключительно на клиенте.

Рассмотрим пример реализации:


&НаКлиенте
Процедура ПриОткрытии(Отказ)
    
    #Если ВебКлиент Тогда
        Элементы.ДобавитьКартинку.Видимость = Ложь;
    #Иначе
        Элементы.ДобавитьКартинку.Видимость = Истина;
    #КонецЕсли
    
КонецПроцедуры

В этом случае при компиляции модуля на тонком или толстом клиенте соберется ветка #Иначе, а при запуске в браузере — ветка #Если ВебКлиент. Метод отлично подходит, если вам нужно изменить свойства только визуальных элементов интерфейса, не затрагивая сложную серверную логику инициализации формы.

Способ 2. Использование механизмов БСП (Библиотеки Стандартных Подсистем)

Если ваша конфигурация разработана на базе БСП (а это относится к большинству современных типовых конфигураций 1С, таких как ERP, КА, УТ, БП, ЗУП), то определять тип клиента на сервере вручную нет необходимости. В составе БСП есть готовые функции, которые определяют клиентскую среду при старте системы и кэшируют этот результат.

Для управления интерфейсом на сервере в процедуре ПриСозданииНаСервере мы можем вызвать готовую функцию общего модуля БСП:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Проверяем, запущен ли сеанс через веб-клиент
    Если ОбщегоНазначения.ЭтоВебКлиент() Тогда
        Элементы.ДобавитьКартинку.Видимость = Ложь;
    Иначе
        Элементы.ДобавитьКартинку.Видимость = Истина;
    КонецЕсли;
    
КонецПроцедуры

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

Способ 3. Передача информации через параметры сеанса (для самописных конфигураций)

Если вы разрабатываете конфигурацию с нуля и не используете БСП, вы можете самостоятельно реализовать механизм кэширования типа клиента на сервере. Для этого мы свяжем клиентский запуск системы с серверным контекстом через Параметры сеанса.

Разберем этот процесс по шагам:

  1. В дереве метаданных конфигурации создайте новый Параметр сеанса с именем ТипКлиентаВеб (тип значения — Булево).
  2. Откройте Модуль управляемого приложения и найдите предопределенную процедуру ПриНачалеРаботыСистемы (она всегда выполняется на клиенте). Напишем в ней код определения типа клиента и передадим его на сервер:

&НаКлиенте
Процедура ПриНачалеРаботыСистемы()
    
    ЭтоВебКлиент = Ложь;
    #Если ВебКлиент Тогда
        ЭтоВебКлиент = Истина;
    #КонецЕсли
    
    // Вызываем серверный метод для записи параметра сеанса
    УстановитьПараметрСеансаТипКлиента(ЭтоВебКлиент);
    
КонецПроцедуры

Запись параметра сеанса должна происходить в общем модуле с установленным флагом Сервер и вызовом клиента:


Процедура УстановитьПараметрСеансаТипКлиента(Значение) Экспорт
    ПараметрыСеанса.ТипКлиентаВеб = Значение;
КонецПроцедуры

Теперь в любой серверной процедуре формы (включая ПриСозданииНаСервере) вы можете легко и быстро проверить тип клиента:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    Если ПараметрыСеанса.ТипКлиентаВеб Тогда
        Элементы.ДобавитьКартинку.Видимость = Ложь;
    КонецЕсли;
    
КонецПроцедуры

Способ 4. Использование функциональных опций

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

Проанализируем этот подход:

  1. Создайте параметр сеанса ТипКлиентаВеб (как описано в Способе 3).
  2. Создайте объект конфигурации Функциональная опция с именем РаботаВВебКлиенте. В качестве источника данных для нее укажите ваш параметр сеанса ТипКлиентаВеб.
  3. Теперь откройте нужную форму документа или справочника, выберите элемент управления (например, декорацию-картинку) и найдите в свойствах поле Путь к данным функциональной опции (или свойства состава функциональной опции в самом объекте ФО).

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

Таким образом, комбинируя рассмотренные методы, вы сможете создавать гибкие и производительные интерфейсы 1С, которые будут корректно и быстро работать как в настольном приложении, так и в любом современном веб-браузере.

← На главную