Как в 1С 7.7 ограничить выбор из нескольких справочников для одного реквизита

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

В платформе 1С:Предприятие 8 разработчики привыкли к механизму составных типов данных, где для одного реквизита можно явно отметить флажками несколько нужных объектов метаданных (например, справочники Организации и Контрагенты). В платформе 1С 7.7 составные типы реализованы иначе: при настройке реквизита разработчик может либо жестко зафиксировать один конкретный справочник, либо указать общий тип Справочник без вида, что по умолчанию дает пользователю возможность выбирать элемент из всех существующих в конфигурации справочников.

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

Способ 1. Использование штатного метода ВидыДляВыбора

Самым простым и быстрым решением является использование встроенного метода контекста формы ВидыДляВыбора(). Рассмотрим по шагам, как правильно настроить реквизит и программный код формы документа.

  1. Настройка метаданных в Конфигураторе: перейдем к реквизиту документа и укажем ему тип Справочник, но в поле «Вид» оставим значение пустым (неопределенный справочник). Обратим внимание: тип реквизита должен быть именно Справочник, а не базовый тип Неопределенный, так как метод работает только с объектами ссылочного типа справочников и документов.
  2. Размещение на форме: вынесем реквизит в диалог документа или в колонку табличной части.
  3. Программное ограничение списка: откроем модуль формы документа и обратимся к процедуре ПриОткрытии().

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


Процедура ПриОткрытии()
    // Ограничиваем выбор для реквизита шапки документа
    Форма.Субъект.ВидыДляВыбора("Организации, Контрагенты");
    
    // Если реквизит находится в табличной части:
    // Форма.СубъектВТаблице.ВидыДляВыбора("Организации, Контрагенты");
КонецПроцедуры

Разберем особенности синтаксиса и работы метода:

Метод ВидыДляВыбора(<СписокВидов>) принимает строковый параметр, в котором через запятую перечисляются точные идентификаторы справочников так, как они названы в дереве метаданных Конфигуратора. Метод возвращает строку с предыдущим значением списка видов. При нажатии на кнопку выбора в таком поле пользователю откроется стандартное диалоговое окно платформы, содержащее не полный перечень всех справочников системы, а только указанные в строке.

Ограничения и нюансы стандартного механизма

Проанализируем поведение платформы при использовании ВидыДляВыбора(), о которых важно знать заранее:

  1. Повторное открытие заполненного поля: если значение реквизита уже выбрано (например, указан конкретный контрагент), то при повторном нажатии кнопки с троеточием или клавиши F4 платформа сразу откроет форму списка справочника «Контрагенты». Окно выбора между справочниками не появится. Чтобы изменить вид справочника, пользователю потребуется сначала очистить поле клавишей Delete или комбинацией Shift + F4, после чего снова нажать выбор.
  2. Ввод по строке: быстрый подбор значения по наименованию или коду с клавиатуры не умеет выполнять сквозной поиск сразу по нескольким справочникам.
  3. Отбор в журналах документов: для реквизита документа типа «Справочник неопределенного вида» невозможно установить флаг отбора в Конфигураторе, поэтому быстро фильтровать журнал по такому реквизиту стандартными средствами не получится.

Способ 2. Программный выбор через список значений

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

Посмотрим, как выглядит программная обработка интерактивного выбора:


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

Затем в процедуре ОбработкаВыбораЗначения(ЗначВыбора) модуля формы перехватим выбранный элемент и запишем его в соответствующий реквизит документа:


Процедура ОбработкаВыбораЗначения(ЗначВыбора)
    Субъект = ЗначВыбора;
КонецПроцедуры

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

← На главную