Имя: Пароль:
1C
1С v8
Неадекватное поведение управляемых форм.
0 espanol
 
22.05.12
16:28
&НаКлиенте
Процедура СписокПриАктивизацииСтроки(Элемент)
   Если НЕ Элементы.Список.ТекущиеДанные.ЭтоГруппа Тогда
       //ВыводОстатокИРозничныхЦен(Элементы.Список.ТекущиеДанные.Ссылка);
       ПолучениеОстатков(Элементы.Список.ТекущиеДанные.Ссылка);
       //ПоказатьКартинку(Элементы.Список.ТекущиеДанные.Ссылка);
   КонецЕсли;
КонецПроцедуры

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


Не понимаю почему после выгрузки, сразу прыгает в Процедура СписокПриАктивизацииСтроки(Элемент)? и так зацикливается до бесконечности!
1 ptiz
 
22.05.12
16:31
Например, ты остатки на форме обновляешь так, что выполняется перерисовка формы.
2 Азат
 
22.05.12
16:36
Батюшка, сие не есть новость... У Чистова было разъяснение на эту тему))
3 ГАГАТУН
 
22.05.12
16:36
все логично, ты при активизации строки вызываешь серверную процедуру.
При обращении к серверу форма обновляется и опять возникает событие активизации строки.
4 ГАГАТУН
 
22.05.12
16:37
+(3) пиши все на клиенте без обращений к серверу
5 ГАГАТУН
 
22.05.12
16:39
+(4) хотя у меня есть вариант в котором это работает
&НаКлиенте
Процедура ОбъектыНедвижимостиПриАктивизацииСтроки(Элемент)                              
   
   Если НЕ Элементы.ОбъектыНедвижимости.ТекущаяСтрока = Неопределено Тогда
       
       ПрочитатьОбщуюИнформациюПоОбъектуСделкиНаСервереШапка();
       
   КонецЕсли;

КонецПроцедуры
6 espanol
 
22.05.12
16:40
(4) на клиенте запрос и множество другого не пашет
7 ГАГАТУН
 
22.05.12
16:41
&НаСервере
Процедура ПрочитатьОбщуюИнформациюПоОбъектуСделкиНаСервереШапка()
   
   АктивнаяСтрока = Объект.ОбъектыНедвижимости.НайтиПоИдентификатору(Элементы.ОбъектыНедвижимости.ТекущаяСтрока);
   
   СсылкаНаНедвижимость = АктивнаяСтрока.ОбъектНедвижимости;
                             
   Запрос = Новый Запрос;
   Запрос.УстановитьПараметр("Ссылка", СсылкаНаНедвижимость);
   Запрос.Текст =
   "ВЫБРАТЬ
   |    ПлощадиОбъектовНедвижимости.ОбщаяПлощадь,
   |    ПлощадиОбъектовНедвижимости.ЖилаяПлощадь,
   |    ПлощадиОбъектовНедвижимости.ПлощадьКухни,
   |    ПлощадиОбъектовНедвижимости.КоличествоЖилыхКомнат,
   |    ПлощадиОбъектовНедвижимости.ПлощадиЖилыхКомнат,
   |    УсловияПродажиОбъектов.КоличествоКомнатДляПродажиАренды,
   |    ПравообладателиОбъектов.Контрагент КАК КонтрагентПравообладатель
   |ИЗ
   |    Справочник.УПН_ОбъектыНедвижимости КАК ОбъектыНедвижимости
   |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.УПН_ПлощадиОбъектовНедвижимости.СрезПоследних(, ОбъектНедвижимости = &Ссылка) КАК ПлощадиОбъектовНедвижимости
   |        ПО (ПлощадиОбъектовНедвижимости.ОбъектНедвижимости = ОбъектыНедвижимости.Ссылка)
   |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.УПН_УсловияПродажиОбъектов.СрезПоследних(, ОбъектНедвижимости = &Ссылка) КАК УсловияПродажиОбъектов
   |        ПО ОбъектыНедвижимости.Ссылка = УсловияПродажиОбъектов.ОбъектНедвижимости
   |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.УПН_ПравообладателиОбъектов.СрезПоследних(, ОбъектНедвижимости = &Ссылка) КАК ПравообладателиОбъектов
   |        ПО ОбъектыНедвижимости.Ссылка = ПравообладателиОбъектов.ОбъектНедвижимости
   |ГДЕ
   |    ОбъектыНедвижимости.Ссылка = &Ссылка";
   
   Результат = Запрос.Выполнить();
   Выборка = Результат.Выбрать();
   
   Если Выборка.Следующий() Тогда
               
       ОбщаяПлощадь                     = Выборка.ОбщаяПлощадь;
       ЖилаяПлощадь                     = Выборка.ЖилаяПлощадь;
       ПлощадьКухни                     = Выборка.ПлощадьКухни;
       КоличествоЖилыхКомнат             = Выборка.КоличествоЖилыхКомнат;
       ПлощадиЖилыхКомнат                 = Выборка.ПлощадиЖилыхКомнат;
       КонтрагентПравообладатель         = Выборка.КонтрагентПравообладатель;
       КоличествоКомнатДляПродажиАренды = Выборка.КоличествоКомнатДляПродажиАренды;        
       
   Иначе
       ОбщаяПлощадь                     = "";
       ЖилаяПлощадь                     = "";
       ПлощадьКухни                     = "";
       КоличествоЖилыхКомнат             = "";
       ПлощадиЖилыхКомнат                 = "";
       КонтрагентПравообладатель         = "";
       КоличествоКомнатДляПродажиАренды = "";

   КонецЕсли;
   
   ЗаполнитьЗдание();
   
КонецПроцедуры
8 Ranger_83
 
22.05.12
16:41
Маразм крепчал
9 ГАГАТУН
 
22.05.12
16:42
(6) вероятно, в серверной процедуре ты что-то меняешь в табличной части, в результате чего возникает обновление формы (синхронизация с сервером)
10 espanol
 
22.05.12
16:43
(9) понятно, я тока начинаю разбираться с этой клиент-серверной архитектурой, разберусь, таких вопросов не возникнет...
11 DocWin
 
22.05.12
16:44
НЕЛЬЗЯ использовать не сервере

ПриАктивизацииСтроки (OnActivateRow)
Синтаксис:

ПриАктивизацииСтроки()
Описание:

Вызывается при активизации строки таблицы.
Примечание:

В обработчике данного события нельзя использовать серверные методы формы с директивой компиляции &НаСервере.
12 Ranger_83
 
22.05.12
16:44
(10)"Разработка управляемого интерфейса" из серии проф.разработка тебе в помощь
13 Ranger_83
 
22.05.12
16:45
(11)А что там про безконтекстный вызов говорится?
14 ГАГАТУН
 
22.05.12
16:45
(11) я использую и никаких проблем. Пример (5) и (7)
15 espanol
 
22.05.12
16:53
(11) ну а как тогда реализовать механизм, если тыкаем на строчку, должен обрабатываться запрос, и на форме другая табличка должна меняться...
16 ГАГАТУН
 
22.05.12
16:57
(15) например, создай реквизит формы с типом "ТаблицаЗначений" и выгружай в него запрос, его на сервере не будет, соответственно, обновления формы возникать не будет.
17 espanol
 
22.05.12
17:01
(16) но веть это будет отрабатываться для каждой строки...
18 ГАГАТУН
 
22.05.12
17:03
(17) пофигу, реквизит формы с "объектом" не связан, соответственно, все будет путем.
19 ГАГАТУН
 
22.05.12
17:04
+(18) у меня в (7) заполняются именно реквизиты формы, не связанные с "объектом" - никаких проблем не возникает
20 espanol
 
22.05.12
17:05
(18) у меня Таблица Остатки это реквизит форма с типом Таблица значений....
21 ГАГАТУН
 
22.05.12
17:06
(20) тогда не знаю почему у меня работает, а у тебя нет.

полный текст процедуры выложи
22 ГАГАТУН
 
22.05.12
17:07
+(21) а нафига тебе нужны остатки при активизации каждой строки?
23 YAGolova
 
22.05.12
17:09
Я бы сделал переменную в модуле формы на клиенте и менял ее значение при первом выполнение ПриАктивизацииСтроки, ну и соответственно не выполнял бы код, если переменная не нужного мне значения.......как то так
24 ГАГАТУН
 
22.05.12
17:10
(23) если нужен остаток, я бы добавил колонку, не связанную с данными в ту же таблицу и заполнял её цифирькой
25 ГАГАТУН
 
22.05.12
17:11
+(24) сделал бы еще кнопку "Обновить", чтобы обновлялось по требованию юзера, а не по активизации строки
26 ГАГАТУН
 
22.05.12
17:12
+(25) ибо нафига нужен тогда именно тонкий клиент, если он постоянно тыркается к серверу?
27 espanol
 
22.05.12
17:14
(24) складов тьма, и надо показать по каждому складу...
28 YAGolova
 
22.05.12
17:14
(23)Я не очень насто с УФ работаю, поэтому может че не понимаю, но форма ведь существует одновременно и на сервере и на клиенте, почему ты говоришь, что если реквизит не связан с объектом при вызове процедуры НаСервере не происходит синхронизация с сервером?
29 ГАГАТУН
 
22.05.12
17:15
(28) вообще не понимаю, почему у меня (5) и (7) тогда работает?
30 YAGolova
 
22.05.12
17:23
(29) Опять же точно вспомнить не могу, но помоему есть какое то свойсто у табличного поля, типо при изменениии патоматически активизировать первую строку, видать у тебя это свойство стоит в "НЕТ" и спасает от зацикиливания строка:  Если НЕ Элементы.ОбъектыНедвижимости.ТекущаяСтрока = Неопределено Тогда
31 ГАГАТУН
 
22.05.12
17:43
(30) нет такого свойства. По ходу проблема автора в том, что он в таблицу на форме выводит, и из-за этого дергаются все таблицы.

А я в реквизит не табличного типа вывожу...
32 IamAlexy
 
22.05.12
18:38
(0) http://partners.v8.1c.ru/forum/thread.jsp?id=751564#751564

а вообще, взрослые люди при активизации строки подключают обработчик ожидания с однократным выполнением..
и никакого зацикливания
33 Ranger_83
 
23.05.12
07:46
(0)попробуй заполнять остатки в ТЗ не на сервере,а на клиенте заменив серверную процедуру функцией.И поменяй директиву компиляции на безконтекстную,накуя гонять данные формы на сервере,если ты впоследствии используешь только ссылку.
34 toypaul
 
гуру
23.05.12
07:53
вроде такая же проблема была. просто запоминал текущий элемент в переменной и второй раз не вызывал процедуру.
35 dimm7310
 
23.05.12
08:15
в конце прошлой недели обеими ногами наступил на эти грабли.

решил также как в (34)