Имя: Пароль:
1C
1С v8
Помогите с запросом
0 ksergey
 
14.07.16
12:50
Добрый день.
Просьба помочь с составлением запроса.

Приведу наглядный пример на основе спр.Номенклатура.
В спр-к добавлен реквизит КвоКонтроля, у которого св-во использования "Для групп и элементов".

В запросе необходимо реализовать следующий алгоритм:
если для Товара КвоКонтроля= 0,  то получаем это значение  из ближайшей вышестоящей в иерархии группы, у которой данное значение больше 0


ГРУППА 1    КвоКонтроля= 10
     ГРУППА2    КвоКонтроля= 20
    Товар21        КвоКонтроля= 0
    Товар22        КвоКонтроля= 22
     ГРУППА3    КвоКонтроля= 0      
    Товар 31    КвоКонтроля= 0    
    Товар 32    КвоКонтроля= 33



Запрос должен вернуть следующие данные для товаров:
    Товар21        КвоКонтроля= 20
    Товар22        КвоКонтроля= 22  
    Товар 31    КвоКонтроля= 10
    Товар 32    КвоКонтроля= 33  


Буду признателен за любые подсказки
1 Горогуля
 
14.07.16
12:51
>у которой данное значение больше 0
закрой глаза и представь, что таких нет. что будешь делать?
2 Горогуля
 
14.07.16
12:52
а так - выбор когда и вперёд
3 Fragster
 
гуру
14.07.16
12:52
подсказка - добавить второй реквизит у элементов "авто количество" и при записи группы обновлять данные в подчиненных. также обновлять при изменении группы.
4 RomanYS
 
14.07.16
12:53
выбор
когда Спр.Рекв > 0 тогда Спр.Рекв
когда Спр.Родитель.Рекв > 0 тогда Спр.Родитель.Рекв
когда Спр.Родитель.Родитель.Рекв > 0 тогда Спр.Родитель.Родитель.Рекв
...

для небольшого количества уровней всё равно лучше ничего не придумаешь
5 ksergey
 
14.07.16
13:01
(4) согласен, идея здравая

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

хотелось бы в одном запросе получить данные по списку ном-ры (и они понятно будут разного уровня входимости)
6 Горогуля
 
14.07.16
13:02
(5) а как ты собрался в запросе получить один товар?
7 Dotoshin
 
14.07.16
13:02
(0) При произвольном количестве уровней запросом не получится. Можно написать служебную обработку, которая заполнит твой реквизит, а при добавлении новой группы делать автоматическое заполнение этого реквизита.
8 ksergey
 
14.07.16
13:06
(6)  уточнение к задаче: нужно получить не весь товар(с данным реквизитом), а из конкретного списка

соот-но возможно(теоретически) 2 вар-та реализации:
1) обход по списку и запрос в котором обычное равенство
2) запрос в которм будут присутствовать условия Номенклатура В (&СписокНомеклатуры)
9 ViSo76
 
14.07.16
13:07
(4) Это простой но крайне тормознутый метод. Делать нужно через временные таблицы. И иерархия так же ограничена, если не делать цикл на клиенте.
10 Ildarovich
 
14.07.16
13:09
(7) При произвольном (реальном) количестве уровней запросом получится!
Посмотрите, как сделано здесь: http://catalog.mista.ru/public/158512/ или здесь: http://catalog.mista.ru/public/160707/ .
11 Dotoshin
 
14.07.16
13:12
(10) Интересное решение...
12 Dotoshin
 
14.07.16
13:17
+ (11) Только там все равно цикл присутствует, в котором текст запроса конструируется, так что это не совсем "чистая победа" :)
14 ViSo76
 
14.07.16
14:01
(12) Если количество уровней ограничено к примеру 10 то можно и запросом через временные таблицы нарисовать руками.
15 Ildarovich
 
14.07.16
14:50
(12) Вот пример запроса для справочника Номенклатура. Запрос выбирает ближайшее сверху задание реквизита "ВидНоменклатуры", так как у меня в базе реквизита Кво нет. Расчет, что будет не больше 8-ми уровней.ВЫБРАТЬ
    Номенклатура.Родитель КАК От,
    Номенклатура.Ссылка КАК До
ПОМЕСТИТЬ Дуги1
ИЗ
    Справочник.Номенклатура КАК Номенклатура

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    Номенклатура.Ссылка,
    Номенклатура.Ссылка
ИЗ
    Справочник.Номенклатура КАК Номенклатура
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
    Дуга1.От,
    Дуга2.До
ПОМЕСТИТЬ Дуги2
ИЗ
    Дуги1 КАК Дуга1
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Дуги1 КАК Дуга2
        ПО Дуга1.До = Дуга2.От
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
    Дуга1.От,
    Дуга2.До
ПОМЕСТИТЬ Дуги4
ИЗ
    Дуги2 КАК Дуга1
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Дуги2 КАК Дуга2
        ПО Дуга1.До = Дуга2.От
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
    Дуга1.От,
    Дуга2.До
ПОМЕСТИТЬ Дуги8
ИЗ
    Дуги4 КАК Дуга1
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Дуги4 КАК Дуга2
        ПО Дуга1.До = Дуга2.От
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    КОЛИЧЕСТВО(Дуги.От) - 1 КАК Уровень,
    Дуги.До КАК Ссылка
ПОМЕСТИТЬ Уровни
ИЗ
    Дуги8 КАК Дуги

СГРУППИРОВАТЬ ПО
    Дуги.До
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Дуги.До КАК Ссылка,
    Номенклатура.ВидНоменклатуры,
    Уровни.Уровень
ПОМЕСТИТЬ ВсеОпределения
ИЗ
    Дуги8 КАК Дуги
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Уровни КАК Уровни
        ПО Дуги.От = Уровни.Ссылка
        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номенклатура
        ПО (Номенклатура.Ссылка = Дуги.От)
            И (Номенклатура.ВидНоменклатуры <> ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка))
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВсеОпределения.Ссылка,
    МАКСИМУМ(ВсеОпределения.Уровень) КАК УровеньОпределения
ПОМЕСТИТЬ УровниОпределения
ИЗ
    ВсеОпределения КАК ВсеОпределения

СГРУППИРОВАТЬ ПО
    ВсеОпределения.Ссылка
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВсеОпределения.Ссылка,
    ВсеОпределения.ВидНоменклатуры
ИЗ
    ВсеОпределения КАК ВсеОпределения
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ УровниОпределения КАК УровниОпределения
        ПО ВсеОпределения.Ссылка = УровниОпределения.Ссылка
            И ВсеОпределения.Уровень = УровниОпределения.УровеньОпределения
Разница с подходом "родитель...через много точек" в том, что тут можно заранее сказать "в справочнике не больше 32 уровней", встроить в запрос 5 блоков замыкания и получить все еще компактный результат. Для 32-х уровней родитель...родитель...будет кучерявее.
16 ViSo76
 
14.07.16
18:39
(15) Соединения не оптимально. Можно множеством выборками + неявное соединение через точку + объединением результатов с фильтрацией