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

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

    Движения.Записать();

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

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

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