Имя: Пароль:
1C
1С v8
Ошибка: Преобразование значения к типу Число не может быть выполнено
0 MathaiShung
 
30.04.16
18:49
При попытке списать себестоимость товаров возникает эта ошибка, указывает на на модуль менеджера документа ПродажаТоваров, где находится обработчик списания себестоимости.
Проверю в отладчике - все переменные в выражении на которое ссылается ошибка итак имеют тип число, зачем тогда вообще что-то преобразовывать? В чём тогда ошибка, не могу понять, что не так?? Может у кого было что-то подобное, подскажите пожалуйста.
1 MathaiShung
 
30.04.16
18:51
(0) NULL в переменные не попадает
2 Lexey_
 
30.04.16
19:16
(0) код и полный текст ошибки нужно угадать?
3 MathaiShung
 
30.04.16
19:24
(2) Текст ошибки: Документ.ПродажаТоваров.МодульМенеджера(287)}: Преобразование значения к типу Число не может быть выполнено
                        СтоимостьКСписанию = ВыборкаДетальныеЗаписи.СуммаОстаток/ВыборкаДетальныеЗаписи.КоличествоОстаток*КоличествоКСписанию;

Код:
Функция СписатьСебестоимостьТоваровДокумента(ДокументСсылка) Экспорт
    НачатьТранзакцию(РежимУправленияБлокировкойДанных.Управляемый);
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ РАЗЛИЧНЫЕ
    |    ПродажаТоваровТовары.Номенклатура,
    |    ПродажаТоваровТовары.Ссылка.Склад
    |ИЗ
    |    Документ.ПродажаТоваров.Товары КАК ПродажаТоваровТовары
    |ГДЕ
    |    ПродажаТоваровТовары.Ссылка = &Ссылка
    |    И ПродажаТоваровТовары.Номенклатура.ВидНоменклатуры <> ЗНАЧЕНИЕ(Перечисление.ВидыТоваров.Услуга)";
    
    Запрос.УстановитьПараметр("Ссылка",ДокументСсылка);
    Результат = Запрос.Выполнить();
    Если НЕ Результат.Пустой() Тогда
        ТаблицаДляБлокирования = Результат.Выгрузить();
        Блокировка = Новый БлокировкаДанных;
        ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатуры");
        ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
        ЭлементБлокировки.ИсточникДанных = ТаблицаДляБлокирования;
        ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура","Номенклатура");
        ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Склад","Склад");
        Блокировка.Заблокировать();
    КонецЕсли;
    ФлагУспешностиСписания = Истина;
    НаборЗаписей = РегистрыНакопления.ОстаткиНоменклатуры.СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.Регистратор.Установить(ДокументСсылка);
    НаборЗаписей.Записать();
        //{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    ПродажаТоваровТовары.Номенклатура КАК Номенклатура,
        |    ПродажаТоваровТовары.Ссылка.Склад КАК Склад,
        |    СУММА(ПродажаТоваровТовары.Количество) КАК Количество,
        |    ПродажаТоваровТовары.Ссылка.Дата
        |ПОМЕСТИТЬ ТабДок
        |ИЗ
        |    Документ.ПродажаТоваров.Товары КАК ПродажаТоваровТовары
        |ГДЕ
        |    ПродажаТоваровТовары.Ссылка = &Ссылка
        |    И ПродажаТоваровТовары.Номенклатура.ВидНоменклатуры <> ЗНАЧЕНИЕ(Перечисление.ВидыТоваров.Услуга)
        |
        |СГРУППИРОВАТЬ ПО
        |    ПродажаТоваровТовары.Номенклатура,
        |    ПродажаТоваровТовары.Ссылка.Склад,
        |    ПродажаТоваровТовары.Ссылка.Дата
        |
        |ИНДЕКСИРОВАТЬ ПО
        |    Номенклатура,
        |    Склад
        |;
        |
        |////////////////////////////////////////////////////////////////////////////////
        |ВЫБРАТЬ
        |    ТабДок.Дата КАК Дата,
        |    ТабДок.Склад,
        |    ТабДок.Номенклатура КАК Номенклатура,
        |    ТабДок.Количество КАК Количество,
        |    ОстаткиНоменклатурыОстатки.Партия КАК Партия,
        |    ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток,
        |    ЕСТЬNULL(ОстаткиНоменклатурыОстатки.СуммаОстаток, 0) КАК СуммаОстаток
        |ИЗ
        |    ТабДок КАК ТабДок
        |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки(
        |                &Момент,
        |                (Номенклатура, Склад) В
        |                    (ВЫБРАТЬ
        |                        ТабДок.Номенклатура,
        |                        ТабДок.Склад
        |                    ИЗ
        |                        ТабДок КАК ТабДок)) КАК ОстаткиНоменклатурыОстатки
        |        ПО ТабДок.Номенклатура = ОстаткиНоменклатурыОстатки.Номенклатура
        |";
    Если РегистрыСведений.УчётнаяПолитика = Перечисления.МетодыСписания.FIFO Тогда
        Запрос.Текст = Запрос.Текст +
        "
        |УПОРЯДОЧИТЬ ПО
        |    Номенклатура,
        |    Дата,
        |    Партия";
    Иначе
        Запрос.Текст = Запрос.Текст +
        "
        |УПОРЯДОЧИТЬ ПО
        |    Номенклатура,
        |    Дата УБЫВ,
        |    Партия";
    КонецЕсли;
    Запрос.Текст = Запрос.Текст +
        "
        |ИТОГИ
        |    МАКСИМУМ(Количество),
        |    СУММА(КоличествоОстаток),
        |    СУММА(СуммаОстаток)
        |ПО
        |    Номенклатура";
            
    Запрос.УстановитьПараметр("Ссылка", ДокументСсылка);
    Запрос.УстановитьПараметр("Момент",ДокументСсылка.МоментВремени());
    РезультатЗапроса = Запрос.Выполнить();    
    ВыборкаНоменклатура = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
    //}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
    Пока ВыборкаНоменклатура.Следующий() Цикл
        Если ВыборкаНоменклатура.КоличествоОстаток < ВыборкаНоменклатура.Количество Тогда
            ФлагУспешностиСписания = Ложь;
            Сообщение = Новый СообщениеПользователю;
            Нехватка = ВыборкаНоменклатура.Количество - ВыборкаНоменклатура.КоличествоОстаток;
            Сообщение.Текст = "В документе №"+ДокументСсылка.Номер+" от "+ДокументСсылка.Дата+" на складе не хватает "+Нехватка+" единиц товара "+ВыборкаНоменклатура.Номенклатура;
            Сообщение.Сообщить();
        Иначе
            КоличествоНадоСписать = ВыборкаНоменклатура.Количество;
            ВыборкаДетальныеЗаписи = ВыборкаНоменклатура.Выбрать();
            
            Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
                Если ВыборкаДетальныеЗаписи.КоличествоОстаток <= КоличествоНадоСписать Тогда
                    КоличествоКСписанию = ВыборкаДетальныеЗаписи.КоличествоОстаток;
                    СтоимостьКСписанию = ВыборкаДетальныеЗаписи.СуммаОстаток;
                    КоличествоНадоСписать = КоличествоНадоСписать - КоличествоКСписанию;
                Иначе
                    КоличествоНадоСписать = КоличествоКСписанию;
                    Если ВыборкаДетальныеЗаписи.КоличествоОстаток <>0 Тогда
                        СтоимостьКСписанию = ВыборкаДетальныеЗаписи.СуммаОстаток/ВыборкаДетальныеЗаписи.КоличествоОстаток*КоличествоКСписанию;
                    Иначе
                        СтоимостьКСписанию = ВыборкаДетальныеЗаписи.СуммаОстаток;
                    КонецЕсли;
                    КоличествоНадоСписать = 0;
                КонецЕсли;
                Движение = НаборЗаписей.Добавить();
                Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
                Движение.Период = ВыборкаДетальныеЗаписи.Дата;
                Движение.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура;
                Движение.Склад = ВыборкаДетальныеЗаписи.Склад;
                Движение.Партия = ВыборкаДетальныеЗаписи.Партия;
                Движение.Количество = КоличествоКСписанию;
                Движение.Сумма = СтоимостьКСписанию;
                Если КоличествоНадоСписать <= 0 Тогда
                    Прервать;
                КонецЕсли;
            КонецЦикла;
        КонецЕсли;
    КонецЦикла;    
    Если ФлагУспешностиСписания И НаборЗаписей.Количество() <> 0 Тогда
        НаборЗаписей.Записать();
    КонецЕсли;
    ЗафиксироватьТранзакцию();
    Возврат ФлагУспешностиСписания;
КонецФункции
4 Lexey_
 
30.04.16
19:25
(3) 287 это какая строка?
5 MathaiShung
 
30.04.16
19:28
(4) Строка: СтоимостьКСписанию = ВыборкаДетальныеЗаписи.СуммаОстаток/ВыборкаДетальныеЗаписи.КоличествоОстаток*КоличествоКСписанию (после Пока ВыборкаДетальныеЗаписи.Следующий, в ветке Иначе)
6 tixis
 
30.04.16
19:33
Не верю, , делаешь остановка по ошибке + срин табло с переменными
7 Lexey_
 
30.04.16
19:33
(5) видимо,КоличествоКСписанию не определена, отладчик поможет
8 tixis
 
30.04.16
19:35
(7) тоже к этому склоняюсь ))
9 MathaiShung
 
30.04.16
19:43
(6) (7) Да, действительно - сейчас сделал остановку по ошибке и показал КоличествоКсписанию - Необределено. До этого тоже думал на эту переменную, но просто точку останова ставил и Неопределено не было, возвращалось число.
10 Lexey_
 
30.04.16
19:45
(9) не там ставил
11 MathaiShung
 
30.04.16
19:49
(10) Да как не там, вроде в том же самом месте, а результаты разные, вот:
https://yadi.sk/d/G0aL_DRirQk2x
https://yadi.sk/d/48P9YiMarQk5j
12 hhhh
 
30.04.16
22:28
(11) это же внутри цикла происходит, 999 раз может быть число, а на 1000-й раз не число.
13 Злопчинский
 
01.05.16
00:41
Я конечно могу ошибаться
Но

Цикл выборкадетальные записи
  Если Условие Тогда // !!!!! Условие на первом проходе не выполнилось
  Иначе
     //здесь млин КоличествоКСписнию - откуда инициализировано будет???
14 Lexey_
 
01.05.16
00:43
(13) да-да, это уже выяснилось
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн