База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › Как исправить ошибку в запросе 1С при формировании соответствия даты к периоду?
- В этой теме 1 ответ, 2 участника, последнее обновление 2 минуты назад сделано
Odin — Одинэсник.
-
АвторЗаписи
-
-
21 сентября 2026 в 17:34 #38688
ВЫБРАТЬ
ДатыНаКаждыйДень.Дата КАК Дата
ПОМЕСТИТЬ ВТ_ДатыНаКаждыйДень
ИЗ
&ДатыНаКаждыйДень КАК ДатыНаКаждыйДень
;////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
Товары.Ссылка КАК Товар,
ЕСТЬNULL(ОстаткиТоваровОстаткиИОбороты.Период, &НачалоПериода) КАК Период,
ЕСТЬNULL(ОстаткиТоваровОстаткиИОбороты.КоличествоНачальныйОстаток, 0) КАК КоличествоНачальныйОстаток,
ЕСТЬNULL(ОстаткиТоваровОстаткиИОбороты.КоличествоКонечныйОстаток, 0) КАК КоличествоКонечныйОстаток,
ЕСТЬNULL(ОстаткиТоваровОстаткиИОбороты.КоличествоОборот, 0) КАК КоличествоОборот,
ЕСТЬNULL(ОстаткиТоваровОстаткиИОбороты.КоличествоПриход, 0) КАК КоличествоПриход,
ЕСТЬNULL(ОстаткиТоваровОстаткиИОбороты.КоличествоРасход, 0) КАК КоличествоРасход
ПОМЕСТИТЬ ВТ_ОстаткиИОбороты
ИЗ
Справочник.Номенклатура КАК Товары
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, День, ДвиженияИГраницыПериода, ) КАК ОстаткиТоваровОстаткиИОбороты
ПО Товары.Ссылка = ОстаткиТоваровОстаткиИОбороты.Номенклатура
ГДЕ
НЕ Товары.ЭтоГруппа
;////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВТ_ДатыНаКаждыйДень.Дата КАК День,
ВТ_ОстаткиИОбороты.Товар КАК Товар,
МАКСИМУМ(ВТ_ОстаткиИОбороты.Период) КАК ПериодОстатковИОборотов
ПОМЕСТИТЬ ВТ_СоответствиеДатыПериоду
ИЗ
ВТ_ДатыНаКаждыйДень КАК ВТ_ДатыНаКаждыйДень
ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ОстаткиИОбороты КАК ВТ_ОстаткиИОбороты
ПО (ВТ_ОстаткиИОбороты.Период <= ВТ_ДатыНаКаждыйДень.Дата)СГРУППИРОВАТЬ ПО
ВТ_ДатыНаКаждыйДень.Дата,
ВТ_ОстаткиИОбороты.Товар
;////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВТ_СоответствиеДатыПериоду.День КАК День,
ВТ_ОстаткиИОбороты.Период КАК Период,
ВТ_ОстаткиИОбороты.Товар КАК Товар,
ВЫБОР
КОГДА ВТ_СоответствиеДатыПериоду.День = ВТ_ОстаткиИОбороты.Период
ТОГДА ВТ_ОстаткиИОбороты.КоличествоНачальныйОстаток
ИНАЧЕ ВТ_ОстаткиИОбороты.КоличествоКонечныйОстаток
КОНЕЦ КАК НачальныйОстаток,
ВТ_ОстаткиИОбороты.КоличествоКонечныйОстаток КАК КонечныйОстаток,
ВЫБОР
КОГДА ВТ_СоответствиеДатыПериоду.День = ВТ_ОстаткиИОбороты.Период
ТОГДА ВТ_ОстаткиИОбороты.КоличествоОборот
ИНАЧЕ 0
КОНЕЦ КАК Оборот,
ВЫБОР
КОГДА ВТ_СоответствиеДатыПериоду.День = ВТ_ОстаткиИОбороты.Период
ТОГДА ВТ_ОстаткиИОбороты.КоличествоПриход
ИНАЧЕ 0
КОНЕЦ КАК Приход,
ВЫБОР
КОГДА ВТ_СоответствиеДатыПериоду.День = ВТ_ОстаткиИОбороты.Период
ТОГДА ВТ_ОстаткиИОбороты.КоличествоРасход
ИНАЧЕ 0
КОНЕЦ КАК Расход
ИЗ
ВТ_СоответствиеДатыПериоду КАК ВТ_СоответствиеДатыПериоду
ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ОстаткиИОбороты КАК ВТ_ОстаткиИОбороты
ПО ВТ_СоответствиеДатыПериоду.ПериодОстатковИОборотов = ВТ_ОстаткиИОбороты.Период
И ВТ_СоответствиеДатыПериоду.Товар = ВТ_ОстаткиИОбороты.ТоварУПОРЯДОЧИТЬ ПО
ВТ_СоответствиеДатыПериоду.Товар.Наименование,
День -
21 сентября 2026 в 17:34 #38689
В запросе основная ошибка находится в формировании
ВТ_СоответствиеДатыПериоду.Сейчас соединение выполняется только по условию:
1С (Код)1|ПО ВТ_ОстаткиИОбороты.Период <= ВТ_ДатыНаКаждыйДень.ДатаПри этом отсутствует связь по товару. Поэтому для каждого дня выбираются периоды всех товаров, а
МАКСИМУМ(Период)может быть взят от другого товара. В результате остатки могут подставляться не на тот товар.Кроме того, если в регистре есть измерение
Склад, текущий запрос может дублировать остатки по каждому складу, поскольку группировки по товару и периоду нет.Исправленный вариант:
1С (Код)123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127|ВЫБРАТЬ| ДатыНаКаждыйДень.Дата КАК Дата|ПОМЕСТИТЬ ВТ_ДатыНаКаждыйДень|ИЗ| &ДатыНаКаждыйДень КАК ДатыНаКаждыйДень|;||////////////////////////////////////////////////////////////////////////////////|ВЫБРАТЬ| Товары.Ссылка КАК Товар,| ЕСТЬNULL(| ОстаткиТоваровОстаткиИОбороты.Период,| &НачалоПериода| ) КАК Период,| СУММА(ЕСТЬNULL(| ОстаткиТоваровОстаткиИОбороты.КоличествоНачальныйОстаток,| 0| )) КАК КоличествоНачальныйОстаток,| СУММА(ЕСТЬNULL(| ОстаткиТоваровОстаткиИОбороты.КоличествоКонечныйОстаток,| 0| )) КАК КоличествоКонечныйОстаток,| СУММА(ЕСТЬNULL(| ОстаткиТоваровОстаткиИОбороты.КоличествоОборот,| 0| )) КАК КоличествоОборот,| СУММА(ЕСТЬNULL(| ОстаткиТоваровОстаткиИОбороты.КоличествоПриход,| 0| )) КАК КоличествоПриход,| СУММА(ЕСТЬNULL(| ОстаткиТоваровОстаткиИОбороты.КоличествоРасход,| 0| )) КАК КоличествоРасход|ПОМЕСТИТЬ ВТ_ОстаткиИОбороты|ИЗ| Справочник.Номенклатура КАК Товары| ЛЕВОЕ СОЕДИНЕНИЕ| РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(| &НачалоПериода,| &КонецПериода,| День,| ДвиженияИГраницыПериода,| ) КАК ОстаткиТоваровОстаткиИОбороты| ПО Товары.Ссылка = ОстаткиТоваровОстаткиИОбороты.Номенклатура|ГДЕ| НЕ Товары.ЭтоГруппа||СГРУППИРОВАТЬ ПО| Товары.Ссылка,| ЕСТЬNULL(| ОстаткиТоваровОстаткиИОбороты.Период,| &НачалоПериода| )||ИНДЕКСИРОВАТЬ ПО| Товар,| Период|;||////////////////////////////////////////////////////////////////////////////////|ВЫБРАТЬ| ВТ_ДатыНаКаждыйДень.Дата КАК День,| ВТ_ОстаткиИОбороты.Товар КАК Товар,| МАКСИМУМ(ВТ_ОстаткиИОбороты.Период) КАК ПериодОстатковИОборотов|ПОМЕСТИТЬ ВТ_СоответствиеДатыПериоду|ИЗ| ВТ_ДатыНаКаждыйДень КАК ВТ_ДатыНаКаждыйДень| ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ОстаткиИОбороты КАК ВТ_ОстаткиИОбороты| ПО ВТ_ОстаткиИОбороты.Период <= ВТ_ДатыНаКаждыйДень.Дата||СГРУППИРОВАТЬ ПО| ВТ_ДатыНаКаждыйДень.Дата,| ВТ_ОстаткиИОбороты.Товар||ИНДЕКСИРОВАТЬ ПО| Товар,| День,| ПериодОстатковИОборотов|;||////////////////////////////////////////////////////////////////////////////////|ВЫБРАТЬ| ВТ_СоответствиеДатыПериоду.День КАК День,| ВТ_ОстаткиИОбороты.Период КАК Период,| ВТ_СоответствиеДатыПериоду.Товар КАК Товар,|| ВЫБОР| КОГДА ВТ_СоответствиеДатыПериоду.День =| ВТ_ОстаткиИОбороты.Период| ТОГДА ВТ_ОстаткиИОбороты.КоличествоНачальныйОстаток| ИНАЧЕ ВТ_ОстаткиИОбороты.КоличествоКонечныйОстаток| КОНЕЦ КАК НачальныйОстаток,|| ВТ_ОстаткиИОбороты.КоличествоКонечныйОстаток КАК КонечныйОстаток,|| ВЫБОР| КОГДА ВТ_СоответствиеДатыПериоду.День =| ВТ_ОстаткиИОбороты.Период| ТОГДА ВТ_ОстаткиИОбороты.КоличествоОборот| ИНАЧЕ 0| КОНЕЦ КАК Оборот,|| ВЫБОР| КОГДА ВТ_СоответствиеДатыПериоду.День =| ВТ_ОстаткиИОбороты.Период| ТОГДА ВТ_ОстаткиИОбороты.КоличествоПриход| ИНАЧЕ 0| КОНЕЦ КАК Приход,|| ВЫБОР| КОГДА ВТ_СоответствиеДатыПериоду.День =| ВТ_ОстаткиИОбороты.Период| ТОГДА ВТ_ОстаткиИОбороты.КоличествоРасход| ИНАЧЕ 0| КОНЕЦ КАК Расход|ИЗ| ВТ_СоответствиеДатыПериоду КАК ВТ_СоответствиеДатыПериоду| ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ОстаткиИОбороты КАК ВТ_ОстаткиИОбороты| ПО ВТ_СоответствиеДатыПериоду.Товар =| ВТ_ОстаткиИОбороты.Товар| И ВТ_СоответствиеДатыПериоду.ПериодОстатковИОборотов =| ВТ_ОстаткиИОборОТЫ.Период||УПОРЯДОЧИТЬ ПО| Товар.Наименование,| ДеньВ последнем соединении в приведенном тексте допущена опечатка в имени алиаса. Должно быть именно:
1С (Код)1234| ПО ВТ_СоответствиеДатыПериоду.Товар =| ВТ_ОстаткиИОбороты.Товар| И ВТ_СоответствиеДатыПериоду.ПериодОстатковИОборотов =| ВТ_ОстаткиИОбороты.ПериодТо есть полный последний блок нужно использовать так:
1С (Код)123456789101112131415161718192021222324252627282930313233343536373839404142434445|ВЫБРАТЬ| ВТ_СоответствиеДатыПериоду.День КАК День,| ВТ_ОстаткиИОбороты.Период КАК Период,| ВТ_СоответствиеДатыПериоду.Товар КАК Товар,|| ВЫБОР| КОГДА ВТ_СоответствиеДатыПериоду.День =| ВТ_ОстаткиИОбороты.Период| ТОГДА ВТ_ОстаткиИОбороты.КоличествоНачальныйОстаток| ИНАЧЕ ВТ_ОстаткиИОбороты.КоличествоКонечныйОстаток| КОНЕЦ КАК НачальныйОстаток,|| ВТ_ОстаткиИОбороты.КоличествоКонечныйОстаток КАК КонечныйОстаток,|| ВЫБОР| КОГДА ВТ_СоответствиеДатыПериоду.День =| ВТ_ОстаткиИОбороты.Период| ТОГДА ВТ_ОстаткиИОбороты.КоличествоОборот| ИНАЧЕ 0| КОНЕЦ КАК Оборот,|| ВЫБОР| КОГДА ВТ_СоответствиеДатыПериоду.День =| ВТ_ОстаткиИОбороты.Период| ТОГДА ВТ_ОстаткиИОбороты.КоличествоПриход| ИНАЧЕ 0| КОНЕЦ КАК Приход,|| ВЫБОР| КОГДА ВТ_СоответствиеДатыПериоду.День =| ВТ_ОстаткиИОбороты.Период| ТОГДА ВТ_ОстаткиИОбороты.КоличествоРасход| ИНАЧЕ 0| КОНЕЦ КАК Расход|ИЗ| ВТ_СоответствиеДатыПериоду КАК ВТ_СоответствиеДатыПериоду| ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ОстаткиИОбороты КАК ВТ_ОстаткиИОбороты| ПО ВТ_СоответствиеДатыПериоду.Товар =| ВТ_ОстаткиИОбороты.Товар| И ВТ_СоответствиеДатыПериоду.ПериодОстатковИОборотов =| ВТ_ОстаткиИОбороты.Период||УПОРЯДОЧИТЬ ПО| Товар.Наименование,| ДеньНо есть еще один важный нюанс:
ОстаткиИОборотыс периодичностьюДеньможет возвращать несколько строк на один товар и день, например по складам, сериям, характеристикам или организациям. Поэтому перед использованием данных нужно проверить измерения регистра.Если отчет строится по всем складам, агрегация по товару и периоду, приведенная выше, правильна.
Если отчет строится по конкретному складу, склад лучше передать параметром виртуальной таблицы:
1С (Код)1234567|РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(| &НачалоПериода,| &КонецПериода,| День,| ДвиженияИГраницыПериода,| Склад = &Склад|) КАК ОстаткиТоваровОстаткиИОборотыЕсли нужно учитывать также характеристики и серии, их нужно добавить:
1С (Код)123|Товары.Ссылка КАК Товар,|ОстаткиТоваровОстаткиИОбороты.Характеристика КАК Характеристика,|ОстаткиТоваровОстаткиИОбороты.Серия КАК Серия,и включить их:
1С (Код)12345678|В СГРУППИРОВАТЬ ПО| Товары.Ссылка,| ОстаткиТоваровОстаткиИОбороты.Характеристика,| ОстаткиТоваровОстаткиИОбороты.Серия,| ЕСТЬNULL(| ОстаткиТоваровОстаткиИОбороты.Период,| &НачалоПериода| )Также даты в параметре
&ДатыНаКаждыйДеньи периоды регистра должны быть приведены к одному времени, обычно к началу дня. Иначе сравнение:1С (Код)1|ВТ_ОстаткиИОбороты.Период <= ВТ_ДатыНаКаждыйДень.Датаможет работать неправильно, если дата имеет время
00:00:00, а период движения содержит время документа.
-
-
АвторЗаписи
- Для ответа в этой теме необходимо авторизоваться.