Использование подчиненных справочников
При создании конкретных конфигураций довольно часто возникают задачи, когда надо реализовать для каждого конкретного элемента справочника -список относящихся к нему объектов (отношение один-ко-многим). В нашем примере имеется справочник оборудования, и каждый элемент справочника может иметь произвольный список единиц измерения данного оборудования. Для того чтобы ввести новый или отредактировать существующий элемент справочника «Единицы», сначала откройте форму списка справочника владельца «Оборудование», выберите в нем курсором нужный элемент. Затем откройте форму списка подчиненного справочника «Единицы», он будет отображать список единиц измерения данного оборудования. Теперь можно добавлять, редактировать или удалять записи в справочнике «Единицы». Выбор элементов подчиненного справочника, в форме, при условии, что в форме существует элемент диалога, в котором выбран элемент справочника владельца, для которого производится выбор, реализуется в конфигурации при помощи указания в палитре свойств реквизита формы, предназначенного для выбора элемента подчиненного справочника, параметра «Связан с». В нем вводится имя идентификатора реквизита формы, который содержит элемент родительского справочника. В этом случае при выборе элемента подчиненного справочника автоматически будет производиться выбор из элементов, подчиненных выбранному элементу справочника-родителя. Другим способом установки элемента справочника владельца, по значению которого должен выполняться выбор подчиненного справочника является вызов метода ИспользоватьВладельца(<?>) для объекта подчиненного
VII. Справочники_____________________________________________________________ 75
справочника. Это позволяет определить выбор подчиненного справочника даже в том случае, когда в форме нет элемента диалога имеющего тип справочника - владельца. Для выборки элементов подчиненного справочника по владельцу, после метода ИсполъзоватьВладельца(< ?>) надо вызвать метод ВыбратьЭлементы() и далее методы ПолучитьЭлемент() или НайтиЭлемент(< ?>), НайтиПоКоду(< ?>), НайтиПоНаименованию(< ?>).
Упражнение 9. (Необязательное) Создайте в форме элемента и форме списка справочника «Оборудование» алгоритм, позволяющий при создании нового элемента программно создавать подчиненный элемент в справочнике «Единицы» с Наименованием «шт.» и Коэффициентом равным 1.
Опишем для этого предопределенные процедуры ПриЗакрытии() в модуле формы и в модуле формы списка справочника «Оборудование», потому что последовательность директив в кнопке «ОК» в форме следующая: #3аписать? Закрыть.
Метод ТекущийЭлемент() возвращает значение записанного в базу данных позиционированного текущего элемента справочника.
В модуле формы:
Перем ФлагНового;
Процедура ВводНового(признак,копируемый)
Если признак=1 Тогда
ВвестиСтроку(Наименование,"Введите наименование",25);
КонецЕсли;
Если Родитель.Выбран()=1 Тогда
Цена=Родитель.ГрЦена;
КонецЕсли;
ФлагНового-1;
КонецПроцедуры
Процедура ПриЗакрытии()
Если ФлагНового=1 Тогда
Ед=Создать0бъект("Справочник.Единицы");
Ед.ИспользоватьВладельца(ТекущийЭлемент());
Ед.Новый();
Ед.Наименование="шт.";
Ед.Коэффициент=1;
Ед.Записать();
КонецЕсли;
76 ______________________ 1C:Предприятие. Практика программирования на платформе V7
КонецПроцедуры ФлагНового=0;
В модуле формы списка мы можем создать несколько элементов, поэтому создадим список значений новых значений.
Метод РазмерСписка( ) возвращает число элементов в списке значений.
Метод ПолучитьЗначение(<Позиция>,<Строка>) позволяет получить значение из указанной
позиции списка. Возвращает значение из списка.
<Позиция> - номер позиции в списке, из которой возвращается значение (изменяется от 1 до
РазмерСписка); <Строка> - идентификатор переменной, в которой возвращается символьное
представление получаемого значения.
Метод НаЙтиПоКоду(<Код>,<ФлагПоиска>) позволяет найти элемент справочника по коду.
Возвращает: 1 - если действие выполнено;
О - если действие не выполнено (элемент не найден).
<Код> - выражение со значением искомого кода,
<флагПоиска> - флаг поиска (необязателен):
0 - поиск во всем справочнике вне зависимости от родителя;
1 - поиск внутри установленного подчинения (родителя);
2 - поиск по полному коду через разделитель.
Значение по умолчанию:
О - если код уникален во всем справочнике; 2 - если код уникален только'в группе. Его можно использовать только для объектов, созданных функцией СоздатьОбъект.
Перем СписокНовых;
Процедура ПриРедактированииНовойСтроки ()
Если Родитель.Выбран()=1 Тогда
Цена=Родитель.ГрЦена;
КонецЕсли;
СписокНовых.ДобавитьЗначение(Код,Наименование);
КонецПроцедуры
Процедура ПриЗакрытии()
Перем Стр;
Если СписокНовых.РазмерСписка()>0 Тогда
Новый=СоздатьОбъект("Справочник.Оборудование");
Для i=1 по СписокНовых.РазмерСписка() Цикл
Если Новый.НайтиПоКоду (СписокНовых.ПолучитьЗначение (i, Стр),0) =1 Тогда
Ед=СоздатьОбъект("Справочник.Единицы"); Ед.ИспользоватьВладельца(Новый.ТекущийЭлемент());
Ед.Новый();
Ед.Наименование="шт.";
Ед.Коэффициент = 1;
Ед.Записать();
КонецЕсли;
VII. Справочники_____________________________________________________________ 77
КонецЦикла;//
КонецЕсли;
КонецПроцедуры СписокНовых=Создать0бъект("СписокЗначений");
На приведенном ниже рисунке показано, как выглядят формы списков обоих справочников и форма элемента справочника «Единицы». В форме списка справочника «Единицы» отключен режим иерархии, но благодаря текстовому реквизиту «Владелец» можно различить единицы измерения с одинаковыми наименованиями и кодами , принадлежащие разным владельцам, в форме списка.