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

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

 

 

 

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

 

 

Результат

 

 

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

Похожее:

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

См. также

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

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

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

10000 руб.

02.09.2020    127466    688    389    

740

Для чего используют конструкцию запроса "ГДЕ ЛОЖЬ" в СКД на примере конфигурации 1С:ERP

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

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

13.02.2024    6122    KawaNoNeko    23    

26

Набор-объект для СКД по тексту или запросу

Запросы СКД Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Абонемент ($m)

Есть список полей в виде текста, или запрос - закидываем в набор СКД.

1 стартмани

31.01.2024    2204    2    Yashazz    0    

31

Запрос 1С copilot

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

Пишем на человеческом языке, что нам надо, и получаем текст запроса на языке 1С. Используются большие языковые модели (LLM GPT) от OpenAI или Яндекс на выбор.

5 стартмани

15.01.2024    6822    32    mkalimulin    31    

53

PrintWizard: поддержка представлений ЗУП в конструкторе

Инструментарий разработчика Запросы Платформа 1С v8.3 Бесплатно (free)

Одной из интересных задач, стоящих в процессе разработки, была поддержка механизма представлений в ЗУП. Но не просто возможность исполнения запросов с ними. Основная проблема была в том, чтобы с ними было удобно работать, а именно: создавать, модифицировать и отлаживать. Кратко о том, что в итоге получилось...

14.12.2023    1953    vandalsvq    7    

29

Объектная модель запроса "Схема запроса" 2

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

Далеко уже не новый тип данных "Схема запроса". Статья о том, как использовать его "попроще". Примеры создания текста запроса с нуля и изменение имеющегося запроса.

06.12.2023    5700    user1923546    26    

46

Начните уже использовать хранилище запросов

HighLoad оптимизация Запросы

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

11.10.2023    16768    skovpin_sa    14    

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


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

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

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