Продвинутый курс. Занятие №8
Третье занятие 1-го блока продвинутого курса.
Необходимо изучить следующие главы текущего блока.
Глава 6. Построитель отчета и построитель запроса.
Глава 7. Запросы.
К сожалению, у Вас недостаточно прав для просмотра этой записи. Если Вы еще не залогинены на сайте
— залогиньтесь.
— залогиньтесь.
Если не активировали токен — посмотрите видео-инструкцию (видео N5)
Если вы залогинены, у Вас активирован токен доступа, но вы все равно видите эту запись —
напишите нам на e-mail поддержки.
Задание выполнено, вроде бы.
Для определения периодов использовалось соединение таблицы самой с собой. А вообще со сложными запросами как-то тяжело получается.
Присоединяюсь насчет “шпаргалки по запросам”. Хотелось бы иметь перед глазами основные типовые примеры, приемы.
Задача 1.
Решение заключается в том, что получается таблица движений и остатков по номенклатуре на все рабочие дни и дни движений, из которой берется количество рабочих дней, когда товар был на складе. Сначала строится таблица движений: объединяются остатки на начало периода с движениями из физической таблицы остатков, где расход берется с обратным знаком. Затем эта таблица объединяется дважды с таблицей рабочих дней (один раз по условию равенства дат, а второй раз по не равенству). Итог объединения последних запросов соединяем сам с собой и получаем таблицу движений и остатков в разрезе дней.
ВЫБРАТЬ
ПродажиОбороты.Номенклатура КАК Номенклатура,
СУММА(ПродажиОбороты.КоличествоОборот) КАК КоличествоОборот
ПОМЕСТИТЬ втПродажи
ИЗ
РегистрНакопления.Продажи.Обороты(&ДатаНачала, &ДатаОкончания, , ) КАК ПродажиОбороты
СГРУППИРОВАТЬ ПО
ПродажиОбороты.Номенклатура
ИНДЕКСИРОВАТЬ ПО
Номенклатура
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
НАЧАЛОПЕРИОДА(ГрафикиРаботы.Дата, ДЕНЬ) КАК День
ПОМЕСТИТЬ втРабочиеДни
ИЗ
РегистрСведений.ГрафикиРаботы КАК ГрафикиРаботы
ГДЕ
ГрафикиРаботы.ТипГрафика = &ТипГрафика
И ГрафикиРаботы.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
И ГрафикиРаботы.Значение = 1
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ОстаткиТоваровОстатки.Номенклатура,
ОстаткиТоваровОстатки.КоличествоОстаток КАК Приращение,
НАЧАЛОПЕРИОДА(&ДатаНачала, ДЕНЬ) КАК Дата
ПОМЕСТИТЬ втОстаткиНаНачалоПериода
ИЗ
РегистрНакопления.ОстаткиТоваров.Остатки(&ДатаНачала, ) КАК ОстаткиТоваровОстатки
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ОстаткиТоваров.Номенклатура КАК Номенклатура,
ВЫБОР
КОГДА ОстаткиТоваров.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)
ТОГДА ОстаткиТоваров.Количество
ИНАЧЕ -1 * ОстаткиТоваров.Количество
КОНЕЦ КАК Приращение,
НАЧАЛОПЕРИОДА(ОстаткиТоваров.Период, ДЕНЬ) КАК День
ПОМЕСТИТЬ втДвижения
ИЗ
РегистрНакопления.ОстаткиТоваров КАК ОстаткиТоваров
ГДЕ
ОстаткиТоваров.Период МЕЖДУ &ДатаНачала И &ДатаОкончания
И ОстаткиТоваров.Активность
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
втОстаткиНаНачалоПериода.Номенклатура,
втОстаткиНаНачалоПериода.Приращение,
втОстаткиНаНачалоПериода.Дата
ИЗ
втОстаткиНаНачалоПериода КАК втОстаткиНаНачалоПериода
ИНДЕКСИРОВАТЬ ПО
День
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
втДвижения.Номенклатура,
СУММА(втДвижения.Приращение) КАК Приращение,
втДвижения.День КАК День
ПОМЕСТИТЬ втДвиженияИРабочиеДни
ИЗ
втДвижения КАК втДвижения
ЛЕВОЕ СОЕДИНЕНИЕ втРабочиеДни КАК втРабочиеДни
ПО втДвижения.День = втРабочиеДни.День
СГРУППИРОВАТЬ ПО
втДвижения.Номенклатура,
втДвижения.День
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
втДвижения.Номенклатура,
СУММА(0),
втРабочиеДни.День
ИЗ
втРабочиеДни КАК втРабочиеДни
ЛЕВОЕ СОЕДИНЕНИЕ втДвижения КАК втДвижения
ПО (втДвижения.День <> втРабочиеДни.День)
СГРУППИРОВАТЬ ПО
втДвижения.Номенклатура,
втРабочиеДни.День
ИНДЕКСИРОВАТЬ ПО
День
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
втДвиженияИРабочиеДни.Номенклатура КАК Номенклатура,
втДвиженияИРабочиеДни.Приращение КАК Приращение,
втДвиженияИРабочиеДни.День КАК День,
СУММА(втДвиженияИРабочиеДни1.Приращение) КАК Остаток
ПОМЕСТИТЬ втДвиженияИОстатки
ИЗ
втДвиженияИРабочиеДни КАК втДвиженияИРабочиеДни
ВНУТРЕННЕЕ СОЕДИНЕНИЕ втДвиженияИРабочиеДни КАК втДвиженияИРабочиеДни1
ПО втДвиженияИРабочиеДни.День >= втДвиженияИРабочиеДни1.День
И втДвиженияИРабочиеДни.Номенклатура = втДвиженияИРабочиеДни1.Номенклатура
СГРУППИРОВАТЬ ПО
втДвиженияИРабочиеДни.Номенклатура,
втДвиженияИРабочиеДни.День,
втДвиженияИРабочиеДни.Приращение
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
втДвиженияИОстатки.Номенклатура КАК Номенклатура,
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ втДвиженияИОстатки.День) КАК День
ИЗ
втДвиженияИОстатки КАК втДвиженияИОстатки
ГДЕ
(втДвиженияИОстатки.Остаток > 0)
ИЛИ (втДвиженияИОстатки.Остаток = 0
И втДвиженияИОстатки.Приращение < 0)
СГРУППИРОВАТЬ ПО
втДвиженияИОстатки.Номенклатура
УПОРЯДОЧИТЬ ПО
Номенклатура
Задача 2.
Для решения задачи добавил регистр Взаиморасчеты и документы для формирования движений по нему. Решение состоит в получении таблицы долгов, в которой содержится сумма долга, а так же начальная и конечная даты его изменений. А далее вычисляя разность между этими датами и умножая на сумму долга получается необходимый коэффициент.
ВЫБРАТЬ
ВзаиморасчетыОстаткиИОбороты.Период КАК Период,
ВзаиморасчетыОстаткиИОбороты.Контрагент КАК Контрагент,
ВзаиморасчетыОстаткиИОбороты.СуммаКонечныйОстаток КАК Долг
ПОМЕСТИТЬ втДолги
ИЗ
РегистрНакопления.Взаиморасчеты.ОстаткиИОбороты(&ДатаНачала, &ДатаОкончания, День, ДвиженияИГраницыПериода, ) КАК ВзаиморасчетыОстаткиИОбороты
ИНДЕКСИРОВАТЬ ПО
Контрагент,
Период
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
втДолги.Контрагент КАК Контрагент,
втДолги.Период КАК ПериодНачалаДолга,
МИНИМУМ(втДолги1.Период) КАК ПериодОкончанияДолга,
втДолги.Долг
ПОМЕСТИТЬ втПериодыДолгов
ИЗ
втДолги КАК втДолги
ВНУТРЕННЕЕ СОЕДИНЕНИЕ втДолги КАК втДолги1
ПО втДолги.Контрагент = втДолги1.Контрагент
И втДолги.Период < втДолги1.Период
СГРУППИРОВАТЬ ПО
втДолги.Контрагент,
втДолги.Период,
втДолги.Долг
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
втПериодыДолгов.Контрагент КАК Контрагент,
СУММА(ВЫБОР
КОГДА втПериодыДолгов.Долг < 0
ТОГДА -1 * втПериодыДолгов.Долг * РАЗНОСТЬДАТ(втПериодыДолгов.ПериодНачалаДолга, втПериодыДолгов.ПериодОкончанияДолга, ДЕНЬ)
ИНАЧЕ 0
КОНЕЦ) КАК УровеньПолученныхКредитов,
СУММА(ВЫБОР
КОГДА втПериодыДолгов.Долг > 0
ТОГДА втПериодыДолгов.Долг * РАЗНОСТЬДАТ(втПериодыДолгов.ПериодНачалаДолга, втПериодыДолгов.ПериодОкончанияДолга, ДЕНЬ)
ИНАЧЕ 0
КОНЕЦ) КАК УровеньВыданныхКредитов
ИЗ
втПериодыДолгов КАК втПериодыДолгов
СГРУППИРОВАТЬ ПО
втПериодыДолгов.Контрагент
УПОРЯДОЧИТЬ ПО
Контрагент
ИТОГИ ПО
ОБЩИЕ
Задание выполнила. Пришлось немного поломать голову, но, т. к. раньше приходилось решать подобные задачи (запросы в ЗУПе не самые простые), затруднения преодолела.
Пока решила Задачу 1. Запрос получился таким:
ВЫБРАТЬ
ДниЗаПериод.ДатаНоменклатура КАК Номенклатура,
ОстаткиТоваровОстатки.КоличествоОстаток/ДниЗаПериод.КолДнейЗаПериод КАК СкоростьПродажи
ИЗ
( ВЫБРАТЬ
Даты.Номенклатура КАК ДатаНоменклатура,
СУММА(1) КАК КолДнейЗаПериод
ИЗ
(ВЫБРАТЬ
ГрафикиРаботы.Дата КАК ДатаКалендаря,
ОстаткиТоваровОстаткиИОбороты.Номенклатура КАК Номенклатура,
МАКСИМУМ(ОстаткиТоваровОстаткиИОбороты.Период) КАК ДатаИтогов
ИЗ
РегистрСведений.ГрафикиРаботы КАК ГрафикиРаботы
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиТоваров.ОстаткиИОбороты(&НачПериода, &КонПериода, День, ДвиженияИГраницыПериода, ) КАК ОстаткиТоваровОстаткиИОбороты
ПО ГрафикиРаботы.Дата >= ОстаткиТоваровОстаткиИОбороты.Период
И (ГрафикиРаботы.ТипГрафика = &ТипГрафика)
И (ГрафикиРаботы.Значение = 1)
ГДЕ
ГрафикиРаботы.Дата >= &НачПериода
И ГрафикиРаботы.Дата <= &КонПериода
СГРУППИРОВАТЬ ПО
ГрафикиРаботы.Дата,
ОстаткиТоваровОстаткиИОбороты.Номенклатура) КАК Даты
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиТоваров.ОстаткиИОбороты(&НачПериода, &КонПериода, День, ДвиженияИГраницыПериода, ) КАК ОстаткиИОбороты
ПО Даты.ДатаИтогов = ОстаткиИОбороты.Период
И (ОстаткиИОбороты.Номенклатура = Даты.Номенклатура)
ГДЕ
ОстаткиИОбороты.КоличествоНачальныйОстаток + ОстаткиИОбороты.КоличествоПриход > 0
СГРУППИРОВАТЬ ПО
Даты.Номенклатура) ДниЗаПериод
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиТоваров.Остатки(&КонПериода, ) КАК ОстаткиТоваровОстатки
ПО ДниЗаПериод.ДатаНоменклатура = ОстаткиТоваровОстатки.Номенклатура
Ой, только заметила во внешнем запросе конечно внутреннее соединение с регистр оборотов а не остатков для определения количества реализации и скорости продажи.
Домашнее задание выполнено.
В задаче № 1 объем реализации легко определяется с помощью виртуальной таблицы “Обороты”. Основная сложность – получить число дней, когда товар был на складе. Пусть мы имеем таблицу, содержащую начальные остатки товара на каждый день рассматриваемого периода. Если остаток больше нуля, то товар был на складе в этот день. Если остаток равен нулю, то нужно сделать дополнительную проверку – не было ли прихода в этот день. После этого несложно посчитать число дней, предварительно откинув выходные дни согласно выбранному графику.
Идея решения задачи №2 заключается в следующем. Пусть в день x осуществлена операция, а в день y осуществлена следующая операция (x<y). Нам нужно взять остаток на начало дня y и умножить его на количество дней, при этом учитываются дни x+1, x+2, …, y. Начальный остаток дня легко получается из виртуальной таблицы “ОстаткиИОбороты”. Чтобы определить количество дней, соединяем виртуальную таблицу саму с собой по условию Период > Период1, кроме того, делаем группировку по полю Период и берем максимум по полю Период1. В результате поле Период содержит день y, а поле Период1 – день x. Далее, с помощью функции “РазностьДат” получаем количество дней, умножаем его на соответствующий начальный остаток и получаем требуемый результат.
Задание выполнил.
1. Сам запрос:
<code>
ВЫБРАТЬ
ОстаткиТоваровОстаткиИОбороты.Номенклатура,
ОстаткиТоваровОстаткиИОбороты.Период КАК Период,
ОстаткиТоваровОстаткиИОбороты.КоличествоНачальныйОстаток,
ОстаткиТоваровОстаткиИОбороты.КоличествоПриход,
ОстаткиТоваровОстаткиИОбороты.КоличествоРасход,
ОстаткиТоваровОстаткиИОбороты.КоличествоКонечныйОстаток
ПОМЕСТИТЬ ВТОсновныеДанные
ИЗ
РегистрНакопления.ОстаткиТоваров.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, День, ДвиженияИГраницыПериода, ) КАК ОстаткиТоваровОстаткиИОбороты
;
//////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВТОсновныеДанные.Номенклатура КАК Номенклатура,
ВТОсновныеДанные.Период КАК НачалоПериодаХранения
ПОМЕСТИТЬ ВТДатыНачалаХранения
ИЗ
ВТОсновныеДанные КАК ВТОсновныеДанные
ГДЕ
((ВТОсновныеДанные.КоличествоНачальныйОстаток <= 0 И ВТОсновныеДанные.КоличествоКонечныйОстаток > 0)
ИЛИ НАЧАЛОПЕРИОДА(ВТОсновныеДанные.Период, ДЕНЬ) = НАЧАЛОПЕРИОДА(&НачалоПериода, ДЕНЬ))
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВТОсновныеДанные.Номенклатура КАК Номенклатура,
ВТОсновныеДанные.Период КАК КонецПериодаХранения
ПОМЕСТИТЬ ВТДатыОкончанияХранения
ИЗ
ВТОсновныеДанные КАК ВТОсновныеДанные
ГДЕ
ВТОсновныеДанные.КоличествоКонечныйОстаток <= 0
И ВТОсновныеДанные.КоличествоНачальныйОстаток > 0
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВТДатыНачалаХранения.Номенклатура КАК Номенклатура,
ВТДатыНачалаХранения.НачалоПериодаХранения КАК НачалоПериодаХранения,
ЕСТЬNULL(ВТДатыОкончанияХранения.КонецПериодаХранения, &КонецПериода) КАК КонецПериодаХранения,
РАЗНОСТЬДАТ(ВТДатыНачалаХранения.НачалоПериодаХранения, ЕСТЬNULL(ВТДатыОкончанияХранения.КонецПериодаХранения, &КонецПериода), ДЕНЬ) + 1 КАК РаздностьДней
ПОМЕСТИТЬ ВТПериоды
ИЗ
ВТДатыНачалаХранения КАК ВТДатыНачалаХранения
ЛЕВОЕ СОЕДИНЕНИЕ ВТДатыОкончанияХранения КАК ВТДатыОкончанияХранения
ПО ВТДатыНачалаХранения.Номенклатура = ВТДатыОкончанияХранения.Номенклатура
И ВТДатыНачалаХранения.НачалоПериодаХранения < ВТДатыОкончанияХранения.КонецПериодаХранения
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВТПериоды.Номенклатура,
ВТПериоды.НачалоПериодаХранения,
МИНИМУМ(ВТПериоды.РаздностьДней) КАК РаздностьДней
ПОМЕСТИТЬ ВТПериодыХранения
ИЗ
ВТПериоды КАК ВТПериоды
СГРУППИРОВАТЬ ПО
ВТПериоды.Номенклатура,
ВТПериоды.НачалоПериодаХранения
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВТПериоды.Номенклатура КАК Номенклатура,
ВТПериоды.НачалоПериодаХранения КАК НачалоПериодаХранения,
ВТПериоды.КонецПериодаХранения КАК КонецПериодаХранения
ПОМЕСТИТЬ ВТДанныеПериодовХранения
ИЗ
ВТПериоды КАК ВТПериоды
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТПериодыХранения КАК ВТПериодыХранения
ПО ВТПериоды.Номенклатура = ВТПериодыХранения.Номенклатура
И ВТПериоды.НачалоПериодаХранения = ВТПериодыХранения.НачалоПериодаХранения
И ВТПериоды.РаздностьДней = ВТПериодыХранения.РаздностьДней
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВТДанныеПериодовХранения.Номенклатура,
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ГрафикиРаботы.Дата) КАК КоличествоДней
ПОМЕСТИТЬ ВТКоличествоДнейХранения
ИЗ
ВТДанныеПериодовХранения КАК ВТДанныеПериодовХранения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГрафикиРаботы КАК ГрафикиРаботы
ПО (ГрафикиРаботы.Дата >= ВТДанныеПериодовХранения.НачалоПериодаХранения)
И (ГрафикиРаботы.Дата <= ВТДанныеПериодовХранения.КонецПериодаХранения)
И (ГрафикиРаботы.Значение = 1)
И (ГрафикиРаботы.ТипГрафика = &ТипГрафика)
СГРУППИРОВАТЬ ПО
ВТДанныеПериодовХранения.Номенклатура
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ПродажиОбороты.Номенклатура,
ПродажиОбороты.КоличествоОборот
ПОМЕСТИТЬ ВТПродажиЗаПериод
ИЗ
РегистрНакопления.Продажи.Обороты(
&НачалоПериода,
&КонецПериода,
,
Номенклатура В
(ВЫБРАТЬ
ВТДанныеПериодовХранения.Номенклатура
ИЗ
ВТДанныеПериодовХранения)) КАК ПродажиОбороты
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВТКоличествоДнейХранения.Номенклатура КАК Номенклатура,
ЕСТЬNULL(ВТПродажиЗаПериод.КоличествоОборот, 0) КАК КоличествоПродаж,
ВТКоличествоДнейХранения.КоличествоДней КАК ЧислоДнейХранения,
ЕСТЬNULL(ВТПродажиЗаПериод.КоличествоОборот, 0) / ВТКоличествоДнейХранения.КоличествоДней КАК СкоростьПродажи
ИЗ
ВТКоличествоДнейХранения КАК ВТКоличествоДнейХранения
ЛЕВОЕ СОЕДИНЕНИЕ ВТПродажиЗаПериод КАК ВТПродажиЗаПериод
ПО ВТКоличествоДнейХранения.Номенклатура = ВТПродажиЗаПериод.Номенклатура
</code>
2. Для получения данных добавил регистр накопления Взаиморасчеты (остатки, изм. Контрагенты, рес. Сумма, приход – реализация, расход – поступление). Модифицировал обработки проведения указанных документов и заполнил регистр. На основании данных регистра формирую нужные данные запросом:
<code>
ВЫБРАТЬ
ВзаиморасчетыОстаткиИОбороты.Период,
ВзаиморасчетыОстаткиИОбороты.Контрагент,
ВзаиморасчетыОстаткиИОбороты.СуммаНачальныйОстаток,
ВзаиморасчетыОстаткиИОбороты.СуммаПриход,
ВзаиморасчетыОстаткиИОбороты.СуммаРасход,
ВзаиморасчетыОстаткиИОбороты.СуммаКонечныйОстаток
ПОМЕСТИТЬ ВТОсновныеДанные
ИЗ
РегистрНакопления.Взаиморасчеты.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, День, ДвиженияИГраницыПериода, ) КАК ВзаиморасчетыОстаткиИОбороты
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВТОсновныеДанныеПЗ.Контрагент,
МИНИМУМ(РАЗНОСТЬДАТ(ВТОсновныеДанныеПЗ.Период, ВТОсновныеДанныеВЗ.Период, ДЕНЬ)) КАК Длительность,
ВТОсновныеДанныеПЗ.СуммаКонечныйОстаток КАК Сумма
ПОМЕСТИТЬ ВТДанные
ИЗ
ВТОсновныеДанные КАК ВТОсновныеДанныеПЗ
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТОсновныеДанные КАК ВТОсновныеДанныеВЗ
ПО ВТОсновныеДанныеПЗ.Контрагент = ВТОсновныеДанныеВЗ.Контрагент
И ВТОсновныеДанныеПЗ.СуммаКонечныйОстаток = ВТОсновныеДанныеВЗ.СуммаНачальныйОстаток
И ВТОсновныеДанныеПЗ.Период < ВТОсновныеДанныеВЗ.Период
СГРУППИРОВАТЬ ПО
ВТОсновныеДанныеПЗ.Контрагент,
ВТОсновныеДанныеПЗ.СуммаКонечныйОстаток
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВТДанные.Контрагент,
СУММА(ВЫБОР
КОГДА ВТДанные.Сумма >= 0
ТОГДА ВТДанные.Сумма * ВТДанные.Длительность
ИНАЧЕ 0
КОНЕЦ) КАК УровеньДебиторки,
СУММА(ВЫБОР
КОГДА ВТДанные.Сумма < 0
ТОГДА ВТДанные.Сумма * ВТДанные.Длительность
ИНАЧЕ 0
КОНЕЦ) КАК ОбъемКредиторки
ИЗ
ВТДанные КАК ВТДанные
СГРУППИРОВАТЬ ПО
ВТДанные.Контрагент
ИТОГИ ПО
ОБЩИЕ
</code>
Задание выполнено.
Оказалось весьма не простым для меня, пришлось немало поломать голову. :-)
Задача №1. В первом запросе пакета формируется временная таблица События, где для каждой даты периода указана дата ближайшего прошлого (включая саму дату периода) события с товаром. Во втором запросе пакета для каждого товара вычисляется кол-во дней, в течение которых он был на остатке. Вычисление производится так: если дата периода = дате события, то товар считается находившемся если был на начальном остатке этого дня, либо в течение дня было поступление товара. Если дата периода не соответствует дате события, то факт нахождения определяется исходя из конечного остатка на дату события. Также учитывается был ли день рабочим согласно выбранного графика, и если нет, то день нахождения на остатке в любом случае не засчитывается. Результат вычислений помещается в ВТ ДниНаОстатке, которая в третьем запросе соединяется с таблицей оборотов регистра Продажи и вычисляется скорость продажи. Если по товару были продажи в периоде, а дней на остатке не было (такое может быть, если были продажи в “минус” остатка), то скорость принимает значение “неопределено”.
Сам текст запроса:
<code>
ВЫБРАТЬ
ГрафикиРаботы.Дата КАК Дата,
МАКСИМУМ(ОстаткиТоваровОстаткиИОбороты.Период) КАК ДатаСобытия,
ОстаткиТоваровОстаткиИОбороты.Номенклатура КАК Номенклатура,
ГрафикиРаботы.Значение КАК РабочийДень
ПОМЕСТИТЬ События
ИЗ
РегистрСведений.ГрафикиРаботы КАК ГрафикиРаботы
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиТоваров.ОстаткиИОбороты(&НачПериода, &КонПериода, День, ДвиженияИГраницыПериода, ) КАК ОстаткиТоваровОстаткиИОбороты
ПО ГрафикиРаботы.Дата >= ОстаткиТоваровОстаткиИОбороты.Период
ГДЕ
ГрафикиРаботы.ТипГрафика = &ТипГрафика
СГРУППИРОВАТЬ ПО
ОстаткиТоваровОстаткиИОбороты.Номенклатура,
ГрафикиРаботы.Дата,
ГрафикиРаботы.Значение
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
События.Номенклатура КАК Номенклатура,
СУММА(ВЫБОР
КОГДА События.РабочийДень > 0
ТОГДА ВЫБОР
КОГДА События.Дата = ОстаткиТоваровОстаткиИОбороты.Период
ТОГДА ВЫБОР
КОГДА ОстаткиТоваровОстаткиИОбороты.КоличествоНачальныйОстаток + ОстаткиТоваровОстаткиИОбороты.КоличествоПриход > 0
ТОГДА 1
ИНАЧЕ 0
КОНЕЦ
ИНАЧЕ ВЫБОР
КОГДА ОстаткиТоваровОстаткиИОбороты.КоличествоКонечныйОстаток > 0
ТОГДА 1
ИНАЧЕ 0
КОНЕЦ
КОНЕЦ
ИНАЧЕ 0
КОНЕЦ) КАК ДнейНаОстатке
ПОМЕСТИТЬ ДниНаОстатке
ИЗ
События КАК События
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиТоваров.ОстаткиИОбороты(&НачПериода, &КонПериода, День, ДвиженияИГраницыПериода, ) КАК ОстаткиТоваровОстаткиИОбороты
ПО События.Номенклатура = ОстаткиТоваровОстаткиИОбороты.Номенклатура
И События.ДатаСобытия = ОстаткиТоваровОстаткиИОбороты.Период
СГРУППИРОВАТЬ ПО
События.Номенклатура
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ПродажиОбороты.Номенклатура,
ВЫБОР
КОГДА ЕСТЬNULL(ДниНаОстатке.ДнейНаОстатке, 0) = 0
ТОГДА “неопределено”
ИНАЧЕ ПродажиОбороты.КоличествоОборот / ДниНаОстатке.ДнейНаОстатке
КОНЕЦ КАК СкоростьПродажи
ИЗ
РегистрНакопления.Продажи.Обороты(&НачПериода, &КонПериода, , ) КАК ПродажиОбороты
ЛЕВОЕ СОЕДИНЕНИЕ ДниНаОстатке КАК ДниНаОстатке
ПО ПродажиОбороты.Номенклатура = ДниНаОстатке.Номенклатура
ГДЕ
ПродажиОбороты.КоличествоОборот > 0
</code>
Задача №2. В качестве источника данных используется регистр Взаиморасчеты. Оплату клиента я эмулировал с помощью документа Поступление товаров. Кстати, почему-то в каркасной конфигурации и в док-те Поступление товаров, и в док-те Реализация товаров по регистру Продажи делается расход, на сумму документа. Я исправил документ реализации, сейчас он делает приход по регистру, таким образом положительное значение ресурса соответствует долгу клиента (дебиторская задолженность), а отрицательная – долгу перед клиентом.
Сам пакет состоит из двух запросов. В первом путем соединения виртуальной таблицы оборотов регистра Продажи самой с собой и последующей группировки получаем все ВТ движений по взаиморасчетам за период, сопоставленных с датой следующего изменения долга. Во втором запросе пакета на основании этой ВТ вычисляются уровни выданных и полученных кредитов (учетом того долга, который мог существовать на начало анализируемого периода).
Текст запроса:
<code>
ВЫБРАТЬ
ВзаиморасчетыОстаткиИОбороты.Контрагент КАК Контрагент,
ВзаиморасчетыОстаткиИОбороты.Период КАК Дата,
ВзаиморасчетыОстаткиИОбороты.СуммаКонечныйОстаток КАК Долг,
МИНИМУМ(ВзаиморасчетыОстаткиИОбороты1.Период) КАК ДатаСледующая,
ВзаиморасчетыОстаткиИОбороты.СуммаНачальныйОстаток КАК ДолгНаНачало
ПОМЕСТИТЬ ИсторияРасчетов
ИЗ
РегистрНакопления.Взаиморасчеты.ОстаткиИОбороты(&НачПериода, &КонПериода, День, ДвиженияИГраницыПериода, ) КАК ВзаиморасчетыОстаткиИОбороты
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Взаиморасчеты.ОстаткиИОбороты(&НачПериода, &КонПериода, День, ДвиженияИГраницыПериода, ) КАК ВзаиморасчетыОстаткиИОбороты1
ПО ВзаиморасчетыОстаткиИОбороты.Контрагент = ВзаиморасчетыОстаткиИОбороты1.Контрагент
И ВзаиморасчетыОстаткиИОбороты.Период < ВзаиморасчетыОстаткиИОбороты1.Период
СГРУППИРОВАТЬ ПО
ВзаиморасчетыОстаткиИОбороты.Контрагент,
ВзаиморасчетыОстаткиИОбороты.Период,
ВзаиморасчетыОстаткиИОбороты.СуммаКонечныйОстаток,
ВзаиморасчетыОстаткиИОбороты.СуммаНачальныйОстаток
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ИсторияРасчетов.Контрагент,
СУММА(ВЫБОР
КОГДА ИсторияРасчетов.Дата = &Начпериода
И ИсторияРасчетов.ДолгНаНачало > 0
ТОГДА ИсторияРасчетов.ДолгНаНачало
ИНАЧЕ 0
КОНЕЦ + ВЫБОР
КОГДА ИсторияРасчетов.Долг > 0
ТОГДА ИсторияРасчетов.Долг * РАЗНОСТЬДАТ(ИсторияРасчетов.Дата, ИсторияРасчетов.ДатаСледующая, ДЕНЬ)
ИНАЧЕ 0
КОНЕЦ) КАК РейтингВыданныхКредитов,
СУММА(ВЫБОР
КОГДА ИсторияРасчетов.Дата = &Начпериода
И ИсторияРасчетов.ДолгНаНачало < 0
ТОГДА -ИсторияРасчетов.ДолгНаНачало
ИНАЧЕ 0
КОНЕЦ + ВЫБОР
КОГДА ИсторияРасчетов.Долг < 0
ТОГДА -ИсторияРасчетов.Долг * РАЗНОСТЬДАТ(ИсторияРасчетов.Дата, ИсторияРасчетов.ДатаСледующая, ДЕНЬ)
ИНАЧЕ 0
КОНЕЦ) КАК РейтингПолученныхКредитов
ИЗ
ИсторияРасчетов КАК ИсторияРасчетов
СГРУППИРОВАТЬ ПО
ИсторияРасчетов.Контрагент
</code>
ВЫБРАТЬ
ГрафикиРаботы.Дата КАК Дата,
МАКСИМУМ(ОстаткиТоваровОстаткиИОбороты.Период) КАК ДатаСобытия,
ОстаткиТоваровОстаткиИОбороты.Номенклатура КАК Номенклатура,
ГрафикиРаботы.Значение КАК РабочийДень
ПОМЕСТИТЬ События
ИЗ
РегистрСведений.ГрафикиРаботы КАК ГрафикиРаботы
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиТоваров.ОстаткиИОбороты(&НачПериода, &КонПериода, День, ДвиженияИГраницыПериода, ) КАК ОстаткиТоваровОстаткиИОбороты
ПО ГрафикиРаботы.Дата >= ОстаткиТоваровОстаткиИОбороты.Период
ГДЕ
ГрафикиРаботы.ТипГрафика = &ТипГрафика
СГРУППИРОВАТЬ ПО
ОстаткиТоваровОстаткиИОбороты.Номенклатура,
ГрафикиРаботы.Дата,
ГрафикиРаботы.Значение
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
События.Номенклатура КАК Номенклатура,
СУММА(ВЫБОР
КОГДА События.РабочийДень > 0
ТОГДА ВЫБОР
КОГДА События.Дата = ОстаткиТоваровОстаткиИОбороты.Период
ТОГДА ВЫБОР
КОГДА ОстаткиТоваровОстаткиИОбороты.КоличествоНачальныйОстаток + ОстаткиТоваровОстаткиИОбороты.КоличествоПриход > 0
ТОГДА 1
ИНАЧЕ 0
КОНЕЦ
ИНАЧЕ ВЫБОР
КОГДА ОстаткиТоваровОстаткиИОбороты.КоличествоКонечныйОстаток > 0
ТОГДА 1
ИНАЧЕ 0
КОНЕЦ
КОНЕЦ
ИНАЧЕ 0
КОНЕЦ) КАК ДнейНаОстатке
ПОМЕСТИТЬ ДниНаОстатке
ИЗ
События КАК События
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиТоваров.ОстаткиИОбороты(&НачПериода, &КонПериода, День, ДвиженияИГраницыПериода, ) КАК ОстаткиТоваровОстаткиИОбороты
ПО События.Номенклатура = ОстаткиТоваровОстаткиИОбороты.Номенклатура
И События.ДатаСобытия = ОстаткиТоваровОстаткиИОбороты.Период
СГРУППИРОВАТЬ ПО
События.Номенклатура
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ПродажиОбороты.Номенклатура,
ВЫБОР
КОГДА ЕСТЬNULL(ДниНаОстатке.ДнейНаОстатке, 0) = 0
ТОГДА “неопределено”
ИНАЧЕ ПродажиОбороты.КоличествоОборот / ДниНаОстатке.ДнейНаОстатке
КОНЕЦ КАК СкоростьПродажи
ИЗ
РегистрНакопления.Продажи.Обороты(&НачПериода, &КонПериода, , ) КАК ПродажиОбороты
ЛЕВОЕ СОЕДИНЕНИЕ ДниНаОстатке КАК ДниНаОстатке
ПО ПродажиОбороты.Номенклатура = ДниНаОстатке.Номенклатура
ГДЕ
ПродажиОбороты.КоличествоОборот > 0
Задача 1.
Используем временные таблицы:
Продажи – продажа номенлатуры за период
ДатыПрихода – товар на склад поступил.
ДатыРасхода – товар на складе закончился.
ТаблицаДвижений – сводная таблица по периоду нахождения товара на складе.
КоличествоДней – количество дней нахождения на складе за вычетом выходных.
В результирующем запросе вычисляем скорость продаж, используя таблицы Продажи и КоличествоДней. Если требуется получить полный список товаров, включая те, по которым продаж не было, нужно добавить справочник “Номенклатура”.
ВЫБРАТЬ
ПродажиОбороты.Номенклатура,
ПродажиОбороты.КоличествоОборот
ПОМЕСТИТЬ Продажи
ИЗ
РегистрНакопления.Продажи.Обороты(&Начало, &Конец, , ) КАК ПродажиОбороты
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ОстаткиТоваровОстаткиИОбороты.Номенклатура,
ОстаткиТоваровОстаткиИОбороты.Период
ПОМЕСТИТЬ ДатыПрихода
ИЗ
РегистрНакопления.ОстаткиТоваров.ОстаткиИОбороты(
&Начало,
&Конец,
День,
ДвиженияИГраницыПериода,
Номенклатура В
(ВЫБРАТЬ
Продажи.Номенклатура
ИЗ
Продажи КАК Продажи)) КАК ОстаткиТоваровОстаткиИОбороты
ГДЕ
(ОстаткиТоваровОстаткиИОбороты.КоличествоНачальныйОстаток = 0
ИЛИ ОстаткиТоваровОстаткиИОбороты.Период = &Начало)
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ОстаткиТоваровОстаткиИОбороты.Номенклатура,
ОстаткиТоваровОстаткиИОбороты.Период
ПОМЕСТИТЬ ДатыРасхода
ИЗ
РегистрНакопления.ОстаткиТоваров.ОстаткиИОбороты(
&Начало,
&Конец,
День,
ДвиженияИГраницыПериода,
Номенклатура В
(ВЫБРАТЬ
Продажи.Номенклатура
ИЗ
Продажи КАК Продажи)) КАК ОстаткиТоваровОстаткиИОбороты
ГДЕ
(ОстаткиТоваровОстаткиИОбороты.КоличествоКонечныйОстаток = 0
ИЛИ ОстаткиТоваровОстаткиИОбороты.Период = &Конец)
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ДатыПрихода.Номенклатура,
ДатыПрихода.Период КАК ДатаПрихода,
МИНИМУМ(ДатыРасхода.Период) КАК ДатаРасхода
ПОМЕСТИТЬ ТаблицаДвижений
ИЗ
ДатыРасхода КАК ДатыРасхода
ПОЛНОЕ СОЕДИНЕНИЕ ДатыПрихода КАК ДатыПрихода
ПО ДатыРасхода.Номенклатура = ДатыПрихода.Номенклатура
И (ДатыРасхода.Период > ДатыПрихода.Период
ИЛИ ДатыРасхода.Период = ДатыПрихода.Период)
СГРУППИРОВАТЬ ПО
ДатыПрихода.Номенклатура,
ДатыПрихода.Период
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ТаблицаДвижений.Номенклатура КАК Номенклатура,
СУММА(ЕСТЬNULL(ГрафикиРаботы.Значение, 0)) КАК Дни
ПОМЕСТИТЬ КоличествоДней
ИЗ
ТаблицаДвижений КАК ТаблицаДвижений
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ГрафикиРаботы КАК ГрафикиРаботы
ПО ТаблицаДвижений.ДатаПрихода <= ГрафикиРаботы.Дата
И ТаблицаДвижений.ДатаРасхода >= ГрафикиРаботы.Дата
ГДЕ
ГрафикиРаботы.ТипГрафика = &ТипГрафика
СГРУППИРОВАТЬ ПО
ТаблицаДвижений.Номенклатура
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
Продажи.Номенклатура КАК Номенклатура,
ВЫРАЗИТЬ(Продажи.КоличествоОборот / КоличествоДней.Дни КАК ЧИСЛО(15, 2)) КАК СкоростьПродажи
ИЗ
Продажи КАК Продажи
ЛЕВОЕ СОЕДИНЕНИЕ КоличествоДней КАК КоличествоДней
ПО Продажи.Номенклатура = КоличествоДней.Номенклатура
УПОРЯДОЧИТЬ ПО
Номенклатура
Задача 2
По условияю задачи должна фиксироваться оплата от покупателей и поставщикам. Так как в конфигурации имеются только документы поступления/выдачи товаров, придется добавить документ оплаты, который будет фиксировать сумму прихода или расхода денежных средств. Также добавим регистр “Взаиморасчеты” (измерение “Контрагент”, ресурс “Сумма”, с регистраторами “ПоступлениеТоваровИУслуг”, “РеализацияТоваровИУслуг”, “ДокументОплаты”) и добавим движения по регистру в документы.
Используем временную таблицу Взаиморасчеты, куда выбираем ненулевые конечные остатки, период текущих данных и период следующей операции. Периодичность вывода “День”, т.к. отгрузки и оплаты в течение одного дня не влияют на выводимый показатель. В конечном запросе выводим показатели в две колонки по кредиторской и дебиторской задолженности и рассчитываем итоги.
ВЫБРАТЬ
ВзаиморасчетыОстаткиИОбороты.Контрагент КАК Контрагент,
ВзаиморасчетыОстаткиИОбороты.Период КАК Период,
МИНИМУМ(ВзаиморасчетыОстаткиИОбороты1.Период) КАК СледующийПериод,
ВзаиморасчетыОстаткиИОбороты.СуммаКонечныйОстаток
ПОМЕСТИТЬ Взаиморасчеты
ИЗ
РегистрНакопления.Взаиморасчеты.ОстаткиИОбороты(&Начало, &Конец, День, ДвиженияИГраницыПериода, ) КАК ВзаиморасчетыОстаткиИОбороты
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Взаиморасчеты.ОстаткиИОбороты(&Начало, &Конец, День, ДвиженияИГраницыПериода, ) КАК
ВзаиморасчетыОстаткиИОбороты1
ПО ВзаиморасчетыОстаткиИОбороты.Контрагент = ВзаиморасчетыОстаткиИОбороты1.Контрагент
И ВзаиморасчетыОстаткиИОбороты.Период < ВзаиморасчетыОстаткиИОбороты1.Период
ГДЕ
ВзаиморасчетыОстаткиИОбороты.Период <> &Конец
И ВзаиморасчетыОстаткиИОбороты.СуммаКонечныйОстаток <> 0
СГРУППИРОВАТЬ ПО
ВзаиморасчетыОстаткиИОбороты.Контрагент,
ВзаиморасчетыОстаткиИОбороты.Период,
ВзаиморасчетыОстаткиИОбороты.СуммаКонечныйОстаток;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
Взаиморасчеты.Контрагент КАК Контрагент,
СУММА(ВЫБОР
КОГДА Взаиморасчеты.СуммаКонечныйОстаток > 0
ТОГДА РАЗНОСТЬДАТ(Взаиморасчеты.Период, Взаиморасчеты.СледующийПериод, ДЕНЬ) *
Взаиморасчеты.СуммаКонечныйОстаток
ИНАЧЕ 0
КОНЕЦ) КАК Дебиторская,
СУММА(ВЫБОР
КОГДА Взаиморасчеты.СуммаКонечныйОстаток < 0
ТОГДА -РАЗНОСТЬДАТ(Взаиморасчеты.Период, Взаиморасчеты.СледующийПериод, ДЕНЬ) *
Взаиморасчеты.СуммаКонечныйОстаток
ИНАЧЕ 0
КОНЕЦ) КАК Кредиторская
ИЗ
Взаиморасчеты КАК Взаиморасчеты
СГРУППИРОВАТЬ ПО
Взаиморасчеты.Контрагент
УПОРЯДОЧИТЬ ПО
Контрагент
ИТОГИ
СУММА(Дебиторская),
СУММА(Кредиторская)
ПО
ОБЩИЕ,
Контрагент ИЕРАРХИЯ
P.S. я не стал делать в конфигурации изменения, просто вместо документа оплаты я использовал документ поступления, хотя не сложно все это перевести на регистраторы регистра накопления, скажем Взаиморасчеты
Ок.
Задание выполнено. Хорошая вышла головоломка, пришлось многое делать пошагово и не раз менять подход к решению. Решение ниже:
Задача 1.
ВЫБРАТЬ
ГрафикиРаботы.Дата КАК Дата,
ОстаткиТоваровОстаткиИОбороты.Номенклатура КАК Номенклатура,
МАКСИМУМ(ОстаткиТоваровОстаткиИОбороты.Период) КАК Период
ПОМЕСТИТЬ Остатки
ИЗ
РегистрСведений.ГрафикиРаботы КАК ГрафикиРаботы
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиТоваров.ОстаткиИОбороты(, , День, ДвиженияИГраницыПериода, ) КАК ОстаткиТоваровОстаткиИОбороты
ПО ГрафикиРаботы.Дата > ОстаткиТоваровОстаткиИОбороты.Период
ГДЕ
ГрафикиРаботы.Дата МЕЖДУ &НачДата И &КонДата
И ГрафикиРаботы.Значение = 1
И ГрафикиРаботы.ТипГрафика = &ТипГрафика
СГРУППИРОВАТЬ ПО
ГрафикиРаботы.Дата,
ОстаткиТоваровОстаткиИОбороты.Номенклатура
ИНДЕКСИРОВАТЬ ПО
Дата,
Номенклатура
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
Остатки.Номенклатура КАК Номенклатура,
СУММА(ВЫБОР
КОГДА ОстаткиТоваровОстаткиИОбороты.КоличествоКонечныйОстаток + ЕСТЬNULL(ОстаткиТоваровОбороты.КоличествоПриход, 0) > 0
ТОГДА 1
ИНАЧЕ 0
КОНЕЦ) КАК КолвоДнейХранения
ПОМЕСТИТЬ ДниХранения
ИЗ
Остатки КАК Остатки
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиТоваров.ОстаткиИОбороты(, , День, ДвиженияИГраницыПериода, ) КАК ОстаткиТоваровОстаткиИОбороты
ПО Остатки.Период = ОстаткиТоваровОстаткиИОбороты.Период
И Остатки.Номенклатура = ОстаткиТоваровОстаткиИОбороты.Номенклатура
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиТоваров.Обороты(, , День, ) КАК ОстаткиТоваровОбороты
ПО Остатки.Дата = ОстаткиТоваровОбороты.Период
И Остатки.Номенклатура = ОстаткиТоваровОбороты.Номенклатура
СГРУППИРОВАТЬ ПО
Остатки.Номенклатура
ИНДЕКСИРОВАТЬ ПО
Номенклатура
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ПродажиОбороты.Номенклатура,
СУММА(ПродажиОбороты.КоличествоОборот / ЕСТЬNULL(ДниХранения.КолвоДнейХранения, 1)) КАК ЧастотаПродаж
ИЗ
РегистрНакопления.Продажи.Обороты(&НачДата, &КонДата, День, ) КАК ПродажиОбороты
ЛЕВОЕ СОЕДИНЕНИЕ ДниХранения КАК ДниХранения
ПО ПродажиОбороты.Номенклатура = ДниХранения.Номенклатура
СГРУППИРОВАТЬ ПО
ПродажиОбороты.Номенклатура
Задача 2.
ВЫБРАТЬ
НАЧАЛОПЕРИОДА(ПоступлениеТоваровИУслугТовары.Ссылка.Дата, ДЕНЬ) КАК Дата,
ПоступлениеТоваровИУслугТовары.Ссылка.Контрагент КАК Контрагент,
-СУММА(ПоступлениеТоваровИУслугТовары.Сумма) КАК Сумма
ПОМЕСТИТЬ Общая
ИЗ
Документ.ПоступлениеТоваровИУслуг.Товары КАК ПоступлениеТоваровИУслугТовары
ГДЕ
ПоступлениеТоваровИУслугТовары.Ссылка.Дата МЕЖДУ &Дата1 И &Дата2
СГРУППИРОВАТЬ ПО
НАЧАЛОПЕРИОДА(ПоступлениеТоваровИУслугТовары.Ссылка.Дата, ДЕНЬ),
ПоступлениеТоваровИУслугТовары.Ссылка.Контрагент
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
НАЧАЛОПЕРИОДА(РеализацияТоваровИУслугТовары.Ссылка.Дата, ДЕНЬ),
РеализацияТоваровИУслугТовары.Ссылка.Контрагент,
СУММА(РеализацияТоваровИУслугТовары.Сумма)
ИЗ
Документ.РеализацияТоваровИУслуг.Товары КАК РеализацияТоваровИУслугТовары
ГДЕ
РеализацияТоваровИУслугТовары.Ссылка.Дата МЕЖДУ &Дата1 И &Дата2
СГРУППИРОВАТЬ ПО
РеализацияТоваровИУслугТовары.Ссылка.Контрагент,
НАЧАЛОПЕРИОДА(РеализацияТоваровИУслугТовары.Ссылка.Дата, ДЕНЬ)
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
Общая.Дата КАК Дата,
Общая.Контрагент КАК Контрагент,
СУММА(Общая.Сумма) КАК Сумма,
МИНИМУМ(Общая1.Дата) КАК Дата1
ПОМЕСТИТЬ ПоДатам
ИЗ
Общая КАК Общая
ЛЕВОЕ СОЕДИНЕНИЕ Общая КАК Общая1
ПО Общая.Контрагент = Общая1.Контрагент
И Общая.Дата < Общая1.Дата
СГРУППИРОВАТЬ ПО
Общая.Дата,
Общая.Контрагент
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ПоДатам.Дата КАК Дата,
ПоДатам.Контрагент КАК Контрагент,
ПоДатам.Сумма,
ЕСТЬNULL(ПоДатам.Дата1, &Дата2) КАК Поле1,
СУММА(Общая.Сумма) КАК Сумма1,
РАЗНОСТЬДАТ(ПоДатам.Дата, ЕСТЬNULL(ПоДатам.Дата1, &Дата2), ДЕНЬ) КАК КоличествоДней,
РАЗНОСТЬДАТ(ПоДатам.Дата, ЕСТЬNULL(ПоДатам.Дата1, &Дата2), ДЕНЬ) * СУММА(Общая.Сумма) КАК Уровень
ПОМЕСТИТЬ Итоговая
ИЗ
ПоДатам КАК ПоДатам
ЛЕВОЕ СОЕДИНЕНИЕ Общая КАК Общая
ПО ПоДатам.Контрагент = Общая.Контрагент
И ПоДатам.Дата >= Общая.Дата
СГРУППИРОВАТЬ ПО
ПоДатам.Дата,
ПоДатам.Контрагент,
ПоДатам.Дата1,
ПоДатам.Сумма
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
Итоговая.Контрагент КАК Контрагент,
ВЫБОР
КОГДА Итоговая.Уровень > 0
ТОГДА Итоговая.Уровень
ИНАЧЕ 0
КОНЕЦ КАК УровеньВыданных,
ВЫБОР
КОГДА Итоговая.Уровень < 0
ТОГДА -Итоговая.Уровень
ИНАЧЕ 0
КОНЕЦ КАК УровеньПолученных
ИЗ
Итоговая КАК Итоговая
ГДЕ
Итоговая.Поле1 = &Дата2
УПОРЯДОЧИТЬ ПО
Контрагент
ИТОГИ
СУММА(УровеньВыданных),
СУММА(УровеньПолученных)
ПО
ОБЩИЕ
Задание выполнено. Хорошая вышла головоломка, пришлось многое делать пошагово и не раз менять подход к решению. Решение ниже:
Задача 1.
ВЫБРАТЬ
ГрафикиРаботы.Дата КАК Дата,
ОстаткиТоваровОстаткиИОбороты.Номенклатура КАК Номенклатура,
МАКСИМУМ(ОстаткиТоваровОстаткиИОбороты.Период) КАК Период
ПОМЕСТИТЬ Остатки
ИЗ
РегистрСведений.ГрафикиРаботы КАК ГрафикиРаботы
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиТоваров.ОстаткиИОбороты(, , День, ДвиженияИГраницыПериода, ) КАК ОстаткиТоваровОстаткиИОбороты
ПО ГрафикиРаботы.Дата > ОстаткиТоваровОстаткиИОбороты.Период
ГДЕ
ГрафикиРаботы.Дата МЕЖДУ &НачДата И &КонДата
И ГрафикиРаботы.Значение = 1
И ГрафикиРаботы.ТипГрафика = &ТипГрафика
СГРУППИРОВАТЬ ПО
ГрафикиРаботы.Дата,
ОстаткиТоваровОстаткиИОбороты.Номенклатура
ИНДЕКСИРОВАТЬ ПО
Дата,
Номенклатура
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
Остатки.Номенклатура КАК Номенклатура,
СУММА(ВЫБОР
КОГДА ОстаткиТоваровОстаткиИОбороты.КоличествоКонечныйОстаток + ЕСТЬNULL(ОстаткиТоваровОбороты.КоличествоПриход, 0) > 0
ТОГДА 1
ИНАЧЕ 0
КОНЕЦ) КАК КолвоДнейХранения
ПОМЕСТИТЬ ДниХранения
ИЗ
Остатки КАК Остатки
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиТоваров.ОстаткиИОбороты(, , День, ДвиженияИГраницыПериода, ) КАК ОстаткиТоваровОстаткиИОбороты
ПО Остатки.Период = ОстаткиТоваровОстаткиИОбороты.Период
И Остатки.Номенклатура = ОстаткиТоваровОстаткиИОбороты.Номенклатура
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиТоваров.Обороты(, , День, ) КАК ОстаткиТоваровОбороты
ПО Остатки.Дата = ОстаткиТоваровОбороты.Период
И Остатки.Номенклатура = ОстаткиТоваровОбороты.Номенклатура
СГРУППИРОВАТЬ ПО
Остатки.Номенклатура
ИНДЕКСИРОВАТЬ ПО
Номенклатура
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ПродажиОбороты.Номенклатура,
СУММА(ПродажиОбороты.КоличествоОборот / ЕСТЬNULL(ДниХранения.КолвоДнейХранения, 1)) КАК ЧастотаПродаж
ИЗ
РегистрНакопления.Продажи.Обороты(&НачДата, &КонДата, День, ) КАК ПродажиОбороты
ЛЕВОЕ СОЕДИНЕНИЕ ДниХранения КАК ДниХранения
ПО ПродажиОбороты.Номенклатура = ДниХранения.Номенклатура
СГРУППИРОВАТЬ ПО
ПродажиОбороты.Номенклатура
Задача 2.
ВЫБРАТЬ
НАЧАЛОПЕРИОДА(ПоступлениеТоваровИУслугТовары.Ссылка.Дата, ДЕНЬ) КАК Дата,
ПоступлениеТоваровИУслугТовары.Ссылка.Контрагент КАК Контрагент,
-СУММА(ПоступлениеТоваровИУслугТовары.Сумма) КАК Сумма
ПОМЕСТИТЬ Общая
ИЗ
Документ.ПоступлениеТоваровИУслуг.Товары КАК ПоступлениеТоваровИУслугТовары
ГДЕ
ПоступлениеТоваровИУслугТовары.Ссылка.Дата МЕЖДУ &Дата1 И &Дата2
СГРУППИРОВАТЬ ПО
НАЧАЛОПЕРИОДА(ПоступлениеТоваровИУслугТовары.Ссылка.Дата, ДЕНЬ),
ПоступлениеТоваровИУслугТовары.Ссылка.Контрагент
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
НАЧАЛОПЕРИОДА(РеализацияТоваровИУслугТовары.Ссылка.Дата, ДЕНЬ),
РеализацияТоваровИУслугТовары.Ссылка.Контрагент,
СУММА(РеализацияТоваровИУслугТовары.Сумма)
ИЗ
Документ.РеализацияТоваровИУслуг.Товары КАК РеализацияТоваровИУслугТовары
ГДЕ
РеализацияТоваровИУслугТовары.Ссылка.Дата МЕЖДУ &Дата1 И &Дата2
СГРУППИРОВАТЬ ПО
РеализацияТоваровИУслугТовары.Ссылка.Контрагент,
НАЧАЛОПЕРИОДА(РеализацияТоваровИУслугТовары.Ссылка.Дата, ДЕНЬ)
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
Общая.Дата КАК Дата,
Общая.Контрагент КАК Контрагент,
СУММА(Общая.Сумма) КАК Сумма,
МИНИМУМ(Общая1.Дата) КАК Дата1
ПОМЕСТИТЬ ПоДатам
ИЗ
Общая КАК Общая
ЛЕВОЕ СОЕДИНЕНИЕ Общая КАК Общая1
ПО Общая.Контрагент = Общая1.Контрагент
И Общая.Дата < Общая1.Дата
СГРУППИРОВАТЬ ПО
Общая.Дата,
Общая.Контрагент
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ПоДатам.Дата КАК Дата,
ПоДатам.Контрагент КАК Контрагент,
ПоДатам.Сумма,
ЕСТЬNULL(ПоДатам.Дата1, &Дата2) КАК Поле1,
СУММА(Общая.Сумма) КАК Сумма1,
РАЗНОСТЬДАТ(ПоДатам.Дата, ЕСТЬNULL(ПоДатам.Дата1, &Дата2), ДЕНЬ) КАК КоличествоДней,
РАЗНОСТЬДАТ(ПоДатам.Дата, ЕСТЬNULL(ПоДатам.Дата1, &Дата2), ДЕНЬ) * СУММА(Общая.Сумма) КАК Уровень
ПОМЕСТИТЬ Итоговая
ИЗ
ПоДатам КАК ПоДатам
ЛЕВОЕ СОЕДИНЕНИЕ Общая КАК Общая
ПО ПоДатам.Контрагент = Общая.Контрагент
И ПоДатам.Дата >= Общая.Дата
СГРУППИРОВАТЬ ПО
ПоДатам.Дата,
ПоДатам.Контрагент,
ПоДатам.Дата1,
ПоДатам.Сумма
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
Итоговая.Контрагент КАК Контрагент,
ВЫБОР
КОГДА Итоговая.Уровень > 0
ТОГДА Итоговая.Уровень
ИНАЧЕ 0
КОНЕЦ КАК УровеньВыданных,
ВЫБОР
КОГДА Итоговая.Уровень < 0
ТОГДА -Итоговая.Уровень
ИНАЧЕ 0
КОНЕЦ КАК УровеньПолученных
ИЗ
Итоговая КАК Итоговая
ГДЕ
Итоговая.Поле1 = &Дата2
УПОРЯДОЧИТЬ ПО
Контрагент
ИТОГИ
СУММА(УровеньВыданных),
СУММА(УровеньПолученных)
ПО
ОБЩИЕ
Ну, так как мысли все кончились – рапортую. Задание выполнено, но как-то коряво…. очень коряво….. Искал другие пути решения, более оптимальные, всю голову сломал, но не нашел. Данные по отдельности без проблем получаю, но вот с объединением этих данных что-то не получается сразу сделать по-нормальному. Сложные запросы всегда были для меня темным лесом. :( Где-то я что-то не понимаю. Уроки смотришь, вроде все элементарно и просто. А как дело доходит до самостоятельного решения – такой огород начинаешь городить. :( Я уже тут подумываю насчет какой-то “шпаргалки по запросам”, чтобы постоянно висела перед глазами :)
А что бы хотелось видеть в этой шпаргалке?
Ну, к примеру, что дают различные соединения, нарастание итога, срезы на дату (какие связи и с чем играют важную роль). Честно говоря, я пока для себя в голове не до конца сформировал, как это компактно изложить и чтобы я хотел видеть в этой шпаргалке
Понятно. Скоро будет новая сессия МГ, где будет показан новый способ (наиболее правильный) получения нарастающего итога и другие вкусности.
Спасибо! Вы, как всегда, на высоте!