Распределение оплаты по товарам

04.08.14

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

Учебная задача. Оплата приходит по заказу. Требуется запросом распределить её по товарам. Практическая задача была сложнее. Упростил специально для иллюстрации. Сначала собираем в одну таблицу заказы и товары. Затем ОБЪЕДИНИТЬ ВСЕ с оплатами. Потом намазываем оплату на товар.

Подобный подход можно использовать для распределения, например,

  • по партиям при списании количества товара
  • оплаты по заказам, если оплата пришла по договору вцелом

Минусом данного решения является ресурсоёмкость запроса. За основу взято классическое решение запроса с нарастающим итогом. К нему добавлен запрос, преобразующий нарастающий итог в текущее сальдо.
 

// Заказ собираем в одну таблицу с колонками "Заказ", "Товар", "СуммаЗаказано", "СуммаОплачено"
// колонку "СуммаОплачено" в запросе по заказам заполняем нулями
ВЫБРАТЬ
    "Заказ № 1" КАК заказ,
    "сапоги гусарские" КАК товар,
    100 КАК суммаЗаказано,
    0 КАК СуммаОплачено
ПОМЕСТИТЬ табКоличеств

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

ВЫБРАТЬ
    "Заказ № 1",
    "валенки Здоровье",
    50,
    0

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

ВЫБРАТЬ
    "Заказ № 1",
    "туфельки Золушка",
    60,
    0

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

ВЫБРАТЬ
    "Заказ № 222",
    "сапоги гусарские",
    200,
    0

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

ВЫБРАТЬ
    "Заказ № 222",
    "туфельки Золушка",
    20,
    0

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

// К запросу по заказам снизу добавляем суммы оплат. При этом колонки Товар и СуммаЗаказано заполняем пустыми значениями.
// но не просто пустыми, а такими, чтобы при сортировке становились ДО значений из таблицы заказов.
// Для колонки Товар в реальном запросе следует использовать Значение(Справочник.Номенклатура.ПустаяСсылка), для колонки Сумма следует использовать 0
ВЫБРАТЬ
    "Заказ № 1",
    "",
    0,
    175

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

ВЫБРАТЬ
    "Заказ № 222",
    "",
    0,
    210
;

////////////////////////////////////////////////////////////////////////////////
// Намазываем оплату на товары. Получаем сальдо нарастающим итогом.
ВЫБРАТЬ РАЗЛИЧНЫЕ
    табКоличеств.заказ,
    табКоличеств.товар,
    МИНИМУМ(табКоличеств.суммаЗаказано) КАК суммаЗаказано,
    СУММА(табКоличеств1.суммаЗаказано) КАК суммаЗаказаноНарастающим,
    МИНИМУМ(табКоличеств.СуммаОплачено) КАК суммаОплачено,
    СУММА(табКоличеств1.суммаЗаказано - табКоличеств1.СуммаОплачено) КАК СальдоОплаченоНарастающим
ПОМЕСТИТЬ СальдоНарастающим
ИЗ
    табКоличеств КАК табКоличеств
        ЛЕВОЕ СОЕДИНЕНИЕ табКоличеств КАК табКоличеств1
        ПО табКоличеств.заказ = табКоличеств1.заказ
            И табКоличеств.товар >= табКоличеств1.товар

СГРУППИРОВАТЬ ПО
    табКоличеств.заказ,
    табКоличеств.товар
;

////////////////////////////////////////////////////////////////////////////////
// Превращаем нарастающее сальдо в простое. При этом получем в колонке СальдоПотовару 0 - нет задолженности, число - сумма задолженности
ВЫБРАТЬ
    СальдоНарастающим.заказ,
    СальдоНарастающим.товар,
    СальдоНарастающим.суммаЗаказано,
    ВЫБОР
        КОГДА СальдоНарастающим.СальдоОплаченоНарастающим > 0
            ТОГДА ВЫБОР
                    КОГДА СальдоНарастающим.СальдоОплаченоНарастающим > СальдоНарастающим.суммаЗаказано
                        ТОГДА СальдоНарастающим.суммаЗаказано
                    ИНАЧЕ СальдоНарастающим.СальдоОплаченоНарастающим
                КОНЕЦ
        ИНАЧЕ 0
    КОНЕЦ КАК СальдоПотовару
ИЗ
    СальдоНарастающим КАК СальдоНарастающим

УПОРЯДОЧИТЬ ПО
    СальдоНарастающим.заказ,
    СальдоНарастающим.товар



О сути времени

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

запрос распределение нарсатающим итогом

См. также

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

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

15500 руб.

02.09.2020    197049    1089    409    

1006

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

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

1 стартмани

16.05.2025    3360    73    zup_dev    16    

57

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

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

2 стартмани

05.03.2025    2903    10    XilDen    12    

23

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

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

2 стартмани

06.02.2025    2843    22    XilDen    26    

36

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

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

03.12.2024    6906    artemusII    11    

24

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

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

18.10.2024    14962    sergey279    18    

68

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

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

11.10.2024    9639    XilDen    38    

101

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

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

20.08.2024    3967    PROSTO-1C    0    

26
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. OBEH 06.08.14 00:53 Сейчас в теме
А можно алгоритм наоборот?
Например, на документ реализации брошена сумма. Эту сумму отнять от каждой позиции табличной части пропорционально стоимости в каждой строке.
3. Трактор 1271 06.08.14 10:56 Сейчас в теме
А можно алгоритм наоборот?

(1) OBEH, не совсем наоборот. Просто немного другой способ намазывания. Вот прикинул как может выглядеть запрос. Ошибки округления в запросе решать не стал, поэтому это заготовка, а не готовый ответ.
// Заказ собираем в одну таблицу с колонками "Заказ", "Товар", "СуммаЗаказано", "СуммаОплачено"
// колонку "СуммаОплачено" в запросе по заказам заполняем нулями
ВЫБРАТЬ
    "Заказ № 1" КАК заказ,
    "сапоги гусарские" КАК товар,
    100 КАК суммаЗаказано,
    0 КАК СуммаОплачено
ПОМЕСТИТЬ табКоличеств

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

ВЫБРАТЬ
    "Заказ № 1",
    "валенки Здоровье",
    50,
    0

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

ВЫБРАТЬ
    "Заказ № 1",
    "туфельки Золушка",
    60,
    0

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

ВЫБРАТЬ
    "Заказ № 222",
    "сапоги гусарские",
    200,
    0

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

ВЫБРАТЬ
    "Заказ № 222",
    "туфельки Золушка",
    20,
    0

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

// К запросу по заказам снизу добавляем суммы оплат. При этом колонки Товар и СуммаЗаказано заполняем пустыми значениями.
// но не просто пустыми, а такими, чтобы при сортировке становились ДО значений из таблицы заказов.
// Для колонки Товар в реальном запросе следует использовать Значение(Справочник.Номенклатура.ПустаяСсылка), для колонки Сумма следует использовать 0
ВЫБРАТЬ
    "Заказ № 1",
    "",
    0,
    175

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

ВЫБРАТЬ
    "Заказ № 222",
    "",
    0,
    210
;
// добавляем в начальную таблицу колонку ВсегоСуммаПоЗаказу
// и в каждую строку прописываем ВсегоСуммаЗаказано и суммаОплачено, которая упала на заказ
ВЫБРАТЬ
	табКоличеств.заказ,
	табКоличеств.товар,
	табКоличеств.суммаЗаказано,
	ВсегоЗаказано.суммаОплачено,
	ВсегоЗаказано.ВсегоСуммаЗаказано
Поместить ЗаказыСИтоговымиСуммами
ИЗ
	табКоличеств КАК табКоличеств
		ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
			табКоличеств.заказ КАК заказ,
			СУММА(табКоличеств.суммаОплачено) КАК суммаОплачено,
			СУММА(табКоличеств.суммаЗаказано) КАК ВсегоСуммаЗаказано
		ИЗ
			табКоличеств КАК табКоличеств
		
		СГРУППИРОВАТЬ ПО
			табКоличеств.заказ) КАК ВсегоЗаказано
		ПО (ВсегоЗаказано.заказ = табКоличеств.заказ)
Где табКоличеств.товар <> ""
;
// теперь у нас в каждой строке есть сумма заказно по Товару, сумма оплаты по Заказу и сумма Заказа
Выбрать
	ЗаказыСИтоговымиСуммами.заказ,
	ЗаказыСИтоговымиСуммами.товар,
	ЗаказыСИтоговымиСуммами.суммаЗаказано,
	ЗаказыСИтоговымиСуммами.суммаОплачено,
	ЗаказыСИтоговымиСуммами.ВсегоСуммаЗаказано,
	// сумму заказано по Товару делим на сумму всего заказа получаем долю товара в заказе
	// затем умножаем на сумму оплаты. Получим сумму оплаты по товару, пропорциональную доле стоимости товара в заказе.
	ЗаказыСИтоговымиСуммами.суммаЗаказано / ЗаказыСИтоговымиСуммами.ВсегоСуммаЗаказано *
	// При этом учитываем, что оплата может оказаться больше суммы заказа. В этом случае считаем, что оплачен только заказ
	Выбор Когда ЗаказыСИтоговымиСуммами.суммаОплачено > ЗаказыСИтоговымиСуммами.ВсегоСуммаЗаказано
		Тогда ЗаказыСИтоговымиСуммами.ВсегоСуммаЗаказано
		Иначе ЗаказыСИтоговымиСуммами.суммаОплачено
	Конец КАК ОплаченоЗаТовар
	
ИЗ ЗаказыСИтоговымиСуммами как ЗаказыСИтоговымиСуммами
	
Упорядочить по 
	ЗаказыСИтоговымиСуммами.заказ,
	ЗаказыСИтоговымиСуммами.товар
Показать
2. asved.ru 37 06.08.14 08:31 Сейчас в теме
О сути времени


Разъясните, пожалуйста, какое отношение к изложенному в статье имеет секта пургеняна и зачем вы ее пиарите?
4. hazd 12.10.14 01:39 Сейчас в теме
Все подробно написано, по полочкам разложено. Спасибо.
Оставьте свое сообщение