Как найти элемент в подчиненном справочнике

В прикладных задачах иногда возникают ситуации, когда элемент какого-нибудь справочника должен быть жестко подчинен элементу другого справочника. Например, у контрагентов могут существовать договоры, которые заключены с организацией, ведущей учёт. Тогда, экземпляр справочника Договоры контрагента должен быть подчинен справочнику Контрагенты, поскольку, мы не можем создать договор сам по себе, договор должен быть привязан к конкретному контрагенту. Для реализации подобных задач необходим подчиненный справочник 1С. В выше приведенном случае, справочник Договоры контрагента станет подчинен справочнику Контрагенты. А справочник Контрагенты будет являться владельцем справочника Договоры контрагента.

Конструируем подчиненный справочник 1С

Для того, чтобы из справочника 1С сделать подчиненный справочник, достаточно в редакторе справочника на закладке Владельцы указать владельца этого справочника.

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

После этого, справочник с заполненным списком на закладке Владельцы станет подчиненный, а справочник (или справочники) из списка на этой закладке будут владельцами данного справочника.

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

После таких манипуляций, нельзя создать этот справочник (в рассматриваемом примере – ДоговорыКонтрагента) без указания владельца (Контрагента).

Если мы попробуем создать, элемент справочника ДоговорыКонтрагента, то поле, в котором следует указать контрагента-владельца будет обязательным для заполнения.

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

Заметьте, это поле называется Владелец  и является стандартным реквизитом справочника.

Стандартный реквизит справочника 1С

Этот реквизит стал активным, тогда, когда мы указали владельца справочника на закладке Владельцы.

В тоже время, на форме элемента справочника-владельца появилась команда с названием подчиненного справочника.

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

После выполнении этой команды, откроется форма списка с элементами подчиненного справочника, у которых владелец ссылка на открытый элемент справочника Контрагенты.

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

Программное создание элемента подчиненного справочника

Разберем программное создание элемента подчиненного справочника. Оно выполняется при помощи метода менеджера справочник СоздатьЭлемент. Только, в случае подчиненных справочников обязательно нужно указать владельца!

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

Форма обработки 1С

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

&НаСервере
Процедура СоздатьПодчиненныйСправочникНаСервере()
	
	НовыйДоговор = Справочники.ДоговорыКонтрагента.СоздатьЭлемент();
	НовыйДоговор.Наименование = НазваниеДоговора;
	НовыйДоговор.Владелец = Владелец;
	НовыйДоговор.Записать();
	
КонецПроцедуры

&НаКлиенте
Процедура СоздатьПодчиненныйСправочник(Команда)
	
	Если Не ПроверитьЗаполнение() Тогда 
		Возврат;
	КонецЕсли;
	
	СоздатьПодчиненныйСправочникНаСервере();
КонецПроцедуры

В клиентской процедуре используется проверка заполнения. Подробнее о проверке читайте в этой статье:

Проверка заполнения 1С

Выбор элементов подчиненного справочника на управляемой форме

Часто возникают задачи, когда на управляемой форме размещены поля ввода и для справочника владельца, и для подчиненного справочника. И в этом случае нужно реализовать, чтобы в поле ввода подчиненного справочника отображались только те элементы, владелец которых указан в поле ввода справочника владельца.

Например, у документа Продажа товаров существуют реквизиты Контрагент  и Договор контрагента соответствующих типов.

Справочники 1С

Для того, чтобы в реквизите Договор контрагента  можно было выбрать только договоры указанного контрагента, следует в палитре свойств реквизита объекта у свойства Связи параметров выбора сделать настройку, в которой указать, что реквизит Контрагент используется при выборе значений в качестве владельца.

Справочники 1С

Справочники 1С

После таких настроек, в поле ввода Договоры контрагента можно выбрать только договоры, указанного контрагента.

Справочники 1С

Если же мы создадим реквизит управляемой формы с ссылкой на подчиненный справочник, то у этого реквизита не будет такого же свойства, как и у реквизита объекта.

Реквизит управляемой формы 1С

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

Реквизит управляемой формы 1С

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

Для того, чтобы найти какой-то элемент среди подчиненных справочников, при помощи методов менеджера справочника НайтиПоНаименованию, НайтиПоКоду и НайтиПоРеквизиту следует использовать параметр Владелец  этих методов.

Например, в случае поиска по наименованию, код будет следующим.

Договор = Справочники. ДоговорыКонтрагента.НайтиПоНаименованию(НазваниеДоговора,Истина,,Владелец);

Где НазваниеДоговора – это наименование элемента справочника, который ищется.

Владелец – это ссылка на справочник владелец.  

Подчиненный справочник 1С или табличная часть?

Часто возникает вопрос: чем отличается подчиненный справочника от табличной части. Основной ответ, тем что у элемента подчиненного справочника имеется ссылка на этот элемент, а у строки табличной части такой ссылки нет.

Подробно, о  том, что выбрать при разработке подчиненный справочник или табличную часть читайте по этой ссылке на сайте its.1c.ru:

Подчиненный справочник или табличная часть

Видео по теме:

Читайте также по теме:

Объект в 1С

Ссылка в 1С

Метаданные 1С

Документы в 1С

Более подробно и основательно начальные вопросы программирования в 1С есть вы можете изучить в
Книга «Программировать в 1С за 11 шагов»

Изучайте программирование в 1С в месте с моей книгой «Программировать в 1С за 11 шагов»

Программировать в 1С за 11 шагов

Книга написана понятным и простым языком — для новичка.

  1. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
  2. Научитесь понимать архитектуру 1С;
  3. Станете писать код на языке 1С;
  4. Освоите основные приемы программирования;
  5. Закрепите полученные знания при помощи задачника

О том как разрабатывать под управляемым приложением 1С, читайте в книге Книга «Основы разработки в 1С: Такси»

Отличное пособие по разработке в управляемом приложении 1С, как для начинающих разработчиков, так и для опытных программистов.

Основы разработки в 1С такси
  1. Очень доступный и понятный язык изложения
  2. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
  3. Поймете идеологию управляемого приложения 1С
  4. Узнаете, как разрабатывать управляемое приложение;
  5. Научитесь разрабатывать управляемые формы 1С;
  6. Сможете работать с основными и нужными элементами управляемых форм
  7. Программирование под управляемым приложением станет понятным

Промо-код на скидку в 15% — 48PVXHeYu

Эти книги, плюс книга по программированию оперативного учета имеются в едином комплекте: комплект книг по разработке в 1С.
Только для читателей моего блога,
промо-код на скидку в 300 рублей на весь комплект: blog


Если Вам понравился этот урок, был полезен или помог решить какую-нибудь проблему, то Вы можете поддержать мой проект, перечислив любую сумму
.

можно оплатить вручную:

Яндекс.Деньги — 410012882996301

Вступайте в мои группы:

Вконтакте: https://vk.com/1c_prosto
Фейсбуке: https://www.facebook.com/groups/922972144448119/
ОК: http://ok.ru/group/52970839015518
Твиттер: https://twitter.com/signum2009

Как найти значение в подчиненном спровочнике?

Я
   DDD2006

15.06.10 – 09:10

Добавил в спр. Цены еще 1 поле артикул, Бух 517 релиз, в константах сделал что могут быть разные цены, Торг 12 внешняя печатная форма

спрА=СоздатьОбъект(“Справочник.Цены”);

СпрА.ИспользоватьВладельца(Докум.Контрагент);                        

   СпрЕ=СоздатьОбъект(“Справочник.Единицы”);

   
   Ном = 0;

   ТабДок.ВыбратьСтроки();

   Пока ТабДок.ПолучитьСтроку() = 1 Цикл  

       Артикул=””;

       Если СпрА.НайтиПоРеквизиту(“Номенклатура”,ТабДок.Товар,0)=1 Тогда

           Артикул=СпрА.Артикул;    

       КонецЕсли;          

       К=0;

       СпрЕ.ИспользоватьВладельца(ТабДок.Товар);

       Если СпрЕ.ВыбратьЭлементы()=1 Тогда

           Если СпрЕ.ПолучитьЭлемент()=1 Тогда

               К=СпрЕ.Код;    

           КонецЕсли;    

       КонецЕсли;

       
       Ном = Ном + 1;

выдает ошибку

Если СпрА.НайтиПоРеквизиту(“Номенклатура”,ТабДок.Товар,0)=1 Тогда

{F:PRNFORMSТОРГ12.ERT(247)}: Неверное имя реквизита!

   ДенисЧ

1 – 15.06.10 – 09:11

Ну, наверное, нет такового реквизита Номенклатура в справочнике цен…

   1Сергей

2 – 15.06.10 – 09:12

СпрА.ИспользоватьВладельца(ТабДок.Товар);

   Chameleon1980

3 – 15.06.10 – 09:12

спрА=СоздатьОбъект(“Справочник.Цены”);
СпрА.ИспользоватьВладельца(Докум.Контрагент);

Цены подчинены контрагентам?

   DDD2006

4 – 15.06.10 – 09:12

(3) нет

   DDD2006

5 – 15.06.10 – 09:13

(1) точно нету

   ВедущийП

6 – 15.06.10 – 09:13

(4) И? то что в (3) тебя не насторожило?

   ДенисЧ

7 – 15.06.10 – 09:13

(5) А что ищешь-то? 🙂

   ВедущийП

8 – 15.06.10 – 09:14

Что хочешь получить то? Чтение кода убило наповал

   DDD2006

9 – 15.06.10 – 09:15

(7) мне нужно из справочника цен выташить артикул, по наименованию Товара

   Rie

10 – 15.06.10 – 09:16

(9) Какие реквизиты есть у справочника Цены? Чему от подчинён (если подчинён)?

   ВедущийП

11 – 15.06.10 – 09:16

Отлично. Цен на один и тот же товар может быть несколько? Какой из артикулов тогда брать?

   DDD2006

12 – 15.06.10 – 09:16

Если ПустоеЗначение(Докум.ТипЦен) =1 Тогда
       СпрА=СоздатьОбъект(“Справочник.Артикулы”);
       СпрА.ИспользоватьВладельца(Докум.Контрагент);                                        
   Иначе
       СпрА=СоздатьОбъект(“Справочник.Цены”);
   КонецЕсли;
   //СпрА=СоздатьОбъект(“Справочник.Артикулы”);
//    СпрА.ИспользоватьВладельца(Докум.Контрагент);                                        

       СпрЕ=СоздатьОбъект(“Справочник.Единицы”);

       Ном = 0;
   ТабДок.ВыбратьСтроки();
   Пока ТабДок.ПолучитьСтроку() = 1 Цикл  
       Артикул=””;
   Если ПустоеЗначение(Докум.ТипЦен) =1 Тогда
       Если СпрА.НайтиПоРеквизиту(“Номенклатура”,ТабДок.Товар,0)=1 Тогда
           Артикул=СпрА.Артикул;    
       КонецЕсли;
   Иначе

// вот здесь нужно получить Артикул из спр. Цен

               КонецЕсли;          
       К=0;
       СпрЕ.ИспользоватьВладельца(ТабДок.Товар);
       Если СпрЕ.ВыбратьЭлементы()=1 Тогда
           Если СпрЕ.ПолучитьЭлемент()=1 Тогда
               К=СпрЕ.Код;    
           КонецЕсли;    
       КонецЕсли;

   DDD2006

13 – 15.06.10 – 09:17

(11) в зависимости от того какой Докум.ТипЦен запонен в документе

   1Сергей

14 – 15.06.10 – 09:18

(13) см (2) + НайтиПоРеквизиту(“ТипЦены”…

   ВедущийП

15 – 15.06.10 – 09:19

(12) Аааа отрыв башки 🙂

   ВедущийП

16 – 15.06.10 – 09:21

СпрА = СоздатьОбъект(“Справочник.Цены”);
СпрА.ИспользоватьВладельца(Товар);
Если СпрА.НайтиПоРеквизиту(“ТипЦен”,Док.ТипЦен) = 1 Тогда
  Артикул = СпрА.Артикул;    
КонецЕсли;

   ВедущийП

17 – 15.06.10 – 09:23

Название переменных и реквизитов настроить и все, можно пользоваться

   DDD2006

18 – 15.06.10 – 09:25

(16)
Если СпрА.НайтиПоРеквизиту(“ТипЦен”,Докум.ТипЦен) = 1 Тогда
{F:1C_BASENPRNFORMSТОРГ12.ERT(254)}: Недостаточное число параметров передано при вызове функции/процедуры объекта

   ДенисЧ

19 – 15.06.10 – 09:26

(18)

НайтиПоРеквизиту(<?>,,);

Синтаксис:

НайтиПоРеквизиту(<ИмяРеквизита>,<Значение>,<ФлагГлобальногоПоиска>)

Назначение:

Найти элемент справочника по значению реквизита.

Возвращает: 1 – если действие выполнено;

0 – если действие не выполнено (элемент не найден).

Параметры:

<ИмяРеквизита> – строка с наименованием реквизита;

<Значение> – значение реквизита для поиска;

<ФлагГлобальногоПоиска> – флаг поиска:

 0 – поиск выполняется в пределах подчинения справочника,

 1 – поиск выполняется по всему справочнику.

Замечание:

Метод можно использовать только для реквизитов с установленным признаком ”Сортировка”.

Метод  можно использовать только для объектов, созданных функцией СоздатьОбъект.

   1Сергей

20 – 15.06.10 – 09:28

   DDD2006

21 – 15.06.10 – 09:36

(20) у меня уже нет такого крутого монитора

   DDD2006

22 – 15.06.10 – 09:39

в результате даже на сообщить пустота

   Если ПустоеЗначение(Докум.ТипЦен) =1 Тогда
       СпрА=СоздатьОбъект(“Справочник.Артикулы”);
       СпрА.ИспользоватьВладельца(Докум.Контрагент);                                        
   Иначе
       СпрА=СоздатьОбъект(“Справочник.Цены”);
       СпрА.ИспользоватьВладельца(Докум.Товар);
   КонецЕсли;
   //СпрА=СоздатьОбъект(“Справочник.Артикулы”);
//    СпрА.ИспользоватьВладельца(Докум.Контрагент);                                        

       СпрЕ=СоздатьОбъект(“Справочник.Единицы”);

       Ном = 0;
   ТабДок.ВыбратьСтроки();
   Пока ТабДок.ПолучитьСтроку() = 1 Цикл  
       Артикул=””;
       Если ПустоеЗначение(Докум.ТипЦен) =1 Тогда
           Если СпрА.НайтиПоРеквизиту(“Номенклатура”,ТабДок.Товар,0)=1 Тогда
               Артикул=СпрА.Артикул;    
           КонецЕсли;
       Иначе
           Если СпрА.НайтиПоРеквизиту(“ТипЦен”,Докум.ТипЦен,0) = 1 Тогда
               Артикул = СпрА.Артикул;
               Сообщить(“Товар “+Докум.Товар+” артикул “+СпрА.Артикул);
           КонецЕсли;    
       КонецЕсли;          
       К=0;
       СпрЕ.ИспользоватьВладельца(ТабДок.Товар);
       Если СпрЕ.ВыбратьЭлементы()=1 Тогда
           Если СпрЕ.ПолучитьЭлемент()=1 Тогда
               К=СпрЕ.Код;    
           КонецЕсли;    
       КонецЕсли;

   DDD2006

23 – 15.06.10 – 09:41

вот так все нормуль

   Если ПустоеЗначение(Докум.ТипЦен) =1 Тогда
       СпрА=СоздатьОбъект(“Справочник.Артикулы”);
       СпрА.ИспользоватьВладельца(Докум.Контрагент);                                        
   Иначе
       СпрА=СоздатьОбъект(“Справочник.Цены”);
   //    СпрА.ИспользоватьВладельца(ТабДок.Товар);
   КонецЕсли;
   //СпрА=СоздатьОбъект(“Справочник.Артикулы”);
//    СпрА.ИспользоватьВладельца(Докум.Контрагент);                                        

       СпрЕ=СоздатьОбъект(“Справочник.Единицы”);

       Ном = 0;
   ТабДок.ВыбратьСтроки();
   Пока ТабДок.ПолучитьСтроку() = 1 Цикл  
       Артикул=””;
       Если ПустоеЗначение(Докум.ТипЦен) =1 Тогда
           Если СпрА.НайтиПоРеквизиту(“Номенклатура”,ТабДок.Товар,0)=1 Тогда
               Артикул=СпрА.Артикул;    
           КонецЕсли;
       Иначе
           СпрА.ИспользоватьВладельца(ТабДок.Товар);
           Если СпрА.НайтиПоРеквизиту(“ТипЦен”,Докум.ТипЦен,0) = 1 Тогда
               Артикул = СпрА.Артикул;
               Сообщить(“Товар “+ТабДок.Товар+” артикул “+СпрА.Артикул);
           КонецЕсли;    
       КонецЕсли;          
       К=0;
       СпрЕ.ИспользоватьВладельца(ТабДок.Товар);
       Если СпрЕ.ВыбратьЭлементы()=1 Тогда
           Если СпрЕ.ПолучитьЭлемент()=1 Тогда
               К=СпрЕ.Код;    
           КонецЕсли;    
       КонецЕсли;

   DDD2006

24 – 15.06.10 – 09:41

спасибо за помощь

   Chameleon1980

25 – 15.06.10 – 09:42

Начало ответа тебе в (16)
СпрА = СоздатьОбъект(“Справочник.Цены”);
СпрА.ИспользоватьВладельца(Товар);
Если СпрА.НайтиПоРеквизиту(“ТипЦен”,Док.ТипЦен) = 1 Тогда
  Артикул = СпрА.Артикул;    
КонецЕсли;

А третьим параметров в НайтиПоРеквизиту(“ТипЦен”,Док.ТипЦен)
ноль поставь

   1Сергей

26 – 15.06.10 – 09:43

(24) Пожалуйста. Принимаю мат.помощь на новый моник 🙂

   DDD2006

27 – 15.06.10 – 09:44

(24) могу такой же выслать если в этом яркость упала

   1Сергей

28 – 15.06.10 – 09:45

(27) не… спасибо, у меня от трубки глаза болят

   Злопчинский

29 – 15.06.10 – 09:54

артикул в цены запихнуть? – это сильно…

   DDD2006

30 – 15.06.10 – 09:58

(29) а куда посоветуй?

   DDD2006

31 – 15.06.10 – 10:00

Есть пользователь хочет в бух как в ТиС чтобы было несколько цен работает с Метро и Айшанам у которого свои Торг 12 и Сч фактуры и свои коды

   ВедущийП

32 – 15.06.10 – 10:30

Обычно артикул в самой карточке товара.

  

DDD2006

33 – 15.06.10 – 10:49

(31) у каждого покупателя свой артикул и своя цена может быть

Как выбрать подчиненные элементы справочника

Как выбрать подчиненные элементы справочника

Выбрать элементы справочника по владельцу

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

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

Либо тоже самое можно сделать запросом, указав владельца явно:

КонтрагентАтлант = Справочники.Контрагенты.НайтиПоНаименованию("Атлант")
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ Договоры.Ссылка
ИЗ
Справочник.Договоры КАК Договоры
ГДЕ
 Договоры.Владелец = &Владелец"
Запрос.УстановитьПараметр("Владелец", КонтрагентАтлант);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
    ТекущийДоговор = Выборка.Ссылка;
КонецЦикла;

Недостаточно прав для комментирования

  • АКТУАЛЬНЫЕ РЕЛИЗЫ 1С
  • ПРИМЕРЫ КОДА НА ПЛАТФОРМЕ 1С
Справочники в 1С 8.x
  • Как создать элемент (группу) справочника?
  • Как найти элемент справочника?
  • Как удалить элемент справочника?
  • Как перебрать элементы справочника?
  • Как выбрать все элементы из определенной группы?
  • Как перебрать элементы подчиненного справочника с помощью запроса?
  • Как перебрать элементы подчиненного справочника с помощью выборки справочника?
  • Как открыть форму списка (элемента) справочника?
  • Как добавить запись в табличную часть элемента справочника?
  • Как удалить строки из табличной части справочника?
  • Как перебрать строки табличной части справочника?
  • Как создать элемент в нужной группе?
  • Как узнать, есть ли у текущего элемента подчиненные?
  • Как узнать количество подчиненных элементов у выбранного элемента справочника?
  • Как узнать количество подчиненных элементов у выбранного элемента справочника, если количество подчиненных справочников больше чем один?
  • Как получить всех родителей выбранного элемента справочника?
  • Как получить запросом “полный” код элементов справочника, если тип кода – Строка?
  • Как получить все элементы справочника, содержащие в наименовании определенную подстроку, со всей иерархией, в которую они входят?
  • Как найти все элементы справочника, в которых не заполнен строковый реквизит?
  • Как перенести все элементы справочника “Контрагенты” из одной группы в другую?
  • Как организовать программный выбор элемента справочника?
  • Как сохранить фотографию сотрудника в справочнике “Сотрудники”?

Как создать элемент (группу) справочника?

НовыйЭлемент = Справочники.ДокументыУдостоверяющиеЛичность.СоздатьЭлемент();
НовыйЭлемент.Наименование = "военный билет"; 

// Установить другие реквизиты.  
....

НовыйЭлемент.Записать(); 

НовыйЭлемент = Справочники.Банки.СоздатьЭлемент(); 

// Получить ссылку на группу, в которой будет находиться новый элемент. 
Родитель = Справочники.Банки.НайтиПоКоду("000000001"); 

НовыйЭлемент.Наименование = "АКБ"; 
НовыйЭлемент.Код = "000000011"; 
НовыйЭлемент.Родитель = Родитель; 

// Установить другие реквизиты.  
....

НовыйЭлемент.Записать(); 

НоваяГруппа = Справочники.Номенклатура.СоздатьГруппу(); 

// Получить ссылку на группу, в которой должна находиться создаваемая группа. 
Родитель = Справочники.Номенклатура.НайтиПоНаименованию("Обувь", Истина); 

НоваяГруппа.Наименование = "Модельная обувь"; 
НоваяГруппа.Родитель = Родитель; 

// Установить другие реквизиты.  
....

НоваяГруппа.Записать(); 


// Создать новый элемент в корне справочника. 
НовыйЭлемент = Справочники.Подразделения.СоздатьЭлемент(); 
НовыйЭлемент.Наименование = "IT отдел";  
НовыйЭлемент.Записать(); 

// Получить ссылку на родителя добавляемых элементов. 
Родитель = НовыйЭлемент.Ссылка; 

// Создать дочерний элемент. 
НовыйЭлемент = Справочники.Подразделения.СоздатьЭлемент(); 
НовыйЭлемент.Наименование = "Группа разработки"; 
НовыйЭлемент.Родитель = Родитель;  

НовыйЭлемент.Записать();
Как найти элемент справочника?
          
// Найдем по коду
РезультатПоиска = Справочники.Номенклатура.НайтиПоКоду("00030"); 
Если РезультатПоиска.Пустая() Тогда 
	// Выполнить действия, предусмотренные в случае, когда элемент не найден.  
КонецЕсли; 

// Найдем по наименованию
РезультатПоиска = Справочники.Номенклатура.НайтиПоНаименованию("Кроссовки"); 

// Найдем по реквизиту
РезультатПоиска = Справочники.Номенклатура.НайтиПоРеквизиту("Артикул", "К-120002");
Как удалить элемент справочника?

// Найти ссылки на удаляемый элемент. 
МассивСсылок = Новый Массив; 
МассивСсылок.Добавить(СсылкаНаУдаляемыйЭлемент); 
НайденныеСсылки = НайтиПоСсылкам(МассивСсылок); 

Если НайденныеСсылки.Количество() > 0 Тогда 
	Сообщить("Нельзя удалять элемент, на него имеются ссылки"); 
Иначе 
	УдаляемыйЭлемент = СсылкаНаУдаляемыйЭлемент.ПолучитьОбъект(); 
	УдаляемыйЭлемент.Удалить(); 
КонецЕсли; 

УдаляемыйЭлемент.УстановитьПометкуУдаления(Истина);         
Как перебрать элементы справочника?

Выборка = Справочники.Номенклатура.ВыбратьИерархически(); 
Пока Выборка.Следующий() Цикл 
	Наименование = Выборка.Наименование; 

	// Обращение к другим данным справочника. 
КонецЦикла; 

Запрос = Новый Запрос(" 
	|ВЫБРАТЬ 
	|	Ссылка, 
	|	Наименование 
	|ИЗ 
	|	Справочник.Номенклатура 
	|АВТОУПОРЯДОЧИВАНИЕ"); 

Результат = Запрос.Выполнить().Выбрать(); 

Пока Результат.Следующий() Цикл 
	Наименование = Результат.Наименование;  
КонецЦикла;         
Как выбрать все элементы из определенной группы?

Выборка = Справочники.Номенклатура.Выбрать(ПолеВводаРодитель); 
Пока Выборка.Следующий() Цикл 
	Наименование = Выборка.Наименование;
КонецЦикла; 

Запрос = Новый Запрос(" 
	|ВЫБРАТЬ 
	|	Ссылка, 
	|	Наименование 
	|ИЗ 
	|	Справочник.Номенклатура 
	|ГДЕ 
	|	Родитель = &Родитель 
	|АВТОУПОРЯДОЧИВАНИЕ"); 

Запрос.УстановитьПараметр("Родитель", ПолеВводаРодитель); 

Результат = Запрос.Выполнить().Выбрать(); 

Пока Результат.Следующий() Цикл 
	Наименование = Результат.Наименование;  
КонецЦикла; 

Выборка=Справочники.Номенклатура.ВыбратьИерархически(ПолеВводаРодитель); 
Пока Выборка.Следующий() Цикл 
	Наименование = Выборка.Наименование;  
КонецЦикла; 


Запрос = Новый Запрос(" 
	|ВЫБРАТЬ 
	|	Ссылка, 
	|	Наименование 
	|ИЗ 
	|	Справочник.Номенклатура 
	|ГДЕ 
	|	Родитель В ИЕРАРХИИ(&Родитель) 
	|АВТОУПОРЯДОЧИВАНИЕ"); 

Запрос.УстановитьПараметр("Родитель", ПолеВводаРодитель); 

Результат = Запрос.Выполнить().Выбрать(); 

Пока Результат.Следующий() Цикл 
	Наименование = Результат.Наименование;  
КонецЦикла;          
Как перебрать элементы подчиненного справочника с помощью запроса?

Процедура ПереборПодчиненыхЭлементов(Контрагент) 

	Запрос = Новый Запрос; 
	Запрос.Текст = "ВЫБРАТЬ 
	|	КонтактныеЛица.Ссылка 
	|ИЗ 
	|	Справочник.КонтактныеЛица КАК КонтактныеЛица 
	|ГДЕ 
	|	КонтактныеЛица.Владелец = &Владелец"; 

	Запрос.УстановитьПараметр("Владелец", Контрагент); 

	Результат = Запрос.Выполнить(); 
	Выборка = Результат.Выбрать(); 

	Пока Выборка.Следующий() Цикл 
		ОчереднойПодчиненый = Выборка.Ссылка; 
	КонецЦикла; 

КонецПроцедуры          
Как перебрать элементы подчиненного справочника с помощью выборки справочника?

Процедура ПереборПодчиненыхЭлементов(Контрагент) 

	// Получить выборку по указанному контрагенту. 
	Выборка = Справочники.КонтактныеЛица.Выбрать( , Контрагент); 

	Пока Выборка.Следующий() Цикл 
		ОчереднойПодчиненый = Выборка.Ссылка; 
	КонецЦикла; 

КонецПроцедуры          
Как открыть форму списка (элемента) справочника?

Форма = Справочники.Номенклатура.ПолучитьФормуСписка(); 
Форма.Открыть();

Элемент = Справочники.Номенклатура.НайтиПоКоду("00070"); 
Форма = Элемент.ПолучитьФорму(); 
Форма.Открыть();         
Как добавить запись в табличную часть элемента справочника?

ЭлементОбъект = СсылкаКонтрагент.ПолучитьОбъект(); 
НоваяСтрока = ЭлементОбъект.ВидыДеятельности.Добавить(); 

// Заполнить реквизиты. 
НоваяСтрока.ВидДеятельности = ПолеВводаВидДеятельности; 

ЭлементОбъект.Записать();          
Как удалить строки из табличной части справочника?

ЭлементСправочника = Справочники.Контрагенты.НайтиПоКоду("Ю0006"); 
ОбъектСправочника = ЭлементСправочника.ПолучитьОбъект(); 
ОбъектСправочника.ВидыДеятельности.Очистить(); 
ОбъектСправочника.Записать(); 


ОбъектСправочника = ВыбранныйЭлемент.ПолучитьОбъект(); 

// Создать структуру для отбора удаляемых строк. 
СтруктураОтбора = Новый Структура("ВидДеятельности", ВыбранныйВидДеятельности); 

// Получить массив удаляемых строк. 
ПодходящиеСтроки = ОбъектСправочника.ВидыДеятельности.НайтиСтроки(СтруктураОтбора); 

// Удалить строки. 
Для Каждого ОчереднаяСтрока Из ПодходящиеСтроки Цикл 
	ОбъектСправочника.ВидыДеятельности.Удалить(ОчереднаяСтрока); 
КонецЦикла; 

ОбъектСправочника.Записать();          
Как перебрать строки табличной части справочника?

ЭлементСправочника = Справочники.Контрагенты.НайтиПоКоду("Ю0006"); 
Для Каждого ТекущаяСтрока Из ЭлементСправочника.ВидыДеятельности Цикл 
	Сообщить(ТекущаяСтрока.ВидДеятельности); 
КонецЦикла;           
Как создать элемент в нужной группе?

КодГруппы = "330100"; 
ПоискПоПолномуКоду = Ложь; // значение по умолчанию 
Группа = Справочники.Номенклатура.НайтиПоКоду(КодГруппы, ПоискПоПолномуКоду); 

Если Группа.Пустая() Тогда 
	Группа = Справочники.Номенклатура.СоздатьГруппу(); 

	Группа.Код = КодГруппы; 
	Группа.Наименование = "Загруженные"; 
	Группа.Записать(); 

ИначеЕсли Не Группа.ЭтоГруппа Тогда 
	Сообщить("Найден элемент справочника с указанным кодом!"); 

	// Предусмотреть прерывание алгоритма.

КонецЕсли; 

Спр = Справочники.Номенклатура.СоздатьЭлемент(); 
Спр.Наименование = "Программно созданный"; 

// Реквизиты заполняются в соответствии с задачей.  

Спр.Родитель = Группа.Ссылка; 
Спр.Записать(); 


Группа = Справочники.Номенклатура.Загруженные; 


КодЭлемента = "330100"; 
ПоискПоПолномуКоду = Ложь; //Значение по умолчанию 
Родитель = Справочники.Номенклатура.НайтиПоКоду(КодЭлемента, ПоискПоПолномуКоду); 

Если Родитель.Пустая() Тогда 
Родитель = Справочники.Номенклатура.СоздатьЭлемент(); 

Родитель.Код = КодЭлемента; 
Родитель.Наименование = "Загруженные"; 

Родитель.Записать(); 
КонецЕсли; 

Спр = Справочники.Номенклатура.СоздатьЭлемент(); 
Спр.Наименование = "Программно созданный"; 
// Реквизиты заполняются в соотвествии с задачей. 

Спр.Родитель = Родитель.Ссылка; 
Спр.Записать();          
Как узнать, есть ли у текущего элемента подчиненные?

Выборка = Справочники.Номенклатура.Выбрать( , Владелец); 
Если Выборка.Следующий() = Истина Тогда 
	// Есть подчиненные элементы.
КонецЕсли;


Запрос = Новый Запрос; 
Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1 
	|	ЕдиницыИзмерения.Ссылка 
	|ИЗ 
	|	Справочник.ЕдиницыИзмерения КАК ЕдиницыИзмерения 
	|ГДЕ 
	|	ЕдиницыИзмерения.Владелец = &Владелец"; 

Запрос.УстановитьПараметр("Владелец", Владелец); 

Если НЕ Запрос.Выполнить().Пустой() Тогда 
	// Есть подчиненные элементы!
КонецЕсли;           
Как узнать количество подчиненных элементов у выбранного элемента справочника?

Выборка = Справочники.ЕдиницыИзмерения.Выбрать( , Владелец); 
КоличествоЭлементов = 0; 
Пока Выборка.Следующий() Цикл 
	КоличествоЭлементов = КоличествоЭлементов + 1; 
КонецЦикла; 


Запрос = Новый Запрос; 
Запрос.Текст = "ВЫБРАТЬ 
	|	КОЛИЧЕСТВО(*) КАК КоличествоЗаписей 
	|ИЗ 
	|	Справочник.ЕдиницыИзмерения КАК ЕдиницыИзмерения 
	|ГДЕ 
	|	ЕдиницыИзмерения.Владелец = &Владелец"; 

Запрос.УстановитьПараметр("Владелец", Владелец); 

Выборка = Запрос.Выполнить().Выбрать(); 

Если Выборка.Следующий() Тогда 
	КоличествоЗаписей = Выборка.КоличествоЗаписей; 
КонецЕсли;          
Как узнать количество подчиненных элементов у выбранного элемента справочника, если количество подчиненных справочников больше чем один?

ВЫБРАТЬ
СУММА(КоличествоПодчиненных) КАК КоличествоПодчиненныхЭлементов 
ИЗ 
(ВЫБРАТЬ 
КОЛИЧЕСТВО(*) КАК КоличествоПодчиненных 
ИЗ 
Справочник.ЕдиницыИзмерения КАК ЕдиницыИзмерения 
ГДЕ ЕдиницыИзмерения.Владелец = &Владелец 

ОБЪЕДИНИТЬ ВСЕ 

ВЫБРАТЬ 
КОЛИЧЕСТВО(*) 
ИЗ 
Справочник.СерииНоменклатуры КАК СерииНоменклатуры 
ГДЕ СерииНоменклатуры.Владелец = &Владелец ) КАК ВложенныйЗапрос          
Как получить всех родителей выбранного элемента справочника?

МассивРодителей = Новый Массив; 
Родитель = СсылкаНаЭлемент.Родитель; 

Пока Не Родитель.Пустая() Цикл 
	МассивРодителей.Добавить(Родитель); 
	Родитель = Родитель.Родитель; 
КонецЦикла; 


Для Каждого ТекущийРодитель Из МассивРодителей Цикл 
	// Работа с текущим родителем. 
КонецЦикла;


ВЫБРАТЬ 
	Номенклатура.Ссылка КАК Ссылка 
ИЗ 
	Справочник.Номенклатура КАК Номенклатура 
ГДЕ 
	Номенклатура.Ссылка = &Ссылка 
ИТОГИ ПО 
	Ссылка ТОЛЬКО ИЕРАРХИЯ 




ТекущийЭлементНоменклатуры = ЭлементНоменклатура; 

Запрос = Новый Запрос("ВЫБРАТЬ 
	|	Номенклатура.Родитель, 
	|	Номенклатура.Родитель.Родитель, 
	|	Номенклатура.Родитель.Родитель.Родитель, 
	|	Номенклатура.Родитель.Родитель.Родитель.Родитель, 
	|	Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель 
	|ИЗ 
	|	Справочник.Номенклатура КАК Номенклатура 
	|ГДЕ 
	|	Номенклатура.Ссылка = &ТекущийЭлементНоменклатуры"; 

Пока Истина Цикл 
	Запрос.УстановитьПараметр("ТекущийЭлементНоменклатуры", ТекущийЭлементНоменклатуры); 
	Результат = Запрос.Выполнить(); 
	Если Результат.Пустой() Тогда 
		Прервать; 
	КонецЕсли; 
	Выборка = Результат.Выбрать(); 
	Выборка.Следующий(); 

	Для НомерКолонки = 0 По Результат.Колонки.Количество() - 1 Цикл 
		ТекущийЭлементНоменклатуры = Выборка[НомерКолонки]; 
		Если ТекущийЭлементНоменклатуры = Справочники.Номенклатура.ПустаяСсылка() Тогда 
			Прервать; 
		Иначе 
			Сообщить(ТекущийЭлементНоменклатуры); 
		КонецЕсли; 
	КонецЦикла; 

	Если ТекущийЭлементНоменклатуры = Справочники.Номенклатура.ПустаяСсылка() Тогда 
		Прервать;
	КонецЕсли; 
КонецЦикла;          
Как получить запросом “полный” код элементов справочника, если тип кода – Строка?

ВЫБРАТЬ 
	Контрагенты.Ссылка, 
ВЫБОР 
КОГДА (Контрагенты.Родитель.Код ЕСТЬ NULL ) ТОГДА Контрагенты.Код 
КОГДА (Контрагенты.Родитель.Родитель.Код ЕСТЬ NULL ) ТОГДА 
	Контрагенты.Родитель.Код + "/" + Контрагенты.Код 
ИНАЧЕ Контрагенты.Родитель.Родитель.Код + "/" + Контрагенты.Родитель.Код + 
	"/" + Контрагенты.Код 
КОНЕЦ КАК ПолныйКод 
ИЗ 
	Справочник.Контрагенты КАК Контрагенты          
Как получить все элементы справочника, содержащие в наименовании определенную подстроку, со всей иерархией, в которую они входят?

Запрос = Новый Запрос("ВЫБРАТЬ 
	|	Контрагенты.Ссылка КАК Ссылка 
	|ИЗ 
	|	Справочник.Контрагенты КАК Контрагенты 
	|ГДЕ 
	|	(Контрагенты.Наименование ПОДОБНО &ЧастьНаименования) И (НЕ Контрагенты.ЭтоГруппа) 
	|ИТОГИ ПО 
	|	Ссылка ТОЛЬКО ИЕРАРХИЯ"); 

Запрос.УстановитьПараметр("ЧастьНаименования", "%" + ПолеВводаПодстрока + "%");          
Как найти все элементы справочника, в которых не заполнен строковый реквизит?

ВЫБРАТЬ 
	ФизическиеЛица.Ссылка 
ИЗ 
	Справочник.ФизическиеЛица КАК ФизическиеЛица 
ГДЕ 
	(ФизическиеЛица.ИНН = "") 


ВЫБРАТЬ 
	ФизическиеЛица.Ссылка 
ИЗ 
	Справочник.ФизическиеЛица КАК ФизическиеЛица 
ГДЕ 
	(ФизическиеЛица.СтраховойНомерПФР = "") ИЛИ (ФизическиеЛица.СтраховойНомерПФР = " - -")
Как перенести все элементы справочника “Контрагенты” из одной группы в другую?

Запрос = Новый Запрос; 
Запрос.Текст = "ВЫБРАТЬ 
	|	Контрагенты.Ссылка 
	|ИЗ 
	|	Справочник.Контрагенты КАК Контрагенты 
	|ГДЕ 
	|	Контрагенты.Родитель = &СтарыйРодитель"; 

Запрос.УстановитьПараметр("СтарыйРодитель", СтарыйРодитель); 

Результат = Запрос.Выполнить(); 


Выборка = Результат.Выбрать(); 
Пока Выборка.Следующий() Цикл 
	Контрагент = Выборка.Ссылка.ПолучитьОбъект(); 
	Контрагент.Родитель = НовыйРодитель; 
	Контрагент.Записать(); 
КонецЦикла;          
Как организовать программный выбор элемента справочника?

// Получить форму выбора справочника как подчиненную 
// форме документа 
ФормаВыбора = Справочники.Номенклатура.ПолучитьФормуВыбора( , ЭтаФорма); 

// Открыть полученную форму 
ФормаВыбора.Открыть(); 


Процедура ОбработкаВыбора(ЗначениеВыбора, Источник) 

	ПолученноеЗначение = ЗначениеВыбора; 
	// Дальнейшая обработка значения.  

КонецПроцедуры 


ФормаВыбора = Справочники.Номенклатура.ПолучитьФормуВыбора( , ЭтаФорма); 
Выбрано = ФормаВыбора.ОткрытьМодально(); 


Процедура ПолеВводаНачалоВыбора(Элемент, СтандартнаяОбработка) 

	// Запретить стандартную обработку. 
	СтандартнаяОбработка = Ложь; 

	// Получить форму выбора справочника как подчиненную полю ввода. 
	ФормаВыбора = Справочники.Номенклатура.ПолучитьФормуВыбора( , Элемент); 

	// Открыть полученную форму 
	ФормаВыбора.Открыть(); 

КонецПроцедуры 


Процедура ПолеВводаОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка) 

	// Отключить стандартную обработку (при необходимости). 
	СтандартнаяОбработка = Ложь; 

	ПолученноеЗначение = ВыбранноеЗначение; 
	// Дальнейшая обработка значения.  

КонецПроцедуры          
Как сохранить фотографию сотрудника в справочнике “Сотрудники”?

Процедура ЗагрузитьФотографию(Элемент) 
	Режим = РежимДиалогаВыбораФайла.Открытие; 
	ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим); 
	ДиалогОткрытияФайла.ПолноеИмяФайла = ""; 
	Фильтр = "Текст (*,*)|*.*"; 
	ДиалогОткрытияФайла.Фильтр = Фильтр; 
	ДиалогОткрытияФайла.МножественныйВыбор = Ложь; 
	ДиалогОткрытияФайла.Заголовок = "Выберите картинку"; 
	Если ДиалогОткрытияФайла.Выбрать() Тогда 
		ВыбраннаяКартинка = Новый Картинка(ДиалогОткрытияФайла.ПолноеИмяФайла); 
		ЭлементХранилища = Новый ХранилищеЗначения(ВыбраннаяКартинка); 
		Фотография = ЭлементХранилища; 
	КонецЕсли; 
КонецПроцедуры 

ВыбФайл = Новый ДвоичныеДанные(ДиалогОткрытияФайла.ПолноеИмяФайла); 
элХранилища = Новый ХранилищеЗначения(ВыбФайл); 
Фотография = элХранилища;          

Задайте вопрос программисту 1С

 +5 

   

Распечатать

1С 8.x : Перебрать, выбрать элементы подчиненного справочника

Перебор элементов справочника принадлежащих элементу другого справочника, т.е когда один справочник подчинен другому справочнику.

Код 1C v 8.х

 // Получить выборку по указанному контрагенту. 
Выборка = Справочники.КонтактныеЛица.Выбрать( , Контрагент);
Пока Выборка.Следующий() Цикл
ОчереднойПодчиненый = Выборка.Ссылка;
КонецЦикла;

Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| КонтактныеЛица.Ссылка
|ИЗ
| Справочник.КонтактныеЛица КАК КонтактныеЛица
|ГДЕ
| КонтактныеЛица.Владелец = &Владелец";

Запрос.УстановитьПараметр("Владелец", Контрагент);

Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();

Пока Выборка.Следующий() Цикл
ОчереднойПодчиненый = Выборка.Ссылка;
КонецЦикла;

Код 1C v 7.x

  //При работе с подчиненным справочником (например, при переборе или поиске элементов) 
//требуется указать, для какого конкретно элемента-владельца получать подчиненные элементы.
//Для этого предназначена процедура ИспользоватьВладельца(ОбъектВладелец)
//агрегатного типа данных Справочник.

// Пример 1
спр=СоздатьОбъект("Справочник.Модели");
спрМарка=СоздатьОбъект("Справочник.Марки");
спрМарка.НайтиПоНаименованию("BMW");
спр.ИспользоватьВладельца(спрМарка.ТекущийЭлемент());
спр.ВыбратьЭлементы();
Пока спр.ПолучитьЭлемент()=1 Цикл
Сообщение(спр.ТекущийЭлемент().Наименование);
КонецЦикла;

// Пример 2
Спр=СоздатьОбъект("Справочник.Контрагенты");
Попытка
дог=СоздатьОбъект("Справочник.Договоры");
исключение
Предупреждение("В конфигурации нет справочника ДОГОВОРЫ");
возврат;
конецПопытки;
Спр.ВыбратьЭлементы();//перебираем справочник-владелец
Пока спр.ПолучитьЭлемент()=1 Цикл
Если спр.ЭтоГруппа()=1 Тогда
продолжить;//группы не имеют подчиненных элементов
КонецЕсли;
Сообщить("Контрагент "+спр.Наименование+ " его договоры:");
дог.ИспользоватьВладельца(Спр.ТекущийЭлемент());//будем перебирать только
//подчиненные владельцу
дог.ВыбратьЭлементы(); //перебираем только подчиненные конкретному владельцу
Пока дог.получитьЭлемент()=1 Цикл
сообщить("----------"+дог.наименование);
КонецЦикла;
КонецЦикла;

Добавить комментарий