Имя: Пароль:
1C
1С v8
Вечный цикл на управляемой форме.
0 SpellKeeper
 
16.02.18
12:55
Добрый день.
На управляемой форме есть заполненное дерево значений.
Мне нужно при активизации строки заполнить другую таблицу данными из базы.
Вот три процедуры, которые используются. В скобочках указаны номера двух строк. Это важно. Читайте до конца.
&НаКлиенте
Процедура ГруппыДеталейВходПриАктивизацииСтроки(Элемент)
(613)    СтрокаГруппыВход = Элемент.ТекущиеДанные;
    
    Объект.СписокДеталей.Очистить();
    Объект.ПараметрыДеталей.Очистить();
    Объект.ПричиныВыбраковки.Очистить();
    
    СформироватьОписаниеГруппы(СтрокаГруппыВход);
    
КонецПроцедуры

&НаКлиенте
Процедура СформироватьОписаниеГруппы(ТекДанные)
    ОписаниеГруппы.Очистить();
    Если ТекДанные = Неопределено Тогда
        Возврат;
    КонецЕсли;
(753) СформироватьОписаниеГруппыНаСервере(Элементы.ГруппыДеталейВход.ТекущиеДанные.Владение, Элементы.ГруппыДеталейВход.ТекущиеДанные.ДокументПоступления, Элементы.ГруппыДеталейВход.ТекущиеДанные.ВагонПоступления);
    
КонецПроцедуры

&НаСервере
Процедура СформироватьОписаниеГруппыНаСервере(Владение, ДокументПоступления, Вагон)
    
    //тГруппы = РеквизитФормыВЗначение("ГруппыДеталей");
    тОписание = РеквизитФормыВЗначение("ОписаниеГруппы");
    Если Владение = Перечисления.твмВладениеДеталей.Переподкатка Тогда
        Если ЗначениеЗаполнено(Вагон) Тогда
            НовСтр = тОписание.Строки.Добавить();
            НовСтр.Параметр = "Вагон поступления";
            НовСтр.Значение = Вагон;
        Иначе
            НовСтр = тОписание.Строки.Добавить();
            НовСтр.Параметр = "Группа";
            НовСтр.Значение = "Группа деталей поступивщих под вагонами";
        КонецЕсли;
    ИначеЕсли Владение = "Установка на вагон" Тогда
        Если ЗначениеЗаполнено(Вагон) Тогда
            НовСтр = тОписание.Строки.Добавить();
            НовСтр.Параметр = "Вагон установки";
            НовСтр.Значение = Вагон;
        Иначе
            НовСтр = тОписание.Строки.Добавить();
            НовСтр.Параметр = "Группа";
            НовСтр.Значение = "Группа установки деталей на вагон";
        КонецЕсли;
        
    ИначеЕсли ЗначениеЗаполнено(ДокументПоступления) Тогда
        НовСтр = тОписание.Строки.Добавить();
        НовСтр.Параметр = "Группа";
        НовСтр.Значение = "Группа деталей " + Владение + " " + Строка(ДокументПоступления);
        
    Иначе
        НовСтр = тОписание.Строки.Добавить();
        НовСтр.Параметр = "Группа";
        НовСтр.Значение = "Группа деталей " + Владение;
    КонецЕсли;
    
    ЗначениеВРеквизитФормы(тОписание, "ОписаниеГруппы");
КонецПроцедуры // ПолучитьПараметрыГруппы()

И тут 1С выпадает в бесконечный цикл и зависает.
Не получается выгрузить лог вызовов в текст, но суть в следующем: бесконечные вызовы строк
613
753
613
753
......

Я решительно не понимаю что происходит.
Может просветите?
1 SpellKeeper
 
16.02.18
12:58
Уточнение
Процедура ГруппыДеталейВходПриАктивизацииСтроки - это описание события таблицы отличной от той, которая заполняется на сервере.
2 Dilgorp
 
16.02.18
13:01
Никогда и ни в коем случае при активизации строки нельзя использовать контекстные вызовы сервера.

Когда сервер возвращает форму обратно и "восстанавливает" ее состояние, событие при активизации строки снова срабатывает и (и так пока ресурсы не кончатся).
3 SpellKeeper
 
16.02.18
13:03
О! как.
Спасибо. Запомню.
На стенке выштраблю.
4 Tateossian
 
16.02.18
13:12
Это 1С по умолчанию борется с циклическими ссылками. Если вы включите контроль циклических ссылок - я вас уверяю - примерно через пять минут работы программы она упадет с грохотом:)
5 Buster007
 
16.02.18
13:19
(3) в СП об этом написано.
6 SpellKeeper
 
16.02.18
13:49
(5). Это хорошо, когда ты четко понимаешь в какой раздел лезть. Но такого уровня ты достигнешь, когда и так будешь знать большую часть из хелпа.
А когда ты даже не очень понимаешь как правильно вопрос задать, то перечитывать ВСЁ, в поиске ма-а-а-ленького вопроса, наверное, увлекательно, но слишком долго.