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

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    130280    704    390    

754

Как посмотреть итоговый запрос в отчете СКД

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

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

15.05.2024    3326    implecs_team    6    

34

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

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

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

13.02.2024    6318    KawaNoNeko    23    

26

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

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

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

1 стартмани

31.01.2024    2304    2    Yashazz    0    

32

Запрос 1С copilot

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

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

15.01.2024    7158    41    mkalimulin    32    

54

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

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

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

14.12.2023    2021    vandalsvq    7    

29

Консоль запросов УФ 8.3.2.24.12 (мод от Dr.Zombi)

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

Работа с запросом и СКД, Полная поддержка пакетных запросов, временных таблиц. Главное скорость отладки запроса и данных, а красота вторична.

1 стартмани

07.12.2023    3498    52    DrZombi    54    

21

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

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

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

06.12.2023    5847    user1923546    26    

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


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

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

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