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

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

Просмотр 1 ветки ответов
  • Автор
    Сообщения
    • #38478
      Фото аватараOdineski
      Участник

        ВЫБРАТЬ
        0 КАК Р
        ПОМЕСТИТЬ Разряды

        ОБЪЕДИНИТЬ

        ВЫБРАТЬ
        1

        ОБЪЕДИНИТЬ

        ВЫБРАТЬ
        2

        ОБЪЕДИНИТЬ

        ВЫБРАТЬ
        3

        ОБЪЕДИНИТЬ

        ВЫБРАТЬ
        4

        ОБЪЕДИНИТЬ

        ВЫБРАТЬ
        5

        ОБЪЕДИНИТЬ

        ВЫБРАТЬ
        6

        ОБЪЕДИНИТЬ

        ВЫБРАТЬ
        7

        ОБЪЕДИНИТЬ

        ВЫБРАТЬ
        8

        ОБЪЕДИНИТЬ

        ВЫБРАТЬ
        9
        ;

        ////////////////////////////////////////////////////////////////////////////////
        ВЫБРАТЬ
        ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&ДатаНачала, ДЕНЬ), ДЕНЬ, Единицы.Р + Десятки.Р * 10 + Сотни.Р * 100 + Тысячи.Р * 1000) КАК Период
        ПОМЕСТИТЬ ТаблицаДат
        ИЗ
        Разряды КАК Единицы,
        Разряды КАК Десятки,
        Разряды КАК Сотни,
        Разряды КАК Тысячи
        ГДЕ
        ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&ДатаНачала, ДЕНЬ), ДЕНЬ, Единицы.Р + Десятки.Р * 10 + Сотни.Р * 100 + Тысячи.Р * 1000) <= &ДатаОкончания
        ;

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

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

        СГРУППИРОВАТЬ ПО
        ТаблицаДат.Период,
        ВТ_Остатки.Номенклатура
        ;

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

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

          В вашем запросе есть несколько ошибок синтаксиса и логики, которые мешают корректному выполнению:

          1. Дублирование соединений (ПО) подряд
          В блоке с соединениями:

          |ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Остатки КАК ВТ_Остатки
          |ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Обороты(…) КАК ТоварыНаСкладахОбороты
          |ПО ВТ_Остатки.Период = НАЧАЛОПЕРИОДА(ТоварыНаСкладахОбороты.Период, ДЕНЬ)
          |ПО ВТ_БлижайшиеДатыОстатков.ПериодРО = ВТ_Остатки.Период
          |И ВТ_БлижайшиеДатыОстатков.Номенклатура = ВТ_Остатки.Номенклатура

          Здесь два оператора ПО подряд — это ошибка. В 1С запросах после каждого соединения должен быть только один оператор ПО.

          Правильно:

          |ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Остатки КАК ВТ_Остатки
          |ПО ВТ_БлижайшиеДатыОстатков.ПериодРО = ВТ_Остатки.Период
          |И ВТ_БлижайшиеДатыОстатков.Номенклатура = ВТ_Остатки.Номенклатура
          |ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Обороты(&ДатаНачала, &ДатаОкончания, Регистратор, Номенклатура = &Номенклатура) КАК ТоварыНаСкладахОбороты
          |ПО ВТ_Остатки.Период = НАЧАЛОПЕРИОДА(ТоварыНаСкладахОбороты.Период, ДЕНЬ)

          2. Отсутствие запятых между полями в выборке
          В блоке выбора полей:

          |ВЫБОР … КОНЕЦ КАК КоличествоРасход,
          |ВТ_Остатки.КоличествоКонечныйОстаток
          |ТоварыНаСкладахОбороты.Регистратор

          Между КоличествоКонечныйОстаток и ТоварыНаСкладахОбороты.Регистратор отсутствует запятая.

          Добавьте запятую:

          |ВЫБОР … КОНЕЦ КАК КоличествоРасход,
          |ВТ_Остатки.КоличествоКонечныйОстаток,
          |ТоварыНаСкладахОбороты.Регистратор

          3. Дублирование соединений с ВТ_Остатки и ТоварыНаСкладахОбороты
          В запросе дважды повторяются соединения с ВТ_Остатки и ТоварыНаСкладахОбороты, что избыточно и вызовет ошибку.

          Удалите повторяющиеся соединения, оставьте по одному соединению каждого.

          4. Рекомендация по построению таблицы дат
          Ваш способ построения таблицы дат через разряды — классический и рабочий. Убедитесь, что параметры &ДатаНачала и &ДатаОкончания корректны.

          ### Итог: исправленный фрагмент с соединениями и выборкой

          |ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Остатки КАК ВТ_Остатки
          |ПО ВТ_БлижайшиеДатыОстатков.ПериодРО = ВТ_Остатки.Период
          |И ВТ_БлижайшиеДатыОстатков.Номенклатура = ВТ_Остатки.Номенклатура
          |ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Обороты(&ДатаНачала, &ДатаОкончания, Регистратор, Номенклатура = &Номенклатура) КАК ТоварыНаСкладахОбороты
          |ПО ВТ_Остатки.Период = НАЧАЛОПЕРИОДА(ТоварыНаСкладахОбороты.Период, ДЕНЬ)

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

          Если нужно, могу помочь с полным исправленным текстом запроса.

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