Разработчики в среде «1С:Предприятие 8.3» часто сталкиваются с ситуацией, когда настроенное в конфигураторе условное оформление (УО) формы не срабатывает для управления видимостью стандартных полей шапки или кнопок. Типичный пример: необходимо скрыть вспомогательный элемент (например, панель «История» или поле ввода) до тех пор, пока новый документ не записан в базу данных. Казалось бы, механизм условного оформления идеально подходит для реализации этой логики без написания кода, но на практике поле упрямо остается на форме. Давайте подробно разберем, почему так происходит, изучим внутренние механизмы платформы и рассмотрим гарантированные, стандартизированные способы решения этой задачи.
Для начала выясним причину, по которой условное оформление игнорирует настройки видимости для обычных реквизитов. В платформе «1С:Предприятие» механизм условного оформления имеет строго разграниченные области применения в зависимости от типа оформляемого элемента:
Цвет фона, Цвет текста и Шрифт. Любые попытки настроить параметры Видимость, Доступность, ТолькоПросмотр или Отображать для нетабличных элементов платформой игнорируются.Видимость и Отображать в условном оформлении. В табличных верстках эти свойства позволяют динамически скрывать значения в конкретных строках или ячейках, перераспределяя экранное пространство.Официальная документация платформы подтверждает это поведение. Параметр условного оформления Видимость используется только для отключения отображения полей таблиц (поле надписи, ввода, переключателя, картинки). Место ячеек с отключенным отображением занимается за счет изменения размера соседних ячеек. Соответственно, попытка скрыть поле шапки формы с помощью УО — это архитектурная ошибка, которая не приведет к желаемому результату.
Вместо использования условного оформления для скрытия элемента «История» у нового (еще не сохраненного в базе данных) документа мы применим прямое программное управление свойством Видимость соответствующего элемента формы. Использование обработчиков ожидания (таймеров) в данном случае нерационально, так как оно создает избыточную нагрузку на клиентский сеанс. Статус документа «Новый» изменяется строго в определенные моменты жизненного цикла формы — при открытии и после успешной записи.
Рассмотрим по шагам правильную программную реализацию этой логики в модуле управляемой формы.
Шаг 1. Настройка при инициализации формы
В обработчике события ПриСозданииНаСервере (или ПриЧтенииНаСервере, если форма открывается для уже существующего объекта) мы должны проверить, записан ли объект в базу данных. Для этого используется функция ЗначениеЗаполнено(), в которую передается ссылка на текущий объект. Если ссылка пустая (новый документ), элемент «История» скрывается.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Проверяем, записан ли документ в базу данных.
// Если документ новый, Объект.Ссылка будет пустой, и свойство "Видимость" установится в Ложь.
Элементы.История.Видимость = ЗначениеЗаполнено(Объект.Ссылка);
КонецПроцедуры
Шаг 2. Обновление видимости после записи документа
После того как пользователь нажимает кнопку «Записать», транзакция успешно завершается, и документ получает реальную ссылку в базе данных. В этот момент нам необходимо сделать элемент «История» видимым на клиенте без перезапуска всей формы. Для этого задействуем клиентский обработчик события ПослеЗаписи.
&НаКлиенте
Процедура ПослеЗаписи(ПараметрыЗаписи)
// Документ гарантированно записан, делаем элемент "История" видимым
Элементы.История.Видимость = Истина;
КонецПроцедуры
Этот метод лаконичен, полностью соответствует стандартам разработки фирмы «1С» и работает мгновенно без лишних клиент-серверных вызовов.
В реальной практике задачи динамического изменения интерфейса могут быть значительно сложнее. Рассмотрим дополнительные приемы, которые применяют профессиональные разработчики 1С для проектирования гибких управляемых форм.
Если на форме необходимо скрывать не один элемент, а целые логические блоки, содержащие десятки реквизитов, управление свойством Видимость для каждого поля в отдельности превращает код в громоздкую структуру, которую тяжело поддерживать. В таких ситуациях мы рекомендуем группировать элементы внутри контейнеров типа Группа - Страницы.
Рассмотрим по шагам реализацию этого паттерна:
Группа - Страницы и отключите отображение закладок, установив свойство ОтображениеСтраниц в значение Нет.СтраницаНовыйОбъект (где будут находиться поля для заполнения нового документа) и СтраницаЗаписан (где будут выводиться полные данные, включая историю и системные отчеты).
&НаСервере
Процедура ОбновитьСостояниеИнтерфейса()
Если ЗначениеЗаполнено(Объект.Ссылка) Тогда
Элементы.ГруппаСтраницыИстория.ТекущаяСтраница = Элементы.СтраницаЗаписан;
Иначе
Элементы.ГруппаСтраницыИстория.ТекущаяСтраница = Элементы.СтраницаНовыйОбъект;
КонецЕсли;
КонецПроцедуры
В тех случаях, когда видимость полей или целых разделов формы зависит от глобальных настроек системы (например, включен ли в программе учет по нескольким складам или организациям), писать программный код для скрытия элементов не нужно. Достаточно использовать механизм Функциональных опций:
ПутьКДаннымПодвала или через свойства элемента.Если вы ведете разработку в типовых конфигурациях (ERP, КА, УТ, ЗУП, БП), в вашем распоряжении находится встроенная подсистема «Свойства» и механизмы управления доступностью. Вы можете настраивать видимость и обязательность заполнения реквизитов динамически через пользовательский режим (например, используя регистр сведений Настройки доступности элементов форм), избегая изменения кода конфигурации и упрощая процесс последующего обновления системы.
Чтобы разрабатываемые вами формы работали быстро и без сбоев, необходимо соблюдать стандарты разработки фирмы «1С» относительно механизмов оформления:
ПриСозданииНаСервере), а не интерактивно в свойствах формы в конфигураторе. Программный подход упрощает групповую разработку, слияние модулей при обновлении конфигураций и позволяет системе автоматизированной проверки кода (АПК) вовремя находить опечатки в именах реквизитов.Видимость = Ложь в УО для имитации фильтрации строк в табличных частях. Это приводит к критическому снижению производительности отрисовки интерфейса (особенно в веб-клиенте) и некорректному отображению полос прокрутки. Для скрытия строк таблиц всегда используйте полноценную фильтрацию и отборы на уровне источника данных (например, параметры отбора в динамическом списке или метод Скопировать() для таблиц значений).