Разработка и Конфигурация · 11 мин
Как запретить выбор элемента справочника в 1С
Как запретить выбор элемента справочника в 1С: условный запрет в коде, пометка удаления, роли и RLS, динамические списки. Пошаговые инструкции и типичные ошибки.
Запретить выбор элемента справочника в 1С можно несколькими способами — от простого программного условия в обработчике выбора до ограничения на уровне прав доступа. Какой вариант подходит, зависит от задачи: нужно ли скрыть элемент из списка выбора полностью, запретить его подстановку в документы или только показать предупреждение пользователю. Ниже разобраны практические способы для управляемых форм с примерами кода на встроенном языке.
Важно понимать разницу между «скрыть» и «запретить». Скрытие через отбор динамического списка убирает элемент из визуального списка, но не мешает ввести его код или наименование вручную. Настоящий запрет требует проверки в момент выбора или записи объекта — только тогда ограничение сработает при любом способе ввода, включая обмены данными и внешние обработки.
Когда какой способ запрета выбирать
Перед настройкой определите, что именно должно происходить: элемент не должен отображаться в списке выбора, его нельзя подставить в конкретный документ или он вообще недоступен определённым пользователям. От ответа зависит уровень реализации — интерфейсный, прикладной код или механизм прав.
Как выбрать способ
Самая частая ошибка — ограничиться отбором в форме выбора и считать задачу решённой. Пользователь вводит начало наименования в поле ввода, платформа находит «запрещённый» элемент и подставляет его, минуя форму выбора. Поэтому для строгого запрета всегда добавляйте проверку на уровне данных.
Запрет выбора через обработчик ОбработкаВыбора
Универсальный способ для управляемых форм — перехватить событие выбора у поля ввода. В модуле формы документа создайте обработчик события ОбработкаВыбора для нужного поля и задайте условие отказа.
&НаКлиенте
Процедура НоменклатураОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
Если ЭлементЗапрещен(ВыбранноеЗначение) Тогда
СтандартнаяОбработка = Ложь;
ПоказатьПредупреждение(, "Выбор данного элемента запрещён.");
КонецЕсли;
КонецПроцедуры
&НаСервереБезКонтекста
Функция ЭлементЗапрещен(Ссылка)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Архив КАК Архив
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Ссылка = &Ссылка";
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Выборка = Запрос.Выполнить().Выбрать();
Возврат Выборка.Следующий() И Выборка.Архив;
КонецФункции
Установка СтандартнаяОбработка = Ложь отменяет подстановку значения в поле. Обратите внимание: проверка вынесена в серверную функцию без контекста — это снижает нагрузку на клиент и не требует передачи данных формы на сервер.
Этот способ защищает от выбора через форму, но не от ввода по строке. Для полного запрета дополнительно обработайте события АвтоПодбор и ОкончаниеВводаТекста либо добавьте контроль при записи документа.
Скрытие элементов отбором динамического списка
Если задача — не показывать элементы в списке выбора, настройте отбор динамического списка формы выбора справочника. Откройте форму выбора в конфигураторе, перейдите к свойствам списка и добавьте элемент отбора, например ПометкаУдаления = Ложь или Архив = Ложь.
Программно отбор устанавливается так:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ЭлементОтбора = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Архив");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = Ложь;
ЭлементОтбора.Использование = Истина;
ЭлементОтбора.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный;
КонецПроцедуры
Режим отображения «Недоступный» не даёт пользователю снять отбор в настройках списка. Помните об ограничении: отбор действует только внутри этой конкретной формы. Если у справочника несколько форм выбора или элемент подбирается через быстрый ввод, ограничение не сработает.
Запрет через пометку удаления
Самый простой административный приём — пометить нежелательный элемент на удаление. В типовых конфигурациях формы выбора часто уже настроены так, чтобы помеченные элементы не предлагались или подсвечивались. Дополнительно в свойствах поля ввода можно включить свойство ВыбиратьТолькоПомеченныеДляУдаления — вернее, использовать стандартное поведение платформы: при вводе по строке помеченные объекты обычно исключаются из автоподбора в типовых решениях.
Однако пометка удаления — семантически другое действие. Она означает, что объект готовится к физическому удалению из базы. Если на элемент ссылаются документы, удалить его не получится, а пометка будет «висеть» и путать пользователей. Для долгосрочного запрета лучше завести отдельный реквизит-флаг, например «НеИспользовать» или «Архив», и строить логику на нём.
Ограничение через роли и RLS
Когда запрет должен зависеть от пользователя, применяется механизм ограничения доступа на уровне записей (RLS). В роли для справочника на закладке «Шаблоны ограничений» задаётся условие, например доступ только к элементам, не входящим в определённую группу или не имеющим признака запрета.
RLS работает на уровне СУБД-запросов платформы: пользователь физически не видит запрещённые записи ни в списках, ни в отчётах, ни при быстром вводе. Это самый надёжный способ, но и самый затратный: сложные шаблоны RLS заметно замедляют запросы, особенно на больших справочниках. Перед внедрением проверьте скорость открытия списков под пользователем с ограниченной ролью.
Для простых сценариев RLS избыточен. Если запрет одинаков для всех пользователей, достаточно реквизита-флага и проверки в коде.
Сравнение способов запрета
Гибкий запрет с сообщением пользователю; не защищает от быстрого ввода и обменов
Просто настраивается; только визуальное скрытие, легко обходится
Не требует доработок; семантически некорректна для долгого запрета
Надёжно и прозрачно; требует доработки конфигурации
Максимальная надёжность по пользователям; влияет на производительность
Проверка при записи — последний рубеж защиты
Даже если вы настроили запрет на формах, данные могут попасть в базу через обмен, загрузку из Excel или внешнюю обработку. Поэтому строгий запрет дублируется в модуле объекта документа в обработчике ОбработкаПроверкиЗаполнения:
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
Если ЗначениеЗаполнено(Номенклатура)
И ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Номенклатура, "Архив") = Истина Тогда
ОбщегоНазначения.СообщитьПользователю(
"Выбранная номенклатура находится в архиве и не может использоваться.",
, "Номенклатура", "Объект", Отказ);
КонецЕсли;
КонецПроцедуры
Параметр Отказ, установленный в Истина, блокирует запись документа независимо от того, как она инициирована — интерактивно или программно. Это гарантирует целостность данных при любых сценариях.
- 1Добавьте в справочник булев реквизит, например «НеИспользовать», и вынесите его на форму элемента
- 2Настройте отбор динамического списка формы выбора по этому реквизиту
- 3Добавьте обработчик ОбработкаВыбора с предупреждением в формы основных документов
- 4Реализуйте проверку в ОбработкаПроверкиЗаполнения документов
- 5Протестируйте: выбор из списка, быстрый ввод, запись документа, загрузка из обработки
Как проверить, что запрет работает
После настройки проверьте все каналы ввода, а не только очевидный. Откройте документ и попробуйте выбрать запрещённый элемент из списка, затем введите его наименование вручную в поле ввода, затем попробуйте вставить код элемента. Каждый сценарий должен завершаться отказом или понятным сообщением.
Как проверить результат
Элемент отсутствует в списке или выбор отклоняется с сообщением
Элемент подставляется в поле без предупреждений
Автоподбор не находит элемент либо запись блокируется при сохранении
Элемент находится и подставляется, документ записывается
Возникает контролируемая ошибка с указанием поля
Документ проводится или падает с системной ошибкой
Запрещённые элементы отфильтрованы или помечены
Элементы выглядят как обычные, пользователи продолжают их выбирать
Отдельно проверьте поведение существующих документов, где запрещённый элемент уже выбран. Решите заранее: блокировать их перепроведение или разрешить, пока значение не меняется. Жёсткая блокировка «старых» документов часто парализует работу, поэтому на практике запрет обычно действует только на новые и изменяемые документы.
Типичные ошибки при настройке запрета
Ещё одна распространённая проблема — расхождение логики между формами. Если запрет реализован в форме одного документа, но забыт в другом, пользователи быстро находят «лазейку». Выносите проверку в общий модуль и вызывайте её из всех точек входа, а ключевой контроль держите в модуле объекта.
Что важно запомнить
Надёжный запрет выбора строится в два слоя: интерфейсный (отбор списка, ОбработкаВыбора) для удобства пользователя и прикладной (проверка при записи или RLS) для гарантии. Отбор списка сам по себе запретом не является.
Частые вопросы
Можно ли запретить выбор без доработки конфигурации?
Частично. Пометка элемента на удаление и настройка отбора в форме списка доступны без изменения конфигурации, но это мягкие ограничения. Полноценный запрет с гарантией требует добавления кода — удобнее всего через расширение конфигурации, чтобы не снимать типовую с поддержки.
Как запретить выбор группы справочника вместе со всеми вложенными элементами?
В проверке используйте метод ПринадлежитЭлементу() или запрос с условием Ссылка В ИЕРАРХИИ(&Группа). Отбор динамического списка по иерархии настраивается через вид сравнения «В иерархии».
Почему запрещённый элемент всё равно находится при вводе наименования?
Быстрый ввод работает напрямую с данными таблицы, минуя отборы формы выбора. Нужно либо обработать событие АвтоПодбор и подменить список вариантов, либо блокировать запись документа в ОбработкаПроверкиЗаполнения.
Что делать со старыми документами, где уже выбран запрещённый элемент?
Рекомендуемая практика — проверять запрет только если значение реквизита изменилось по сравнению с сохранённым в базе. Для этого сравните текущее значение со значением из запроса к базе по ссылке объекта до записи.
Чем расширение конфигурации лучше прямой доработки для этой задачи?
Расширение позволяет добавить реквизит-флаг, обработчики форм и проверки записи без изменения основной конфигурации. При обновлении типового решения расширение сохранится, а доработанную конфигурацию придётся сопровождать вручную при каждом обновлении.
Влияет ли запрет выбора на обмены данными между базами?
Обмены обычно записывают данные напрямую, минуя формы, поэтому интерфейсные запреты на них не действуют. Проверка в ОбработкаПроверкиЗаполнения сработает, если обмен вызывает запись с контролем; при загрузке в режиме ОбменДанными.Загрузка = Истина проверки заполнения пропускаются — это нужно учитывать в правилах конвертации.