Имя: Пароль:
1C
 
Как передать актуальные данные формы? Уф
,
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,СтрокаТЧ.СуммаНДС)/СтрокаТЧ.Количество*СтрокаТЗ.Количество;
                    //СтрокаТЗ.СуммаУпр=СтрокаТЗ.СуммаВзаиморасчетов;
                КонецЕсли;
                
            КонецЦикла;)
в общем модуле.
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан