- Примеры запросов для работы с иерархическими справочниками
- Получение элементов иерархического справочника, находящихся в подчинении заданной группы
- Проверка наличия подчиненных элементов у элемента справочника
- Получение всех родителей элемента
- Вывод иерархического справочника в отчет
- Получение итогов по иерархии
- Примеры запросов для работы с иерархическими справочниками
- Получение элементов иерархического справочника, находящихся в подчинении заданной группы
- Проверка наличия подчиненных элементов у элемента справочника
- Получение всех родителей элемента
- Вывод иерархического справочника в отчет
- Получение итогов по иерархии
- Запрос к справочнику: элемент и все его группы
- Примеры кода работы со справочниками
- Как перебрать все элементы из определенной группы справочника
Примеры запросов для работы с иерархическими справочниками
Получение элементов иерархического справочника, находящихся в подчинении заданной группы
Для получения подчиненных элементов иерархического справочника в языке запросов предусмотрена конструкция В ИЕРАРХИИ :
В данном примере будут получены все записи справочника Номенклатура , находящиеся в группе &Группа , включая ее саму, ее подчиненные группы и элементы, принадлежащие подчиненным группам.
Если же нас интересуют только элементы и группы, находящиеся непосредственно в заданной группе, то такие элементы мы можем получить, установив условие на поле Родитель :
Такой запрос выберет группы и элементы, находящиеся в подчинении группы со ссылкой &Группа .
Проверка наличия подчиненных элементов у элемента справочника
Для проверки наличия подчиненных записей элемента справочника можно пользоваться запросом, аналогичным представленному:
В данном примере ссылка элемента, для которого необходимо проверить наличие дочерних элементов, записывается в параметр запроса &Родитель . После выполнения такого запроса необходимо проверить результат на пустоту. Если результат не пустой, то подчиненные записи есть. Иначе — нет.
Получение всех родителей элемента
В языке запросов не предусмотрено специальных средств для получения всех родителей элемента. Для выполнения задачи можно воспользоваться иерархическими итогами, однако получение иерархических итогов оптимизировано для построения итогов большого количества записей, и не вполне эффективно для получения родителей одного элемента. Для более эффективного получения всех родительских записей элемента, рекомендуется перебирать в цикле его родителей небольшими порциями.
В данном примере в окно служебных сообщений выводятся все родители для ссылки, записанной в переменную ЭлементНоменклатура . В цикле выбирается по пять родителей ссылки.
Если число уровней в справочнике ограничено и невелико, то возможно получение всех родителей одним запросом без цикла.
Вывод иерархического справочника в отчет
Для вывода иерархического справочника в отчет с сохранением иерархии необходимо пользоваться запросом аналогичным следующему:
Данный запрос выбирает все записи из справочника и производит упорядочивание по иерархии. Результат будет упорядочен по наименованию, с учетом иерархии.
Для того, чтобы группы справочника размещались выше элементов необходимо в данном запросе заменить предложение УПОРЯДОЧИТЬ ПО на следующее:
Результат по-прежнему будет упорядочен по иерархии, однако группы будут располагаться выше элементов.
Возможна также замена предложения УПОРЯДОЧИТЬ ПО на предложение АВТОУПОРЯДОЧИВАНИЕ . В этом случае результат будет упорядочен в соответствии с настройками справочника, т.е. если в справочнике указано, что группы должны располагаться выше элементов, то они будут расположены выше.
Получить иерархическую структуру справочника также возможно и при помощи итогов:
Получение итогов по иерархии
Для получения итогов по иерархии в запросе необходимо в предложении ИТОГИ ПО указать ключевое слово ИЕРАРХИЯ после указания поля, по которому будет рассчитываться итоги. Пример отчета «Обороты номенклатуры» с получением итогов по иерархии:
В результате данного запроса будут рассчитаны итоги не только для каждой номенклатуры, но и для групп, к которым принадлежит та или иная номенклатура.
В случае, когда не нужны итоги по элементам, а нужны итоги только по группам, необходимо использовать в итогах конструкцию ТОЛЬКО ИЕРАРХИЯ :
В результате данного запроса будут итоговые записи только для групп номенклатуры.
Источник
Примеры запросов для работы с иерархическими справочниками
В данном разделе показаны примеры решения типовых задач при работе с иерархическими справочниками.
Получение элементов иерархического справочника, находящихся в подчинении заданной группы
Для получения подчиненных элементов иерархического справочника в языке запросов предусмотрена конструкция В ИЕРАРХИИ. Пример использования В ИЕРАРХИИ:
ВЫБРАТЬ
Номенклатура.Код,
Номенклатура.Наименование КАК Наименование,
Номенклатура.ЗакупочнаяЦена
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
Номенклатура.Ссылка В ИЕРАРХИИ(&Группа)
В данном примере будут получены все записи справочника Номенклатура, находящиеся в группе &Группа, включая ее саму, ее подчиненные группы и элементы, принадлежащие подчиненным группам.
Если же нас интересуют только элементы и группы, находящиеся непосредственно в заданной группе, то такие элементы мы можем получить установив условие на поле Родитель. Пример:
ВЫБРАТЬ
Номенклатура.Код,
Номенклатура.Наименование КАК Наименование,
Номенклатура.ЗакупочнаяЦена
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
Номенклатура.Родитель = &Группа
Такой запрос выберет группы и элементы, находящиеся в подчинении группы со ссылкой &Группа.
Проверка наличия подчиненных элементов у элемента справочника
Для проверки наличия подчиненных записей элемента справочника можно пользоваться запросом, аналогичным представленному:
ВЫБРАТЬ ПЕРВЫЕ 1
Номенклатура.Ссылка
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
Номенклатура.Родитель = &Родитель
В данном примере ссылка элемента, для которого необходимо проверить наличие дочерних элементов, записывается в параметр запроса «Родитель». После выполнения такого запроса необходимо проверить результат на пустоту. Если результат не пустой, то подчиненные записи есть. Иначе — нет. Пример:
Если Запрос.Выполнить().Пустой() Тогда
Сообщить(«Зписей нет»);
Иначе
Сообщить(«Записи есть»);
КонецЕсли;
Получение всех родителей элемента
В языке запросов не предусмотрено специальных средств для получения всех родителей элемента. Для выполнения задачи можно воспользоваться иерархическими итогами, однако получение иерархических итогов оптимизировано для построения итогов большого количества записей, и не вполне эффективно для получения родителей одного элемента. Для более эффективного получения всех родительских записей элемента, рекомендуется перебирать в цикле его родителей небольшими порциями. Пример:
Запрос = Новый Запрос(«ВЫБРАТЬ
| Номенклатура.Родитель,
| Номенклатура.Родитель.Родитель,
| Номенклатура.Родитель.Родитель.Родитель,
| Номенклатура.Родитель.Родитель.Родитель.Родитель,
| Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|
|ГДЕ
| Номенклатура.Ссылка = &ТекущийЭлементНоменклатуры»;
Пока Истина Цикл
Запрос.УстановитьПараметр(«ТекущийЭлементНоменклатуры», ТекущийЭлементНоменклатуры);
Результат = Запрос.Выполнить();
Если Результат.Пустой() Тогда
Прервать;
КонецЕсли;
Выборка = Результат.Выбрать();
Выборка.Следующий();
Для НомерКолонки = 0 По Результат.Колонки.Количество() — 1 Цикл
ТекущийЭлементНоменклатуры = Выборка[НомерКолонки];
Если ТекущийЭлементНоменклатуры = Справочники.Номенклатура.ПустаяСсылка() Тогда
Прервать;
Иначе
Сообщить(ТекущийЭлементНоменклатуры);
КонецЕсли;
КонецЦикла;
Если ТекущийЭлементНоменклатуры = Справочники.Номенклатура.ПустаяСсылка() Тогда
Прервать;
КонецЕсли;
КонецЦикла;
В данном примере в окно служебных сообщений выводятся все родители для ссылки, записанной в переменную ЭлементНоменклатура. В цикле выбирается по 5 родителей ссылки.
Если число уровней в справочнике ограничено и невелико, то возможно получение всех родителей одним запросом без цикла.
Вывод иерархического справочника в отчет
Для вывода иерархического справочника в отчет с сохранением иерархии необходимо пользоваться запросом аналогичным следующему:
ВЫБРАТЬ
Номенклатура.Код,
Номенклатура.Наименование КАК Наименование,
Номенклатура.ЗакупочнаяЦена
ИЗ
Справочник.Номенклатура КАК Номенклатура
УПОРЯДОЧИТЬ ПО
Наименование ИЕРАРХИЯ
Данный запрос выбирает все записи из справочника и производит упорядочивание по иерархии. Результат будет упорядочен по наименованию, с учетом иерархии.
Для того чтобы группы справочника размещались выше элементов необходимо в данном запросе заменить предложение УПОРЯДОЧИТЬ ПО на следующее:
УПОРЯДОЧИТЬ ПО
Номенклатура.ЭтоГруппа ИЕРАРХИЯ,
Наименование
Результат по-прежнему будет упорядочен по иерархии, однако группы будут располагаться выше элементов.
Возможна также замена предложения УПОРЯДОЧИТЬ ПО на предложение АВТОУПОРЯДОЧИВАНИЕ. В этом случае результат будет упорядочен в соответствии с настройками справочника, т.е. если в справочнике указано, что группы должны располагаться выше элементов, то они будут расположены выше.
Получить иерархическую структуру справочника также возможно и при помощи итогов.
ВЫБРАТЬ
Номенклатура.Код,
Номенклатура.Наименование КАК Наименование,
Номенклатура.ЗакупочнаяЦена
ИЗ Справочник.Номенклатура КАК Номенклатура
ГДЕ
(Номенклатура.ЭтоГруппа = ЛОЖЬ)
УПОРЯДОЧИТЬ ПО Наименование
ИТОГИ ПО Номенклатура.Ссылка ТОЛЬКО ИЕРАРХИЯ
Получение итогов по иерархии
Для получения итогов по иерархии в запросе необходимо в предложении ИТОГИ ПО указать ключевое слово ИЕРАРХИЯ после указания поля, по которому будет рассчитываться итоги. Пример отчета «Обороты номенклатуры» с получением итогов по иерархии:
ВЫБРАТЬ
УчетНоменклатурыОбороты.Номенклатура КАК Номенклатура,
УчетНоменклатурыОбороты.Номенклатура.Представление,
УчетНоменклатурыОбороты.КоличествоОборот КАК КоличествоОборот
ИЗ
РегистрНакопления.УчетНоменклатуры.Обороты КАК УчетНоменклатурыОбороты
ИТОГИ СУММА(КоличествоОборот) ПО
Номенклатура ИЕРАРХИЯ
В результате данного запроса будут рассчитаны итоги не только для каждой номенклатуры, но и для групп, к которым принадлежит та или иная номенклатура.
В случае, когда не нужны итоги по элементам, а нужны итоги только по группам, нам необходимо использовать в итогах конструкцию ТОЛЬКО ИЕРАРХИЯ. Пример:
ВЫБРАТЬ
УчетНоменклатурыОбороты.Номенклатура КАК Номенклатура,
УчетНоменклатурыОбороты.Номенклатура.Представление,
УчетНоменклатурыОбороты.КоличествоОборот КАК КоличествоОборот
ИЗ
РегистрНакопления.УчетНоменклатуры.Обороты КАК УчетНоменклатурыОбороты
ИТОГИ СУММА(КоличествоОборот) ПО
Номенклатура ТОЛЬКО ИЕРАРХИЯ
В результате данного запроса будут итоговые записи только для групп номенклатуры.
Источник
Запрос к справочнику: элемент и все его группы
Телезритель Asmody из Москвы задает вопрос знатокам:
Уважаемые знатоки! Допустим, у меня есть иерархический справочник (например, Номенклатура), с произвольным уровнем иерархии. Как мне запросом получить элементы справочника и все содержащие его группы?
Показываю на примере:
>>Как мне запросом получить элементы справочника и все содержащие его группы?
. содержащие его — в смысле?
Иерархию можно записать в виде таблицы
ВЫБРАТЬ
Ссылка(представление),
Родитель(представление)
ЭтоГруппа
ИЗ
Справочник.Номенклатура
Получение всех родителей элемента
В языке запросов не предусмотрено специальных средств для получения всех родителей элемента. Для выполнения задачи можно воспользоваться иерархическими итогами, однако получение иерархических итогов оптимизировано для построения итогов большого количества записей, и не вполне эффективно для получения родителей одного элемента. Для более эффективного получения всех родительских записей элемента, рекомендуется перебирать в цикле его родителей небольшими порциями. Пример:
В данном примере в окно служебных сообщений выводятся все родители для ссылки, записанной в переменную ЭлементНоменклатура. В цикле выбирается по 5 родителей ссылки.
Если число уровней в справочнике ограничено и невелико, то возможно получение всех родителей одним запросом без цикла.
а по сути,выбираем в таблицу все элементы и группы и их непосредственные родители.
делаем индекс по элементам.
добавляем колонку номер строки с группой.
далее,из выборки необходимых элементов берем элемент и ищем его в созданной таблице,если номер строки группы задан,то переходим на нее и пишем группу,если нет,то или группа пустая и мы все нашли,или ищем в таблице группу и проставляем ей номер,чтобы в след.раз не искать,и так далее .
Источник
Примеры кода работы со справочниками
Как создать элемент (группу) справочника?
Как найти элемент справочника?
Как удалить элемент справочника?
Как перебрать элементы справочника?
Как выбрать все элементы из определенной группы?
Как перебрать элементы подчиненного справочника с помощью запроса?
Как перебрать элементы подчиненного справочника с помощью выборки справочника?
Как открыть форму списка (элемента) справочника?
Как добавить запись в табличную часть элемента справочника?
Как удалить строки из табличной части справочника?
Как перебрать строки табличной части справочника?
Как создать элемент в нужной группе?
Как узнать, есть ли у текущего элемента подчиненные?
Как узнать количество подчиненных элементов у выбранного элемента справочника?
Как узнать количество подчиненных элементов у выбранного элемента справочника, если подчиненных справочников несколько?
Как получить всех родителей выбранного элемента справочника?
Как получить запросом «полный» код элементов справочника, если тип кода — Строка?
Как получить все элементы справочника, содержащие в наименовании определенную подстроку, со всей иерархией, в которую они входят?
Как найти все элементы справочника, в которых не заполнен строковый реквизит?
Как перенести все элементы справочника «Контрагенты» из одной группы в другую?
Как организовать программный выбор элемента справочника?
Как сохранить фотографию сотрудника в справочнике «Сотрудники»?
Источник
Как перебрать все элементы из определенной группы справочника
Есть несколько вариантов того, как можно получить элементы из определенной группы справочника. Предположим, что у нас на форме есть поле выбора ПолеВводаРодитель в котором указываем родителя (группу).
Вариант 1
[php]
Выборка = Справочники.Номенклатура.Выбрать(ПолеВводаРодитель);
Пока Выборка.Следующий() Цикл
Наименование = Выборка.Наименование;
КонецЦикла;
[/php]
Вариант 2
[php]
Запрос = Новый Запрос(»
|ВЫБРАТЬ
| Ссылка,
| Наименование
|ИЗ
| Справочник.Номенклатура
|ГДЕ
| Родитель = &Родитель
|АВТОУПОРЯДОЧИВАНИЕ»);
Запрос.УстановитьПараметр(«Родитель», ПолеВводаРодитель);
Результат = Запрос.Выполнить().Выбрать();
Пока Результат.Следующий() Цикл
Наименование = Результат.Наименование;
КонецЦикла;
[/php]
Вариант 3 (с иерархией)
[php]
Выборка=Справочники.Номенклатура.ВыбратьИерархически(ПолеВводаРодитель);
Пока Выборка.Следующий() Цикл
Наименование = Выборка.Наименование;
КонецЦикла;
[/php]
Вариант 4 (с иерархией)
[php]
Запрос = Новый Запрос(»
|ВЫБРАТЬ
| Ссылка,
| Наименование
|ИЗ
| Справочник.Номенклатура
|ГДЕ
| Родитель В ИЕРАРХИИ(&Родитель)
|АВТОУПОРЯДОЧИВАНИЕ»);
Запрос.УстановитьПараметр(«Родитель», ПолеВводаРодитель);
Результат = Запрос.Выполнить().Выбрать();
Пока Результат.Следующий() Цикл
Наименование = Результат.Наименование;
КонецЦикла;
[/php]
Источник