Имя: Пароль:
1C
1С v8
v8: Что делать ""Операции сравнения на больше-меньше допустимы только для значений..."
0 _stay true_
 
29.04.13
14:02
Здравствуйте. Написал я обработку проведения:(вроде с логикой всё верно)

Процедура ОбработкаПроведения(Отказ, Режим)
     

   
   Запрос = Новый Запрос;
   Запрос.Текст =
   
           "ВЫБРАТЬ
           |    ВводВЭксплуатациюОборудование.Номенклатура КАК Номенклатура,
           |    ВводВЭксплуатацию.Дата КАК Дата,
           |    СУММА(ВводВЭксплуатациюОборудование.Количество) КАК Количество,
           |    ВводВЭксплуатациюОборудование.СрокЭксплуатацииДо КАК СрокЭксплуатацииДо
           |ПОМЕСТИТЬ Оборуд_ВТ
           |ИЗ
           |    Документ.ВводВЭксплуатацию.Оборудование КАК ВводВЭксплуатациюОборудование,
           |    Документ.ВводВЭксплуатацию КАК ВводВЭксплуатацию
           |ГДЕ
           |    ВводВЭксплуатацию.Ссылка = &Ссылка
           |
           |СГРУППИРОВАТЬ ПО
           |    ВводВЭксплуатациюОборудование.Номенклатура,
           |    ВводВЭксплуатацию.Дата,
           |    ВводВЭксплуатациюОборудование.СрокЭксплуатацииДо
           |;
           |
           |////////////////////////////////////////////////////////////////////////////////
           |ВЫБРАТЬ
           |    УчетОборудованияОстатки.СтоимостьОстаток КАК СуммаОстаток,
           |    УчетОборудованияОстатки.КоличествоОстаток КАК КоличествоОстаток,
           |    УчетОборудованияОстатки.СрокГодностиДо КАК СрокГодностиДо,
           |    Оборуд_ВТ.Количество КАК Количество
           |ИЗ
           |    Оборуд_ВТ КАК Оборуд_ВТ
           |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.УчетОборудования.Остатки КАК УчетОборудованияОстатки
           |        ПО Оборуд_ВТ.Номенклатура = УчетОборудованияОстатки.Оборудование";
   
       
   Запрос.УстановитьПараметр("Ссылка",Ссылка);
   Запрос.УстановитьПараметр("Дата",Дата);
   Запрос.УстановитьПараметр("МоментВремени",МоментВремени());
   Выборка = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
   Пока Выборка.Следующий() Цикл
       
       Если Выборка.Количество > Выборка.КоличествоОстаток Тогда
           Нехватка = Выборка.Количество - Выборка.КоличествоОстаток;
           Сообщение = Новый Сообщениепользователю();
           Сообщение.Текст = "Нехватает номенклатуры "+Выборка.Номенклатура+" в размере "+Нехватка;
           Сообщение.Сообщить();
           Отказ = Истина;
       КонецЕсли;
       
       Если Дата > Выборка.СрокГодностиДо Тогда
           Сообщение = Новый Сообщениепользователю();
           Сообщение.Текст = "Истек срок годности у номенклатуры "+Выборка.Номенклатура;
           Сообщение.Сообщить();
           Отказ = Истина;
       КонецЕсли;

       Если Не Отказ Тогда  
       

       ОсталосьСписать = Выборка.Количество;
       Выборка1=Выборка.Выбрать();
       Пока Выборка1.Следующий() и ОсталосьСписать>0 Цикл
           Списать = МИН(Выборка1.КоличествоОстаток,ОсталосьСписать);
           ОсталосьСписать = ОсталосьСписать - Списать;
           Себестоимость = Списать/Выборка1.КоличествоОстаток*Выборка1.СуммаОстаток;

           
       Движения.УчетОборудования.Записывать = Истина;        
       Движение = Движения.УчетОборудования.Добавить();
       Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
       Движение.Период = Дата;
       Движение.Оборудование = Выборка1.Номенклатура;
       Движение.СрокЭксплуатацииДо = Выборка1.СрокЭксплуатацииДо;
       Движение.СрокГодностиДо = Выборка1.СрокГодностиДо;
       Движение.Стоимость = Себестоимость;
       Движение.Количество = Списать;
       КонецЦикла;
    КонецЕсли;
КонецЦикла;
   
КонецПроцедуры;


Когда пытаешсья провести документ, выдаёт ошибку и ругается на строчку в коде:  "Операции сравнения на больше-меньше допустимы только для значений совпадающих примитивных типов (Булево, Число, Строка, Дата)
       Если Выборка.Количество > Выборка.КоличествоОстаток Тогда"

Подскажите пожалуйста, как с этим можно побороться. Заранее спасибо.
1 Wobland
 
29.04.13
14:03
разобраться, почему в количествах не числа
2 Wobland
 
29.04.13
14:03
+(1) и использовать магию ЕСТЬNULL
3 _stay true_
 
29.04.13
14:05
Ставил точку останова, повычислял выражения, выяснил, что Выборка.КоличествоОстаток имеет тип Null. Я в 1С новичок, можете написать, как использовать этот самый ЕСТЬNULL?))
4 Wobland
 
29.04.13
14:06
выбрать ЕСТЬNULL(ПолеГдеОжидаетсяНУЛЛ, ЗначениеКотороеНужноВместоНулла)
5 palpetrovich
 
29.04.13
14:08
(4) запутать хочешь? :)
ЕСТЬNULL(УчетОборудованияОстатки.КоличествоОстаток, 0)
6 Wobland
 
29.04.13
14:09
(5) хотел бы запутать, писал бы
выбор когда УчетОборудованияОстатки.КоличествоОстаток есть NULL тогда 0 иначе УчетОборудованияОстатки.КоличествоОстаток конец ;)
7 Wobland
 
29.04.13
14:10
а потом будем избавлять автора от деления на ноль
8 Wobland
 
29.04.13
14:11
кстати, какой обход по группировкам? где дерево?
9 _stay true_
 
29.04.13
14:24
Wobland

Спасибо тебе огромное! Заработало. Документ проводится, только вот, теперь вылезло другое: данные в регистр не записываются.

Господи, ну я и чайник)))
10 Wobland
 
29.04.13
14:25
Движения.Хозрасчетный.Записывать=Истина;
есть такое?
11 _stay true_
 
29.04.13
14:30
Есть. Хозрасчетный, я так понял, имя регистра накопления?  

Движения.УчетОборудования.Записывать = Истина;
12 Wobland
 
29.04.13
14:32
(11) это имя регистра бухгалтерии. под рукой взял.
плохо ищешь, видать
13 DaZol1991
 
29.04.13
14:37
(0) Чтобы использовать
Выборка = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
надо в запросе делать итоги по какому-то полю по номенклатуре, в этом случае, - групповое поле, и итоговые поля (Количество и КоличествоОстаток) выбирать те которые понадобятся при обходе верхушки дерева, т.е. в первом цикле, а потом уже все остальное.
14 GANR
 
29.04.13
14:40
Дальше первого запроса в пакете даже смотреть не стал http://ximage.ru/data/imgs/1367231996.jpg
15 GANR
 
29.04.13
14:48
Ага... вижу ошибку http://ximage.ru/data/imgs/1367232512.jpg
16 Wobland
 
29.04.13
14:51
(15) ещё немного, и ты дочитаешь до (9) ;)
17 _stay true_
 
29.04.13
15:25
Разобрался!!!Заработало!!Я спасён:)  Спасибо вам, что не остались равнодушными.
18 AlexITGround
 
29.04.13
15:25
(17) что не так было?
19 GANR
 
29.04.13
15:27
(16) Да там запрос кривой - рано (9) считает, что проблема решена. Синтаксические ошибки да, убраны, но   л о г и ч е с к и е   остались. (17) Введи-ка 2-3 документа на одну и ту же номенклатуру - работает? Сколько списывает?
20 _stay true_
 
29.04.13
15:28
Обход по группировкам не нужен там был совершенно(использовал обынчый обход результата, и всё уложил в один цикл и на одной выборке. Так же сделал ЕСТЬNULL в запросе на КолчиествоОстаток. И ещё соединил таблицы в первом запросе))
21 GANR
 
29.04.13
15:30
Это Документ.ВводВЭксплуатацию КАК ВводВЭксплуатацию надо убрать вообще из запроса - для чего это нужно?
22 GANR
 
29.04.13
15:31
И условие

ГДЕ
ВводВЭксплуатациюОборудование.Ссылка = &Ссылка

добавить
23 _stay true_
 
29.04.13
15:33
(19) Вроде всё списывает. И ругается, если чего не хватает)))

Запрос теперь выглядит так

         "ВЫБРАТЬ
           |    ВводВЭксплуатациюОборудование.Номенклатура КАК Номенклатура,
           |    ВводВЭксплуатацию.Дата КАК Дата,
           |    СУММА(ВводВЭксплуатациюОборудование.Количество) КАК Количество,
           |    ВводВЭксплуатациюОборудование.СрокЭксплуатацииДо КАК СрокЭксплуатацииДо
           |ПОМЕСТИТЬ Оборуд_ВТ
           |ИЗ
           |    Документ.ВводВЭксплуатацию КАК ВводВЭксплуатацию
           |        ЛЕВОЕ СОЕДИНЕНИЕ Документ.ВводВЭксплуатацию.Оборудование КАК ВводВЭксплуатациюОборудование
           |        ПО ВводВЭксплуатацию.Ссылка = ВводВЭксплуатациюОборудование.Ссылка
           |ГДЕ
           |    ВводВЭксплуатацию.Ссылка = &Ссылка
           |
           |СГРУППИРОВАТЬ ПО
           |    ВводВЭксплуатациюОборудование.Номенклатура,
           |    ВводВЭксплуатацию.Дата,
           |    ВводВЭксплуатациюОборудование.СрокЭксплуатацииДо
           |;
           |
           |////////////////////////////////////////////////////////////////////////////////
           |ВЫБРАТЬ
           |    УчетОборудованияОстатки.СтоимостьОстаток КАК СуммаОстаток,
           |    ЕСТЬNULL(УчетОборудованияОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток,
           |    УчетОборудованияОстатки.СрокГодностиДо КАК СрокГодностиДо,
           |    Оборуд_ВТ.Количество КАК Количество,
           |    Оборуд_ВТ.Номенклатура КАК Номенклатура,
           |    Оборуд_ВТ.СрокЭксплуатацииДо КАК СрокЭксплуатацииДо
           |ИЗ
           |    Оборуд_ВТ КАК Оборуд_ВТ
           |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.УчетОборудования.Остатки КАК УчетОборудованияОстатки
           |        ПО Оборуд_ВТ.Номенклатура = УчетОборудованияОстатки.Оборудование";
24 GANR
 
29.04.13
15:43
(23) Это - рабочий вариант, только это

|    Документ.ВводВЭксплуатацию КАК ВводВЭксплуатацию
|        ЛЕВОЕ СОЕДИНЕНИЕ Документ.ВводВЭксплуатацию.Оборудование КАК ВводВЭксплуатациюОборудование
|        ПО ВводВЭксплуатацию.Ссылка = ВводВЭксплуатациюОборудование.Ссылка

зачем?
25 DaZol1991
 
29.04.13
15:48
(23) лучше сделать с группировками и обходу по итогам, потому что если у тебя в одной ТЧ будет несколько наименований номенклатуры? нормально отрабатывает? списывает все кроме этой? или останавливается на этой? проверяет дальше?
26 _stay true_
 
29.04.13
16:02
(25) Вроде адекватно всё списывает. Если вдруг какой косяк вылезет - отпишусь.
27 GANR
 
29.04.13
16:03
+(25) +1 и сортировку по сроку годности, полагаю, надо сделать.
28 GANR
 
29.04.13
16:19
обычно в первую очередь списывается товар с минимальным сроком годности
29 Wobland
 
29.04.13
16:40
может, показать автору, как я списывал по партиям с учётом срока годности в какой-то тестовой задаче? полезно будет?
30 Птица
 
29.04.13
16:40
а откуда в учете оборудования срок годности? о_О
31 Wobland
 
29.04.13
16:42
(30) СрокЭксплуатацииДо
32 Птица
 
29.04.13
16:45
(29) да походу автор откуда -то сдернул верный алгоритм в модуле, но, до конца не разобравшись, избавился от второй группировки, теперь у него получается, на каждую строку документа в результирующей таблице может возникнуть несколько строк с разными сроками годности.
соответственно, и спишется она есколько раз (или не спишется, не пройдя проверку)

(31) ну хотя бы срок эплуатации до, это же не кефир. странно делать для него измерение.
33 Птица
 
29.04.13
16:47
(31) а сообщение пользователю-таки про срок годности
34 Wobland
 
29.04.13
16:48
(32) ну как-то да, странный он какой-то. но мне вдаваться лениво. по меньшей мере до ужина ;)
35 _stay true_
 
29.04.13
18:46
Списать = МИН(Выборка1.КоличествоОстаток,ОсталосьСписать);

Объясните нубу, как оно работает(((
36 palpetrovich
 
29.04.13
18:48
(35) хм, а подумать если? кста,МИН - это минимум
37 Wobland
 
29.04.13
18:59
(35) http://screencast.com/t/ceQHBUXvurjG
с тебя 500 рублей за консультацию
38 _stay true_
 
29.04.13
19:08
Шо то безнадежно туплю под конец дня)))
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.