Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
12 дек 2024, 04:49

Обнулиние результатов ВыборкаДетальныеЗаписи

Автор Кобзик, 10 окт 2023, 17:53

0 Пользователей и 1 гость просматривают эту тему.

Кобзик

Доброго времени суток. Сам запрос формирует продажу по фифо. Но почему-то в цикле Пока ВыборкаДетальныеЗаписи.Следующий()И ОсталосьСписать > 0 ЦиклПроисходит обнуление записи ВыборкаДетальныеЗаписи. При этом до этого работало все. В табло выводит таблицу с необходимыми полями, но в значениях этих полей пишет "Ошибка чтения значений"
Базу прилагаю

Полностью код:
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
    СуммаДокумента = 0;
   
    Для каждого СтрокаТЧ ИЗ Товар Цикл
       
        СуммаДокумента = СуммаДокумента + СтрокаТЧ.Сумма;
       
    КонецЦикла;
       
КонецПроцедуры




Процедура ОбработкаПроведения(Отказ, Режим)
    МетодРасчета = "";
   
    //{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
    // Данный фрагмент построен конструктором.
    // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!

    //// регистр Продажи
    //Движения.Продажи.Записывать = Истина;
    //Для Каждого ТекСтрокаТовар Из Товар Цикл
    //    Движение = Движения.Продажи.Добавить();
    //    Движение.Период = Дата;
    //    Движение.Клиент = Клиент;
    //    Движение.Номенклатура = ТекСтрокаТовар.Товар;
    //    Движение.Количество = ТекСтрокаТовар.Количество;
    //    Движение.Сумма = ТекСтрокаТовар.Сумма;
    //КонецЦикла;
   
         //Движения.ТоварыНаСкладах.Записывать = Истина;
    Движения.ТоварыНаСкладах.Записывать = Истина;
    Для Каждого ТекСтрокаТовар Из Товар Цикл
       
        Движение = Движения.ТоварыНаСкладах.Добавить();
        Движение.ВидДвижения=ВидДвиженияНакопления.Расход;
        Движение.Номенклатура = ТекСтрокаТовар.Товар;
        Движение.Количество = ТекСтрокаТовар.Количество;
        Движение.Склад = Склад;
        Движение.Период = Дата;
    КонецЦикла;
    Движения.Записать();
   
        //{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
    // Данный фрагмент построен конструктором.
    // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
   
    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    ВыборРасчетаСтоимостиСрезПоследних.СебестоимостьМетод
        |ИЗ
        |    РегистрСведений.ВыборРасчетаСтоимости.СрезПоследних КАК ВыборРасчетаСтоимостиСрезПоследних";
   
    РезультатЗапроса = Запрос.Выполнить();
   
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    МетодРасчета = ""+ ВыборкаДетальныеЗаписи.СебестоимостьМетод;
    //Здесь поставим по условиям если и будем выбирать метод расчета себестоимости
   
    Если МетодРасчета = "FIFO" Тогда
         Если Режим = РежимПроведенияДокумента.Оперативный Тогда
              //{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
    // Данный фрагмент построен конструктором.
    // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
   
    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    ТоварыНаСкладахОстатки.Склад,
        |    ТоварыНаСкладахОстатки.Номенклатура,
        |    ТоварыНаСкладахОстатки.КоличествоОстаток
        |ИЗ
        |    РегистрНакопления.ТоварыНаСкладах.Остатки(
        |            ,
        |            Склад = &Склад
        |                И Номенклатура В
        |                    (ВЫБРАТЬ
        |                        РеализацияТоваровТовар.Товар
        |                    ИЗ
        |                        Документ.РеализацияТоваров.Товар КАК РеализацияТоваровТовар
        |                    ГДЕ
        |                        РеализацияТоваровТовар.Ссылка = &Ссылка)) КАК ТоварыНаСкладахОстатки
        |ГДЕ
        |    ТоварыНаСкладахОстатки.КоличествоОстаток < 0";
   
    Запрос.УстановитьПараметр("Склад", Склад);
    Запрос.УстановитьПараметр("Ссылка", Ссылка);
   
    РезультатЗапроса = Запрос.Выполнить();
    Движения.ТоварыНаСкладах.Очистить();
   
   
   
    Если НЕ РезультатЗапроса.Пустой() Тогда
       
        Отказ = Истина;
       
        ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
   
        Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
           
            Сообщить ("Недостаточное количество товара " + ВыборкаДетальныеЗаписи.Номенклатура + " в количестве " + ВыборкаДетальныеЗаписи.КоличествоОстаток)
           
        КонецЦикла;
   
    Иначе
        Запрос = Новый Запрос;
        Запрос.Текст =
            "ВЫБРАТЬ
            |    РеализацияТоваровТовар.Количество,
            |    РеализацияТоваровТовар.Товар
            |ПОМЕСТИТЬ ВТ_ДокТЧ
            |ИЗ
            |    Документ.РеализацияТоваров.Товар КАК РеализацияТоваровТовар
            |ГДЕ
            |    РеализацияТоваровТовар.Ссылка = &Ссылка
            |;
            |
            |////////////////////////////////////////////////////////////////////////////////
            |ВЫБРАТЬ
            |    ВТ_ДокТЧ.Количество КАК Количество,
            |    ВТ_ДокТЧ.Товар КАК Товар,
            |    ТоварыНаСкладахОстатки.Партия,
            |    ЕСТЬNULL(ТоварыНаСкладахОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток,
            |    ЕСТЬNULL(ТоварыНаСкладахОстатки.СтоимостьОстаток, 0) КАК СтоимостьОстаток
            |ИЗ
            |    ВТ_ДокТЧ КАК ВТ_ДокТЧ
            |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(
            |                &МоментВремени,
            |                Склад = &Склад
            |                    И Номенклатура В
            |                        (ВЫБРАТЬ
            |                            ВТ_ДокТЧ.Товар
            |                        ИЗ
            |                            ВТ_ДокТЧ КАК ВТ_ДокТЧ)) КАК ТоварыНаСкладахОстатки
            |        ПО ВТ_ДокТЧ.Товар = ТоварыНаСкладахОстатки.Номенклатура
            |
            |УПОРЯДОЧИТЬ ПО
            |    ТоварыНаСкладахОстатки.Партия.Дата
            |ИТОГИ
            |    МАКСИМУМ(Количество)
            |ПО
            |    Товар";
       
        Запрос.УстановитьПараметр("МоментВремени", МоментВремени());
        Запрос.УстановитьПараметр("Склад", Склад);
        Запрос.УстановитьПараметр("Ссылка", Ссылка);
       
        РезультатЗапроса = Запрос.Выполнить();
       
        ВыборкаТовар = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
       
        Пока ВыборкаТовар.Следующий() Цикл
            // Вставить обработку выборки ВыборкаТовар
            ОсталосьСписать = ВыборкаТовар.Количество;
            ВыборкаДетальныеЗаписи = ВыборкаТовар.Выбрать();
           
               
                   
            Пока ВыборкаДетальныеЗаписи.Следующий()И ОсталосьСписать > 0 Цикл
                Движения.ТоварыНаСкладах.Записывать = Истина;
                Движение = Движения.ТоварыНаСкладах.Добавить();
                Движение.ВидДвижения=ВидДвиженияНакопления.Расход;
                Движение.Период = Дата;
                Движение.Склад = Склад;
                Движение.Номенклатура = ТекСтрокаТовар.Товар;
                Движение.Количество = МИН(ВыборкаДетальныеЗаписи.КоличествоОстаток,ОсталосьСписать);
               
               
                // регистр Продажи
                Движения.Продажи.Записывать = Истина;
                Движение1 = Движения.Продажи.Добавить();
                Движение1.Период = Дата;
                Движение1.Клиент = Клиент;
                Движение1.Номенклатура = ТекСтрокаТовар.Товар;
                Движение1.Количество = Движение.Количество;
                Движение1.Сумма = ТекСтрокаТовар.Цена * МИН(ВыборкаДетальныеЗаписи.КоличествоОстаток,ОсталосьСписать);
               
               
                Если Движение.Количество =  ВыборкаДетальныеЗаписи.КоличествоОстаток Тогда
                    Движение.Стоимость =  ВыборкаДетальныеЗаписи.СтоимостьОстаток;
                    Движение1.Себестоимость =  Движение.Стоимость;
                Иначе
                       Движение.Стоимость  = Движение.Количество / ВыборкаДетальныеЗаписи.КоличествоОстаток * ВыборкаДетальныеЗаписи.СтоимостьОстаток;
                       Движение1.Себестоимость  =  Движение.Стоимость;
                   КонецЕсли;
                Движение.Партия = ВыборкаДетальныеЗаписи.Партия;
                ОсталосьСписать = ОсталосьСписать - Движение.Количество
               
               
               
           
            КонецЦикла;
        КонецЦикла;
            //}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА

    КонецЕсли;
   
    //}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА

    КонецЕсли;
       
    ИначеЕсли МетодРасчета = "LIFO" Тогда
          Сообщить(ВыборкаДетальныеЗаписи.СебестоимостьМетод);
    Иначе
        Сообщить(ВыборкаДетальныеЗаписи.СебестоимостьМетод);
    КонецЕсли;
           
    //}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА

   
   
   

   
   
   
    //{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
    // Данный фрагмент построен конструктором.
    // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
   
   


       
   
    //}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
КонецПроцедуры

GetNight

Кобзик, может я не совсем понял проблему, но вроде как Движения.Записать() не нужно использовать в ОбработкаПроведения, она вроде как сама это делает,
если установлен флаг (Движения.ТоварыНаСкладах.Записывать = Истина)

Я встречал такую запись в этом модуле только в перемещениях, где после этого идёт контроль после всех движений полученных остатков...
может, вы перебиваете одной записью другую?

Кобзик

Да, неправильно поняли. Вот мы начинаем перебирать все записи с помощью Пока ВыборкаДетальныеЗаписи.Следующий()И ОсталосьСписать > 0 Цикл. НА первом вхождении в цикл у нас первая строка данных, которая корректно выгружается. Вернее пока мы не вошли в цикл, то первая строка.1.png


Сразу после вхождения в цикла у нас "ВыборкаДетальныеЗаписи" подхватывает вторую строку данных.2.png 



После прохождения строки "Движение = Движения.ТоварыНаСкладах.Добавить();" происходит как бы обнуления "ВыборкаДетальныеЗаписи" 3.png

Кобзик

GetNight, Еще в поиске решения проблемы теперь стала выскакивать ошибка {Документ.РеализацияТоваров.МодульОбъекта(172,29)}: Переменная не определена (ТекСтрокаТовар)
            Движение.Номенклатура = <<?>>ТекСтрокаТовар.Товар;

Строку переписал, а вот ошибка все та же

Максим75

так у Вас в запросе Итоги (т.е. группировка) только по товару, а где по еще чему-то?
Вы же потом делаете выборку по нужному товару, а выборку чего?
по логике вещей нужны еще итоги по партии

Кобзик

Максим75, Парадокс в том, что это все работало ровно до того момента, пока я не стал делать ответвление по фифо и лифо...

Максим75

так у Вас выборкаДетальныеЗаписи переопределяется.
посмотрите, она и в самом верхнем запросе, а потом по товару еще раз.
дайте им разные имена.

Кобзик

Максим75, Это все равно не помогает. И все также остается вопрос по ошибке  Движение.Номенклатура = <<?>>ТекСтрокаТовар.Товар; Не находит эту переменную)

Переписать строчку и переписать код не подходит. А соответсвтенно и не могу начать работать над изначальной ошибкой..

Максим75

Кобзик, Смотрите, у Вас такая строчка несколько раз присутствует.
ЧТо я нашел - два раза цикл открывается и закрывается в выборке по строкам табличной части.
Третий раз цикл по строкам не открывается, а что-то делается.
Конкретно в какой строке ругается?

Кобзик

Максим75, Вот эта ошибка {Документ.РеализацияТоваров.МодульОбъекта(173,15)}: Переменная не определена (ТекСтрокаТовар)
            Сообщить (<<?>>ТекСтрокаТовар.Товар);

Идет в строке Движение1.Номенклатура = ТекСтрокаТовар.Товар

И опять же, все было хорошо, а сейчас опять она выскакивает...

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск