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