1с это группа в запросе
В 1С иерархия элементов и групп допускает только одного владельца
На самом деле, вопрос "со звездочкой".
Мне нужны не все группы, а подходящие по определенному условию.
Но это можно решить отбором на результат запроса из (0)
Можно наклепать там двадцать левых соединений, но потом хоп и попадутся элементы на 22 уровне и пипец
(5) Да, этот способ я знаю. Там текст запроса программно формируется. Меня это не совсем устраивает.
(9) Да. Если бы можно было использовать В ИЕРАРХИИ() в соединении таблиц.
(6) Программное формирование там только для оптимизации результирующего запроса под конкретный максимальный уровень вложенности. Фишка этого метода - в возможности покрытия очень большого уровня вложенности за небольшое количество шагов (нелинейная зависимость). То есть ты можешь просто написать готовый запрос с небольшим количеством этапов (не программно), который будет покрывать любую разумную глубину вложенности (сотню, скажем).
>>Как мне запросом получить элементы справочника и все содержащие его группы?
. содержащие его - в смысле?
Иерархию можно записать в виде таблицы
ВЫБРАТЬ
Ссылка(представление),
Родитель(представление)
ЭтоГруппа
ИЗ
Справочник.Номенклатура
Мне нужно получить данные из регистра Продажи по номенклатуре. И эти данные должны быть свернуты по группам. Но не по всем группам в иерархии, а только по тем, которые имеют некоторый признак (для простоты считаем, что это булевый реквизит у группы НужнаяГруппа). "Нужные группы" не обязательно верхние. Кроме того, "нужные группы" могут быть вложены, но не подряд, а, например, через уровень.
Соответственно, образуется такая "псевдоиерархия".
Можно, конечно, запихнуть всё это в СКД, и постобработкой выводить только нужные строки, но это как-то неаккуратненько.
(16) Напрашивается настройка формирования СКД по собственной иерархии, которую получать отдельным запросом. Но вычисление этой иерархии в запросе с "пропуском" уровней - это ИМХО будет уже удаление гландов ректально. Я бы попробовал подсунуть требуемую иерархию групп в СКД в качестве объекта ТЗ.
Хотя, если подумать, то может и в запросе получится не так сложно, как мне сначала показалось.
Получение всех родителей элемента
В языке запросов не предусмотрено специальных средств для получения всех родителей элемента. Для выполнения задачи можно воспользоваться иерархическими итогами, однако получение иерархических итогов оптимизировано для построения итогов большого количества записей, и не вполне эффективно для получения родителей одного элемента. Для более эффективного получения всех родительских записей элемента, рекомендуется перебирать в цикле его родителей небольшими порциями. Пример:
Если число уровней в справочнике ограничено и невелико, то возможно получение всех родителей одним запросом без цикла.
Есть такие маньяки, располагающие номенклатуру в сотом уровне вложенности?
А если просто запрос элементов,а в итогах иерархия-он же сам ее построит,останется только выбрать и положить в таблицу.
а по сути,выбираем в таблицу все элементы и группы и их непосредственные родители.
делаем индекс по элементам.
добавляем колонку номер строки с группой.
далее,из выборки необходимых элементов берем элемент и ищем его в созданной таблице,если номер строки группы задан,то переходим на нее и пишем группу,если нет,то или группа пустая и мы все нашли,или ищем в таблице группу и проставляем ей номер,чтобы в след.раз не искать,и так далее .
Для получения подчиненных элементов иерархического справочника в языке запросов предусмотрена конструкция В ИЕРАРХИИ :
В данном примере будут получены все записи справочника Номенклатура , находящиеся в группе &Группа , включая ее саму, ее подчиненные группы и элементы, принадлежащие подчиненным группам.
Если же нас интересуют только элементы и группы, находящиеся непосредственно в заданной группе, то такие элементы мы можем получить, установив условие на поле Родитель :
Такой запрос выберет группы и элементы, находящиеся в подчинении группы со ссылкой &Группа .
Проверка наличия подчиненных элементов у элемента справочника
Для проверки наличия подчиненных записей элемента справочника можно пользоваться запросом, аналогичным представленному:
В данном примере ссылка элемента, для которого необходимо проверить наличие дочерних элементов, записывается в параметр запроса &Родитель . После выполнения такого запроса необходимо проверить результат на пустоту. Если результат не пустой, то подчиненные записи есть. Иначе — нет.
Получение всех родителей элемента
В языке запросов не предусмотрено специальных средств для получения всех родителей элемента. Для выполнения задачи можно воспользоваться иерархическими итогами, однако получение иерархических итогов оптимизировано для построения итогов большого количества записей, и не вполне эффективно для получения родителей одного элемента. Для более эффективного получения всех родительских записей элемента, рекомендуется перебирать в цикле его родителей небольшими порциями.
Если число уровней в справочнике ограничено и невелико, то возможно получение всех родителей одним запросом без цикла.
Вывод иерархического справочника в отчет
Для вывода иерархического справочника в отчет с сохранением иерархии необходимо пользоваться запросом аналогичным следующему:
Данный запрос выбирает все записи из справочника и производит упорядочивание по иерархии. Результат будет упорядочен по наименованию, с учетом иерархии.
Для того, чтобы группы справочника размещались выше элементов необходимо в данном запросе заменить предложение УПОРЯДОЧИТЬ ПО на следующее:
Результат по-прежнему будет упорядочен по иерархии, однако группы будут располагаться выше элементов.
Возможна также замена предложения УПОРЯДОЧИТЬ ПО на предложение АВТОУПОРЯДОЧИВАНИЕ . В этом случае результат будет упорядочен в соответствии с настройками справочника, т.е. если в справочнике указано, что группы должны располагаться выше элементов, то они будут расположены выше.
Получить иерархическую структуру справочника также возможно и при помощи итогов:
Получение итогов по иерархии
Для получения итогов по иерархии в запросе необходимо в предложении ИТОГИ ПО указать ключевое слово ИЕРАРХИЯ после указания поля, по которому будет рассчитываться итоги. Пример отчета «Обороты номенклатуры» с получением итогов по иерархии:
В результате данного запроса будут рассчитаны итоги не только для каждой номенклатуры, но и для групп, к которым принадлежит та или иная номенклатура.
В случае, когда не нужны итоги по элементам, а нужны итоги только по группам, необходимо использовать в итогах конструкцию ТОЛЬКО ИЕРАРХИЯ :
В результате данного запроса будут итоговые записи только для групп номенклатуры.
Войдите как ученик, чтобы получить доступ к материалам школы
Язык запросов 1С 8.3 для начинающих программистов: группировка
Автор уроков и преподаватель школы: Владимир Милькин
Группировка в запросах
Давайте запросим из таблицы Справочник.Еда следующие реквизиты: Наименование, Цвет и Калорийность:
Теперь предположим, что нам необходимо вычислить суммарную калорийность продуктов для каждого цвета.
Алгоритм для жёлтого цвета будет такой:
- Находим все строчки у которых в поле Цвет стоит Жёлтый.
- Это будут строчки №1, 6, 8 и 9.
- Суммируем поле Калорийность для каждой из этих строк: 89 + 31 + 340 + 536
- Получаем, что для жёлтого цвета суммарная калорийность равна 996.
И так для каждого цвета.
Описанный выше процесс называется группировкой . Таким образом, группировка - это "схлопывание" (свёртка) строчек таблицы по определенному признаку.
При группировке все поля делятся на две группы:
- Группировочные - это как раз те поля, по которым идёт свёртка. В нашем случае таким полем является Цвет.
- Группируемые - это те поля, которые сворачиваются (схлопываются, объединяются). В нашем случае таким полем является Калорийность.
Группируемые поля не могут быть сами по себе. К ним обязательно применяется одна из агрегатных функций: СУММА, СРЕДНЕЕ, МИНИМУМ, МАКСИМУМ, КОЛИЧЕСТВО, КОЛИЧЕСТВО РАЗЛИЧНЫЕ:
Агрегатная функция СУММА
Это как раз случай, который мы разбирали. Вы читаете ознакомительную версию урока, полноценные уроки находятся здесь. Все строки группируются по группировочным полям (Цвет), а группируемые поля (Калорийность) суммируются:
Агрегатная функция СРЕДНЕЕ
В этом случае все строки группируются по группировочным полям (Цвет), а среди группируемых полей (Калорийность) находится среднее значение:
Агрегатная функция МИНИМУМ
В этом случае все строки группируются по группировочным полям (Цвет), а среди группируемых полей (Калорийность) находится минимальное значение:
Агрегатная функция МАКСИМУМ
В этом случае все строки группируются по группировочным полям (Цвет), а среди группируемых полей (Калорийность) находится максимальное значение:
Агрегатная функция КОЛИЧЕСТВО
В этом случае все строки группируются по группировочным полям (Цвет), а среди группируемых полей (Калорийность) находится их количество :
Агрегатная функция КОЛИЧЕСТВО РАЗЛИЧНЫЕ
В этом случае все строки группируются по группировочным полям (Цвет), а среди группируемых полей (Калорийность) находится количество элементов с различными значениями:
Функция КОЛИЧЕСТВО РАЗЛИЧНЫЕ требует пояснения, потому что на выбранном примере её результат совпадает с функцией КОЛИЧЕСТВО. Вы читаете ознакомительную версию урока, полноценные уроки находятся здесь. Вот более показательный пример, который всё объясняет:
Группировка без группируемых полей и агрегатных функций
Использование агрегатных функций в запросе не требуется, если результатом запроса будут только группировочные поля:
К примеру, сделаем выборку всех вкусов, которые встречаются среди еды:
Как видите вкусы повторяются - давайте их сгруппируем:
Таким образом, мы сделали группировку только по группировочным полям (Вкус). Группируемые поля, а следовательно и агрегатные функции нам не понадобились.
Группировка без группировочных полей
Соответственно использование группировочных полей также не требуется, если результатом запроса будут только группируемые поля:
К примеру, получим результаты агрегатных функций применительно к полю Калорийность без группировочных полей (то есть по всей таблице):
Группировка по нескольким полям
Группировочных (как впрочем и группируемых) полей может быть сколь угодно много. В запросе они перечисляются через запятую.
Войдите как ученик, чтобы получить доступ к материалам школы
Язык запросов 1С 8.3 для начинающих программистов: операторы МЕЖДУ и В
Автор уроков и преподаватель школы: Владимир Милькин
Логический оператор МЕЖДУ
Оператор МЕЖДУ позволяет проверить, входит ли значение выражения, указанного слева от него, в диапазон , указанный справа ( вместе с границами диапазона , то есть включительно).
Таким образом, вместо
можно написать более лаконичное
А результат будет один и тот же:
Если же необходимо наоборот выбрать всю еду, калорийность которой не входит в диапазон [200;300], то подойдёт следующая форма отрицания (появилась частица НЕ):
Оператор МЕЖДУ можно применять не только к числовым диапазонам. С датами он также хорошо работает:
Логический оператор В
Проверка совпадения с одним из перечисленных
Оператор В позволяет проверить, совпадает ли значение выражения, указанного слева от него, с одним из значений , описанных справа .
Таким образом, вместо
можно написать более лаконичное
А результат будет один и тот же:
Если же необходимо наоборот выбрать всю еду, цвет которой не совпадает ни с одним значением из списка, то подойдёт следующая форма отрицания (появилась частица НЕ):
Проверка совпадения значения с одним из результата запроса
Пусть нам требуется выбрать из базы только те цвета, которые присутствуют в описании еды. Таким образом, в отобранном списке не должен присутствовать, например, чёрный цвет, так как еды чёрного цвета в нашей базе нет. Вы читаете ознакомительную версию урока, полноценные уроки находятся здесь.
Один из вариантов как это можно сделать - использовать логический оператор В, справа от которого будет находиться подзапрос, выбирающий названия цветов из всех записей справочника Еда:
В качестве отступления упомяну, что из внутреннего запроса есть возможность обращаться к полям внешнего запроса.
Опять же, для этой формы оператора В, также доступно использование частицы НЕ перед ним.
Проверка принадлежности по иерархии для справочников
Для справочников проверка может осуществляться и на принадлежность по иерархии.
Для начала давайте рассмотрим пример иерархического справочника. Откройте справочник "Города" в нашей базе:
Обратите внимание, что его элементы отличаются от других справочников (Еда, Цвета, Вкусы) наличием жёлтых папок. Это группы справочника .
Группы отличаются от обычных элементов тем, что могут включать в себя другие группы и элементы. Подобно тому как папки включают в себя другие папки и файлы.
Чтобы просмотреть содержимое группы, сделайте на ней двойной щелчок мышкой:
Чтобы выйти на уровень выше, снова сделайте двойной щелчок по группе:
Таким образом иерархический справочник может содержать как обычные элементы (например, Рио-де-Жанейро, Салвадор), так и группы (например, Бразилия, Индия). Вы читаете ознакомительную версию урока, полноценные уроки находятся здесь.
У каждого элемента (будь то группа или обычный элемент) может быть родитель. Например, родителем элемента Рио-де-Жанейро является группа Бразилия:
И это верно, потому что Рио-де-Жанейро входит в состав группы Бразилия в иерархии справочника:
Теперь давайте напишем такой запрос, который будет запрашивать выбранную группу-страну и все элементы-города, входящие в неё.
Обратите внимание на то, что в тексте запроса перед именем ГруппаСтрана стоит амперсанд (&). Имена с амперсандом автоматически распознаются системой как параметры , значение которых должно быть задано перед выполнением запроса.
После того, как мы вставим этот запрос в консоль и нажмем кнопку "Выполнить" для обновления, у нас появится возможность задать этот параметр:
Выберите в качестве его значения группу "Россия" (кнопка Выбрать):
Если теперь мы нажмём кнопку "Выполнить", то результат запроса будет следующим:
В результат запроса попала сама группа (Россия) и все элементы, которые входят в её состав (Пермь, Красноярск и Воронеж).
Если вместо России, выбрать "Бразилия", то результат будет таким:
Таким образом результатом оператора В ИЕРАРХИИ будет ИСТИНА, если значение выражения слева является ссылкой на элемент справочника и входит во множество значений справа (Бразилия) или иерархически принадлежит какой-нибудь группе, содержащейся в этом множестве (Сан-Паулу, Рио-де-Жанейро, Салвадор).
В качестве множества значений, на совпадение с которыми выполняется проверка, может фигурировать и результат запроса. В этом случае справа от оператора В необходимо указать описание запроса:
Для оператора В ИЕРАРХИИ также доступно использование частицы НЕ перед ним.
Читайте также: