1с скд остатки на каждый день

also Что-то вроде FAQ Отзывов (29) В закладки

С задачей получения среза последних на каждую дату рано или поздно сталкиваются все. Безусловно, это задача достаточно просто решается запросом с соединением по максимальной дате из меньших или равных дат. Но эту же задачу можно решить и с помощью компоновки данных. Не будем рассуждать о том, какой из способов более производителен, все может зависеть от конкретной задачи.

Первый набор данных:

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

Создадим набор данных-запрос “ПродажиОбороты”:

Рис. 1 Вкладка ресурсы набора данных ПродажиОбороты

Рис. 2 Настройки отчета

Сейчас наш отчет будет иметь следующий вид:

Рис. 3 Формирование отчета с одним набором данных

Теперь необходимо добавить в отчет колонку “Цена по прайсу”, которая будет подтягиваться из регистра сведений “Цены номенклатуры” на дату продажи.

Второй набор данных:

Добавим второй набор данных-запрос “Цены”, цены будем брать для фиксированного типа цен:

В данном наборе данных три параметра: Дата, Номенклатура и тип цен. Из низ самые интересные Дата и Номенклатура. Они будут использованы при соединении наборов данных, причем параметр данных присутствует как в параметрах виртуальной таблицы, так и в выбранных полях.

Соединения наборов:

Приступим к основной “фишке” данного метода – соединениям наборов:

Рис. 4 Соединение наборов данных

Здесь самое основное правильно настроить параметры. Если указан параметр,то СКД передает в приемник связи параметры, указанные в соединении. Значениями этих параметров будут значения соответствующих полей источника связи.

Далее добавим поле цена в ресурсы и в выбранные поля.

Рис. 5 Вкладка ресурсы

Рис. 6 Выбранные поля

Результат:

Теперь можно формировать отчет. Проверим правильность работы отчета на примере “Дивана для отдыха”.

Рис. 7 Итоговый отчет

В запросе:

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

Данный пакетный запрос содержит три подзапроса. Рассмотрим их подробнее.

Первый запрос пакета группирует данные по периоду, контрагенту и номенклатуре и помещает их во временную таблицу втБезЦены. Далее мы будем соединять эту таблицу с таблицей цен номенклатуры и получим небольшой выигрыш в том, что соединять будем уже сгруппированные данные.

Во втором подзапросе мы соединяем временную таблицу с регистром сведений “ЦеныНоменклатуры” при этом из регистра сведений мы выбираем МАКСИМАЛЬНУЮ дату из меньших или равных дат. Результат этого подзапроса также помещаем во временную таблицу (втМаксПериод). Посмотрим, какие данные попадают в эту таблицу:

Рис. 8 Временная таблица втМаксПериод

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

Итоговый результат запроса:

Рис. 9 Итоговый результат запроса

Как мы видим результаты вывода цен в обоих случаях (через СКД и через запрос) оказались одинаковы.

Стандартная выборка из виртуального регистра остатков и оборотов не показывает остатки на периодах, в которых нет оборотов. В СКД, то есть вне запроса проблема легко решается, а для использования внутри запроса приходится «городить огород». У многих это выливается в несколько запросов, тогда как можно обойтись и одним. Остатки здесь получаются суммированием оборотов. По тому же принципу платформа рассчитывает остатки внутри периода хранения итогов.
ВЫБРАТЬ РАЗЛИЧНЫЕ
КурсыВалют . Период
ПОМЕСТИТЬ Дни
ИЗ
РегистрСведений . КурсыВалют КАК КурсыВалют
ГДЕ
КурсыВалют . Период МЕЖДУ & НачалоПериода И & КонецПериода
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
Движения . Номенклатура ,
ДНИ . Период ,
СУММА ( ВЫБОР
КОГДА Движения . Период = & НачалоПериода
ТОГДА Движения . КоличествоКонечныйОстаток
ИНАЧЕ ВЫБОР
КОГДА Движения . Период = ДНИ . Период
ТОГДА Движения . КоличествоОборот
ИНАЧЕ 0
КОНЕЦ
КОНЕЦ ) КАК КоличествоКонечныйОстаток
ИЗ
Дни КАК ДНИ ,
РегистрНакопления . ТоварыНаСкладах . ОстаткиИОбороты ( & НачалоПериода , & КонецПериода , День , , Номенклатура = & Номенклатура ) КАК Движения

СГРУППИРОВАТЬ ПО
Движения . Номенклатура ,
ДНИ . Период

Правда, здесь рассчитываются остатки на конец каждого дня (это легко поправить, сдвинув даты на -1). Регистр «КурсыВалют» взят для краткости и для разнообразия — все даты внутри периода можно получать и по другому. Классический вариант проигрывает по быстродействию предложенному примерно в 1.5 раза (проверялось на файловой базе УПП).

Примеры по программированию в 1с 7.7, 8.1, 8.2

понедельник, 9 февраля 2015 г.

1с Запрос 8.2 Остатки на каждый день периода, без движений

Пример запроса 1с 8.2, когда не было движения за период, а необходимо вывести остатки.

Где «ВремТз» — это таблица значений, заполненная датами за месяц:

ВремТз = Новый ТаблицаЗначений;
ВремТз.Колонки.Добавить(«Период»,Новый ОписаниеТипов(«Дата»));

Для сч =0 по Разница Цикл
День_=НачПериода+сч*86400;
ВремТз.Добавить().период = День_;
КонецЦикла;

Вот только запросом:
ВЫБРАТЬ РАЗЛИЧНЫЕ
0 КАК Период
ПОМЕСТИТЬ Дни
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ 1
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ 2
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ 3
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ 4
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ 5
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ 6
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ 7
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ 8
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ 9;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(&Началопериода, ДЕНЬ, ДНИ.Период) КАК Период,
Движения.Склад,
СУММА(ВЫБОР
КОГДА Движения.Период = &НачалоПериода
ТОГДА Движения.КоличествоКонечныйОстаток
ИНАЧЕ ВЫБОР
КОГДА Движения.Период

Понравилась статья? Поделиться с друзьями:
Vkontakte.INFO
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: