Заказы на доработку 1С (сервис удаленной работы)

Хранилище

База знаний
Бесплатные отчеты, обработки, конфигурации, внешние компоненты для 1С Статьи, описание работы, методики по работе с 1С

Здравствуйте, гость ( Вход | Зарегистрироваться )



> Совет по запросу в целях оптимизации          
helluinn Подменю пользователя
сообщение 01.08.22, 8:29
Сообщение #1

Молчаливый
*
Группа: Пользователи
Сообщений: 9
Из: Днепр
Спасибо сказали: 1 раз
Рейтинг: 1

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

sava1 Подменю пользователя
сообщение 01.08.22, 9:16
Сообщение #2

Живет на форуме
Иконка группы
Группа: Местный
Сообщений: 2568
Из: Проскуров
Спасибо сказали: 633 раз
Рейтинг: 613.2

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

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

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

Спасибо сказали: helluinn,

helluinn Подменю пользователя
сообщение 01.08.22, 15:12
Сообщение #3

Молчаливый
*
Группа: Пользователи
Сообщений: 9
Из: Днепр
Спасибо сказали: 1 раз
Рейтинг: 1

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

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


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

Vofka Подменю пользователя
сообщение 02.08.22, 9:02
Сообщение #4

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 13800
Из: Киев
Спасибо сказали: 4397 раз
Рейтинг: 3518

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

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


Спасибо сказали: helluinn,

sava1 Подменю пользователя
сообщение 02.08.22, 9:13
Сообщение #5

Живет на форуме
Иконка группы
Группа: Местный
Сообщений: 2568
Из: Проскуров
Спасибо сказали: 633 раз
Рейтинг: 613.2

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

Спасибо сказали: helluinn,

helluinn Подменю пользователя
сообщение 02.08.22, 9:50
Сообщение #6

Молчаливый
*
Группа: Пользователи
Сообщений: 9
Из: Днепр
Спасибо сказали: 1 раз
Рейтинг: 1

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

Vofka Подменю пользователя
сообщение 02.08.22, 10:59
Сообщение #7

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 13800
Из: Киев
Спасибо сказали: 4397 раз
Рейтинг: 3518

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

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

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

или

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

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

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

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

Сообщение отредактировал Vofka - 02.08.22, 10:59

helluinn Подменю пользователя
сообщение 02.08.22, 11:22
Сообщение #8

Молчаливый
*
Группа: Пользователи
Сообщений: 9
Из: Днепр
Спасибо сказали: 1 раз
Рейтинг: 1

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

Не нашли ответа на свой вопрос?
Зарегистрируйтесь и задайте новый вопрос.


Ответить Новая тема
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

RSS Текстовая версия Сейчас: 13.08.22, 20:15
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!