В прикладных задачах иногда возникают ситуации, когда элемент какого-нибудь справочника должен быть жестко подчинен элементу другого справочника. Например, у контрагентов могут существовать договоры, которые заключены с организацией, ведущей учёт. Тогда, экземпляр справочника Договоры контрагента должен быть подчинен справочнику Контрагенты, поскольку, мы не можем создать договор сам по себе, договор должен быть привязан к конкретному контрагенту. Для реализации подобных задач необходим подчиненный справочник 1С. В выше приведенном случае, справочник Договоры контрагента станет подчинен справочнику Контрагенты. А справочник Контрагенты будет являться владельцем справочника Договоры контрагента.
Конструируем подчиненный справочник 1С
Для того, чтобы из справочника 1С сделать подчиненный справочник, достаточно в редакторе справочника на закладке Владельцы указать владельца этого справочника.
После этого, справочник с заполненным списком на закладке Владельцы станет подчиненный, а справочник (или справочники) из списка на этой закладке будут владельцами данного справочника.
После таких манипуляций, нельзя создать этот справочник (в рассматриваемом примере – ДоговорыКонтрагента) без указания владельца (Контрагента).
Если мы попробуем создать, элемент справочника ДоговорыКонтрагента, то поле, в котором следует указать контрагента-владельца будет обязательным для заполнения.
Заметьте, это поле называется Владелец и является стандартным реквизитом справочника.
Этот реквизит стал активным, тогда, когда мы указали владельца справочника на закладке Владельцы.
В тоже время, на форме элемента справочника-владельца появилась команда с названием подчиненного справочника.
После выполнении этой команды, откроется форма списка с элементами подчиненного справочника, у которых владелец ссылка на открытый элемент справочника Контрагенты.
Программное создание элемента подчиненного справочника
Разберем программное создание элемента подчиненного справочника. Оно выполняется при помощи метода менеджера справочник СоздатьЭлемент. Только, в случае подчиненных справочников обязательно нужно указать владельца!
Например, создадим обработку, на управляемой форме которой разместим реквизиты Владелец (тип ссылка на справочник Контрагент) и Название договора, а также команду Создать подчиненный справочник.
При выполнении этой команды, будем создавать экземпляр справочника Договоры контрагента, который подчинен указанному владельцу.
&НаСервере Процедура СоздатьПодчиненныйСправочникНаСервере() НовыйДоговор = Справочники.ДоговорыКонтрагента.СоздатьЭлемент(); НовыйДоговор.Наименование = НазваниеДоговора; НовыйДоговор.Владелец = Владелец; НовыйДоговор.Записать(); КонецПроцедуры &НаКлиенте Процедура СоздатьПодчиненныйСправочник(Команда) Если Не ПроверитьЗаполнение() Тогда Возврат; КонецЕсли; СоздатьПодчиненныйСправочникНаСервере(); КонецПроцедуры
В клиентской процедуре используется проверка заполнения. Подробнее о проверке читайте в этой статье:
Проверка заполнения 1С
Выбор элементов подчиненного справочника на управляемой форме
Часто возникают задачи, когда на управляемой форме размещены поля ввода и для справочника владельца, и для подчиненного справочника. И в этом случае нужно реализовать, чтобы в поле ввода подчиненного справочника отображались только те элементы, владелец которых указан в поле ввода справочника владельца.
Например, у документа Продажа товаров существуют реквизиты Контрагент и Договор контрагента соответствующих типов.
Для того, чтобы в реквизите Договор контрагента можно было выбрать только договоры указанного контрагента, следует в палитре свойств реквизита объекта у свойства Связи параметров выбора сделать настройку, в которой указать, что реквизит Контрагент используется при выборе значений в качестве владельца.
После таких настроек, в поле ввода Договоры контрагента можно выбрать только договоры, указанного контрагента.
Если же мы создадим реквизит управляемой формы с ссылкой на подчиненный справочник, то у этого реквизита не будет такого же свойства, как и у реквизита объекта.
Для того, чтобы отбор работал, следует у элемента формы, который связана с реквизитом для подчиненного справочника, заполнить свойство Связи параметров выбора.
Поиск среди подчиненных справочников
Для того, чтобы найти какой-то элемент среди подчиненных справочников, при помощи методов менеджера справочника НайтиПоНаименованию, НайтиПоКоду и НайтиПоРеквизиту следует использовать параметр Владелец этих методов.
Например, в случае поиска по наименованию, код будет следующим.
Договор = Справочники. ДоговорыКонтрагента.НайтиПоНаименованию(НазваниеДоговора,Истина,,Владелец);
Где НазваниеДоговора – это наименование элемента справочника, который ищется.
Владелец – это ссылка на справочник владелец.
Подчиненный справочник 1С или табличная часть?
Часто возникает вопрос: чем отличается подчиненный справочника от табличной части. Основной ответ, тем что у элемента подчиненного справочника имеется ссылка на этот элемент, а у строки табличной части такой ссылки нет.
Подробно, о том, что выбрать при разработке подчиненный справочник или табличную часть читайте по этой ссылке на сайте its.1c.ru:
Подчиненный справочник или табличная часть
Видео по теме:
Читайте также по теме:
Объект в 1С
Ссылка в 1С
Метаданные 1С
Документы в 1С
Более подробно и основательно начальные вопросы программирования в 1С есть вы можете изучить в
Книга «Программировать в 1С за 11 шагов»
Изучайте программирование в 1С в месте с моей книгой «Программировать в 1С за 11 шагов»
Книга написана понятным и простым языком — для новичка.
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Научитесь понимать архитектуру 1С;
- Станете писать код на языке 1С;
- Освоите основные приемы программирования;
- Закрепите полученные знания при помощи задачника
О том как разрабатывать под управляемым приложением 1С, читайте в книге Книга «Основы разработки в 1С: Такси»
Отличное пособие по разработке в управляемом приложении 1С, как для начинающих разработчиков, так и для опытных программистов.
- Очень доступный и понятный язык изложения
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Поймете идеологию управляемого приложения 1С
- Узнаете, как разрабатывать управляемое приложение;
- Научитесь разрабатывать управляемые формы 1С;
- Сможете работать с основными и нужными элементами управляемых форм
- Программирование под управляемым приложением станет понятным
Промо-код на скидку в 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
Как найти значение в подчиненном спровочнике? |
Я |
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
Ну, наверное, нет такового реквизита Номенклатура в справочнике цен…
2 – 15.06.10 – 09:12
СпрА.ИспользоватьВладельца(ТабДок.Товар);
3 – 15.06.10 – 09:12
спрА=СоздатьОбъект(“Справочник.Цены”);
СпрА.ИспользоватьВладельца(Докум.Контрагент);
Цены подчинены контрагентам?
4 – 15.06.10 – 09:12
(3) нет
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
Что хочешь получить то? Чтение кода убило наповал
9 – 15.06.10 – 09:15
(7) мне нужно из справочника цен выташить артикул, по наименованию Товара
10 – 15.06.10 – 09:16
(9) Какие реквизиты есть у справочника Цены? Чему от подчинён (если подчинён)?
11 – 15.06.10 – 09:16
Отлично. Цен на один и тот же товар может быть несколько? Какой из артикулов тогда брать?
12 – 15.06.10 – 09:16
Если ПустоеЗначение(Докум.ТипЦен) =1 Тогда
СпрА=СоздатьОбъект(“Справочник.Артикулы”);
СпрА.ИспользоватьВладельца(Докум.Контрагент);
Иначе
СпрА=СоздатьОбъект(“Справочник.Цены”);
КонецЕсли;
//СпрА=СоздатьОбъект(“Справочник.Артикулы”);
// СпрА.ИспользоватьВладельца(Докум.Контрагент);
СпрЕ=СоздатьОбъект(“Справочник.Единицы”);
Ном = 0;
ТабДок.ВыбратьСтроки();
Пока ТабДок.ПолучитьСтроку() = 1 Цикл
Артикул=””;
Если ПустоеЗначение(Докум.ТипЦен) =1 Тогда
Если СпрА.НайтиПоРеквизиту(“Номенклатура”,ТабДок.Товар,0)=1 Тогда
Артикул=СпрА.Артикул;
КонецЕсли;
Иначе
// вот здесь нужно получить Артикул из спр. Цен
КонецЕсли;
К=0;
СпрЕ.ИспользоватьВладельца(ТабДок.Товар);
Если СпрЕ.ВыбратьЭлементы()=1 Тогда
Если СпрЕ.ПолучитьЭлемент()=1 Тогда
К=СпрЕ.Код;
КонецЕсли;
КонецЕсли;
13 – 15.06.10 – 09:17
(11) в зависимости от того какой Докум.ТипЦен запонен в документе
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
Название переменных и реквизитов настроить и все, можно пользоваться
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 – поиск выполняется по всему справочнику.
Замечание:
Метод можно использовать только для реквизитов с установленным признаком ”Сортировка”.
Метод можно использовать только для объектов, созданных функцией СоздатьОбъект.
20 – 15.06.10 – 09:28
21 – 15.06.10 – 09:36
(20) у меня уже нет такого крутого монитора
22 – 15.06.10 – 09:39
в результате даже на сообщить пустота
Если ПустоеЗначение(Докум.ТипЦен) =1 Тогда
СпрА=СоздатьОбъект(“Справочник.Артикулы”);
СпрА.ИспользоватьВладельца(Докум.Контрагент);
Иначе
СпрА=СоздатьОбъект(“Справочник.Цены”);
СпрА.ИспользоватьВладельца(Докум.Товар);
КонецЕсли;
//СпрА=СоздатьОбъект(“Справочник.Артикулы”);
// СпрА.ИспользоватьВладельца(Докум.Контрагент);
СпрЕ=СоздатьОбъект(“Справочник.Единицы”);
Ном = 0;
ТабДок.ВыбратьСтроки();
Пока ТабДок.ПолучитьСтроку() = 1 Цикл
Артикул=””;
Если ПустоеЗначение(Докум.ТипЦен) =1 Тогда
Если СпрА.НайтиПоРеквизиту(“Номенклатура”,ТабДок.Товар,0)=1 Тогда
Артикул=СпрА.Артикул;
КонецЕсли;
Иначе
Если СпрА.НайтиПоРеквизиту(“ТипЦен”,Докум.ТипЦен,0) = 1 Тогда
Артикул = СпрА.Артикул;
Сообщить(“Товар “+Докум.Товар+” артикул “+СпрА.Артикул);
КонецЕсли;
КонецЕсли;
К=0;
СпрЕ.ИспользоватьВладельца(ТабДок.Товар);
Если СпрЕ.ВыбратьЭлементы()=1 Тогда
Если СпрЕ.ПолучитьЭлемент()=1 Тогда
К=СпрЕ.Код;
КонецЕсли;
КонецЕсли;
23 – 15.06.10 – 09:41
вот так все нормуль
Если ПустоеЗначение(Докум.ТипЦен) =1 Тогда
СпрА=СоздатьОбъект(“Справочник.Артикулы”);
СпрА.ИспользоватьВладельца(Докум.Контрагент);
Иначе
СпрА=СоздатьОбъект(“Справочник.Цены”);
// СпрА.ИспользоватьВладельца(ТабДок.Товар);
КонецЕсли;
//СпрА=СоздатьОбъект(“Справочник.Артикулы”);
// СпрА.ИспользоватьВладельца(Докум.Контрагент);
СпрЕ=СоздатьОбъект(“Справочник.Единицы”);
Ном = 0;
ТабДок.ВыбратьСтроки();
Пока ТабДок.ПолучитьСтроку() = 1 Цикл
Артикул=””;
Если ПустоеЗначение(Докум.ТипЦен) =1 Тогда
Если СпрА.НайтиПоРеквизиту(“Номенклатура”,ТабДок.Товар,0)=1 Тогда
Артикул=СпрА.Артикул;
КонецЕсли;
Иначе
СпрА.ИспользоватьВладельца(ТабДок.Товар);
Если СпрА.НайтиПоРеквизиту(“ТипЦен”,Докум.ТипЦен,0) = 1 Тогда
Артикул = СпрА.Артикул;
Сообщить(“Товар “+ТабДок.Товар+” артикул “+СпрА.Артикул);
КонецЕсли;
КонецЕсли;
К=0;
СпрЕ.ИспользоватьВладельца(ТабДок.Товар);
Если СпрЕ.ВыбратьЭлементы()=1 Тогда
Если СпрЕ.ПолучитьЭлемент()=1 Тогда
К=СпрЕ.Код;
КонецЕсли;
КонецЕсли;
24 – 15.06.10 – 09:41
спасибо за помощь
25 – 15.06.10 – 09:42
Начало ответа тебе в (16)
СпрА = СоздатьОбъект(“Справочник.Цены”);
СпрА.ИспользоватьВладельца(Товар);
Если СпрА.НайтиПоРеквизиту(“ТипЦен”,Док.ТипЦен) = 1 Тогда
Артикул = СпрА.Артикул;
КонецЕсли;
А третьим параметров в НайтиПоРеквизиту(“ТипЦен”,Док.ТипЦен)
ноль поставь
26 – 15.06.10 – 09:43
(24) Пожалуйста. Принимаю мат.помощь на новый моник 🙂
27 – 15.06.10 – 09:44
(24) могу такой же выслать если в этом яркость упала
28 – 15.06.10 – 09:45
(27) не… спасибо, у меня от трубки глаза болят
29 – 15.06.10 – 09:54
артикул в цены запихнуть? – это сильно…
30 – 15.06.10 – 09:58
(29) а куда посоветуй?
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 Цикл
сообщить("----------"+дог.наименование);
КонецЦикла;
КонецЦикла;