Как исправить ошибку в запросе 1С при формировании соответствия даты к периоду?

База знаний Одина — Одинэсника Форумы ODIN — Форум по 1С Предприятию Как исправить ошибку в запросе 1С при формировании соответствия даты к периоду?

Просмотр 1 ветки ответов
  • Автор
    Записи
    • #38688
      Фото аватараOdineski
      Участник

        ВЫБРАТЬ
        ДатыНаКаждыйДень.Дата КАК Дата
        ПОМЕСТИТЬ ВТ_ДатыНаКаждыйДень
        ИЗ
        &ДатыНаКаждыйДень КАК ДатыНаКаждыйДень
        ;

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

        ////////////////////////////////////////////////////////////////////////////////
        ВЫБРАТЬ
        ВТ_ДатыНаКаждыйДень.Дата КАК День,
        ВТ_ОстаткиИОбороты.Товар КАК Товар,
        МАКСИМУМ(ВТ_ОстаткиИОбороты.Период) КАК ПериодОстатковИОборотов
        ПОМЕСТИТЬ ВТ_СоответствиеДатыПериоду
        ИЗ
        ВТ_ДатыНаКаждыйДень КАК ВТ_ДатыНаКаждыйДень
        ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ОстаткиИОбороты КАК ВТ_ОстаткиИОбороты
        ПО (ВТ_ОстаткиИОбороты.Период <= ВТ_ДатыНаКаждыйДень.Дата)

        СГРУППИРОВАТЬ ПО
        ВТ_ДатыНаКаждыйДень.Дата,
        ВТ_ОстаткиИОбороты.Товар
        ;

        ////////////////////////////////////////////////////////////////////////////////
        ВЫБРАТЬ
        ВТ_СоответствиеДатыПериоду.День КАК День,
        ВТ_ОстаткиИОбороты.Период КАК Период,
        ВТ_ОстаткиИОбороты.Товар КАК Товар,
        ВЫБОР
        КОГДА ВТ_СоответствиеДатыПериоду.День = ВТ_ОстаткиИОбороты.Период
        ТОГДА ВТ_ОстаткиИОбороты.КоличествоНачальныйОстаток
        ИНАЧЕ ВТ_ОстаткиИОбороты.КоличествоКонечныйОстаток
        КОНЕЦ КАК НачальныйОстаток,
        ВТ_ОстаткиИОбороты.КоличествоКонечныйОстаток КАК КонечныйОстаток,
        ВЫБОР
        КОГДА ВТ_СоответствиеДатыПериоду.День = ВТ_ОстаткиИОбороты.Период
        ТОГДА ВТ_ОстаткиИОбороты.КоличествоОборот
        ИНАЧЕ 0
        КОНЕЦ КАК Оборот,
        ВЫБОР
        КОГДА ВТ_СоответствиеДатыПериоду.День = ВТ_ОстаткиИОбороты.Период
        ТОГДА ВТ_ОстаткиИОбороты.КоличествоПриход
        ИНАЧЕ 0
        КОНЕЦ КАК Приход,
        ВЫБОР
        КОГДА ВТ_СоответствиеДатыПериоду.День = ВТ_ОстаткиИОбороты.Период
        ТОГДА ВТ_ОстаткиИОбороты.КоличествоРасход
        ИНАЧЕ 0
        КОНЕЦ КАК Расход
        ИЗ
        ВТ_СоответствиеДатыПериоду КАК ВТ_СоответствиеДатыПериоду
        ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ОстаткиИОбороты КАК ВТ_ОстаткиИОбороты
        ПО ВТ_СоответствиеДатыПериоду.ПериодОстатковИОборотов = ВТ_ОстаткиИОбороты.Период
        И ВТ_СоответствиеДатыПериоду.Товар = ВТ_ОстаткиИОбороты.Товар

        УПОРЯДОЧИТЬ ПО
        ВТ_СоответствиеДатыПериоду.Товар.Наименование,
        День

      • #38689
        bot_avaOdin — Одинэсник
        Участник

          В запросе основная ошибка находится в формировании ВТ_СоответствиеДатыПериоду.

          Сейчас соединение выполняется только по условию:

          При этом отсутствует связь по товару. Поэтому для каждого дня выбираются периоды всех товаров, а МАКСИМУМ(Период) может быть взят от другого товара. В результате остатки могут подставляться не на тот товар.

          Кроме того, если в регистре есть измерение Склад, текущий запрос может дублировать остатки по каждому складу, поскольку группировки по товару и периоду нет.

          Исправленный вариант:

          В последнем соединении в приведенном тексте допущена опечатка в имени алиаса. Должно быть именно:

          То есть полный последний блок нужно использовать так:

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

          Если отчет строится по всем складам, агрегация по товару и периоду, приведенная выше, правильна.

          Если отчет строится по конкретному складу, склад лучше передать параметром виртуальной таблицы:

          Если нужно учитывать также характеристики и серии, их нужно добавить:

          и включить их:

          Также даты в параметре &ДатыНаКаждыйДень и периоды регистра должны быть приведены к одному времени, обычно к началу дня. Иначе сравнение:

          может работать неправильно, если дата имеет время 00:00:00, а период движения содержит время документа.

      Просмотр 1 ветки ответов
      • Для ответа в этой теме необходимо авторизоваться.
      База знаний 1С