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

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

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



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

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

См. также

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

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

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

13000 руб.

02.09.2020    119917    656    389    

701

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

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

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

13.02.2024    5620    KawaNoNeko    23    

23

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

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

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

1 стартмани

31.01.2024    1964    2    Yashazz    0    

29

Запрос 1С copilot

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

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

5 стартмани

15.01.2024    6091    29    mkalimulin    23    

48

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

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

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

14.12.2023    1714    vandalsvq    7    

28

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

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

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

06.12.2023    5283    user1923546    26    

43

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

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

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

11.10.2023    15956    skovpin_sa    14    

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


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