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