Вход | Регистрация


1С:Предприятие ::

Метки: 

не формируются движения

Я
   Slowresponse
 
21.08.18 - 20:09
Всем доброго дня!
В программировании новичок, не судите строго :)
Есть код, формирующий движения по регистру накопления (а-ля партионный учет). При проведении ошибок нет. но нет и движений. Помогите найти ошибку, заранее благодарен)
Движения.Себестоимость.Записывать = Истина;
    ВТ = Новый МенеджерВременныхТаблиц;
    Запрос4 = Новый Запрос;
    Запрос4.МенеджерВременныхТаблиц = ВТ;
    Запрос4.Текст = "ВЫБРАТЬ
                    |    ОказаниеУслугиПереченьНоменклатуры.Номенклатура,
                    |    ОказаниеУслугиПереченьНоменклатуры.Количество КАК КоличествоДок,
                    |    ОказаниеУслугиПереченьНоменклатуры.Сумма
                    |ПОМЕСТИТЬ ВТ
                    |ИЗ
                    |    Документ.ОказаниеУслуги.ПереченьНоменклатуры КАК ОказаниеУслугиПереченьНоменклатуры
                    |ГДЕ
                    |    ОказаниеУслугиПереченьНоменклатуры.Ссылка = &Ссылка
                    |
                    |СГРУППИРОВАТЬ ПО
                    |    ОказаниеУслугиПереченьНоменклатуры.Номенклатура,
                    |    ОказаниеУслугиПереченьНоменклатуры.Количество,
                    |    ОказаниеУслугиПереченьНоменклатуры.Сумма";
        
    
    Запрос4.УстановитьПараметр("Ссылка", Ссылка);
    РезультатЗапроса = Запрос4.Выполнить();    
        
    Запрос5 = Новый Запрос;
    Запрос5.МенеджерВременныхТаблиц = ВТ;
    Запрос5.Текст = "ВЫБРАТЬ
                    |    ВТ.Номенклатура КАК Номенклатура,
                    |    ВТ.КоличествоДок КАК КоличествоДок,
                    |    ВТ.Сумма КАК Сумма,
                    |    ОстаткиНоменклатурыОстатки.Партия КАК Партия,
                    |    ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0) КАК КоличествоОст,
                    |    ЕСТЬNULL(ОстаткиНоменклатурыОстатки.СуммаОстаток, 0) КАК СуммаСп
                    |ИЗ
                    |    ВТ КАК ВТ
                    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Себестоимость.Остатки(
                    |                &МоментВремени,
                    |                Номенклатура В
                    |                    (ВЫБРАТЬ
                    |                        ВТ.Номенклатура
                    |                    ИЗ
                    |                        ВТ КАК ВТ)) КАК ОстаткиНоменклатурыОстатки
                    |        ПО ВТ.Номенклатура = ОстаткиНоменклатурыОстатки.Номенклатура
                    |ГДЕ
                    |    ОстаткиНоменклатурыОстатки.Номенклатура.ВидНоменклатуры = &Материал
                    |
                    |СГРУППИРОВАТЬ ПО
                    |    ВТ.Номенклатура,
                    |    ОстаткиНоменклатурыОстатки.Партия,
                    |    ВТ.КоличествоДок,
                    |    ВТ.Сумма,
                    |    ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0),
                    |    ЕСТЬNULL(ОстаткиНоменклатурыОстатки.СуммаОстаток, 0)";

    
    Запрос5.УстановитьПараметр("МоментВремени", МоментВремени());
    Запрос5.УстановитьПараметр("Ссылка",Ссылка);
    Запрос5.УстановитьПараметр("Материал", Перечисления.ВидыНоменклатуры.Материал);
    РезультатЗапроса = Запрос5.Выполнить();
    ВыборкаДетальныеЗаписи= РезультатЗапроса.Выбрать();
    
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл                
    КупленныеСписать = ВыборкаДетальныеЗаписи.КоличествоДок;
    Если НЕ КупленныеСписать = 0 И НЕ ВыборкаДетальныеЗаписи.КоличествоОст = 0 Тогда
        Списать = Мин(КупленныеСписать, ВыборкаДетальныеЗаписи.КоличествоОст);
        СуммаСписания = ВыборкаДетальныеЗаписи.СуммаСп/ВыборкаДетальныеЗаписи.КоличествоОст * Списать;
    Движение = Движения.Себестоимость.Добавить();
    Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
    Движение.Период = Дата;
    Движение.Регистратор = Ссылка;    
    Движение.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура;
    Движение.Количество = Списать;
    Движение.Сумма = СуммаСписания;
    Движение.Партия = ВыборкаДетальныеЗаписи.Партия;
    
    Движения.Записать();
КонецЕсли;
КонецЦикла;
 
 
   Бухгалтер76
 
2 - 21.08.18 - 20:42
Номенклатура.ВидНоменклатуры - тип точно перечисление?
А так надо в отладчике посмотреть, возвращает ли запрос непустую выборку и выполняется ли условие "НЕ КупленныеСписать = 0 И НЕ ВыборкаДетальныеЗаписи.КоличествоОст = 0"
   Slowresponse
 
5 - 21.08.18 - 21:01
Так, я не знаю что я сделал, но проводка появляется, но всего одна, хотя в документе несколько строк ТЧ. Есть идеи?)
   Slowresponse
 
6 - 21.08.18 - 21:28
Теперь что-то совсем плохо. Он мне брал остатки только с послденего документа, в запросе дописал:
|ИТОГИ
                    |    СУММА(КоличествоОст)
                    |ПО
                    |    Номенклатура

Теперь выборка дает сумму и номенклатуру, остальные поля NULL
   Cyberhawk
 
7 - 21.08.18 - 21:42
Запись движений вынеси из цикла, либо в без режима замещения пиши
   Slowresponse
 
8 - 21.08.18 - 21:45
(7) Не совсем понял. Если я из цикла вынесу, он же не сделает движений на каждую позицию в документе?
А что за режим замещения не знаю, где можно почитать?
   Eastert
 
9 - 21.08.18 - 21:50
(8) движения.записать() из цикла надо вынести
   hhhh
 
10 - 21.08.18 - 22:01
(6)  этот код должен тебе дать сумму и номенклатуру, остальные поля NULL
 
 Рекламное место пустует
   hhhh
 
11 - 21.08.18 - 22:03
(8) вот это слово
    Движения.Записать();

у тебя внутри цикла. Ты записываешь одно и то же 150 раз
   Slowresponse
 
12 - 21.08.18 - 22:04
(10) Я так подумал, даже нашёл статью, сделал такой запрос:
|    ВТ.Номенклатура КАК Номенклатура,
                    |    ВТ.КоличествоДок КАК КоличествоДок,
                    |    ВТ.Сумма КАК Сумма,
                    |    ОстаткиНоменклатурыОстатки.Партия КАК Партия,
                    |    ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0) КАК КоличествоОст,
                    |    ЕСТЬNULL(ОстаткиНоменклатурыОстатки.СуммаОстаток, 0) КАК СуммаСп
                    |ИЗ
                    |    ВТ КАК ВТ
                    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Себестоимость.Остатки(
                    |                &МоментВремени,
                    |                Номенклатура В
                    |                    (ВЫБРАТЬ
                    |                        ВТ.Номенклатура
                    |                    ИЗ
                    |                        ВТ КАК ВТ)) КАК ОстаткиНоменклатурыОстатки
                    |        ПО ВТ.Номенклатура = ОстаткиНоменклатурыОстатки.Номенклатура
                    |ГДЕ
                    |    ОстаткиНоменклатурыОстатки.Номенклатура.ВидНоменклатуры = &Материал
                    |
                    |СГРУППИРОВАТЬ ПО
                    |    ВТ.Номенклатура,
                    |    ОстаткиНоменклатурыОстатки.Партия,
                    |    ВТ.КоличествоДок,
                    |    ВТ.Сумма,
                    |    ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0),
                    |    ЕСТЬNULL(ОстаткиНоменклатурыОстатки.СуммаОстаток, 0)
                    |
                    |УПОРЯДОЧИТЬ ПО
                    |    ОстаткиНоменклатурыОстатки.Партия.МоментВремени
                    |ИТОГИ
                    |    МАКСИМУМ(КоличествоДок),
                    |    МАКСИМУМ(Сумма),
                    |    СУММА(КоличествоОст),
                    |    СУММА(СуммаСп)
                    |ПО
                    |    Номенклатура"

В итоге он с ума сошёл, на одну позицию делает 3 движения - по одному из каждой партии и одно без партии вообще
   hhhh
 
13 - 21.08.18 - 22:09
(12) ну правильно делает, ИТОГИ - это у вас дерево. То есть первая строка - это корень дерева, у нее три подчиненных строки по партиям. Всего 4 строки по номенклатуру. Непонятно, чего удивляться.
   Slowresponse
 
14 - 21.08.18 - 22:22
(13) Значит для одного движения нужно в итогах оставить одну строку? Но тогда при выполнении ошибка -
Ошибка при выполнении обработчика - 'ОбработкаПроведения'
по причине:
{Документ.ОказаниеУслуги.МодульОбъекта(204)}: Операции сравнения на больше-меньше допустимы только для значений совпадающих примитивных типов (Булево, Число, Строка, Дата)
        Списать = Мин(КупленныеСписать, ВыборкаДетальныеЗаписи.КоличествоОст);

Потому что значение ВыборкаДетальныеЗаписи.КоличествоОст получается NULL
   Slowresponse
 
15 - 21.08.18 - 22:26
(13) Я просто даже базовые принципы работы ИТОГИ не очень понимаю, руководство разработчика не помогает. Поэтому тяжело допереть как правильно сделать
   hhhh
 
16 - 21.08.18 - 23:52
(15) ну выбросьте итоги. Они тут не нужны.
   Slowresponse
 
18 - 22.08.18 - 11:14
(16) Тогда он с каждой партии списывает.
   Buster007
 
19 - 22.08.18 - 11:22
напоминает задачу на спеца)
   Slowresponse
 
20 - 22.08.18 - 11:26
(19) Делал по аналогии часть кода)
   hhhh
 
21 - 22.08.18 - 23:38
(18) и нужно с каждой партии. перебираешь все партии, списываешь. И проверка что всё списал. как только списал, заканчиваешь, с остальных партий не списываешь
   Slowresponse
 
22 - 23.08.18 - 11:33
(21) Сделал, всё ок, но только если в реализации номенклатуры с разных партий. Если 2 товара с одной партии списывает только первый..



Список тем форума
Рекламное место пустует Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует