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