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

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
    КОНЕЦ КАК СальдоПотовару
ИЗ
    СальдоНарастающим КАК СальдоНарастающим

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



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

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

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

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

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

См. также

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

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

16500 руб.

02.09.2020    259240    1430    421    

1165

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

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

1 стартмани

02.04.2026    2251    68    priem_nv    23    

65

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

Представляю новую версию подсистемы работы со схемой запроса, которая завершает её эволюцию от библиотеки по работе со схемой запроса до объектной реализации модели запроса 2. Теперь есть выбор между классическим и текучим стилем написанию кода - оба варианта взаимозаменяемы. Ключевое улучшение - использование объектов в качестве источников данных, значений полей и параметров в условиях виртуальных таблиц, а также новые операторы позиционирования в схеме

1 стартмани

29.03.2026    1804    kalyaka    16    

24

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

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

1 стартмани

16.05.2025    11269    148    zup_dev    30    

83

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

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

2 стартмани

05.03.2025    6539    21    XilDen    12    

29

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

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

3 стартмани

06.02.2025    5807    36    XilDen    26    

42

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

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

03.12.2024    13049    artemusII    11    

27
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. OBEH 06.08.14 00:53 Сейчас в теме
А можно алгоритм наоборот?
Например, на документ реализации брошена сумма. Эту сумму отнять от каждой позиции табличной части пропорционально стоимости в каждой строке.
3. Трактор 1281 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 Сейчас в теме
Все подробно написано, по полочкам разложено. Спасибо.
Для отправки сообщения требуется регистрация/авторизация