|
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
|
Шо то безнадежно туплю под конец дня)))
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |