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

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

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

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


И, получается, что действительно выбираются разные категории для одного наименования без каких-либо дубликатов! Но... Добавив сюда склады теперь оно для каждой категории пролистываем все склады и количества. Сначала для одной, потом для другой и до конца... Подскажите, пожалуйста, как уйти от этого некрасивого случая?
Vofka
Цитата(helluinn @ 01.08.22, 16:12) необходимо зарегистрироваться для просмотра ссылки
как уйти от этого некрасивого случая?

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

sava1
helluinn @ Вчера, 16:12 необходимо зарегистрироваться для просмотра ссылки ,
так логика работы/обхода данных такая. Как по другому?
helluinn
sava1 @ Сегодня, 10:13 необходимо зарегистрироваться для просмотра ссылки ,
Понял, я думал, что оно как-то одновременно будет обходить, меняя и склад с количеством и категорию. А если категорий больше, чем складов, то повторит несколько раз эти значения прошлые. Ну если так всё и задумано, то тогда спасибо вам большое, буду парсить это, досрочно прерывая цикл, чтобы не ждать прохода для каждой категории. Очень благодарен!
Vofka
Цитата(helluinn @ 02.08.22, 10:50) необходимо зарегистрироваться для просмотра ссылки
буду парсить это, досрочно прерывая цикл, чтобы не ждать прохода для каждой категории.

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

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

или

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

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

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

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