В платформе 1С:Предприятие 8 разработчики привыкли к механизму составных типов данных, где для одного реквизита можно явно отметить флажками несколько нужных объектов метаданных (например, справочники Организации и Контрагенты). В платформе 1С 7.7 составные типы реализованы иначе: при настройке реквизита разработчик может либо жестко зафиксировать один конкретный справочник, либо указать общий тип Справочник без вида, что по умолчанию дает пользователю возможность выбирать элемент из всех существующих в конфигурации справочников.
Разберем, как реализовать аналог составного типа в 1С 7.7 и ограничить выбор только определенным списком справочников без добавления лишних управляющих элементов на форму диалога.
Самым простым и быстрым решением является использование встроенного метода контекста формы ВидыДляВыбора(). Рассмотрим по шагам, как правильно настроить реквизит и программный код формы документа.
Справочник, а не базовый тип Неопределенный, так как метод работает только с объектами ссылочного типа справочников и документов.ПриОткрытии().Посмотрим на пример установки фильтра видов справочников:
Процедура ПриОткрытии()
// Ограничиваем выбор для реквизита шапки документа
Форма.Субъект.ВидыДляВыбора("Организации, Контрагенты");
// Если реквизит находится в табличной части:
// Форма.СубъектВТаблице.ВидыДляВыбора("Организации, Контрагенты");
КонецПроцедуры
Разберем особенности синтаксиса и работы метода:
Метод ВидыДляВыбора(<СписокВидов>) принимает строковый параметр, в котором через запятую перечисляются точные идентификаторы справочников так, как они названы в дереве метаданных Конфигуратора. Метод возвращает строку с предыдущим значением списка видов. При нажатии на кнопку выбора в таком поле пользователю откроется стандартное диалоговое окно платформы, содержащее не полный перечень всех справочников системы, а только указанные в строке.
Проанализируем поведение платформы при использовании ВидыДляВыбора(), о которых важно знать заранее:
F4 платформа сразу откроет форму списка справочника «Контрагенты». Окно выбора между справочниками не появится. Чтобы изменить вид справочника, пользователю потребуется сначала очистить поле клавишей Delete или комбинацией Shift + F4, после чего снова нажать выбор.Если поведение стандартного механизма не устраивает (например, требуется всегда открывать меню выбора вида объекта даже при заполненном значении), реализуем логику самостоятельно через предопределенную процедуру ПриНачалеВыбораЗначения().
Посмотрим, как выглядит программная обработка интерактивного выбора:
Процедура ПриНачалеВыбораЗначения(ИдентЭлемДиалога, ФлагСтандОбр)
Если ИдентЭлемДиалога = "Субъект" Тогда
// Отключаем стандартный диалог платформы
ФлагСтандОбр = 0;
Спис = СоздатьОбъект("СписокЗначений");
Спис.ДобавитьЗначение("Организации", "Организация");
Спис.ДобавитьЗначение("Контрагенты", "Контрагент");
ВыбВид = "";
Если Спис.ВыбратьЗначение(ВыбВид, "Выберите тип данных:", , 1) = 1 Тогда
// Открываем форму для выбора нужного элемента
ОткрытьФорму("Справочник." + ВыбВид, "ДляВыбора");
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Затем в процедуре ОбработкаВыбораЗначения(ЗначВыбора) модуля формы перехватим выбранный элемент и запишем его в соответствующий реквизит документа:
Процедура ОбработкаВыбораЗначения(ЗначВыбора)
Субъект = ЗначВыбора;
КонецПроцедуры
Выясним преимущества такого подхода: мы получаем полный контроль над поведением диалога, можем гибко управлять условиями доступности тех или иных справочников прямо во время сеанса пользователя и гарантируем вызов окна выбора типа вне зависимости от того, заполнено поле в текущий момент или нет.