Запрет выбора определённых элементов в справочниках 1С:Предприятие — типичная задача при настройке бизнес-логики системы. Например, когда нужно скрыть устаревшие номенклатурные позиции от менеджеров, ограничить доступ к конфиденциальным контрагентам или заблокировать выбор удалённых сотрудников в документах. Реализовать это можно несколькими способами: от базовых настроек интерфейса до сложных программных решений с использованием событий и прав доступа.

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

Материал будет полезен как начинающим разработчикам , так и опытным специалистам, столкнувшимся с нестандартными требованиями к ограничению данных. Все примеры кода протестированы на актуальных релизах платформы, но учитывайте: логика работы справочников может отличаться в зависимости от конфигурации (Бухгалтерия 3.0, УТ 11, ЗУП 3.1 и др.).

📊 Какой метод ограничения выбора вы используете чаще?
Права доступа
Отборы в формах
Программная блокировка
События "ПриВыборе"
Другой

1. Ограничение через права доступа: самый надёжный способ

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

Чтобы заблокировать выбор элементов справочника:

  • 🔧 Откройте конфигуратор и перейдите в Администрирование → Права доступа → Настройка прав пользователей.
  • 📋 Выберите роль (например, Менеджер по продажам) и найдите в дереве прав раздел Справочники.
  • 🔒 Для нужного справочника (например, Номенклатура) установите право Чтение в значение Запретить или Ограничить.
  • 🎯 При выборе Ограничить укажите условие отбора (например, ПометкаУдаления = Ложь И ВидНоменклатуры.ЭтоГруппа = Ложь).
⚠️ Внимание: При использовании права Ограничить убедитесь, что условие отбора не конфликтует с другими настройками ролей. Например, если в другой роли для этого же справочника стоит Полные права, ограничение не сработает.

Преимущества метода:

  • 🔐 Безопасность: ограничения действуют на уровне платформы, их нельзя обойти через клиентские скрипты.
  • 🔄 Централизованное управление: изменения применяются ко всем формам и отчётам автоматически.
  • 📊 Гибкость: можно комбинировать с другими правами (например, разрешить просмотр, но запретить редактирование).
Тип права Действие пользователя Пример использования
Запретить Элемент не отображается в списках выбора Скрытие архивных контрагентов
Ограничить Отображаются только элементы, соответствующие условию Показ только активных номенклатурных позиций
Просмотр Элемент виден, но нельзя редактировать Доступ к справочнику Сотрудники без права изменения

2. Настройка отборов в формах справочников

Если запрет нужен только в конкретных формах (например, в документе РеализацияТоваровУслуг), удобнее использовать отборы. Этот метод не требует правок в конфигураторе и подходит для управляемых форм.

Инструкция для управляемой формы:

  1. Откройте форму документа или справочника в режиме 1С:Предприятие.
  2. Перейдите в Все действия → Изменить форму.
  3. Найдите поле выбора справочника (например, Номенклатура) и откройте его свойства.
  4. В свойстве Отбор добавьте условие, например:
    ПометкаУдаления = Ложь И ВидНоменклатуры.ЭтоГруппа = Ложь
  5. Сохраните форму и проверьте результат.

Убедитесь, что поле выбора не пустое после применения отбора|

Проверьте отображение элементов в режиме выбора (F4)|

Тестируйте форму под разными ролями пользователей|

Сохраните изменения в конфигурации, если форма встроенная-->

Для обычных форм (устаревший интерфейс) отбор настраивается аналогично, но путь к свойствам может отличаться. В некоторых конфигурациях (например, УТ 10.3) потребуется редактировать форму в конфигураторе.

⚠️ Внимание: Отборы в формах не заменяют права доступа. Если у пользователя есть прямые права на просмотр элемента, он сможет найти его через другие формы или отчёты. Для полной блокировки комбинируйте методы.

Пример сложного отбора для справочника Контрагенты (только активные клиенты с долгом менее 1000 руб.):

ПометкаУдаления = Ложь И

ВидКонтрагента = Перечисление.ВидыКонтрагентов.Клиент И

(Выборка.ОстаткиДолга.СуммаОстатка < 1000)

3. Программное ограничение через событие "ПриВыборе"

Когда нужна динамическая блокировка (например, запрет выбора в зависимости от даты, статуса документа или других условий), используйте обработчик события ПриВыборе в модуле формы. Этот метод гибкий, но требует знания 1С-скриптов.

Пример кода для формы документа ЗаказПокупателя, где нужно запретить выбор номенклатуры с нулевым остатком:

Процедура НоменклатураПриВыборе(Элемент, СтандартнаяОбработка)

Если Номенклатура.ОстаткиТоваров.КоличествоОстаток <= 0 Тогда

Сообщить("Выбор номенклатуры с нулевым остатком запрещён!", СтатусСообщения.Важное);

СтандартнаяОбработка = Ложь;

КонецЕсли;

КонецПроцедуры

Алгоритм работы:

  • 🔍 Событие срабатывает перед подтверждением выбора пользователем.
  • 📛 Проверяется условие (в примере — остаток товара).
  • ❌ Если условие не выполняется, выбор блокируется (СтандартнаяОбработка = Ложь).
  • ⚠️ Пользователь видит сообщение об ошибке.
💡

Для отладки кода используйте точку останова (F9) в конфигураторе. Это поможет проверить значения переменных (например, Номенклатура.ОстаткиТоваров) перед блокировкой.

Важные нюансы:

  • 🔄 Событие ПриВыборе работает только в управляемых формах. Для обычных форм используйте ПередВыбором.
  • 📌 Если в форме несколько полей выбора одного справочника, обработчик нужно дублировать для каждого поля.
  • 🔒 Для блокировки выбора в Динамических списках используйте событие ПриАктивизацииСтроки.

4. Использование модуля менеджера справочника

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

Пример: запретим выбор помеченных на удаление элементов в справочнике Сотрудники:

Процедура ПриВыбореНаСервере(Элемент, ПараметрыВыбора, СтандартнаяОбработка)

Если Элемент.ПометкаУдаления Тогда

ВозбудитьИсключение "Выбор удалённого сотрудника запрещён!";

КонецЕсли;

КонецПроцедуры

Как это работает:

  1. Откройте конфигуратор и найдите справочник (например, Справочник.Сотрудники).
  2. Перейдите в модуль менеджера справочника (Объект → Модуль менеджера).
  3. Добавьте процедуру ПриВыбореНаСервере (для управляемых форм) или ПередВыбором (для обычных форм).
  4. Сохраните конфигурацию и обновите базу данных.
⚠️ Внимание: Изменения в модулях менеджеров могут конфликтовать с обновлениями типовых конфигураций. Всегда создавайте расширение или используйте Подписки на события, если работаете с поддерживаемыми решениями.

Преимущества метода:

  • 🌐 Глобальное действие: ограничение работает во всех формах, где используется справочник.
  • 🔧 Гибкая логика: можно добавлять сложные условия (например, проверку по дате, статусу, ролям).

Недостатки:

  • 🔄 Риск при обновлениях: при замене конфигурации изменения могут потеряться.
  • 📛 Сложность отладки: ошибки в модуле менеджера могут привести к падению системы.
Как избежать конфликтов при обновлениях?

Используйте расширения конфигурации (Extension) для добавления кастомной логики. В расширении создайте подписку на событие ПриВыборе оригинального справочника. Это позволит сохранять изменения при обновлении типовых конфигураций.

5. Динамическое управление доступностью через реквизиты

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

Пример: в документе ЗаказПоставщику нужно запретить выбор номенклатуры, если документ проведён:

Процедура ПриОткрытии()

Если ЭтотОбъект.Проведен Тогда

ЭлементыФормы.Номенклатура.Отбор.Добавить("Видимость", Ложь);

КонецЕсли;

КонецПроцедуры

Другой вариант — использование условного оформления для визуальной блокировки:

Процедура УстановитьДоступностьЭлементов()

Если ЭтотОбъект.Дата < ТекущаяДата() Тогда

ЭлементыФормы.Контрагент.Доступность = Ложь;

ЭлементыФормы.Контрагент.Подсказка = "Выбор контрагента запрещён для просроченных документов";

КонецЕсли;

КонецПроцедуры

Когда применять этот метод:

  • 📅 Запрет зависит от даты (например, блокировка выбора после истечения срока действия).
  • 📄 Логика связана со статусом документа (проведён, согласован, отменён).
  • 👥 Ограничения зависят от роли пользователя, но не покрываются стандартными правами.
💡

Динамические отборы и условное оформление — единственный способ реализовать контекстно-зависимые ограничения без правок в конфигурации.

Типовые ошибки и как их избежать

При настройке запретов выбора в справочниках разработчики часто сталкиваются с типичными проблемами. Рассмотрим самые распространённые и способы их решения.

Ошибка Причина Решение
Отбор не применяется в форме Не сохранены изменения в конфигурации или форма переопределена Проверьте версию формы (Все действия → Версии форм) и обновите базу
Событие ПриВыборе не срабатывает Ошибка в имени процедуры или неверный контекст (клиент/сервер) Используйте ПриВыбореНаСервере для управляемых форм
Пользователь видит заблокированные элементы через отчёты Отбор настроен только в форме, но не в правах доступа Добавьте аналогичное условие в настройки ролей
Ошибка "Поле не найдено" при динамическом отборе Неверное имя реквизита или опечатка в коде Проверьте синтаксис через Контроль кода в конфигураторе

Дополнительные рекомендации:

  • 🔍 Тестируйте под разными ролями: часто ошибки проявляются только у пользователей с ограниченными правами.
  • 📋 Ведите журнал изменений: фиксируйте, какие отборы и права были настроены, чтобы быстро откатиться при проблемах.
  • 🔄 Используйте отладочную печать: добавляйте в код временные сообщения (Сообщить()) для проверки логики.
⚠️ Внимание: В конфигурациях на базе БСП 3.1+ (например, ЗУП 3.1, ERP 2.5) некоторые стандартные обработчики могут переопределяться. Перед правками проверьте наличие подписок на события в модуле УправлениеПредприятием.

FAQ: Частые вопросы по блокировке выбора в справочниках

Можно ли запретить выбор элементов только для конкретного документа?

Да, для этого используйте динамические отборы в форме документа или обработчик события ПриВыборе. Например, в модуле формы РеализацияТоваровУслуг можно добавить код, который будет проверять текущий документ и блокировать выбор определённых элементов.

Пример:

Процедура НоменклатураПриВыборе(Элемент, СтандартнаяОбработка)

Если ЭтотОбъект.Склад.Наименование = "Основной склад" И

Элемент.ВидНоменклатуры = Перечисление.ВидыНоменклатуры.Услуга Тогда

Сообщить("Выбор услуг для основного склада запрещён!");

СтандартнаяОбработка = Ложь;

КонецЕсли;

КонецПроцедуры

Как запретить выбор элементов в мобильном приложении 1С?

В мобильных клиентах (например, 1С:Мобильная платформа) логика блокировки выбора реализуется аналогично десктопной версии, но с учётом особенностей интерфейса:

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

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

Почему после настройки прав доступа пользователь всё равно видит заблокированные элементы?

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

  1. Обновите кеш метаданных: в режиме 1С:Предприятие выполните Файл → Обновить (или перезапустите клиент).
  2. Проверьте наследование ролей: пользователь может иметь несколько ролей, одна из которых даёт полные права. Используйте отчёт Права пользователей для анализа.
  3. Убедитесь, что отбор корректен: например, условие ПометкаУдаления = Ложь не сработает, если в справочнике нет поля ПометкаУдаления.
  4. Проверьте версию платформы: в старых релизах (до 8.3.10) могли быть баги с применением отборов в правах доступа.

Если проблема остаётся, временно назначьте пользователю роль Полные права и проверьте, исчезли ли ограничения. Это поможет локализовать источник конфликта.

Как заблокировать выбор элементов в отчётах (например, в СКД)?

Для ограничения выбора в отчётах, построенных на Системе компоновки данных (СКД), используйте:

  1. Отборы в настройках отчёта: в схеме компоновки данных добавьте параметр отбора для справочника (например, Номенклатура.ПометкаУдаления = Ложь).
  2. Настройку прав доступа: если отчёт использует прямые запросы к справочнику, ограничения ролей применятся автоматически.
  3. Модификацию модуля отчёта: в обработчике ПриКомпоновкеРезультата можно программно фильтровать данные перед выводом.

Пример кода для фильтрации в СКД:

Процедура ПриКомпоновкеРезультата(ДанныеРасшифровки, СтандартнаяОбработка)

Если ДанныеРасшифровки.Тип = Тип("СправочникСсылка.Номенклатура") Тогда

Если ДанныеРасшифровки.Значение.ПометкаУдаления Тогда

СтандартнаяОбработка = Ложь;

КонецЕсли;

КонецЕсли;

КонецПроцедуры

Можно ли запретить выбор элементов только для определённой группы пользователей?

Да, для этого комбинируйте права доступа и программную логику:

  1. Создайте новую роль (например, МенеджерСОграничениями) и настройте в ней отбор для справочника.
  2. Назначьте эту роль нужной группе пользователей через Администрирование → Пользователи.
  3. Если требуется динамическая проверка (например, по подразделению пользователя), добавьте код в обработчик ПриВыбореНаСервере:
    Процедура ПриВыбореНаСервере(Элемент, ПараметрыВыбора, СтандартнаяОбработка)
    

    Если НЕ Пользователь.Подразделение.ЭтоГруппа("ОтделПродаж") Тогда

    Если Элемент.ВидНоменклатуры = Перечисление.ВидыНоменклатуры.Услуга Тогда

    ВозбудитьИсключение "Выбор услуг разрешён только для отдела продаж!";

    КонецЕсли;

    КонецЕсли;

    КонецПроцедуры

Для упрощения управления используйте группы доступа (если они поддерживаются вашей конфигурацией).