Как ограничить выбор полей в меню "Изменить форму" в 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке и настройке конфигураций на базе 1С часто возникает задача гибкого управления интерфейсом. Рассмотрим ситуацию: в табличной части документа (например, заказа клиента) есть реквизит ссылочного типа, такой как номенклатура. Нам необходимо запретить пользователям выводить на форму определенные дочерние реквизиты (например, поле Номенклатура.СтавкаНДС) через типовое меню "Изменить форму". При этом важно, чтобы ограничения применялись только к одному конкретному документу, а не на уровне прав доступа к объекту метаданных в целом. Разберем по шагам, как можно реализовать такую логику и обойти встроенные ограничения платформы.

Ограничения платформы 1С

Сначала проанализируем, как работает механизм "Изменить форму" под капотом. В платформе 1С окно диалога "Добавить поля" формируется динамически на основании структуры метаданных типа реквизита и прав текущего пользователя.

К сожалению, в платформе нет штатного метода или свойства, позволяющего на уровне одной конкретной управляемой формы выборочно исключить отдельный дочерний реквизит из дерева доступных для добавления полей, не затрагивая при этом права доступа. Ограничение прав на чтение реквизита (например, СтавкаНДС) на уровне ролей или RLS решило бы задачу в окне настройки, но это глобальное ограничение. Оно затронет всю конфигурацию, а не только один документ, что противоречит нашему исходному условию.

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

Вариант 1: Использование условного оформления или программное скрытие полей

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

На форуме предложили использовать условное оформление: проверять, выведен ли реквизит на форму, и если да, устанавливать его видимость в значение Ложь. Также можно реализовать это программно при инициализации формы. Разберем этот вариант подробнее.

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


// Пример программного скрытия элемента формы по пути к данным
Для Каждого ЭлементФормы Из Элементы.Товары.ПодчиненныеЭлементы Цикл
    Если ТипЗнч(ЭлементФормы) = Тип("ПолеФормы") Тогда
        Если ЭлементФормы.ПутьКДанным = "Объект.Товары.Номенклатура.СтавкаНДС" Тогда
            ЭлементФормы.Видимость = Ложь;
            // Либо можно полностью удалить элемент:
            // Элементы.Удалить(ЭлементФормы);
        КонецЕсли;
    КонецЕсли;
КонецЦикла;

Важный нюанс: если пользователь добавит это поле "на лету" в уже открытой форме документа, оно временно появится на экране до момента закрытия. Однако при следующем открытии документа наш серверный код корректно обработает состав элементов и скроет ненужную колонку.

Вариант 2: Запрет настройки формы целиком

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

  1. В палитре свойств управляемой формы снимите флаг Разрешить изменять форму.
  2. Для большей гибкости это можно сделать программно в событии ПриСозданииНаСервере.

// Отключаем возможность изменения формы для конкретного документа
ЭтаФорма.РазрешитьИзменятьФорму = Ложь;

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

Вариант 3: Разрыв прямой связи реквизита формы с объектом базы

Рассмотрим более сложный, но изящный архитектурный подход. Если колонка табличной части формы не связана напрямую с реквизитом Объект.Товары.Номенклатура, платформа не определит её ссылочный тип. Следовательно, в диалоге "Добавить поля" дочерние реквизиты номенклатуры вообще не появятся.

Для реализации этого метода:

  1. Добавьте на форму отдельный строковый реквизит или реквизит произвольного типа вместо прямого пути к справочнику.
  2. Выбор номенклатуры реализуйте через отдельную процедуру (обработку события выбора), которая будет записывать выбранную ссылку в скрытый реквизит объекта.
  3. Вывод представления номенклатуры выполняйте в созданную текстовую колонку.

В этом случае платформа не сможет развернуть дерево реквизитов номенклатуры при настройке формы.

Вариант 4: Очистка сохраненных настроек формы

Если пользователи уже успели вывести ненужные поля и сохранить этот вариант формы, вам потребуется сбросить их настройки. Сделать это можно программно с помощью объекта ХранилищеСистемныхНастроек.

Выясним, как удалить настройки конкретной формы для текущего пользователя:


// Очистка системных настроек формы документа
КлючНастроек = "Документ.ЗаказКлиента.Форма.ФормаДокумента/НастройкиФормы";
ХранилищеСистемныхНастроек.Удалить(КлючНастроек, "", ИмяТекущегоПользователя);

Подведение итогов

Мы проанализировали ситуацию и выяснили, что штатного флажка для скрытия дочерних реквизитов из меню настройки формы не существует. Однако мы можем эффективно комбинировать доступные инструменты. Если нужно точечное скрытие — используем программную проверку и свойство Видимость в обработчике ПриСозданииНаСервере. Если настройка формы не критична — отключаем её свойством РазрешитьИзменятьФорму. А для полного контроля над доступными полями разрываем связь колонки с данными ссылочного типа.

← На главную