Программирование в 1С:

Подчиненные справочники

При создании справочников часто возникает необходимость добавления однотипных реквизитов (полей), количество которых заранее не известно. Например, создаем справочник «Контрагенты». У каждого контрагента надо указать контактные лица: фамилия, должность, телефон. При этом заранее трудно определить, сколько будет этих контактных лиц: может быть будет только директор, может директор и главный бухгалтер, а может быть и вообще не будет. Еще один пример. Создаем справочник сотрудники. У каждого сотрудника надо указать имена и даты рождения детей. Количество детей тоже заранее не известно. Такие примеры на практике встречаются повсеместно. Как решается эта проблема в 1С?

В системе 1С:Предприятие существует специальный механизм, который называется «Подчиненный справочник». Не надо путать это с «Подчиненным документом» - сходство между этими понятиями – только в названии. В этом механизме всегда участвуют 2 справочника: справочник-владелец и подчиненный справочник. При этом каждый элемент подчиненного справочника принадлежит одному элементу справочника-владельца.

1. Элемент справочника-владельца может иметь несколько элементов из подчиненного справочника.

2. Элемент справочника-вледельца может не иметь подчиненных элементов.

3. Каждый элемент подчиненного справочника может принадлежать только одному элементу справочника-владельца.

4. Все элементы подчиненного справочника должны кому-нибудь принадлежать. В подчиненном справочнике не может быть элемента без владельца.

Дополнение:

1. Один справочник может иметь несколько подчиненных. Например, в 1С:Бухгалтерии – справочнику «Контрагенты» подчинены справочники «Расчетные счета» и «Договоры».

2. Справочник может быть подчинен только одному справочнику.

3. Любой справочник в системе может быть подчинен и может иметь подчиненный справочник. Можно создать цепочку: справочник «Б» является подчиненным справочнику «А», справочник «В» подчинен справочнику «Б», справочник «Г» подчинен справочнику «В».

При работе с подчиненным справочником появляется один важный метод: «Использовать Владельца» и важный атрибут «Владелец».

Метод «ИспользоватьВладельца» - может применяться к объектам типа «Справочник» в нескольких случаях:

1.    В качестве параметра выборки. Применяется для объектов полученных с помощью функции «СоздатьОбъект», являющихся подчиненными справочниками. Метод используется ДО метода «ВыбратьЭлементы». Дальнейшая выборка элементов с помощью функции ПолучитьЭлемент() будет происходить только среди элементов подчиненного справочника, для которых владельцем является элемент, установленный методом «ИспользоватьВладельца»

2.    При создании нового элемента в подчиненном справочнике метод «ИспользоватьВладельца» - устанавливает владельца создаваемому элементу.

3.    Для объектов типа «Справочник», являющихся реквизитами формы (например в документе или отчете) метод «ИспользоватьВладельца» позволяет программно установить владельца, который будет использован при выборе данного реквизита.

Атрибут «Владелец» - предоставляет доступ к значению элемента сопряженного справочника, которому подчинен выбранный элемент. Важно помнить, что этот атрибут может быть изменен, но только для объектов, полученных с помощью функции «СоздатьОбъект».
Это теоретические сведения.

Рассмотрим практические примеры. Все практические примеры используют справочники «Контрагенты» - «Расчетные счета». Эти справочники есть во многих конфигурациях, и Вы без проблем сможете опробовать примеры.


Пример 1. Перебрать все элементы справочника «Контрагенты» и подчиненного ему справочника «РасчетныеСчета».

Процедура Пример1()
Контр=СоздатьОбъект("Справочник.Контрагенты");
Рсч=СоздатьОбъект("Справочник.РасчетныеСчета");
Контр.ВыбратьЭлементы();//открываем выборку контрагентов
Пока Контр.ПолучитьЭлемент()=1 цикл
    Сообщить("Контрагент "+Контр.Наименование);//сообщаем того по куму будем выводить счета
    рсч.ИспользоватьВладельца(контр.ТекущийЭлемент());////ВОТ ОН!
    рсч.ВыбратьЭлементы();//теперь открываем выборку
    Пока рсч.ПолучитьЭлемент()=1 цикл//получаем из выборки новый элемент
        сообщить("_____"+рсч.Наименование+" №"+рсч.Номер);// выводим имя и номер счета
    конецЦикла;
конецЦикла;
КонецПроцедуры


Пример 2. Как перебрать элементы подчиненного справочника, «не глядя» на владельца. Номера и названия счетов всех контрагентов.

Процедура Пример2()
    Рсч=СоздатьОбъект("Справочник.РасчетныеСчета");
    рсч.ВыбратьЭлементы(0);//теперь открываем выборку
    //Ноль означает, что выбираем без учета иерархии
    //это все-равно, что отключить иерархический список в меню "Действия"
    Пока рсч.ПолучитьЭлемент()=1 цикл//получаем из выборки новый элемент
        сообщить(+рсч.Наименование+" №"+рсч.Номер);// выводим имя и номер счета
    конецЦикла;
КонецПроцедуры


Пример 3. В примере 2 кроме названия и номера счета вывести название контрагента.

Процедура Пример3()
    Рсч=СоздатьОбъект("Справочник.РасчетныеСчета");
    рсч.ВыбратьЭлементы(0);//теперь открываем выборку
    Пока рсч.ПолучитьЭлемент()=1 цикл//получаем из выборки новый элемент
        Контрагент=рсч.Владелец;//вот мы и посмотрели на владельца
        сообщить(рсч.Наименование+" №"+рсч.Номер+" "+Контрагент);
    конецЦикла;
КонецПроцедуры


Обратите внимание! Очень важный момент. Разница между примером 1 и примером 3 – в первом случае перебираем справочник-владелец, а во втором случае – подчиненный справочник. В первом случае все счета оказываются сгруппированы по контрагентам. Во втором случае – один контрагент может встретиться несколько раз в разных местах (у разных счетов).


Пример 4. Для выбранного в форме контрагента – создать новый расчетный счет.

Процедура Пример4()
    Рсч=СоздатьОбъект("Справочник.РасчетныеСчета");
    Если ПустоеЗначение(выбКонтрагент)=1 тогда//смотрим - есть ли контрагент
        предупреждение("Укажите контрагента - хозяина");//если нет - ругаемся
        возврат;                                         // и уходим
    конецЕсли;
    рсч.ИспользоватьВладельца(ВыбКонтрагент);//используем нового контрагента как владельца
    рсч.Новый();//делаем новый элемент
    рсч.Наименование="Валютный"; //заполняем реквизиты
    рсч.Номер=777777777777;            
    //..................
    //..................
    рсч.Записать();//не забываем записать!
КонецПроцедуры


Важно: бывает так, что в диалоге лежит 2 реквизита. При этом один из них подчинен другому. Например, такое есть в любой расходной или приходной накладной: реквизит «Контрагент» и реквизит «Договор» (или основание). Вы точно знаете, что договор надо выбирать из списка договоров конкретного контрагента. Подчиненность можно установить программно: Договор.ИспользоватьВладельца(Контрагент). Программно надо устанавливать в момент выбора контрагента. Но можно подчиненность установить прямо в свойствах подчиненного реквизита – в поле «Связан с» - надо написать имя реквизита-владельца. В этом случае – после выбора владельца в реквизите хозяине, в подчиненном реквизите – автоматически будет устанавливаться выборка элементов по хозяину. Пример можно посмотреть в любой расходной накладной.

 

Назад

Вверх

На главную

Вперед
Hosted by uCoz