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