Как в 1С 7.7 запретить выбор некорректного элемента справочника и не закрывать форму выбора?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

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

Рассмотрим подробно основные способы реализации такой проверки в платформе 1С:Предприятие 7.7.

Способ 1. Проверка в процедуре ПриВыбореСтроки() формы выбора

Это самый прямой и удобный способ. При интерактивном выборе элемента (двойной клик мыши или нажатие клавиши Enter) в форме списка или форме выбора справочника вызывается предопределенная процедура ПриВыбореСтроки(). Если элемент не удовлетворяет условиям, мы можем прервать стандартное действие с помощью функции СтатусВозврата(0) — в этом случае окно справочника останется открытым.

Разберем по шагам важные нюансы реализации:

  1. Проверка режима формы: Необходимо убедиться, что форма открыта именно для выбора, а не для обычного просмотра. Для этого используется метод Форма.ВРежимеВыбора(). Если этого не сделать, СтатусВозврата(0) заблокирует открытие элемента на редактирование при обычном просмотре справочника.
  2. Проверка на группу: В иерархических справочниках двойной клик по группе выполняет вход внутрь папки. Чтобы не заблокировать навигацию по дереву, нужно проверять ТекущийЭлемент().ЭтоГруппа().
  3. Передача параметров: Если ограничение должно действовать не всегда, а только при вызове из конкретного документа, контекст или признак проверки передается через параметр формы.

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


Процедура ПриВыбореСтроки()
    // Проверяем, что форма открыта именно в режиме выбора значения
    Если Форма.ВРежимеВыбора() = 1 Тогда
        // Разрешаем стандартный вход в группы для иерархических справочников
        Если ТекущийЭлемент().ЭтоГруппа() = 1 Тогда
            Возврат;
        КонецЕсли;
        
        // Проверяем условие запрета выбора
        Если ТекущийЭлемент().НеВыбирать = 1 Тогда
            Предупреждение("Данный элемент недоступен для выбора!");
            СтатусВозврата(0);
            Возврат;
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

Способ 2. Установка отбора при открытии формы выбора

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

Проанализируем варианты наложения отбора:

  1. Стандартный отбор по реквизиту: Если по реквизиту в конфигураторе установлен признак «Отбор» или «Сортировка», в процедуре ПриОткрытии() формы выбора достаточно вызвать метод УстановитьОтбор().
  2. Использование списка разрешенных элементов: Если отбор сложный или реквизит не индексирован, формируется СписокЗначений и применяется метод ИспользоватьСписокЭлементов(). Следует помнить, что при активном списке платформа отключает создание новых элементов в форме.

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


Процедура ПриОткрытии()
    // Проверяем переданный параметр формы
    Если Форма.Параметр = "ОтборТолькоРабочие" Тогда
        // Если реквизит проиндексирован для отбора
        УстановитьОтбор("НеВыбирать", 0);
    КонецЕсли;
КонецПроцедуры

Способ 3. Перехват выбора в вызывающей форме через ПриНачалеВыбораЗначения()

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

Для этого в процедуре ПриНачалеВыбораЗначения() вызывающей формы сбрасывается стандартная обработка через ФлагСтандОбр = 0, создается объект справочника и запускается выбор в цикле до тех пор, пока пользователь не выберет корректный элемент либо не откажется от выбора (нажмет кнопку «Отмена» / клавишу Esc).

Разберем пример реализации в модуле документа:


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

Способ 4. Использование механизма подбора (ОткрытьПодбор)

Для табличных частей документов наиболее гибким решением является использование механизма подбора через метод ОткрытьПодбор(). В вызывающей форме объявляется процедура ОбработкаПодбора(ЗначениеПодбора), где анализируется каждый переданный элемент. Если элемент не подходит по условию, он просто игнорируется с выводом сообщения в окно сообщений или через всплывающее предупреждение, при этом форма подбора не закрывается и остается доступной для дальнейшего выбора.

← На главную