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

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

В процессе разработки на платформе 1С:Предприятие 7.7 часто возникает задача управления составом доступных типов для реквизитов, имеющих тип Справочник неопределенного вида. Типичный пример: в табличной части документа есть колонка Актив, в которую пользователь может выбрать акции, облигации или валюты. Если оставить настройки по умолчанию, система предложит пользователю огромный список всех справочников конфигурации, что неудобно и повышает риск ошибки. Разберем, как элегантно решить эту задачу программными средствами.

Метод 1: Использование функции ВидыДляВыбора()

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

Проанализируем синтаксис: ВидыДляВыбора(СписокВидов). В качестве параметра передается строка, где названия справочников (как они заданы в конфигураторе) перечислены через запятую.

Рассмотрим пример реализации. Предположим, у нас есть реквизит Актив. Мы хотим, чтобы пользователь мог выбирать только из трех справочников: Акции, Облигации и Валюты. В модуле формы документа мы можем прописать следующую строку:

Актив.ВидыДляВыбора("Акции, Облигации, Валюты");

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

Метод 2: Динамическое ограничение в зависимости от условий

Часто требуется менять состав доступных справочников «на лету», в зависимости от значения другого поля. Например, если в колонке ТипОперации выбрано значение ПродажаАкций, то в колонке Актив должны быть доступны только Акции. Разберем, как это реализовать через процедуру, вызываемую при изменении типа операции.

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

Посмотрим на пример кода для процедуры, привязанной к изменению типа операции:


Процедура ПриВыбореТипаОперации()
    Если ТипОперации = Перечисление.ВидыОпераций.ПродажаАкций Тогда
        Актив.ВидыДляВыбора("Акции");
    ИначеЕсли ТипОперации = Перечисление.ВидыОпераций.ПокупкаВалюты Тогда
        Актив.ВидыДляВыбора("Валюты");
    Иначе
        // Возвращаем стандартный набор или сбрасываем фильтр
        Актив.ВидыДляВыбора("Акции, Облигации, Валюты");
    КонецЕсли;
КонецПроцедуры

Метод 3: Жесткая типизация через НазначитьТип()

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

Проанализируем ситуацию: если мы точно знаем, что тип актива — это Акции, используем следующий код:

Актив.НазначитьТип("Справочник.Акции");

Это значительно повышает эргономику интерфейса, так как исключает лишние клики пользователя.

Особенности работы в табличной части (ТЧ)

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

  1. Найдите в модуле формы процедуру ПриНачалеРедактированияСтроки() (или создайте ее).
  2. Внутри процедуры добавьте проверку текущего значения управляющего реквизита (например, ТипОперации).
  3. Установите соответствующий фильтр через ВидыДляВыбора() или НазначитьТип().

Пример реализации в контексте строки ТЧ:


Процедура ПриНачалеРедактированияСтроки()
    Если ТипОперации = Перечисление.ВидыОпераций.ТорговляОблигациями Тогда
        Актив.ВидыДляВыбора("Облигации");
    Иначе
        Актив.ВидыДляВыбора("Акции, Облигации, Валюты");
    КонецЕсли;
КонецПроцедуры

Метод 4: Использование ПриНачалеВыбораЗначения()

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

Разберем алгоритм действий:

  1. В параметре ИдентЭлемента проверяем, что выбор происходит именно в колонке Актив.
  2. Устанавливаем ФлагСтандартнойОбработки = 0, чтобы отменить системное окно выбора.
  3. Программно открываем нужную форму выбора с помощью ОткрытьФормуВыбора().

Рассмотрим пример кода:


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

Сброс ограничений

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

Пример сброса:

Актив.ВидыДляВыбора("");

Резюме и рекомендации

Мы проанализировали несколько способов управления типом элемента диалога в 1С 7.7. Подведем итоги:

Применяя эти методы, мы сделаем интерфейс программы более профессиональным, удобным и защищенным от ошибок ввода.

← На главную