Сложный запрос с простой обработкой

11.06.25

Разработка - Запросы

Очень не хотелось ни отбирать строки из табличек через длинные структуры, ни выбирать по группировкам. Лень-матушка и немного математики для извращенцев. Ограничение - количество строк и частота запросов.

Длинное вступление...

Жил-был документ типа маршрутный лист. Ну, некоторое количество заявок на "забрать отсюда вот это (список с параметрами типа количества-веса-объёма) и отвезти вот сюда". 

И захотели пользователи, чтобы печатался он так: сначала погрузки с их количествами забираемого, потом разгрузки с их итогами чего везти.

Но вот беда, машина-то едет не поочерёдно "тут взял - там положил", а сначала наберёт в одном месте по пяти заявкам, потом в другом ещё по двум, потом три из первых и одну из вторых выгрузит и так далее. А "одно место" - это не какая-то простая штука типа "точка маршрута", а сложная комбинация из N полей. Ну там адрес, да время с-по, да получатель, да ещё чёрти что...

Вот и лень мне стало каждый раз стыковаться по всей этой комбинаторике. Захотелось простого обхода результата, типа табличка пунктов погрузки, табличка пунктов выгрузки, табличка грузов погрузки, табличка грузов выгрузки - и в коде просто цоп по одному полю грузы текущего пункта. А все свёртки - в запросе, там конструктор удобненький.

Мозг вскипел и выпал в осадок, поскольку с арифметикой у меня плохо, но лень всё равно победила.

 

Итааак... встречайте:

1. Существует таблица А (в данном случае - набор заявок).

Мы её нумеруем через АВТОНОМЕРЗАПИСИ(), обзывая поле, допустим, НЗ. Да, если слать запрос за запросом на один набор, он у нас будет не с 1, но для данной задачи несущественно, один документ (набор заявок) дважды и быстро редко печатают.

2. Далее таблица А порождает таблицу Б - в которой для каждой заявки вытаскиваются все те поля, по которым потом пойдёт группировка пунктов погрузки и выгрузки. В ней мы берём поле НЗ и... делаем из него поле НЗ2 таким образом:

POW(2, ВТ_Заявки.НЗ) КАК НЗ2

(вообще, конечно, ВЫРАЗИТЬ(вотэтовот как ЧИСЛО(сколькотамможноразрядов,0)), но поскольку у меня плохо с арифметикой, посчитайте, пожалуйста, сами, при каком значении упадёт!)

3. А ещё таблица А порождает таблицу В - которая "что везти", из табличной части оных заявок. И там мы ровно так же издеваемся над НЗ (надо было назвать ХЗ, было бы веселее), только называем его НЗ2_Груз. К сожалению, сразу сделать это в таблице А нельзя, потому что 1С не любит, когда с результатом этой функции делают что-то прямо там же, где вызвали.

4. Смотрим на эту пару таблиц, чешем репу, типа а чо тут упростилось-то. Ну циферки, с каждой строчкой Б всё длиннее, а в В по нескольку раз повторяющиеся.

5. Делаем из таблицы Б таблицы... так, пора вводить нормальные имена, а то запутаемся. Из таблицы рейсов с группировочными полями делаем собственно таблицы пунктов погрузки (ВТ_ПунктыПогрузки) и разгрузки (ВТ_ПунктыРазгрузки) - по нужным полям группируем, а поле НЗ2... СУММИРУЕМ. То есть было у нас:
Заявка|ПолеПогрузки1|ПолеПогрузки2|...|ПолеПогрузкиN|ПолеВыгрузки1|ПолеВыгрузки2|...|ПолеВыгрузкиN|НЗ2

...а получилось:

ПолеПогрузки1|ПолеПогрузки2|...|ПолеПогрузкиN|НЗ2

и

ПолеВыгрузки1|ПолеВыгрузки2|...|ПолеВыгрузкиN|НЗ2

- и обе этих временных таблицы в последней колонке содержат сумму степеней двойки, каждая из которых встречается только раз.

6. А теперь самый мозгозаворот.

Вытаскиваем табличку грузов для первой и для второй. Как? Выбираем из пунктов НЗ2, из грузов - нужные поля (по НЗ2 и там какой-то ещё детализирующей фигне типа "что за груз" группируем, веса-количества суммируем)... и соединяем:

ИЗ

    ВТ_ГрузыЗаявок КАК ВТ_ГрузыЗаявок

        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_ПунктыПогрузки КАК ВТ_ПунктыПогрузки

        ПО (ВЫБОР

                КОГДА ВТ_ПунктыПогрузки.НЗ2< ВТ_ГрузыЗаявок.НЗ2_Груз

                    ТОГДА ЛОЖЬ

                КОГДА (ВЫРАЗИТЬ(ВТ_ПунктыПогрузки.НЗ2 / ВТ_ГрузыЗаявок.НЗ2_Груз- 0.5 КАК ЧИСЛО(15, 0))) - 2 * (ВЫРАЗИТЬ((ВЫРАЗИТЬ(ВТ_ПунктыПогрузки.НЗ2/ ВТ_ГрузыЗаявок.НЗ2_Груз- 0.5 КАК ЧИСЛО(15, 0))) / 2 - 0.5 КАК ЧИСЛО(15, 0))) = 1

                    ТОГДА ИСТИНА

                ИНАЧЕ ЛОЖЬ

            КОНЕЦ)

...а было бы в запросе 1С целочисленное деление и остаток - было бы проще, первое условие бы не понадобилось.

7. Запрос, конечно, пакетом, результаты, конечно, в структуру, и на выходе в процедуре печати выдираем кусочки груза по пунктам по ОДНОМУ ключу:

        Для Каждого строПогр из ТаблицаПогрузки Цикл  
            ТабДокумент.Вывести(облПогрузкаШапка); 
            ГрузыПункта=ГрузыПогрузки.Скопировать(Новый Структура("НЗ2",строПогр.НЗ2));
            Для Каждого строГруза Из ГрузыПункта Цикл
                //трампампам заполняются паарметры
                ТабДокумент.Вывести(облСтрокаГруз); 
            КонецЦикла;
            ТабДокумент.Вывести(облПодвалГруз); 
        КонецЦикла;

И для выгрузки аналогично.

Решение не претендует на оптимальность, осмысленность и прочие умные вещи и является исключительно демонстрацией того, что лень - двигатель прогресса (иногда совсем не в ту сторону, куда стоило бы).

Оптимизация приветствуется!

 

В процессе мозголомания были изучены (и местами даже поняты!):

1. "Запрос-комбинатор" Ильдаровича (Ильдарович велик!)

2. Ловушка функции запроса АВТОНОМЕРЗАПИСИ() Макрушина

3. Ограничения разрядности в запросах (потому что первая версия была десятичная, но упала уже на 30 строках)

4. ГигаЧат (потому что с арифметикой у меня ПЛОХО) - кстати, предложенные им алгоритмы косячили на части наборов данных, поэтому пришлось использовать свой мозг

5. Масса "статей" по "Окр" и "Выразить" - коллеги, будьте бдительны, даже на сайтах франчайзи сейчас часть материалов от ИИ и там ЛЮТАЯ ХРЕНЬ, жаль, не скринила.

...а также синдром-дефицита-вау-Галуа, то есть всё, что добрый гугл подсунул в "не хотите ли почитать".

запросы математика соединения группировки

См. также

Инструментарий разработчика Роли и права Запросы СКД Программист Руководитель проекта Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Платные (руб)

Инструменты для разработчиков 1С 8.3: Infostart Toolkit. Автоматизация и ускорение разработки на управляемых формах. Легкость работы с 1С.

15500 руб.

02.09.2020    192474    1064    405    

992

Инструментарий разработчика Запросы Программист Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

QueryConsole1C — расширение, включающее консоль запросов с поддержкой исполняемых представлений — аналогов виртуальных таблиц, основанных на методах программного интерфейса ЗУП. Оно позволяет выполнять запросы с учётом встроенной бизнес-логики, отлаживать алгоритмы получения данных и автоматически генерировать код на встроенном языке 1С.

1 стартмани

16.05.2025    2808    62    zup_dev    14    

54

Инструментарий разработчика Запросы Программист Платформа 1С v8.3 Управляемые формы 1С:ERP Управление предприятием 2 Абонемент ($m)

В данной публикации рассказывается о решении, которое позволяет находить сразу все ошибки в тексте запроса за раз, а не только самую первую.

2 стартмани

05.03.2025    2580    7    XilDen    12    

23

Обновление 1С Запросы Программист Платформа 1С v8.3 1С:ERP Управление предприятием 2 Абонемент ($m)

Данный инструмент помогает анализировать доработанную конфигурацию после обновления на новый релиз и находить «битые» тексты запросов, в которых участвуют несуществующие в новом релизе метаданные.

2 стартмани

06.02.2025    2567    20    XilDen    26    

36

Запросы Программист Платформа 1С v8.3 Запросы 1C:Бухгалтерия Бесплатно (free)

В статье приведена удобная возможность отладки исполняемого запроса динамического списка.

03.12.2024    6543    artemusII    11    

23

Запросы Программист Бесплатно (free)

Увидел cheatsheet по SQL и захотелось нарисовать подобное, но про запросы.

18.10.2024    14328    sergey279    18    

67

Запросы Программист Платформа 1С v8.3 Запросы 1C:Бухгалтерия Бесплатно (free)

Столкнулся с интересной ситуацией, которую хотел бы разобрать, ввиду её неочевидности. Речь пойдёт про использование функции запроса АВТОНОМЕРЗАПИСИ() и проблемы, которые могут возникнуть.

11.10.2024    9059    XilDen    36    

94

СКД Механизмы типовых конфигураций Запросы Программист Платформа 1С v8.3 1С:Зарплата и кадры государственного учреждения 3 1С:Зарплата и Управление Персоналом 3.x Россия Бесплатно (free)

Работая с типовыми отчетами в конфигурациях «Зарплата и управление персоналом, редакция 3», «Зарплата и кадры государственного учреждения, редакция 3» и подобных, в схемах компоновки данных можно встретить конструкции запросов, которые обращаются к некоторым виртуальным таблицам.

20.08.2024    3715    PROSTO-1C    0    

25
Оставьте свое сообщение