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

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

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

Автор: helluinn 01.08.22, 8:29

Здравствуйте, я начинающий программист в 1С. Версия, с которой приходится работать сейчас - 8.1.15.14. "Управление торговлей для Украины", редакция 2.3. Разработка конфигурации: "ABBYY Ukraine", 2003-2008 (2.3.3.4)
Нужно написать достаточно сложный отчет и выгрузить это в эксель. Просто СКД сама не справится с необходимой кастомизацией, да и выгрузка нужна, поэтому пишу вручную через Запрос = Новый Запрос
Вопрос заключается в следующем: мне нужно помимо всего - отобрать остатки по всем складам номенклатуры и все категории к каждой (у одной номенклатуры много складов и много категорий). Если я делаю это в СКД, то через детальные записи я могу создать своеобразную вложенность так сказать, чтобы группировало и не дублировало записи, в обычном же запросе я не понимаю, возможно ли это? Подскажите пожалуйста лучший вариант выбора, чтобы в запросе можно было потом всё это дело обойти и выгрузить в эксель? Спасибо за ваше внимание заранее.

Автор: sava1 01.08.22, 9:16

есть в запросах такая конструкция ИТОГИ...ПО...
прописываете агрегатные функции для полей и поля группирования

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

смотрите Выбрать(...) для результата запроса

Автор: helluinn 01.08.22, 15:12

sava1 @ Сегодня, 10:16 * ,
Спасибо вам большое за ответ! Ознакомился с вашим предложением и это действительно то, что нужно! Я решил отдельно потренироваться на более простом запросе, прежде чем вернусь в сложный отчет.
Я решил выбрать для каждого кода номенклатуры каждый склад с остатком и категориями и обойти их по группировкам:

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

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


И, получается, что действительно выбираются разные категории для одного наименования без каких-либо дубликатов! Но... Добавив сюда склады теперь оно для каждой категории пролистываем все склады и количества. Сначала для одной, потом для другой и до конца... Подскажите, пожалуйста, как уйти от этого некрасивого случая?

Автор: Vofka 02.08.22, 9:02

Цитата(helluinn @ 01.08.22, 16:12) *
как уйти от этого некрасивого случая?

А в чем некрасивость? В каком виде вам это надо?


Автор: sava1 02.08.22, 9:13

helluinn @ Вчера, 16:12 * ,
так логика работы/обхода данных такая. Как по другому?

Автор: helluinn 02.08.22, 9:50

sava1 @ Сегодня, 10:13 * ,
Понял, я думал, что оно как-то одновременно будет обходить, меняя и склад с количеством и категорию. А если категорий больше, чем складов, то повторит несколько раз эти значения прошлые. Ну если так всё и задумано, то тогда спасибо вам большое, буду парсить это, досрочно прерывая цикл, чтобы не ждать прохода для каждой категории. Очень благодарен!

Автор: Vofka 02.08.22, 10:59

Цитата(helluinn @ 02.08.22, 10:50) *
буду парсить это, досрочно прерывая цикл, чтобы не ждать прохода для каждой категории.

У вас может быть какая-то древовидная структура.

Склад
...Категория
......Номенклатура

или

Категория
...Склад
......Номенклатура

или любая другая, которую вы опишете в итогах. И если у вас на каком-то уровне ничего не будет, то такая конструкция
Пока ВыборкаВторогоУровня.Следующий() цикл

вернет Ложь и вы просто не попадете в тело цикла.

Я не очень понял что вы собрались парсить и где/зачем прерывать цикл.

Автор: helluinn 02.08.22, 11:22

Vofka @ Сегодня, 11:59 * ,
Категории никак не связаны со складами. У номенклатуры просто есть категории и просто есть склады. Нет такого, что у склада свои категории или у категории свои склады.
Сейчас оно просто проходит по каждой категории и пишет "Склад1" - 2 шт, "Склад2" - 3 шт, "Склад3" - 4 шт. Всё, склады закончились. Оно берёт следующую категорию уже и давай опять то же самое мне: "Склад1" - 2 шт, "Склад2" - 3 шт, , "Склад3" - 4 шт. - это я уже и понял smile.gif
Прерывать цикл, чтобы просто листать категории, а не ждать, пока оно мне все склады опять перечислит, одно и то же же выводит. Вот что я имел ввиду под прерывать.

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