|
Перебор в цикле | ☑ | ||
---|---|---|---|---|
0
STAYEKR
12.06.12
✎
18:28
|
Друзья, помогите с запросом
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ЗаявкаНаОплату.Номер, | ЗаявкаНаОплату.Дата КАК дата, | ЗаявкаНаОплату.Тип КАК Тип, | ЗаявкаНаОплату.ПометкаУдаления КАК Удалить, | ЗаявкаНаОплату.ЭлементДоговора, | ЗаявкаНаОплату.Сумма КАК Сумма, | ЗаявкаНаОплату.Состояние |ИЗ | Документ.ЗаявкаНаОплату КАК ЗаявкаНаОплату |ГДЕ | ЗаявкаНаОплату.Дата < &ТекДата | И ЗаявкаНаОплату.Тип = &Тип | И ЗаявкаНаОплату.ПометкаУдаления = ЛОЖЬ | И ЗаявкаНаОплату.Состояние <> &СостояниеЗО"; Запрос.УстановитьПараметр("Тип","Инвестиционная"); Запрос.УстановитьПараметр("СостояниеЗО","ОтклоненоЗО"); Запрос.УстановитьПараметр("ТекДата",ТекущаяДата()); РезультатЗапроса = Запрос.Выполнить().Выбрать(); Пока РезультатЗапроса.Следующий()>0 Цикл Результат = РезультатЗапроса.Сумма; КонецЦикла; ОстатокПоЭлДог = Объект.ЭлементДоговора.Сумма - (Объект.Сумма + Результат.Сумма); Если ОстатокПоЭлДог < 0 Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Сумма заявки на оплату и в бюджет не должна превышать сумму по элементу договора"; Сообщение.Сообщить(); ЭтаФорма.КоманднаяПанель.ПодчиненныеЭлементы.ФормаПроведение.Доступность = Ложь; ЭтаФорма.КоманднаяПанель.ПодчиненныеЭлементы.ФормаПровестиИЗакрыть.Доступность = Ложь; КонецЕсли; Нужно чтобы ОстатокПоЭлДог считался по данным, полученным из запроса. Объект.Сумма - это сумма текущей завки на оплату, Результат.Сумма - сумма всех других заявок. Помогите, не могу додуматься, как в цикле это все посчитать. Заранее спасибо! |
|||
1
aleks-id
12.06.12
✎
18:30
|
ой как все запущено. СП украли? про Итоги не слышал?
|
|||
2
quest
12.06.12
✎
18:30
|
Запрос.Выполнить().Выгрузить().Итог("Сумма") - это если на скорую руку. А вообще - считай сразу в запросе -
"Сумма(ЗаявкаНаОплату.Сумма) КАК Сумма" и все остальные поля убери. Все равно не используешь. |
|||
3
vicof
12.06.12
✎
18:30
|
гкод детектед.
Заведи регистр накопления. |
|||
4
STAYEKR
12.06.12
✎
18:42
|
(2)Спасибо! Нужно нужно попробовать.
|
|||
5
AlexNew
12.06.12
✎
18:47
|
Вы хотите сказать, что это не вылетает по ощибке? Про остальное я промолчу.
|
|||
6
aleks-id
12.06.12
✎
18:54
|
>>Запрос.УстановитьПараметр("СостояниеЗО","ОтклоненоЗО");
в мемориз!! |
|||
7
m-serg74
12.06.12
✎
18:55
|
замена нам растет))))
|
|||
8
AlexNew
12.06.12
✎
18:56
|
Странно, что вам только это понравилось.
|
|||
9
cawokru
12.06.12
✎
18:56
|
Пока РезультатЗапроса.Следующий()>0 Цикл
Результат = РезультатЗапроса.Сумма; КонецЦикла; тоже шедевр |
|||
10
m-serg74
12.06.12
✎
18:57
|
мне не нравится... но помочь то чем могу?
|
|||
11
timurhv
12.06.12
✎
19:14
|
(0) лучше конечно использовать регистр, чем все документы перебирать)))
Тип документа и состояние в виде текста хранится? Про запрос уже писали, а непроведенные документы тоже учитываются? Сообщение необходимо выдавать с помощью процедуры общего модуля "ОбщегоНазначения.СообщитьОбОшибке". При каком событии отрабатывается проверка? И зачем изменять доступность кнопок проведения? Не проще возвращать отказ? |
|||
12
STAYEKR
12.06.12
✎
21:30
|
Господа, можете хоть весь текст моего сообщения в мемориз занести, я не обижусь. Я поэтому и обращаюсь к вам, т.к. сам решение найти не могу. Мне нужно перебрать результат запроса, если он не пустой. Учитывать надо документы, созданные ранее, не помеченные на удаление и не отклоненные. Откуда брать состояние завтра разбирусь, от вас it пытаюсь узнать, как перебрать данные из запроса, чтобы можно было посчитать ОстатокПоЭлДог согласно формуле. "ОстатокПоЭлДог = Объект.ЭлементДоговора.Сумма - (Объект.Сумма + Результат.Сумма);" Если сможете чем-то помочь, пусть и путем стеба над нубом, то буду очень благодарен! Заранее спасибо!
|
|||
13
STAYEKR
12.06.12
✎
21:33
|
(11) Суть задачи в том, чтобы закрывать доступность кнопки проведения для заявок, сумма которых превышает остаток по элементу договора. Проверка осуществляется соответственно при попытке провести заявку, не соотвествующую требованию (сумма заявок по элементу договора должна быть меньше остатка по элементу договора). Заранее спасибо!
|
|||
14
a_alenkin
12.06.12
✎
21:40
|
ТС наверное не знает про проведение и отмену проведения задним числом
|
|||
15
a_alenkin
12.06.12
✎
21:46
|
| И ЗаявкаНаОплату.Тип = &Тип
| И ЗаявкаНаОплату.ПометкаУдаления = ЛОЖЬ | И ЗаявкаНаОплату.Состояние <> &СостояниеЗО"; Запрос.УстановитьПараметр("Тип","Инвестиционная"); Запрос.УстановитьПараметр("СостояниеЗО","ОтклоненоЗО"); а так? | И ЗаявкаНаОплату.Тип = "Инвестиционная" | И ЗаявкаНаОплату.ПометкаУдаления = ЛОЖЬ | И ЗаявкаНаОплату.Состояние <> "ОтклоненоЗО""; |
|||
16
a_alenkin
12.06.12
✎
21:52
|
троллить чо то сегодня нет настроения, поэтому постараюсь поправильнее посоветовать
При проведении документа сделай нормальный запрос и выдавай отказ при выыполнении условия для которого отказ и не надо делать кнопку не дающую проводить - менеджеры которые вбивают такие заказы тоже не дураки бывают - если им уж очень надо провесвти документ - снимут с проведения более ранний и потом проведут |
|||
17
STAYEKR
12.06.12
✎
22:48
|
(16) спасибо, что не стали троллить!)) А что насчет перебора в цикле? Чтобы выводились актуальные данные.
|
|||
18
experimentator76
12.06.12
✎
22:56
|
(0) возвращайся сюда через пару лет и пусть тебе будет стыдно )
|
|||
19
STAYEKR
12.06.12
✎
23:35
|
(18) обязательно вернусь и сделаю тебе репост: мне стыдно))) А пока продолжу писать, как Вам, профессионалам, кажется, ахинею и ересь. В любом случае, благодарен всем откликнувшимся по делу! Ну и тем, у кого лютый бешеный "синдром вахтера" тоже))
|
|||
20
cViper
12.06.12
✎
23:50
|
(0)
Запрос.УстановитьПараметр("Тип","Инвестиционная"); Запрос.УстановитьПараметр("СостояниеЗО","ОтклоненоЗО"); Неверно передаешь параметры в запрос. Они имеют тип ПЕРЕЧИСЛЕНИЕ, а не строка. Данные у тебя не правильно отберутся. Поправь. РезультатЗапроса = Запрос.Выполнить().Выбрать(); Пока РезультатЗапроса.Следующий()>0 Цикл Результат = РезультатЗапроса.Сумма; КонецЦикла; Ты пытаешься получить итоги по отобранным данным, это можно сделать запросом. Почитай "ИТОГИ". Полученный в этом куске итог ты переписываешь постоянно в переменную РЕЗУЛЬТАТ. Если делать так как делаешь ты (без итогов), то нужно делать Пока РезультатЗапроса.Следующий() Цикл Результат = Результат + РезультатЗапроса.Сумма; КонецЦикла; подсчет остатка ты пишешь ОстатокПоЭлДог = Объект.ЭлементДоговора.Сумма - (Объект.Сумма + Результат.Сумма); в твоем случае надо делать иначе: ОстатокПоЭлДог = Объект.ЭлементДоговора.Сумма - (Объект.Сумма + Результат); |
|||
21
cViper
12.06.12
✎
23:52
|
+(0) Ты не корректно обходил результат запроса. Метод Следующий() вовзращает БУЛЕВО, а ты пытаешься сравнивать его с нулем. Смотри(20).
|
|||
22
cViper
12.06.12
✎
23:53
|
(0)Конкретно по задаче- надо делать запрос к регистру с проводками, ибо потом вылезут проблемы )
|
|||
23
STAYEKR
13.06.12
✎
00:21
|
(20) огромное спасибо!
|
|||
24
cViper
13.06.12
✎
00:46
|
(23) Рано говоришь спасибо. У тебя само решение не корректно. Делай через регистр накопления. Когда будет большой объём документов, то у тебя все зависнет с этим запросом.
|
|||
25
cViper
13.06.12
✎
00:46
|
+(24) Я всего-лишь указал баги в коде.
|
|||
26
timurhv
13.06.12
✎
01:00
|
(0) Еще нужно присвоить "Результат = 0;" перед перебором выборки раз уж так пишем, иначе далее получим ошибку для договоров, которые не были задействованы раннее.
|
|||
27
STAYEKR
13.06.12
✎
17:58
|
Склепал запрос:
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Сумма(ЗаявкаНаОплату.Сумма) КАК Сумма |ИЗ | Документ.ЗаявкаНаОплату КАК ЗаявкаНаОплату |ГДЕ | ЗаявкаНаОплату.Тип = &Тип | И ЗаявкаНаОплату.ПометкаУдаления = ЛОЖЬ | И ЗаявкаНаОплату.Состояние <> &СостояниеЗО | И ЗаявкаНаОплату.ЭлементДоговора = &ТекЭлДог"; Запрос.УстановитьПараметр("Тип",Справочники.ТипыЗаявок.Инвестиционная); Запрос.УстановитьПараметр("СостояниеЗО",Справочники.Состояния.ОтклоненаЗО); Запрос.УстановитьПараметр("ТекЭлДог",Объект.ЭлементДоговора); РезультатЗапроса = Запрос.Выполнить(); ВыборкаРезультата = РезультатЗапроса.Выбрать(); Результат = 0; //Проверка на пустую таблицу Если ВыборкаРезультата.Количество() > 0 Тогда //Если таблица заполнена Результат = Результат + ВыборкаРезультата[0].Сумма; //Нулевая строка Иначе Результат = 0;//Если таблица пустая КонецЕсли; ОстатокПоЭлДог = Объект.ЭлементДоговора.Сумма - (Объект.Сумма + Результат); Если ОстатокПоЭлДог < 0 Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Сумма заявки на оплату и в бюджет не должна превышать сумму по элементу договора"; Сообщение.Сообщить(); Отказ = Истина; КонецЕсли; Падает по ошибке: "Значение не является значением объектного типа", в чем причина, кроме моей криворукости в 1с? |
|||
28
izekia
13.06.12
✎
18:01
|
(27) что такое объект?
|
|||
29
STAYEKR
13.06.12
✎
18:01
|
Полный код ошибки "Значение не является значением объектного типа (Сумма)" Отладчиком не определяет значение ВыборкаРезультата[0].Сумма, отсюда "Результат" заполняется пустым значением => проверка на ЭлДог считается только по текущей заявке, а не по всем по этому элементу. Помогите, пожалуйста!
|
|||
30
STAYEKR
13.06.12
✎
18:02
|
(28) в данном случае: Объект.ЭлементДоговора.Сумма - это сумма по текущей заявке (которую хотим провести)
|
|||
31
izekia
13.06.12
✎
18:04
|
ЭлементДоговора и сумма - это реквизиты шапки?
|
|||
32
izekia
13.06.12
✎
18:10
|
кстати, так без лишнего:
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Сумма(ЗаявкаНаОплату.Сумма) КАК Сумма |ИЗ | Документ.ЗаявкаНаОплату КАК ЗаявкаНаОплату |ГДЕ | ЗаявкаНаОплату.Тип = ЗНАЧЕНИЕ(Справочник.ТипыЗаявок.Инвестиционная) | И ЗаявкаНаОплату.ПометкаУдаления = ЛОЖЬ | И ЗаявкаНаОплату.Состояние <> ЗНАЧЕНИЕ(Справочник.Состояния.ОтклоненаЗО) | И ЗаявкаНаОплату.ЭлементДоговора = &ТекЭлДог"; Запрос.УстановитьПараметр("ТекЭлДог",Объект.ЭлементДоговора); выборка = запрос.Выполнить().Выбрать(); Если выборка.Следующий() Тогда Результат = выборка.Сумма Иначе Результат = 0;//Если таблица пустая КонецЕсли; ОстатокПоЭлДог = Объект.ЭлементДоговора.Сумма - (Объект.Сумма + Результат); Если ОстатокПоЭлДог < 0 Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Сумма заявки на оплату и в бюджет не должна превышать сумму по элементу договора"; Сообщение.Сообщить(); Отказ = Истина; КонецЕсли; |
|||
33
izekia
13.06.12
✎
18:16
|
видимо начальник читает мисту и незамедлительно уволил автора
|
|||
34
STAYEKR
13.06.12
✎
18:17
|
Объект.ЭлементДоговора это реквизит формы документа ЗаявкаНаОплату. Сумма это подчиненный ЭлементуДоговора реквищит формы того же документа
|
|||
35
izekia
13.06.12
✎
18:18
|
так, стоп, вот это "Сумма это подчиненный ЭлементуДоговора реквищит формы того же документа" можно подробнее?
|
|||
36
izekia
13.06.12
✎
18:20
|
у элемента договора есть реквизит сумма? у документа есть реквизит сумма?
далее заявка на оплату по элементу договора может быть только одна? |
|||
37
STAYEKR
13.06.12
✎
18:27
|
И у элемента договора и у документа есть реквизит сумма. По элементу договора может быть несколько заявок. Суть задачи в следующем: не давать проводить заявку, если общая сумма всех заявок по элементу договора превышает остаток по элементу договора.
|
|||
38
izekia
13.06.12
✎
18:35
|
и все происходит в модуле в обработке проведения?
это в обычном приложении? если да, то просто так должно работать: Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Сумма(ЗаявкаНаОплату.Сумма) КАК Сумма |ИЗ | Документ.ЗаявкаНаОплату КАК ЗаявкаНаОплату |ГДЕ | ЗаявкаНаОплату.Тип = ЗНАЧЕНИЕ(Справочник.ТипыЗаявок.Инвестиционная) | И ЗаявкаНаОплату.ПометкаУдаления = ЛОЖЬ | И ЗаявкаНаОплату.Состояние <> ЗНАЧЕНИЕ(Справочник.Состояния.ОтклоненаЗО) | И ЗаявкаНаОплату.ЭлементДоговора = &ТекЭлДог"; Запрос.УстановитьПараметр("ТекЭлДог",Объект.ЭлементДоговора); выборка = запрос.Выполнить().Выбрать(); Если выборка.Следующий() И ЭлементДоговора.Сумма < Сумма + выборка.Сумма Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Сумма заявки на оплату и в бюджет не должна превышать сумму по элементу договора"; Сообщение.Сообщить(); Отказ = Истина; КонецЕсли; |
|||
39
izekia
13.06.12
✎
18:35
|
так на что ругаться будет?
|
|||
40
STAYEKR
13.06.12
✎
19:23
|
(39) это в процедуре ПриЗаписиНаСервере в модуле формы ФормаДокументаУпр документа ЗаявкаНаОплату.) Спасибо за помощь. Чуть позже попробую
|
|||
41
ILM
гуру
13.06.12
✎
21:34
|
Глядя на все это безобразия, осознаешь насколько хороша жизнь)))
Впереди просто океан высокооплачиваемой работы. |
|||
42
STAYEKR
13.06.12
✎
23:52
|
(41) я искренне рад, что хоть одно ничтожество смогло почесать свое ЧСВ о забор занозу человека, пытающегося постичь "Истину" этого ничтожества путем проб и ошибок. Аллаха, Будду и Иегову тебе в рабы, гуру. Не каждому ведь дано потратить свое никчемное время на комменты к этой Б-гомерзкой статейке! Да прибудет с тобой Адъ и Израиль, святейший гуру святейшей однозадницы!
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |