Как запретить выбор «неготовых» элементов справочника в 1С, сохранив возможность их редактирования?

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

В практике разработки на платформе 1С:Предприятие 8.3 часто возникает специфическая задача: необходимо позволить пользователям создавать и редактировать элементы справочника, но запретить выбирать их в документах до тех пор, пока они не будут полностью заполнены. Это актуально для сложных справочников (например, «Контрагенты» или «Номенклатура»), где данные могут вноситься разными сотрудниками в несколько этапов.

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

Методика контроля через дополнительный реквизит

Первым делом проанализируем ситуацию: системе нужно как-то отличать «готовый» элемент от «черновика». Для этого в метаданные справочника следует добавить реквизит, например, СтатусЗаполнения. Это может быть тип Булево (Готов/Не готов), но более гибким решением будет использование Перечисления со значениями: Черновик, НаПроверке, Заполнен.

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

Решение 1: Настройка параметров выбора в метаданных

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

  1. Найдем нужный реквизит в документе.
  2. В палитре свойств откроем пункт Параметры выбора.
  3. Установим фиксированный отбор: Отбор.СтатусЗаполнения(ЗначениеПеречисления.СтатусыКонтрагентов.Заполнен).

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

Решение 2: Программная установка отбора в событии «НачалоВыбора»

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

Рассмотрим пример кода для обычных форм:


Процедура КонтрагентНачалоВыбора(Элемент, СтандартнаяОбработка)
    
    // Отменяем стандартное открытие формы, чтобы настроить её самостоятельно
    СтандартнаяОбработка = Ложь;
    
    // Получаем форму выбора справочника
    ФормаВыбора = Справочники.Контрагенты.ПолучитьФормуВыбора("ФормаВыбора", Элемент);
    
    // Устанавливаем отбор по статусу готовности
    ФормаВыбора.СправочникСписок.Отбор.СтатусЗаполнения.Использование = Истина;
    ФормаВыбора.СправочникСписок.Отбор.СтатусЗаполнения.Значение = Перечисления.Статусы.Готов;
    ФормаВыбора.СправочникСписок.Отбор.СтатусЗаполнения.ВидСравнения = ВидСравнения.Равно;
    
    // Открываем форму
    ФормаВыбора.Открыть();
    
КонецПроцедуры

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

Решение 3: Контроль ввода по строке и автоподбора

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

Для этого в свойствах поля ввода необходимо настроить события АвтоПодборТекста или ОкончаниеВводаТекста. Однако в обычных формах надежнее всего использовать проверку в событии ПриИзменении или проверку перед записью самого документа.

Разберем логику проверки в событии ПриИзменении:


Процедура КонтрагентПриИзменении(Элемент)
    
    Если ЗначениеЗаполнено(Контрагент) И Контрагент.СтатусЗаполнения <> Перечисления.Статусы.Готов Тогда
        Сообщить("Выбранный элемент еще не готов к использованию!");
        Контрагент = Справочники.Контрагенты.ПустаяСсылка();
    КонецЕсли;
    
КонецПроцедуры

Решение 4: Визуальное выделение «неготовых» элементов

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

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


Процедура СправочникСписокПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
    
    Если ДанныеСтроки.СтатусЗаполнения <> Перечисления.Статусы.Готов Тогда
        // Окрашиваем текст в серый цвет, сигнализируя о недоступности
        ОформлениеСтроки.ЦветТекста = ЦветаСтиля.ТекстЗаблокированногоЭлемента;
    КонецЕсли;
    
КонецПроцедуры

Решение 5: Ограничение доступа на уровне записей (RLS)

Если требования к безопасности и корректности данных очень жесткие, рассмотрим использование механизма RLS (Record Level Security). Это позволит ограничить право Чтение или Просмотр для элементов с определенным статусом для конкретных ролей.

Важный нюанс: если вы полностью запретите чтение «неготовых» элементов через RLS, пользователи не смогут их даже редактировать, что противоречит исходной задаче. Поэтому RLS стоит применять только в том случае, если редактирование разрешено одной группе пользователей (например, «Редакторы НСИ»), а выбор в документах — другой группе («Менеджеры»).

Заключение и рекомендации

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

Не забудьте также добавить проверку в модуле объекта документа в процедуре ПередЗаписью или ОбработкаПроверкиЗаполнения. Это станет «последним рубежом» защиты, который не позволит провести документ с некорректными данными, если они были подставлены программно или в обход форм.

← На главную