Имя: Пароль:
1C
1С v8
Преобразование значения к типу Число не может быть выполнено
0 LayneTredz
 
27.10.15
22:32
Доброго времени суток. Очень прошу помочь, ибо уже третий день пытаюсь понять в чем проблема, но все бестолку.
Имеется такой код:
...
Процедура ОбработкаПроведения(Отказ, Режим)
    //{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
    // Данный фрагмент построен конструктором.
    // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
    Движения.ОстаткиМатериалов.Записывать = Истина;
    Движения.СтоимостьМатериалов.Записывать = Истина;
    Движения.Продажи.Записывать = Истина;
        //{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
    // Данный фрагмент построен конструктором.
    // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
    МенеджерВТ = Новый МенеджерВременныхТаблиц;    
    Запрос = Новый Запрос;    
    Запрос.МенеджерВременныхТаблиц = МенеджерВТ;    
    Запрос.Текст =
        "ВЫБРАТЬ
        |    ОказаниеУслугиПереченьНоменклатуры.Номенклатура,
        |    ОказаниеУслугиПереченьНоменклатуры.Номенклатура.ВидНоменклатуры КАК ВидНоменклатуры,
        |    СУММА(ОказаниеУслугиПереченьНоменклатуры.Количество) КАК КоличествоВДокументе,
        |    СУММА(ОказаниеУслугиПереченьНоменклатуры.Сумма) КАК СуммаВДокументе
        |ПОМЕСТИТЬ НоменклатураДокумента
        |ИЗ
        |    Документ.ОказаниеУслуги.ПереченьНоменклатуры КАК ОказаниеУслугиПереченьНоменклатуры
        |ГДЕ
        |    ОказаниеУслугиПереченьНоменклатуры.Ссылка = &Ссылка
        |
        |СГРУППИРОВАТЬ ПО
        |    ОказаниеУслугиПереченьНоменклатуры.Номенклатура,
        |    ОказаниеУслугиПереченьНоменклатуры.Номенклатура.ВидНоменклатуры";
    Запрос.УстановитьПараметр("Ссылка", Ссылка);
    Результат = Запрос.Выполнить();
        
    Запрос2 = Новый Запрос;
    Запрос2.МенеджерВременныхТаблиц = МенеджерВТ;
    Запрос2.Текст = "ВЫБРАТЬ
                    |    НоменклатураДокумента.Номенклатура,
                    |    НоменклатураДокумента.ВидНоменклатуры,
                    |    НоменклатураДокумента.КоличествоВДокументе,
                    |    НоменклатураДокумента.СуммаВДокументе,
                    |    ЕСТЬNULL(СтоимостьМатериаловОстатки.СтоимостьОстаток, 0) КАК Стоимость,
                    |    ЕСТЬNULL(ОстаткиМатериаловОстатки.КоличествоОстаток, 0) КАК Количество
                    |ИЗ
                    |    НоменклатураДокумента КАК НоменклатураДокумента
                    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СтоимостьМатериалов.Остатки(
                    |                ,
                    |                Материал В
                    |                    (ВЫБРАТЬ
                    |                        НоменклатураДокумента.Номенклатура
                    |                    ИЗ
                    |                        НоменклатураДокумента)) КАК СтоимостьМатериаловОстатки
                    |        ПО НоменклатураДокумента.Номенклатура = СтоимостьМатериаловОстатки.Материал
                    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиМатериалов.Остатки(
                    |                ,
                    |                Материал В
                    |                    (ВЫБРАТЬ
                    |                        НоменклатураДокумента.Номенклатура
                    |                    ИЗ
                    |                        НоменклатураДокумента)) КАК ОстаткиМатериаловОстатки
                    |        ПО НоменклатураДокумента.Номенклатура = ОстаткиМатериаловОстатки.Материал";
    Движения.СтоимостьМатериалов.Записать();
    Движения.ОстаткиМатериалов.Записать();
                    
    Результат = Запрос2.Выполнить();
    ТЗ = Результат.Выгрузить();
    ВыборкаДетальныеЗаписи = Результат.Выбрать();

    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        Если ВыборкаДетальныеЗаписи.Количество = 0 Тогда
            СтоимостьМатариала = 0;
        Иначе
            СтоимостьМатериала = ВыборкаДетальныеЗаписи.Стоимость / ВыборкаДетальныеЗаписи.Количество;
        КонецЕсли;    
        
        Если ВыборкаДетальныеЗаписи.ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Материал Тогда    
        //регистр Остатки Материалов Расход
        Движение = Движения.ОстаткиМатериалов.Добавить();
        Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
        Движение.Период = Дата;
        Движение.Материал = ВыборкаДетальныеЗаписи.Номенклатура;
        Движение.Склад = Склад;
        Движение.Количество = ВыборкаДетальныеЗаписи.Количество;
        //регистр Стоимость Материалов Расход
        Движение = Движения.СтоимостьМатериалов.Добавить();
        Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
        Движение.Период = Дата;
        Движение.Материал = ВыборкаДетальныеЗаписи.Номенклатура;
        Движение.Стоимость = ВыборкаДетальныеЗаписи.КоличествоВДокументе * СтоимостьМатериала;        
        КонецЕсли;
        //регистр Продажи
        Движение = Движения.Продажи.Добавить();
        Движение.Период = Дата;
        Движение.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура;
        Движение.Клиент = Клиент;
        Движение.Мастер = Мастер;
        Движение.Количество = ВыборкаДетальныеЗаписи.КоличествоВДокументе;
        Движение.Выручка = ВыборкаДетальныеЗаписи.СуммаВДокументе;
        Движение.Стоимость = СтоимостьМатериала * ВыборкаДетальныеЗаписи.КоличествоВДокументе;
    КонецЦикла;
КонецПроцедуры
...
При проведение документа выдает ошибку "Преобразование значения к типу Число не может быть выполнено" на последней строке. Проверял тип реквизита Стоимость у регистра накопления Продажи - нет, все верно, число. Ведь строка
...
Движение.Стоимость = ВыборкаДетальныеЗаписи.КоличествоВДокументе * СтоимостьМатериала;
...
проходит, значит, и последняя строка должна проходить. Код скопипастен из книги "Практическое пособие разработчика 1С:Предприятие 8.2" , поэтому я даже понятия не имею, где может быть ошибка.
1 LayneTredz
 
27.10.15
22:36
Имеется ввиду, эта же строка у регистра накопления "Стоимость Материалов"
2 FIXXXL
 
27.10.15
22:37
Если есь левое соединение, возможен null
В запросе null не обрабатывается, отсюда и ошибка
3 FIXXXL
 
27.10.15
22:38
Хотя обрабатываеся вроде...
4 LayneTredz
 
27.10.15
22:40
(2) В том то и дело что функция ЕСТЬNULL описана, поэтому ошибок быть не должно, я уж не совсем дурак)
5 фобка
 
27.10.15
22:42
отладчик
6 фобка
 
27.10.15
22:44
Отставить - количествовдокументе  - неопределено.
Ты первый результат вообще зачем сделал?
7 LayneTredz
 
27.10.15
23:08
(6) Ну как, первый запрос создает общий набор данных, а второй вытаскивает из них только необходимые для него и добавочно взаимодействует с регистрами. А чтобы первый запрос был сформирован, как я понял и существует строка:
...
Результат = Запрос.Выполнить();
...
8 LayneTredz
 
27.10.15
23:10
(6) К слову, ошибку с неопределением я тоже видел, но опять же, она была на последней строке, то есть такая же строка в регистре Стоимость Материалов опять же проходила спокойно.
9 LayneTredz
 
27.10.15
23:28
(6) Хотя скорее всего первый запрос необходим для получения виртуальных таблиц с данными, которые я не смог бы вытащить из виртуальных таблиц сгенерированных системой.
10 Aleksandr N
 
28.10.15
00:12
(0) Там могут быть значения null. Попробуйте в запросе сделать проверку на null через isnull.
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.