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