Пропорциональное распределение в запросе с использованием АвтоНомерЗаписи()

11.04.24

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

Часто поступают задачи по произвольному распределению общих сумм. После распределения иногда пропадают копейки. Суть решения добавить АвтоНомерЗаписи() в ВТ распределения, и далее используя функции МАКСИМУМ или МИНИМУМ можем положить разницу копеек в первую или последнюю строку знаменателя распределения.
ВЫБРАТЬ

    "Услуги" КАК ВидОбщейСущности,

    1000 КАК ПолнаяСтоимостьВида

ПОМЕСТИТЬ втСтоимостьПоВиду



ОБЪЕДИНИТЬ ВСЕ



ВЫБРАТЬ

    "Товары",

    600



ОБЪЕДИНИТЬ ВСЕ



ВЫБРАТЬ

    "Халява",

    7200



ОБЪЕДИНИТЬ ВСЕ



ВЫБРАТЬ

    "Нечто",

    115100

;



////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ

    "Услуги" КАК ВидОбщейСущности,

    "Чесать за ухом 1" КАК Наименование,

    1 КАК Количество

ПОМЕСТИТЬ втНоменклатура



ОБЪЕДИНИТЬ ВСЕ



ВЫБРАТЬ

    "Услуги",

    "Чесать за ухом 2",

    1



ОБЪЕДИНИТЬ ВСЕ



ВЫБРАТЬ

    "Услуги",

    "Чесать за ухом 3",

    1



ОБЪЕДИНИТЬ ВСЕ



ВЫБРАТЬ

    "Товары",

    "Болт",

    1



ОБЪЕДИНИТЬ ВСЕ



ВЫБРАТЬ

    "Товары",

    "Гайка",

    1



ОБЪЕДИНИТЬ ВСЕ



ВЫБРАТЬ

    "Товары",

    "Смазка",

    1



ОБЪЕДИНИТЬ ВСЕ



ВЫБРАТЬ

    "Халява",

    "Уксус",

    1



ОБЪЕДИНИТЬ ВСЕ



ВЫБРАТЬ

    "Халява",

    "Сладкий",

    1

;



////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ

    втНоменклатура.ВидОбщейСущности КАК ВидОбщейСущности,

    СУММА(втНоменклатура.Количество) КАК Количество

ПОМЕСТИТЬ втКоличествоНоменклатуры

ИЗ

    втНоменклатура КАК втНоменклатура



СГРУППИРОВАТЬ ПО

    втНоменклатура.ВидОбщейСущности

;



////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ

    втНоменклатура.ВидОбщейСущности КАК ВидОбщейСущности,

    втНоменклатура.Наименование КАК Наименование,

    АВТОНОМЕРЗАПИСИ() КАК НомерПоПорядку,

    втСтоимость.ПолнаяСтоимостьВида КАК ПолнаяСтоимостьВида,

    ЕСТЬNULL(втКоличествоНоменклатуры.Количество, 0) КАК КоличествоНоменклатуры,

    ВЫБОР

        КОГДА ЕСТЬNULL(втКоличествоНоменклатуры.Количество, 0) <> 0

                И втСтоимость.ПолнаяСтоимостьВида <> 0

            ТОГДА ОКР(втСтоимость.ПолнаяСтоимостьВида / втКоличествоНоменклатуры.Количество, 2)

        ИНАЧЕ 0

    КОНЕЦ КАК Распределение

ПОМЕСТИТЬ втРаспределение

ИЗ

    втНоменклатура КАК втНоменклатура

        ЛЕВОЕ СОЕДИНЕНИЕ втСтоимостьПоВиду КАК втСтоимость

        ПО втНоменклатура.ВидОбщейСущности = втСтоимость.ВидОбщейСущности

        ЛЕВОЕ СОЕДИНЕНИЕ втКоличествоНоменклатуры КАК втКоличествоНоменклатуры

        ПО втНоменклатура.ВидОбщейСущности = втКоличествоНоменклатуры.ВидОбщейСущности

;



////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ

    втСтоимостьПоВиду.ВидОбщейСущности КАК ВидОбщейСущности,

    МАКСИМУМ(втНоменклатураНомерПоПорядку.НомерПоПорядку) КАК НомерПоПорядку,

    СУММА(втНоменклатураНомерПоПорядку.Распределение) КАК Распределение,

    втСтоимостьПоВиду.ПолнаяСтоимостьВида КАК ПолнаяСтоимостьВида

ПОМЕСТИТЬ втРазница

ИЗ

    втРаспределение КАК втНоменклатураНомерПоПорядку

        ЛЕВОЕ СОЕДИНЕНИЕ втСтоимостьПоВиду КАК втСтоимостьПоВиду

        ПО втНоменклатураНомерПоПорядку.ВидОбщейСущности = втСтоимостьПоВиду.ВидОбщейСущности



СГРУППИРОВАТЬ ПО

    втСтоимостьПоВиду.ВидОбщейСущности,

    втСтоимостьПоВиду.ПолнаяСтоимостьВида

;



////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ

    втНоменклатураНомерПоПорядку.ВидОбщейСущности КАК ВидОбщейСущности,

    втНоменклатураНомерПоПорядку.Наименование КАК Наименование,

    втНоменклатураНомерПоПорядку.НомерПоПорядку КАК НомерПоПорядку,

    втНоменклатураНомерПоПорядку.Распределение + ЕСТЬNULL(втРазница.ПолнаяСтоимостьВида - втРазница.Распределение, 0) КАК Распределение,

    втНоменклатураНомерПоПорядку.ПолнаяСтоимостьВида КАК ПолнаяСтоимостьВида,

    втНоменклатураНомерПоПорядку.КоличествоНоменклатуры КАК КоличествоНоменклатуры

ИЗ

    втРаспределение КАК втНоменклатураНомерПоПорядку

        ЛЕВОЕ СОЕДИНЕНИЕ втРазница КАК втРазница

        ПО (втРазница.ВидОбщейСущности = втНоменклатураНомерПоПорядку.ВидОбщейСущности)

            И (втРазница.НомерПоПорядку = втНоменклатураНомерПоПорядку.НомерПоПорядку)

Имея 2 таблицы, необходимо распределить полную стоимость вида по номенклатуре без потери копеек при округлении

 

 

 

Таблица разниц стоимости

 

 

Результат

 

 

Есть похожие алгоритмы решения распределения, но мой вариант субъективно наглядней и прост для восприятия.

Похожее:

Пропорциональное распределение в запросе

См. также

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

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

15500 руб.

02.09.2020    184774    1029    403    

968

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

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

2 стартмани

06.02.2025    2205    17    XilDen    26    

36

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

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

03.12.2024    5735    artemusII    11    

23

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

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

18.10.2024    13147    sergey279    18    

66

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

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

11.10.2024    8222    XilDen    36    

90

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

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

20.08.2024    3194    PROSTO-1C    0    

23

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

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

16.08.2024    10806    user1840182    5    

29
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Vadzim 13.04.24 19:03 Сейчас в теме
Почему это нужно делать в запросе?
2. Xershi 1540 13.04.24 23:22 Сейчас в теме
(1) эффективнее чем портянку кода писать.
3. andrey_sag 58 14.04.24 03:46 Сейчас в теме
(2) Если писать код задачи от начала до конца, то да можно и после. А если поступило задание мол поправить алгоритм отчета итд итп.. ситуации разные бывают же. Да и не портянка получается, а всего лишь еще одна дополнительная ВТРазница
10. Vadzim 16.04.24 23:52 Сейчас в теме
(2) В чем оценивается данная эффективность?
4. dyuha 52 14.04.24 21:05 Сейчас в теме
Попробуйте 2000 Полной стоимости поделить на 7 товаров.
5. andrey_sag 58 15.04.24 09:00 Сейчас в теме
(4) нормально + 0.3 на последнюю запись. Итог общий не пропал


В этой статье ниже комментарии предлагают другие алгоритмы, есть хорошие предложения
Пропорциональное распределение

Моя цель то была предложить еще один вариант распределения, да и я почему то решил, что сам факт выпуска статьи стартмани заработаю, а оказалось тут все серьезнее.. Надо нормальное что - то предлагать в статье.. а я так поигрался маленько на сайте, хотя может кому и подойдет что предлагаю.
Прикрепленные файлы:
6. dimanich70 897 16.04.24 10:15 Сейчас в теме
(5) Да, в этой статье описание чуть-чуть получше.
1. Раньше я уже использовал тот запрос для распределения зарплаты по КТУ и тогда мне действительно нужно было сделать это запросом. Автору большое спасибо.
2. Но чаще все же при распределении приходится учитывать значения нескольких колонок. И здесь запрос слегка усложняется.
Пример: документ Приобретение товаров и услуг. Отражаем услуги, а аналитика тоже приобретение, но с товарами.
Хотим запросом сразу посмотреть как сумма каждой услуги распределится на номенклатуру товара по базе, например, - сумма товара.
Почувствуйте как усложнилась задача, - теперь это уже не просто сумма, которая распределяется между всеми строками, а сумма каждой услуги, которая распределяется между строчками своего приобретения. Услуги и Приобретения могут быть и одинаковыми и разными.

Ниже прикрепил скрин документа и запрос (сделан консолью в инструментах разработчика).
Прикрепленные файлы:
распределение запросом.q9
7. andrey_sag 58 16.04.24 12:10 Сейчас в теме
(6) Благодаря АвтоНомерЗаписи() это своего рода ключ уникальности ничего не потеряется если идет распределение по несколькис строкам, втРазница своего рода ключ "КолонкаИсточникРаспределения" + НомерПоПорядку. В моем алгоритме тоже есть минус, например как указано выше если распределять 2000 на 7 позиций разница в 0.3 может попасть только на последнее значение.
8. dimanich70 897 16.04.24 13:02 Сейчас в теме
(7) Ты гигант мыслей, я до такого вряд ли бы додумался. Респект однозначный.
9. andrey_sag 58 16.04.24 13:18 Сейчас в теме
(8) Гигант мыслей отец русской демократии не я, гигант у нас Киса Воробьянинов
Прикрепленные файлы:
Оставьте свое сообщение