Имя: Пароль:
1C
1С v8
Ошибка сравнения типов
0 malex18
 
04.09.17
11:40
{Документ.Расходная.МодульОбъекта(51)}: Операции сравнения на больше-меньше допустимы только для значений совпадающих примитивных типов (Булево, Число, Строка, Дата)
        Если Выборка.Количество > Выборка.КоличествоОстаток Тогда



Почему при сравнении "Выборка.количествоОстаток" это неопределенный тип?Если в запросе указал,что естьнулл = 0?????





Процедура ОбработкаПроведения(Отказ, Режим)
    
    Движения.ОстаткиТоваров.Записывать = Истина;
    Движения.ОстаткиТоваров.Записывать = Истина;
    
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    Номенклатура,
    |    СУММА(Количество) КАК Количество,
    |    МИНИМУМ(НомерСтроки) КАК НомерСтроки
    |ПОМЕСТИТЬ ДокТЧ
    |ИЗ
    |    Документ.Расходная.Товары
    |ГДЕ
    |    Ссылка = &Ссылка И НЕ Номенклатура.Услуга
    |СГРУППИРОВАТЬ ПО Номенклатура
    |;
    |ВЫБРАТЬ
    |    Остатки.Партия,
    |    ДокТЧ.НомерСтроки,
    |    ДокТЧ.Номенклатура,
    |    ДокТЧ.Количество,
    |    ЕСТЬNULL(Остатки.КоличествоОстаток,0) КАК КоличествоОстаток,
    |    ЕСТЬNULL(Остатки.СтоимостьОстаток,0) КАК СтоимостьОстаток,
    |    ЕСТЬNULL(ОстаткиСКЛ.КоличествоОстаток,0) КАК ОстатокНаСкладе
    |ИЗ
    |    ДокТЧ КАК ДокТЧ
    |    
    |    ЛЕВОЕ СОЕДИНЕНИЕ
    |    РегистрНакопления.ОстаткиТоваров.Остатки(&МоментВремени, Номенклатура В(ВЫБРАТЬ Номенклатура ИЗ ДокТЧ КАК ДокТЧ)) КАК Остатки
    |    ПО ДокТЧ.Номенклатура = Остатки.Номенклатура
    |    
    |    ЛЕВОЕ СОЕДИНЕНИЕ
    |    РегистрНакопления.ОстаткиПоСкладам.Остатки(&МоментВремени, Склад = &Склад
    |            И Номенклатура В(ВЫБРАТЬ Номенклатура ИЗ ДокТЧ КАК ДокТЧ) ) КАК ОстаткиСКЛ
    |    ПО ДокТЧ.Номенклатура = ОстаткиСКЛ.Номенклатура
    |ИТОГИ МИНИМУМ(Количество), МИНИМУМ(ОстатокНаСкладе), МИНИМУМ(НомерСтроки)
    |ПО ДокТЧ.Номенклатура";
    
    Запрос.УстановитьПараметр("МоментВремени", МоментВремени() );
    Запрос.УстановитьПараметр("Ссылка", Ссылка);
    Запрос.УстановитьПараметр("Склад", Склад);
    
    РезультатЗапроса = Запрос.Выполнить();
    
    Выборка = РезультатЗапроса.Выбрать();
    
    Пока Выборка.Следующий() Цикл
        Если Выборка.Количество > Выборка.КоличествоОстаток Тогда
            Сообщение = Новый СообщениеПользователю;
            Сообщение.Текст = "Не хватает товара """ + Выборка.Номенклатура
            + """, из  необходимых " +
            Выборка.Количество + " в наличии осталось только " +
            Выборка.КоличествоОстаток;
            Сообщение.Поле = "Товары[" + (Выборка.НомерСтроки-1) + "].Количество";
            Сообщение.УстановитьДанные(ЭтотОбъект);
            Сообщение.Сообщить();
            
            Отказ = Истина;
            Движения.ОстаткиТоваров.Записывать = Ложь;
            Движения.ОстаткиПоСкладам.Записывать = Ложь;
            
        КонецЕсли;
    КонецЦикла;    
    
    Если Отказ Тогда
        Возврат;
    КонецЕсли;
    
    Выборка.Сбросить();
    
    Пока Выборка.Следующий() Цикл
        
        ОсталосьСписать = Выборка.Количество;
        
        ВыборкаПартии = Выборка.Выбрать();
        Пока ВыборкаПартии.Следующий() И ОсталосьСписать <> 0 Цикл
            
        Списать = Мин(ОсталосьСписать, ВыборкаПартии.КоличествоОстаток);
        Себестоимость = Списать / ВыборкаПартии.КоличествоОстаток * Выборка.Партии.СтоимостьОстаток;
            
            Движение = Движения.ОстаткиТоваров.Добавить();
            Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
            Движение.Период = Дата;
            Движение.Номенклатура = Выборка.Номенклатура;
            Движение.Количество = Списать;
            Движение.Стоимость =  Себестоимость;
            Движение.Партия = ВыборкаПартии.Партия;
            
            ОсталосьСписать = ОсталосьСписать - Списать;
        КонецЦикла;
        
        
        Движение = Движения.ОстаткиПоСкладам.ДобавитьРасход();
        Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
        Движение.Период = Дата;
        Движение.Номенклатура = Выборка.Номенклатура;
        Движение.Количество = Выборка.Количество;
        Движение.Склад = Склад;
        
    КонецЦикла;
КонецПроцедуры
1 1dvd
 
04.09.17
11:42
NULL <> Неопределено
2 Господин ПЖ
 
04.09.17
11:43
>Почему при сравнении "Выборка.количествоОстаток" это неопределенный тип?

у кого-то в union поля перепутаны
3 Альбатрос
 
04.09.17
11:43
Даже для поля .количество?
4 dezss
 
04.09.17
11:43
Уверен что ругается на Выборка.количествоОстаток, а не на ДокТЧ.Количество?
5 malex18
 
04.09.17
11:47
С помощью точки останова смотрю содержимое сравниваемых значений, "выборка.количество" показывает, а "выборка.количествоОстаток" пишет "переменная не определена (КоличествоОстато)
6 dezss
 
04.09.17
11:50
(5) Проверь имя переменной. Что-то с ним не так.
7 malex18
 
04.09.17
11:50
имя такое же как в запросе. непонятно что-то
8 1dvd
 
04.09.17
11:50
(5) букву к украли вражеские программисты
9 dezss
 
04.09.17
11:51
(7) скопируй его из запроса.
10 malex18
 
04.09.17
11:51
пробовал)
11 dezss
 
04.09.17
11:52
(10) Ну посмотри что есть в выборка.
12 malex18
 
04.09.17
11:53
в выборке пишет,что количестоОстаток ЕСТЬNUll
13 dezss
 
04.09.17
11:54
(12) покажи скрином что хранится в "Выборка" внутри цикла.
14 1dvd
 
04.09.17
11:54
ошибка вот здесь:

|ИТОГИ МИНИМУМ(Количество), МИНИМУМ(ОстатокНаСкладе), МИНИМУМ(НомерСтроки)
15 malex18
 
04.09.17
11:56
и что здесь не так?
16 1dvd
 
04.09.17
11:57
(15)
1. нафига тебе вообще итоги, если ты за один проход всё смотришь?
2. Раз уж ты собрался их использовать, то включи в них все переменные, которые хочешь брать
17 dezss
 
04.09.17
12:01
(14) Блин, точно...не обратил внимания сразу...
18 Serginio1
 
04.09.17
16:50
Например сравнение на неустановленность значения в поле с множественными типами

|ТИПЗНАЧЕНИЯ(СчетФактура) <> &Тип";
    
Запрос.УстановитьПараметр("Тип",Тип("NULL"));
19 Serginio1
 
04.09.17
16:51
20 Хрыч
 
04.09.17
20:40
Потому что первая строка в выборке у тебя итоговая, а в ней вычисляются только Количество, ОстатокНаСкладе и НомерСтроки. Поле КоличествоОстаток в итогах значения не имеет. Либо откажись от итогов, либо добавь в них это поле. А скорее всего, ты хотел использовать две выборки: одна с обходом по группировке для фиксации итоговых значений и внутри нее выборка детальных записей, где уже возможно сравнение. Но не вышел из Данилы каменный цветок.
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший