Версия для печати темы (https://pro1c.org.ua/index.php?s=960c51f57920cbf567ac454aba8ae282&showtopic=32084)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование в 1С Предприятие 8.3 _ Массив как параметр для запроса

Автор: sanytch 30.09.16, 11:25

Здравствуйте, Такая вот проблема:
Запрос формирует количественный оборот с отбором по Номенклатурным Группам. Список групп для передачи в запрос как параметр, формирую в массив, но...
Приведу фрагменты кода где формирую массив

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

и использую его как параметр
    |ВложенныйЗапрос.НоменклатурнаяГруппа В(&СпНомГрупп)

и получаю в результате

Ситуация осложнена тем что наименования номенклатурных групп имеют вид - ХХ-Наименование, где ХХ - число. Отчет формируется в 2-х вариантах т.к. номенклатурные группы разделены как раз по ХХ на 2 вида, но это уже другая задача. Я же не могу получить результат даже без деления номенклатурных групп.

этот же запрос отлично отрабатывает в СКД, но при переносе в модуль не работает...

Посему прошу помощи и буду благодарен за любые наставления.

Автор: podcast 30.09.16, 11:49

sanytch @ Сегодня, 12:25 * ,
А где вы задаете значение параметра? Ошибка что не задан параметр.

Запрос.УстановитьПараметр("НазваниеПараметра", СпНомГрупп);


Автор: sanytch 30.09.16, 12:34

podcast @ Сегодня, 12:49 *
Извиняюсь, забыл про эту строчку - она есть конечно же

    Запрос.УстановитьПараметр("НоменклатурнаяГруппа", СпНомГрупп);

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

Не обращайте внимание на названия Групп, баловался smile.gif
Даже уже из значений массива формировал строковую переменную, в которой значения разделял и , и ; но все равно ничего

Автор: Acid 30.09.16, 12:55

sanytch @ Сегодня, 13:34 * ,
Покажите текст запроса полностью.

Автор: logist 30.09.16, 13:20

Цитата(sanytch @ 30.09.16, 12:25) *
Приведу фрагменты кода где формирую массив

Научиться программировать на 8-ке возможно, разучиться программировать на 7-ке никогда...


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


    Если Результат = 0 Тогда
        Возврат
    КонецЕсли;

Странно, а тут у вас ошибку не выдает? Ведь в вашем код Результат будет не число и не булевою

Автор: sanytch 30.09.16, 13:35

logist @ Сегодня, 14:20 * ,
Да нет, все нормально. upset.gif

Acid @ Сегодня, 13:55 * ,
Вот так в модуле

    Запрос.Текст = 
    "
    |ВЫБРАТЬ
    |ХозрасчетныйОстаткиИОбороты.Субконто1 КАК Номенклатура,
    |ВложенныйЗапрос.Коэффициент КАК "+?(ТипА = 1,"Литраж","ШТвПач")+",
    |ХозрасчетныйОстаткиИОбороты.КоличествоОборотДт КАК ОборотДТ,
    |ХозрасчетныйОстаткиИОбороты.КоличествоОборотДт * ВложенныйЗапрос.Коэффициент / "+?(ТипА=1,"10000","1000000")+" КАК ВсегоПриобретено"+?(ТипА=1,"ТысДал","МлнШт")+",
    |ХозрасчетныйОстаткиИОбороты.КоличествоОборотКт КАК ОборотКТ,
    |ХозрасчетныйОстаткиИОбороты.КоличествоОборотКт * ВложенныйЗапрос.Коэффициент / "+?(ТипА=1,"10000","1000000")+" КАК ВсегоРеализовано"+?(ТипА=1,"ТысДал","МлнШт")+",
    |ХозрасчетныйОстаткиИОбороты.КоличествоНачальныйОстаток КАК НачОстаток,
    |ХозрасчетныйОстаткиИОбороты.КоличествоКонечныйОстаток КАК КонОстаток,
    |ХозрасчетныйОстаткиИОбороты.КоличествоНачальныйОстаток * ВложенныйЗапрос.Коэффициент / "+?(ТипА=1,"10000","1000000")+" КАК НачОстаток"+?(ТипА=1,"ТысДал","МлнШт")+",
    |ХозрасчетныйОстаткиИОбороты.КоличествоКонечныйОстаток * ВложенныйЗапрос.Коэффициент / "+?(ТипА=1,"10000","1000000")+" КАК КонОстаток"+?(ТипА=1,"ТысДал","МлнШт")+",
    |ХозрасчетныйОстаткиИОбороты.ПериодСекунда,
    |ВложенныйЗапрос.НоменклатурнаяГруппа КАК НоменклатурнаяГруппа
    |ИЗ
    |РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(&НачПериода, &КонПериода, Авто, ДвиженияИГраницыПериода, , , ) КАК ХозрасчетныйОстаткиИОбороты
    |    ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
    |        НоменклатураЕдиницыИзмерения.Коэффициент КАК Коэффициент,
    |        НоменклатураЕдиницыИзмерения.Ссылка КАК Номен,
    |        НоменклатураЕдиницыИзмерения.Ссылка.НаименованиеПолное КАК НаименованиеПолное,
    |        НоменклатураЕдиницыИзмерения.Ссылка.Наименование КАК Наименование,
    |        Номенклатура.НоменклатурнаяГруппа КАК НоменклатурнаяГруппа
    |    ИЗ
    |        Справочник.Номенклатура.ЕдиницыИзмерения КАК НоменклатураЕдиницыИзмерения
    |            ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номенклатура
    |            ПО НоменклатураЕдиницыИзмерения.Ссылка = Номенклатура.Ссылка
    |    ГДЕ
    |        НоменклатураЕдиницыИзмерения.ЕдиницаИзмерения = &ЕдИзм) КАК ВложенныйЗапрос
    |    ПО ХозрасчетныйОстаткиИОбороты.Субконто1 = ВложенныйЗапрос.Номен
    |ГДЕ
    |ВложенныйЗапрос.НоменклатурнаяГруппа В(&СпНомГрупп)
    |
    |     СГРУППИРОВАТЬ ПО
    |     ХозрасчетныйОстаткиИОбороты.ПериодСекунда,
    |     ХозрасчетныйОстаткиИОбороты.Субконто1,
    |     ВложенныйЗапрос.Коэффициент,
    |     ХозрасчетныйОстаткиИОбороты.КоличествоОборотДт,
    |     ХозрасчетныйОстаткиИОбороты.КоличествоОборотКт,
    |     ХозрасчетныйОстаткиИОбороты.КоличествоНачальныйОстаток,
    |     ХозрасчетныйОстаткиИОбороты.КоличествоКонечныйОстаток,
    |ВложенныйЗапрос.НоменклатурнаяГруппа
    |
    |УПОРЯДОЧИТЬ ПО
    |НоменклатурнаяГруппа";

а так в СКД
ВЫБРАТЬ
    ХозрасчетныйОстаткиИОбороты.Субконто1 КАК Номенклатура,
    ВложенныйЗапрос.Коэффициент КАК Литраж,
    ХозрасчетныйОстаткиИОбороты.КоличествоОборотДт КАК ОборотДТ,
    ХозрасчетныйОстаткиИОбороты.КоличествоОборотДт * ВложенныйЗапрос.Коэффициент / 1000000 КАК ВсегоПриобретеноТысДал,
    ХозрасчетныйОстаткиИОбороты.КоличествоОборотКт КАК ОборотКТ,
    ХозрасчетныйОстаткиИОбороты.КоличествоОборотКт * ВложенныйЗапрос.Коэффициент / 1000000 КАК ВсегоРеализованоТысДал,
    ХозрасчетныйОстаткиИОбороты.КоличествоНачальныйОстаток КАК НачОстаток,
    ХозрасчетныйОстаткиИОбороты.КоличествоКонечныйОстаток КАК КонОстаток,
    ХозрасчетныйОстаткиИОбороты.КоличествоНачальныйОстаток * ВложенныйЗапрос.Коэффициент / 1000000 КАК НачОстатокДал,
    ХозрасчетныйОстаткиИОбороты.КоличествоКонечныйОстаток * ВложенныйЗапрос.Коэффициент / 1000000 КАК КонОстатокДал,
    ХозрасчетныйОстаткиИОбороты.ПериодСекунда,
    ВложенныйЗапрос.НоменклатурнаяГруппа КАК НоменклатурнаяГруппа
ИЗ
    РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(, , Авто, ДвиженияИГраницыПериода, , , ) КАК ХозрасчетныйОстаткиИОбороты
        ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
            НоменклатураЕдиницыИзмерения.Коэффициент КАК Коэффициент,
            НоменклатураЕдиницыИзмерения.Ссылка КАК Номен,
            НоменклатураЕдиницыИзмерения.Ссылка.НаименованиеПолное КАК НаименованиеПолное,
            НоменклатураЕдиницыИзмерения.Ссылка.Наименование КАК Наименование,
            Номенклатура.НоменклатурнаяГруппа КАК НоменклатурнаяГруппа
        ИЗ
            Справочник.Номенклатура.ЕдиницыИзмерения КАК НоменклатураЕдиницыИзмерения
                ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номенклатура
                ПО НоменклатураЕдиницыИзмерения.Ссылка = Номенклатура.Ссылка
        ГДЕ
            НоменклатураЕдиницыИзмерения.ЕдиницаИзмерения = &ЕдиницаИзмерения) КАК ВложенныйЗапрос
        ПО ХозрасчетныйОстаткиИОбороты.Субконто1 = ВложенныйЗапрос.Номен,
    (ВЫБРАТЬ
        КонтактнаяИнформация.Объект КАК Контрагент,
        ВЫРАЗИТЬ(КонтактнаяИнформация.Представление КАК СТРОКА(200)) КАК Адрес
    ИЗ
        РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация) КАК ЗапросАдреса
ГДЕ
    ВложенныйЗапрос.НоменклатурнаяГруппа В(&НоменклатурнаяГруппа)

СГРУППИРОВАТЬ ПО
    ХозрасчетныйОстаткиИОбороты.ПериодСекунда,
    ХозрасчетныйОстаткиИОбороты.Субконто1,
    ВложенныйЗапрос.Коэффициент,
    ХозрасчетныйОстаткиИОбороты.КоличествоОборотДт,
    ХозрасчетныйОстаткиИОбороты.КоличествоОборотКт,
    ХозрасчетныйОстаткиИОбороты.КоличествоНачальныйОстаток,
    ХозрасчетныйОстаткиИОбороты.КоличествоКонечныйОстаток,
    ВложенныйЗапрос.НоменклатурнаяГруппа

УПОРЯДОЧИТЬ ПО
    НоменклатурнаяГруппа


в СКД формируются обороты только по алкоголю, а в модуле сделал чтобы и по алкоголю и по табаку. Чтобы было понятнее это отчеты 1РА и 1РТ, в которых нужно отобразить обороты по алкоголю в тыс.дал (1 дал = 10л.) и по табаку в млн.шт.

Автор: Acid 30.09.16, 14:30

sanytch @ Сегодня, 14:35 * ,
нет, так не пойдет.
Во-первых - Отбор надо делать первым делом в вашем вложенном запросе.
Во-вторых - левое соединение соединяется по совсем разным объектам.
В-третих - ваш вложенный запрос надо поставить основным, а к нему уже присоединять данные по бухгалтерии.

Конструируйте ваш запрос - небольшими этапами. так легче.

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua