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

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 таблицы, необходимо распределить полную стоимость вида по номенклатуре без потери копеек при округлении

 

 

 

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

 

 

Результат

 

 

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

Похожее:

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

См. также

SALE! 15%

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

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

10000 руб.

02.09.2020    158018    857    399    

860

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

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

18.10.2024    9520    sergey279    18    

60

Запросы Программист Платформа 1С v8.3 Запросы Конфигурации 1cv8 Бесплатно (free)

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

11.10.2024    4945    XilDen    35    

78

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

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

16.08.2024    7699    user1840182    5    

28

Математика и алгоритмы Запросы Программист Платформа 1С v8.3 Запросы Бесплатно (free)

Рассмотрим быстрый алгоритм поиска дублей с использованием hash функции по набору полей шапки и табличных частей.

08.07.2024    2354    ivanov660    9    

22

Запросы СКД Программист Стажер Система компоновки данных Россия Бесплатно (free)

Часто при разработке отчетов в СКД возникает ситуация, когда не совсем понятно, почему отчет выводит не те данные, которые нужны, либо не выводит вовсе. Возникает потребность увидеть конечный запрос, который формирует СКД. Как это сделать, рассмотрим в этой статье.

15.05.2024    8357    implecs_team    6    

46

Запросы СКД Программист Стажер Платформа 1С v8.3 Запросы Система компоновки данных 1С:ERP Управление предприятием 2 Бесплатно (free)

В типовых конфигурациях разработчики компании 1С иногда используют в отчетах, построенных на СКД, такую конструкцию, как "ГДЕ ЛОЖЬ". Такая конструкция говорит о том, что данные в запросе не будут получены совсем. Для чего же нужен тогда запрос?

13.02.2024    7581    KawaNoNeko    23    

26
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Vadzim 13.04.24 19:03 Сейчас в теме
Почему это нужно делать в запросе?
2. Xershi 1551 13.04.24 23:22 Сейчас в теме
(1) эффективнее чем портянку кода писать.
3. andrey_sag 55 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 55 15.04.24 09:00 Сейчас в теме
(4) нормально + 0.3 на последнюю запись. Итог общий не пропал


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

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

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