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

В прикладных задачах иногда возникают ситуации, когда элемент какого-нибудь справочника должен быть жестко подчинен элементу другого справочника. Например, у контрагентов могут существовать договоры, которые заключены с организацией, ведущей учёт. Тогда, экземпляр справочника Договоры контрагента должен быть подчинен справочнику Контрагенты, поскольку, мы не можем создать договор сам по себе, договор должен быть привязан к конкретному контрагенту. Для реализации подобных задач необходим подчиненный справочник 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

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

Я
   Sereja

09.09.10 – 16:43

Подскажите пожалуйста, как через метаданные найти справочники “б,в,г” подчиненные справочнику “а” ?

   Fragster

1 – 09.09.10 – 16:45

Для сч = 1 по Метданные.Справочник() Цикл
 Сообщить(Метаданные.Справочник(Сч).Родитель); // или владелец, не помню
КонецЦикла;

   Sereja

2 – 09.09.10 – 16:45

Спасибо

   Sereja

3 – 09.09.10 – 16:48

Для сч = 1 по Метданные.Справочник() Цикл
 Сообщить(Метаданные.Справочник(Сч).Владелец); // или владелец, не помню
КонецЦикла;

   Mikeware

4 – 09.09.10 – 16:52

почитать СП – настолько страшное колдунство?

   Он

5 – 09.09.10 – 16:53

(4) И что там по этому поводу написано?

   vS

6 – 09.09.10 – 16:58

(5) попробуй 🙂

   zak555

7 – 09.09.10 – 17:03

Владелец
Синтаксис:
Метаданные.Справочник(х).Владелец
Назначение:
 Возвращает полный идентификатор справочника владельца для х-того справочника. В случае неподчиненного справочника возвращается пустая строка.

   Fragster

8 – 09.09.10 – 17:06

(7) у тебя походу als какие-то подключены левые. не помню такого в стандарте. хотя давно не брал я в руки шашек

   vS

9 – 09.09.10 – 17:07

(8) если у тебя нет правильных als, то пользоваться шашкой вообще не следует – пораниться можешь случайно

   zak555

10 – 09.09.10 – 17:07

(8) =)
с чего вдруг левые ?

   Amra

11 – 09.09.10 – 17:08

(8) Есть файл помошника как раз по метаданным, в типовом работа с метаданными никак не расписана)

   Fragster

12 – 09.09.10 – 17:32

просто умиляют заявы типа “смотри в СП”, когда в стандартном СП нету ничего…

   zak555

13 – 09.09.10 – 17:33

   Fragster

14 – 09.09.10 – 17:34

   Он

15 – 09.09.10 – 17:35

(6) Что улыбаешься?

У тебя metadata.als есть, а у автора скорее всего нет.

   Он

16 – 09.09.10 – 17:36

(12) +100. И это НеДятел говорит.)))

   AeDen

17 – 09.09.10 – 17:36

(14) интересные вы вещи в яндексе ищите…:)
(13) Ага, ага, для самых умных.

   zak555

18 – 09.09.10 – 17:39

(14) тогда так :

Положил детскую соску-пустышку рядом с плитой, она расплавилась и пристала к столу. Набрал в Яндексе:  http://yandex.ru/yandsearch?text=ак+отодрать+соску

забыл, что искал…

   zak555

19 – 09.09.10 – 17:42

(0) закинь файл http://zalil.ru/29655688 в папку с платформой и будет тебе метаданные

   Sereja

20 – 09.09.10 – 17:44

(19) Да у меня есть. Просто я думал, можно попроще, думал что есть не только Спр.Владелец, но и Спр.СписокПодчиненных. Ну что-нить в этом роде

Спасибо

   Mikeware

21 – 09.09.10 – 17:45

(20) Ога. И сикретный метод ЗделатьФсё()

   Sereja

22 – 09.09.10 – 17:59

   zak555

23 – 09.09.10 – 19:40

(20) обработку сложно написать ?

   Эльниньо

24 – 09.09.10 – 19:57

(23) 4 строчки

   zak555

25 – 09.09.10 – 19:57

(24) и какие ?

   Эльниньо

26 – 09.09.10 – 20:20

СписокРабов = СоздатьОбъект(“СписокЗначений”);

Для х = 1 по Метаданные.Справочник() Цикл

   Если Метаданные.Справочник(х).Владелец.Выбран() = 1 Тогда

       Если Метаданные.Справочник(х).Владелец.Идентификатор = Спр.Вид() Тогда

           СписокРабов.ДобавитьЗначение(Метаданные.Справочник(х).Идентификатор);

       КонецЕсли;

   КонецЕсли;

КонецЦикла;                

// Больше получилось, однако. Сорри.

   zak555

27 – 09.09.10 – 20:25

(26) если Спр имеет подчиненный справочник, который имеет своего подчиненного и т.д. ?

   Fragster

28 – 09.09.10 – 20:41

(27) освой рекурсию

  

Эльниньо

29 – 09.09.10 – 20:51

(27) Видел конфу с семью уровнями подчинённости. И ведь работало.

  • Как создать элемент (группу) справочника?
  • Как найти элемент справочника?
  • Как удалить элемент справочника?
  • Как перебрать элементы справочника?
  • Как выбрать все элементы из определенной группы?
  • Как перебрать элементы подчиненного справочника с помощью запроса?
  • Как перебрать элементы подчиненного справочника с помощью выборки справочника?
  • Как открыть форму списка (элемента) справочника?
  • Как добавить запись в табличную часть элемента справочника?
  • Как удалить строки из табличной части справочника?
  • Как перебрать строки табличной части справочника?
  • Как создать элемент в нужной группе?
  • Как узнать, есть ли у текущего элемента подчиненные?
  • Как узнать количество подчиненных элементов у выбранного элемента справочника?
  • Как узнать количество подчиненных элементов у выбранного элемента справочника, если подчиненных справочников нексолько?
  • Как получить всех родителей выбранного элемента справочника?
  • Как получить запросом «полный» код элементов справочника, если тип кода — Строка?
  • Как получить все элементы справочника, содержащие в наименовании определенную подстроку, со всей иерархией, в которую они входят?
  • Как найти все элементы справочника, в которых не заполнен строковый реквизит?
  • Как перенести все элементы справочника «Контрагенты» из одной группы в другую?
  • Как организовать программный выбор элемента справочника?
  • Как сохранить фотографию сотрудника в справочнике «Сотрудники»?

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

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

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

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

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

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

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

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

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

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

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

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

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

УдаляемыйЭлемент.УстановитьПометкуУдаления(Истина);

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

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

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

Как выбрать все элементы из определенной группы?

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

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

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

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

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

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

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

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

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

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

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

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

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

Как удалить строки из табличной части справочника?

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

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

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

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

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

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

Как перебрать строки табличной части справочника?

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

Как создать элемент в нужной группе?

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

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

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

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

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

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

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

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

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

Как узнать, есть ли у текущего элемента подчиненные?

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

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

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

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

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

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

Как узнать количество подчиненных элементов у выбранного элемента справочника, если подчиненных справочников несколько?

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

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

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

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

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

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

Для Каждого ТекущийРодитель Из МассивРодителей Цикл
    // Работа с текущим родителем
КонецЦикла;
ВЫБРАТЬ 
    Номенклатура.Ссылка КАК Ссылка 
ИЗ 
    Справочник.Номенклатура КАК Номенклатура 
ГДЕ 
    Номенклатура.Ссылка = &Ссылка 
ИТОГИ ПО 
    Ссылка ТОЛЬКО ИЕРАРХИЯ 
ТекущийЭлементНоменклатуры = ЭлементНоменклатура; 

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

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

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

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

Как получить запросом «полный» код элементов справочника, если тип кода — Строка?

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

Как получить все элементы справочника, содержащие в наименовании определенную подстроку, со всей иерархией, в которую они входят?

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

Как найти все элементы справочника, в которых не заполнен строковый реквизит?

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

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

Как перенести все элементы справочника «Контрагенты» из одной группы в другую?

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

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

Как организовать программный выбор элемента справочника?

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

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

Процедура ОбработкаВыбора(ЗначениеВыбора, Источник) 
    ПолученноеЗначение = ЗначениеВыбора; 
    // Дальнейшая обработка значения...
КонецПроцедуры 

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

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

Процедура ПолеВводаОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка) 
    // Отключить стандартную обработку (при необходимости)
    СтандартнаяОбработка = Ложь; 
    ПолученноеЗначение = ВыбранноеЗначение; 
    // Дальнейшая обработка значения...
КонецПроцедуры

Как сохранить фотографию сотрудника в справочнике «Сотрудники»?

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

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

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

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

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

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

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

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

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

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

Автор mark2011, 30 июн 2011, 12:04

0 Пользователей и 1 гость просматривают эту тему.

Здравствуйте,

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

В общем объясняю суть. Есть справочник “Номенклатура”. Там категории, подкатегории и товары. Вроде пока понятно. Я весь этот справочник экспортнул в XML затем на сайт в MySQL.

Когда тыкаешь на товар один раз, внизу есть кнопка “Справочники”. Туда можно нажать, появляется выпадающий список, один из пунктов – “Цены”. Туда нажимаю, появляется цена конкретного товара.

Отсюда у меня, как у программиста, возникает вопрос. Если цена каждого товара, значит имеется связь, скорее всего по ID товара. Но в форме цен я графу ID товара не наблюдаю. Соответственно вопрос – как до неё добраться?

И ещё один вопрос. В номенклатуре я перебирал список. Здесь табличные значения. Значит (размышляю как программист) они должны обрабатываться как-то по-другому. Вопрос – каким образом?

Если много вопросов, может кто-нибудь меня ткнёт носом в ссылку, где об этом можно почитать? Я сам вообще-то веб-программист, но приходится с 1С вот разбираться…

В общем буду благодарен за любую помощь. Всем заранее спасибо :)


подчиненный справочник однако, программирование изучать по конфигуратору.
такой же интерпритатор (а не компиллятор) как и все вэбки твои.
интерфейсные окна  и взаимосвязи между объектами,и методы исполнения, и панели, и добавочные панели окон, и компоненты очень
похожи  (прямой закос)  – на дельфи  шестерку старенькую – все интуитивно , и понятно,а остальное из книжки почитай пожалуйста,
если программист то догонять быстро будешь, связи между элементами подчиненными – структурно в базе данных первичные знаешь если – мозги под 1с допилишь не напрягаясь, если раша не устраивает, можешь использовать
англ. версию операторов – операторы, построение языка и синтаксис – очень очень очень на делфу похож (я сам немного дельфин – так пописываю для души и по небольшим заказам)



ВыбЦены = СоздатьОбъект(Справочник.Цены) – я правильно понимаю?
По поводу владельца – вот здесь есть это упоминание, но непонятно какой параметр передаётся, что это такое…


Вот накопал на просторах инета процедурку:

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

Для моего случая получается аналогично в принципе?


Твой код в принципе работает, но выдаёт строку “руб.” вместо цены….
Там так-то табличный элемент, т.е. оптовая и розничная цена, вот…. мне просто нужно получить их значения, чтобы впоследствии записать их в XML. Проблема состоит только в получении значений, как бы так…. Но цены там точно есть, я смотрел в сам справочник.

Если делать так:


Сообщить(СпрЦены.Цена)

то выдаёт “Неизвестный объект”.


Делаю вот так:


Пока СпрЦены.ПолучитьЭлемент() = 1 Цикл   

Если ТипЦен.НайтиПоНаименованию("Оптовые")=1 Тогда

Сообщить(СпрЦены.Цена.Получить(РабочаяДата()));

КонецЕсли;


Цена.Значение = СпрЦены.Цена.Получить(РабочаяДата());
                //Сообщить(""+СпрЦены.Цена.Получить(РабочаяДата()) + " " +  СпрЦены.Валюта);
            КонецЦикла;

Этим надеюсь получить толькооптовую цену, но всё равно выводятся две цены. Почему так?


Во первых создаешь в диалоге поле с выбором
ТипЦеныТек в свойствах в “тип”  указываешь “справочник.ТипыЦен”

дальше ставишь в отчете или обработке в процедуре
выполнить:

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

      Пока Цены.ПолучитьЭлемент()  = 1 Цикл  
      Если ТипЦеныТек.Рассчитывается = 1  тогда

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

                                 РеалЦенаОб         = ТипЦеныТек;
            РеалЦена           = ЦенаЦены;
            Прервать;
         КонецЕсли;
      КонецЕсли;
       КонецЦикла;

                   ИначеЕсли ТипЦеныТек.Рассчитывается <> 1 Тогда
         Если Цены.ТипЦен <> ТипЦеныТек Тогда
             Продолжить;
          КонецЕсли;
           РеалЦенаОб = Цены.ТекущийЭлемент();
            РеалЦена = РеалЦенаОб.Цена.Получить(ДатаОтчета);
//            Сообщить(“РеалЦена  !!! ” + РеалЦена);

          КонецЕсли;   
   КонецЦикла;

Так вытягиваешь то что тебе надо по ЛЮБОМУ ТИПУ ЦЕН выйдет значение которое на определенную дату (периодический по владельцу справочника)
Во ВТОРЫХ (ЗАРАНЕЕ ИЗВИНЯЮСЬ ЗА МАТ)
Чо за нагонялово в личку? Наезд? Я так понял?
Часом не ох…л?
Я тебя не блокировал – это ррраз,
Блокирую как могу порнуху -это два.
Вопрос уже подымался – это не ко мне САЙТ НЕ МОЙ – полномочий от движка не давали, удаляют по пользователю, темы удаляют у нас только
глобальные модеры и ВЫШЕ, сами с ума сходим, прав просим,а нам не дают, знач пока не считают нужным,
структуру сайта не мы разрабатывали – допер?
В ТРЕТЬИХ  задачу правильно конечную пиши
В ЧЕТВЕРТЫХ не знаешь человека, не дерзи
В ПЯТЫХ УВАЖАЕМЫЙ – ПРАВИЛА ЧИТАЙ – КОНФИГУРАЦИЮ НАДО УКАЗЫВАТЬ

Извиняюсь перед всем форумом за грубость, а то в личку пишут,и винят не разобравшись.
Постараюсь грубостей больше не допускать.


ТипЦеныТек  – не константа какая нибудь, это для примера, чтобы обозначить в диалоге например нужный тип цены
и на дату отчета (не забудь прикрепить реквизит диалога датаотчета – “тип” – дата) какую ты в диалоге укажешь вывести тебе цены на номенклатуру с таким то типом цены, от такого то числа – актуальности.


ну и еще в перебор по номенклатуре в цикл загони,
СпрНом1 = СоздатьОбъект(“Справочник.Номенклатура”)
СпрНом1.ВыбратьЭлементы();
Пока Спрном1.ПолучитьЭлемент() = 1 Цикл

Потом что я там написал

КонецЦикла;


Теги:

  • Форум 1С

  • Форум 1С – ПРЕДПРИЯТИЕ 7.7

  • Конфигурирование, программирование в 1С Предприятие 7.7

  • Как добраться до подчинённого справочника в 1С?

Похожие темы (5)

Рейтинг@Mail.ru

Rambler's Top100

Поиск

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