|
Как передать актуальные данные формы? Уф | ☑ | ||
---|---|---|---|---|
0
pro3ri
16.11.15
✎
19:10
|
добрый вечер!
1с 83. На форме изменил значения. Количество было 1 стало -453. На форме есть код: &НаКлиенте Процедура ПроверкаДокумента(Команда) ПроверкаДокументовСервер.ПроверитьДокумент(Объект.Ссылка); КонецПроцедуры в общий модуль: Процедура ПроверитьДокумент(Документ) Экспорт Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ПродажаТоваровТовары.Товар, | ПродажаТоваровТовары.НомерСтроки |ИЗ | Документ.ПродажаТоваров.Товары КАК ПродажаТоваровТовары |ГДЕ | ПродажаТоваровТовары.Ссылка = &Ссылка | И ПродажаТоваровТовары.Количество < 0"; Запрос.УстановитьПараметр("Ссылка", Документ); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Пока Выборка.Следующий() Цикл Предупреждение("Ошибка в строке № "+Выборка.НомерСтроки+" количество не может быть отрицательным!", 5); КонецЦикла; КонецПроцедуры тут запрос видит значение 1. Как сделать чтобы он видел актуальные данные? |
|||
1
pro3ri
16.11.15
✎
19:11
|
предлагаю такое решение:
модуль формы: &НаКлиенте Процедура ПроверкаДокумента(Команда) //ПроверкаДокументовСервер.ПроверитьДокумент(Объект); //ПроверкаДокументовСервер.ПроверитьДокумент(Объект.Ссылка); ВызовСервер(); КонецПроцедуры &НаСервере Процедура ВызовСервер() Док = РеквизитФормыВЗначение("Объект",Тип("ДокументОбъект.ПродажаТоваров")); ПроверкаДокументовСервер.ПроверитьДокумент(Док); КонецПроцедуры ом: Процедура ПроверитьДокумент(Документ) Экспорт НачатьТранзакцию(); Документ.Записать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ПродажаТоваровТовары.Товар, | ПродажаТоваровТовары.НомерСтроки |ИЗ | Документ.ПродажаТоваров.Товары КАК ПродажаТоваровТовары |ГДЕ | ПродажаТоваровТовары.Ссылка = &Ссылка | И ПродажаТоваровТовары.Количество < 0"; Запрос.УстановитьПараметр("Ссылка", Документ.ссылка); Результат = Запрос.Выполнить(); Если Не Результат.Пустой() Тогда ОтменитьТранзакцию(); Иначе ЗафиксироватьТранзакцию(); КонецЕсли; Выборка = Результат.Выбрать(); Пока Выборка.Следующий() Цикл //Предупреждение("Ошибка в строке № "+Выборка.НомерСтроки+" количество не может быть отрицательным!", 5); Сообщить("Ошибка в строке № "+Выборка.НомерСтроки+" количество не может быть отрицательным!"); КонецЦикла; КонецПроцедуры |
|||
2
pro3ri
16.11.15
✎
19:11
|
а как это сделать проще?
|
|||
3
letni88
16.11.15
✎
19:22
|
Нужно посмотреть актуальные остатки чтоли?
|
|||
4
pro3ri
16.11.15
✎
19:26
|
(3) нужно посмотреть что забито на форме, было так https://s.mail.ru/38pdWwfMW24Z/img-2015-11-16-21-23-50.png нажал кнопку Проверка документа. Все ок.
Сделал так https://s.mail.ru/p9AnTR2uWv3r/img-2015-11-16-21-24-43.png нажал кнопку Проверка документа опять все ок (а должен ругаться). В общем модуле он берет значения по ссылке. Нужно передать актуальные данные с формы на общий модуль сервера. |
|||
5
su_mai
16.11.15
✎
19:26
|
(2) Проще установить галочку "Неотрицательное" в свойствах реквизита табличной части.
|
|||
6
su_mai
16.11.15
✎
19:27
|
(5) В дереве объектов выбрать реквизит Количество и в свойствах установить галку.
|
|||
7
pro3ri
16.11.15
✎
19:28
|
(5) согласен, но такое особое пожелание заказчика
|
|||
8
su_mai
16.11.15
✎
19:36
|
(7) В смысле? Ну тогда перебирай строки на клиенте
&НаКлиенте Процедура ПередЗаписью(Отказ, ПараметрыЗаписи) Для каждого СтрокаТабличнойЧасти Из Объект.Номенклатура Цикл Если СтрокаТабличнойЧасти.Количество < 0 Тогда //Сообщить Отказ = Истина; Прервать; КонецЕсли; КонецЦикла; КонецПроцедуры |
|||
9
pro3ri
16.11.15
✎
19:41
|
благодарю. Но требуется использовать именно серверную процедуру из формы для проверки.
|
|||
10
su_mai
16.11.15
✎
20:53
|
(9) Тогда вот так:
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты) Для каждого СтрокаТЧ Из Номенклатура Цикл Если СтрокаТЧ.Количество < 0 Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "В строке № " + СтрокаТЧ.НомерСтроки + " количество меньше 0!"; Сообщение.Поле = "Номенклатура[" + Номенклатура.Индекс(СтрокаТЧ) + "].Количество"; Сообщение.УстановитьДанные(ЭтотОбъект); Сообщение.Сообщить(); Отказ = Истина; КонецЕсли; КонецЦикла; КонецПроцедуры |
|||
11
su_mai
16.11.15
✎
20:53
|
(10) Это модуль объекта
|
|||
12
su_mai
16.11.15
✎
20:58
|
(11) Методически это более правильно чем располагать проверку например в серверном событии формы ОбработкаПроверкиЗаполненияНаСервере или в ПередЗаписьюНаСервере. Однако событие ОбработкаПроверкиЗаполнения срабатывает только при проведении документа, при записи оно не возникает. То есть записать документ с отрицательным Количеством можно, а вот провести уже нет.
|
|||
13
Мимохожий Однако
16.11.15
✎
21:05
|
(9)Логичнее проверить на форме, если известно условие. Незачем зря трясти сервер.
|
|||
14
su_mai
16.11.15
✎
21:18
|
(13) Тоже так думал, но он все - равно "трясется", количество серверных вызовов не увеличивается, так как это событие возникает всегда при проведении документа и при записи проведенного.
В модуле проверять надо реквизиты основного объекта, а в форме на сервере, дополнительные реквизиты формы. Тут может быть вопрос зачем вообще записывать неправильный документ? Но представьте, что в нем >= 1000 строк, а бухгалтер забивала несколько часов с бумаги эту табличную часть и теперь очень хочет в туалет, а потом сразу на обед, чтоб руки два раза не мыть. Логичнее предоставить возможность записать все, но не проводить. :) |
|||
15
Горогуля
16.11.15
✎
21:45
|
А никто не подумал о правильном типе?
|
|||
16
su_mai
16.11.15
✎
21:51
|
(15) Подумали (5)
|
|||
17
pro3ri
17.11.15
✎
08:49
|
(10) спасибо конечно но вся соль в том, чтобы проверить запросом
(Для каждого СтрокаТЧ из Товары Цикл // ОстатокОстаткиТоваровПоЗаказуПокупателя(Сделка,ДоговорКонтрагента,Дата); Отбор = Новый Структура ("ЗаказПокупателя, Номенклатура", Сделка,СтрокаТЧ.Номенклатура); //Остатки = РегистрыНакопления.ЗаказыПокупателей.Остатки(Дата,Отбор,"Номенклатура","Количество"); Остатки = РегистрыНакопления.ЗаказыПокупателей.Остатки(Сделка.Дата+1,Отбор,"Номенклатура","Количество"); Если Остатки.Количество()>0 Тогда ОстатокЗаказа=Остатки[0].Количество; Иначе ОстатокЗаказа=0; КонецЕсли; Если ОстатокЗаказа>0 Тогда СтрокаТЗ=ТаблицаПоТоварам.Добавить(); СтрокаТЗ.Склад=СтрокаТЧ.Склад; СтрокаТЗ.Номенклатура=СтрокаТЧ.Номенклатура; СтрокаТЗ.ЕдиницаИзмерения=СтрокаТЧ.ЕдиницаИзмерения; СтрокаТЗ.Цена=СтрокаТЧ.Цена; //СтрокаТЗ.Количество=?(ОстатокЗаказа>СтрокаТЧ.Количество,СтрокаТЧ.Количество,ОстатокЗаказа); СтрокаТЗ.Количество=СтрокаТЧ.Количество; //СтрокаТЗ.СуммаВзаиморасчетов=СтрокаТЧ.Сумма+?(Сделка.СуммаВключаетНДС,0,СтрокаТЧ.СуммаНДС)/СтрокаТЧ.Количество*СтрокаТЗ.Количество; //СтрокаТЗ.СуммаУпр=СтрокаТЗ.СуммаВзаиморасчетов; КонецЕсли; КонецЦикла;) в общем модуле. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |