Как программно скрыть определенные реквизиты в форме списка документов в 1С?

Программист 1С v8.3 (Обычные формы) 1C:Бухгалтерия IT и автоматизация бизнеса
← На главную

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

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

Программное скрытие колонок в обычных формах (на примере 1С v8.3 / v8.2)

Рассмотрим ситуацию, с которой столкнулся автор темы на форуме. В обычных формах (например, в конфигурации «Бухгалтерия предприятия 2.0») списки документов строятся на основе элемента управления «Табличное поле», которое связано с объектом базы данных. Чтобы управлять отображением реквизитов, необходимо обратиться к коллекции колонок этого табличного поля.

Выясним точный синтаксис обращения к элементам управления. Для этого мы используем коллекцию ЭлементыФормы. Чтобы скрыть колонку, нам нужно обратиться к конкретной колонке табличного поля по ее имени. Пример кода, который успешно решил проблему автора:


Процедура ПриОткрытии()
    // Скрываем колонку "СуммаПоРазделам" в табличном поле "ДокументСписок"
    ЭлементыФормы.ДокументСписок.Колонки.СуммаПоРазделам.Видимость = Ложь;
КонецПроцедуры

В данном примере ДокументСписок — это имя элемента управления на форме (табличного поля), а СуммаПоРазделам — имя конкретной колонки, отображающей нужный нам реквизит.

Динамическая настройка видимости через регистр сведений

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

Разберем этот подход по шагам:

  1. Создадим в конфигураторе новый регистр сведений (например, НастройкиВидимостиРеквизитов) с измерениями: Пользователь (тип Ссылка на справочник Пользователи), ИмяОбъекта (Строка), ИмяРеквизита (Строка) и ресурсом ЗначениеВидимости (Булево).
  2. При открытии формы списка будем выполнять запрос к этому регистру, передавая текущего пользователя и имя текущего документа.
  3. На основании полученной записи будем устанавливать видимость колонок табличного поля.

Посмотрим на пример реализации данного алгоритма в модуле формы списка документов:


Процедура ПриОткрытии()
    ТекущийПользователь = ПараметрыСеанса.ТекущийПользователь;
    ИмяДокумента = Метаданные().Имя; // Получаем имя текущего документа
    
    // Запрос к регистру сведений
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ" 
        "    Настройки.ИмяРеквизита," 
        "    Настройки.ЗначениеВидимости" 
        "ИЗ" 
        "    РегистрСведений.НастройкиВидимостиРеквизитов КАК Настройки" 
        "ГДЕ" 
        "    Настройки.Пользователь = &Пользователь" 
        "    И Настройки.ИмяОбъекта = &ИмяОбъекта";
    
    Запрос.УстановитьПараметр("Пользователь", ТекущийПользователь);
    Запрос.УстановитьПараметр("ИмяОбъекта", ИмяДокумента);
    
    Выборка = Запрос.Выполнить().Выбрать();
    Пока Выборка.Следующий() Цикл
        ИмяКолонки = Выборка.ИмяРеквизита;
        Если ЭлементыФормы.ДокументСписок.Колонки.Найти(ИмяКолонки) <> Неопределено Тогда
            ЭлементыФормы.ДокументСписок.Колонки[ИмяКолонки].Видимость = Выборка.ЗначениеВидимости;
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Этот способ позволяет администраторам системы оперативно управлять интерфейсом пользователей в режиме «1С:Предприятие» без изменения программного кода конфигурации. Для интерактивной настройки видимости и других параметров элементов без доработки кода можно применить обработку для редактирования свойств элементов открытых форм.

Программное скрытие колонок в управляемых формах (1С v8.3, Бухгалтерия 3.0)

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

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

Разберем пример реализации в модуле управляемой формы:


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

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

Критически важный аспект: Ограничение видимости не равно защита данных!

Каждый разработчик 1С должен четко понимать разницу между кастомизацией интерфейса и разграничением прав доступа. Программное скрытие колонки формы через свойство Видимость = Ложь решает исключительно эстетическую или эргономическую задачу. Это действие не защищает ваши конфиденциальные данные от просмотра пользователем!

Если пользователь имеет права на чтение реквизита, он сможет получить доступ к скрытым данным следующими способами:

Для гарантированной защиты данных необходимо настраивать права доступа на уровне метаданных (ролей). Посмотрим, как это сделать правильно:

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

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

Альтернативные способы настройки видимости без написания кода

Платформа 1С:Предприятие 8 предоставляет мощные встроенные инструменты для управления видимостью элементов формы без создания программного кода в модулях.

Использование свойства «Пользовательская видимость»

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

Особенность этого механизма заключается в следующем:

Использование функциональных опций (ФО)

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

Блокировка интерактивной настройки формы для пользователей

Если вы программно скрыли колонку в коде формы, но хотите гарантировать, что пользователь не сможет вернуть ее обратно на форму интерактивно (через настройки списка), вам нужно заблокировать такую возможность:

После этого колонка будет скрыта программно, а в окне настройки формы она просто не появится в списке доступных для отображения элементов.

Проверка ролей в коде (вместо сложных регистров)

Если логика скрытия колонок завязана исключительно на роли пользователей (а не на конкретные фамилии), использование регистра сведений может оказаться избыточным усложнением. Для проверки доступности ролей непосредственно в программном коде используйте стандартные инструменты:

Для обычных форм:


Если Не РольДоступна("Бухгалтер") И Не РольДоступна("ПолныеПрава") Тогда
    ЭлементыФормы.ДокументСписок.Колонки.СуммаПоРазделам.Видимость = Ложь;
КонецЕсли;

В управляемых формах с использованием Библиотеки стандартных подсистем (БСП) проверку ролей рекомендуется делать через функции общего модуля БСП:


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

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

← На главную