21.12.2016

Остатки по дням запросом 1С

Автор: Белозерских Евгений

      Ниже будет разобран пример запроса 1С, для получения данных об остатках товаров на каждый день, вне зависимости от того, были движения (приход, расход) или нет. Выводить будем остатки по количеству на конец дня. Приступим!

Даты каждого дня на который нужны остатки

     Возьмем их из производственного календаря и поместим в таблицу "_ДатыПоДням"
"ВЫБРАТЬ
|	Календарь.ДатаКалендаря
|ПОМЕСТИТЬ _ДатыПоДням
|ИЗ
|	РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК Календарь
|ГДЕ
|	Календарь.ДатаКалендаря >= &Период
|;"

Дни когда были движения

"ВЫБРАТЬ
|	Движения.Номенклатура,
|	Движения.Период
|ПОМЕСТИТЬ _ДатыДвижений
|ИЗ
|	РегистрНакопления.ТоварыНаСкладах.Обороты(&Период, , День,
|			Номенклатура В ИЕРАРХИИ (&Товар)) КАК Движения
|;"

Актуальные даты остатков

     Теперь необходимо выяснить, на какой день получать остаток. К примеру, был приход товара 3-го числа и 6-го числа, и больше ничего не происходило. Таким образом, 3-го, 4-го и 5-го числа, нам нужны остатки на 3 (третье) число, а 6-го 7-го (и дальше) на 6 (шестое) число. Надеюсь понятно объяснил.
"ВЫБРАТЬ
|	_ДатыПоДням.ДатаКалендаря КАК ДатаКалендаря,
|	_ДатыДвижений.Номенклатура,
|	МАКСИМУМ(_ДатыДвижений.Период) КАК ДатаОстатков
|ПОМЕСТИТЬ ДанныеСДатамиОстатков
|ИЗ
|	_ДатыПоДням КАК _ДатыПоДням
|		ЛЕВОЕ СОЕДИНЕНИЕ _ДатыДвижений КАК _ДатыДвижений
|		ПО _ДатыПоДням.ДатаКалендаря >= _ДатыДвижений.Период
|
|СГРУППИРОВАТЬ ПО
|	_ДатыПоДням.ДатаКалендаря,
|	_ДатыДвижений.Номенклатура
|;"
     Если выполнить запрос сейчас, то результат будет примерно таким:

Даты актуальных остатков

Добавляем данные о количестве на конец дня

     Для этого воспользуемся виртуальной таблицей регистра накопления "ОстаткиИОбороты", с периодом "День", поле "КоличествоКонечныйОстаток"
"ВЫБРАТЬ
|	ДанныеСДатамиОстатков.ДатаКалендаря КАК ДатаКалендаря,
|	ДанныеСДатамиОстатков.Номенклатура,
|	ДанныеСДатамиОстатков.ДатаОстатков,
|	ОстаткиИОбороты.КоличествоКонечныйОстаток КАК КонечныйОстаток
|ИЗ
|	ДанныеСДатамиОстатков КАК ДанныеСДатамиОстатков
|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(&Период, , День, ,
|					Номенклатура В ИЕРАРХИИ (&Товар)) КАК ОстаткиИОбороты
|		ПО ДанныеСДатамиОстатков.Номенклатура = ОстаткиИОбороты.Номенклатура
|			И ДанныеСДатамиОстатков.ДатаОстатков = ОстаткиИОбороты.Период
|
|УПОРЯДОЧИТЬ ПО
|	ДатаКалендаря
|"
Результат. Остатки на каждый день
     Данные способ имеет одно допущение, если не было движений за период, то не будет и записей. Для таких позиций, необходимо добавить данные по остаткам на начало периода, и вопрос будет закрыт.

Другие статьи

NULL, ЕСТЬNULL() и ЕСТЬ NULL в запросах 1С

    Определяемся что же такое NULL в запросах 1С и как с таким значением работать

Оператор "ПОДОБНО" в запросе 1С

   В статье рассматривается использование оператора "ПОДОБНО" в запросах 1С, примеры и особенности поведения
 

Получение в запросе 1С, курса валюты на дату документа

     Пример запроса 1С, для получения курса валюты документа, на дату документа.

Нумерация строк в запросе 1С

Один из способов пронумеровать строки в запросе 1С

Оптимизация запросов 1С

В статье рассмотрены основные приемы по оптимизации запросов 1С. В отдельных случаях, понимая как работают механизмы платформы, возможно увеличить скорость выполнения запроса в РАЗЫ!