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

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

 

 

 

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

 

 

Результат

 

 

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

Похожее:

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

Вступайте в нашу телеграмм-группу Инфостарт

Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

См. также

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

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

10000 руб.

02.09.2020    267975    1492    421    

1179

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

Структура запроса. Обработка визуально показывает, из какого количества подзапросов состоит запрос.

2 стартмани

06.07.2026    3352    44    XSlava    20    

44

Запросы Программист 1С 8.3 Россия Бесплатно (free)

Визуальный «Конструктор запроса» 1С, встроенный прямо в VS Code, — аналог конструктора из Конфигуратора и EDT, но без запуска платформы. Расширение читает конфигурацию, выгруженную в файлы, позволяет собрать запрос мышью и генерирует корректный текст на языке запросов 1С (SDBL). Открывает уже существующий текст запроса из кода для правки и — что особенно ценно — сохраняет комментарии при цикле «открыть - править - сохранить». Подходит тем, кто пишет код 1С в VS Code, держит под рукой множество проектов и не хочет ради одного запроса запускать тяжёлый Конфигуратор или EDT.

26.06.2026    7146    Alex_YAM    5    

33

WEB-интеграция Запросы Программист 1С 8.3 Абонемент ($m)

Post1C - это внешняя обработка, которая превращает 1С в полноценный инструмент для тестирования REST API. Всё управление сосредоточено в одном окне: настройка запроса, выполнение, просмотр ответа и генерация кода - без переключения между формами. Аналог Postman, но работающий в привычной среде 1С.

1 стартмани

02.04.2026    2964    82    priem_nv    24    

66

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

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

1 стартмани

16.05.2025    12057    155    zup_dev    32    

86

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

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

2 стартмани

05.03.2025    6852    24    XilDen    12    

29

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

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

3 стартмани

06.02.2025    6122    37    XilDen    26    

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


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

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

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