При интерактивной работе с реквизитами документов или диалогов часто возникает задача ограничить выбор элементов справочника по определенному условию (например, запретить выбор уволенных сотрудников, закрытых складов или элементов с установленным флагом запрета). При этом важно не просто вывести предупреждение, но и не дать форме выбора закрыться, чтобы пользователю не приходилось открывать справочник заново.
Рассмотрим подробно основные способы реализации такой проверки в платформе 1С:Предприятие 7.7.
Это самый прямой и удобный способ. При интерактивном выборе элемента (двойной клик мыши или нажатие клавиши Enter) в форме списка или форме выбора справочника вызывается предопределенная процедура ПриВыбореСтроки(). Если элемент не удовлетворяет условиям, мы можем прервать стандартное действие с помощью функции СтатусВозврата(0) — в этом случае окно справочника останется открытым.
Разберем по шагам важные нюансы реализации:
Форма.ВРежимеВыбора(). Если этого не сделать, СтатусВозврата(0) заблокирует открытие элемента на редактирование при обычном просмотре справочника.ТекущийЭлемент().ЭтоГруппа().Посмотрим на пример кода в модуле формы выбора справочника:
Процедура ПриВыбореСтроки()
// Проверяем, что форма открыта именно в режиме выбора значения
Если Форма.ВРежимеВыбора() = 1 Тогда
// Разрешаем стандартный вход в группы для иерархических справочников
Если ТекущийЭлемент().ЭтоГруппа() = 1 Тогда
Возврат;
КонецЕсли;
// Проверяем условие запрета выбора
Если ТекущийЭлемент().НеВыбирать = 1 Тогда
Предупреждение("Данный элемент недоступен для выбора!");
СтатусВозврата(0);
Возврат;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Вместо проверки при клике можно полностью скрыть неподходящие элементы из списка выбора. В этом случае пользователь физически не сможет нажать на запрещенный элемент.
Проанализируем варианты наложения отбора:
ПриОткрытии() формы выбора достаточно вызвать метод УстановитьОтбор().СписокЗначений и применяется метод ИспользоватьСписокЭлементов(). Следует помнить, что при активном списке платформа отключает создание новых элементов в форме.Пример передачи параметра и установки фильтра в форме выбора:
Процедура ПриОткрытии()
// Проверяем переданный параметр формы
Если Форма.Параметр = "ОтборТолькоРабочие" Тогда
// Если реквизит проиндексирован для отбора
УстановитьОтбор("НеВыбирать", 0);
КонецЕсли;
КонецПроцедуры
Если вносить изменения в форму справочника нежелательно, логику выбора можно полностью перенести в модуль документа или отчета (вызывающую форму).
Для этого в процедуре ПриНачалеВыбораЗначения() вызывающей формы сбрасывается стандартная обработка через ФлагСтандОбр = 0, создается объект справочника и запускается выбор в цикле до тех пор, пока пользователь не выберет корректный элемент либо не откажется от выбора (нажмет кнопку «Отмена» / клавишу Esc).
Разберем пример реализации в модуле документа:
Процедура ПриНачалеВыбораЗначения(ИдентЭлемДиалога, ФлагСтандОбр)
Если ИдентЭлемДиалога = "Сотрудник" Тогда
ФлагСтандОбр = 0; // Отключаем стандартное открытие
Спр = СоздатьОбъект("Справочник.Сотрудники");
Пока 1 = 1 Цикл
// Открываем форму выбора модально
Если Спр.ВыбратьЭлемент("Выберите сотрудника") = 1 Тогда
// Проверяем выбранный элемент
Если Спр.ТекущийЭлемент().НеВыбирать = 1 Тогда
Предупреждение("Выбран некорректный сотрудник! Повторите выбор.");
Иначе
// Записываем корректное значение в реквизит диалога
Сотрудник = Спр.ТекущийЭлемент();
Прервать;
КонецЕсли;
Иначе
// Пользователь закрыл окно выбора без выбора
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Для табличных частей документов наиболее гибким решением является использование механизма подбора через метод ОткрытьПодбор(). В вызывающей форме объявляется процедура ОбработкаПодбора(ЗначениеПодбора), где анализируется каждый переданный элемент. Если элемент не подходит по условию, он просто игнорируется с выводом сообщения в окно сообщений или через всплывающее предупреждение, при этом форма подбора не закрывается и остается доступной для дальнейшего выбора.