Клюев В.В.
http://prof1c.kklab.ru
Скорее всего Вы уже неоднократно замечали в обычных типовых конфигурациях, взаимосвязанные между собой справочники, когда при выборе элемента справочника(справочник1), значение другого справочника(справочник2) «фильтруется» по этому значению – то есть выбираются значения, принадлежащие только текущему элементу справочника1; к примеру – это Справочник «Подразделения», владельцем которого является Справочник «Организации».
Для того, чтобы сразу вникнуть в суть происходящего, давайте посмотрим что происходит на практике. Для этого, вы можете, создать пустую конфигурацию с нуля, либо зайти в какую-либо имеющуюся копию информационной базы и в конфигураторе создать 2 справочника.
Справочник1 и Справочник2. В справочнике2 перейдите на вкладку «Владельцы» и выберите владельца – «Справочник1», смотрите как показано на рисунке.
Теперь при создании элементов в «Справочнике2», система будет просить ввести владельца справочника1. Есть опция – Использование подчинения – когда задается подчинение Элементам, группам, или группам и элементам.
Казалось бы всё просто, но проблемы возникают у пользователей. Пользователь при открытии «Справочника2» видит все элементы в совершенно непонятном порядке, да и к тому же, если вы работали с типовыми конфигурациями, то могли заметить, что напрямую в справочнике «Подразделения» вы нигде не задаёте владельца, а при открытии справочника можете выбирать организацию и в зависимости от этого получать элементы, подчинённые той или иной организации; при этом при создании элемента справочника «Подразделения» по умолчанию вы получите того владельца, которого выбрали в форме списка подразделений.
Итак приступим, и создадим «Форму списка» для нашего «Справочника2», пока предоставьте это 1С, не внося никаких изменений, позже мы подкорректируем созданную конструктором форму.
В «Справочнике2» перейдите на вкладку Формы и добавьте (+) новую Форму списка справочника и нажмите Готово.
Создадим реквизит формы с типом данных «Справочник1.Ссылка», с именем «ОтборСправочник1», и перетащим этот реквизит на форму, задайте заголовок «Справочник1».
Теперь, для того, чтобы «сие чудо» заработало, необходимо написать код, который будет выполнять отбор при выборе Элемента Справочника1.
Для того, чтобы отобразить в форме списка справочника только необходимые нам элементы по выбранному элементу Справочника1, необходимо программно сделать отбор – по выбранному элементу, для этого воспользуемся предопределенной процедурой элемента управления ОтборСправочник1, и напишем код, выполняющие указанную задачу.
В верхней части выберите «ОтборСправочник1» нажмите на правую клавишу мыши и выберите «Свойства», в появившемся окне найдите свойство «ПриИзменении» и нажмите лупу, тем самым перейдя в модуль формы; автоматически создается процедура «ОтборСправочник1ПриИзменении(Элемент)»
В процедуре введите следующий текст:
&НаКлиенте Процедура ОтборСправочник1ПриИзменении(Элемент) Список.Отбор.Элементы.Очистить(); // ЭлементОтбора = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Владелец"); ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; ЭлементОтбора.Использование = Истина; ЭлементОтбора.ПравоеЗначение = ОтборСправочник1; ЭлементОтбора.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный; КонецПроцедуры
При построении форм – всё то же самое, только формы необходимо создавать обычные, управляемые формы в обычном приложении не работают.
Разница будет состоять в процедуре отбора для элемента в форме списка и создании реквизита.
Чтобы добавить реквизит на обычную форму нажмите кнопку
И далее текст процедуры
Процедура Справочник1ПриИзменении(Элемент) ЭтаФорма.Отбор.Владелец.Значение = Справочник1.Ссылка; ЭтаФорма.Отбор.Владелец.Использование = Истина; ЭтаФорма.ЭлементыФормы.СправочникСписок.НастройкаОтбора.Владелец.Доступность = Ложь;//(?) КонецПроцедуры
Предпоследней строкой(?) – запрещаем изменять отбор при открытии параметров отбора пользователем - только через элемент управления!
Видео (без звука - все понятно без звука)