Имя: Пароль:
1C
 
Зацикливание ПриАктивацииСтроки Бух 3.0
,
0 Ychenik1c
 
01.06.17
09:33
Здравствуйте. Перечитал форумы, посмотрел Гилева, но не могу уйти от зацикливания. Делаю чтобы в справочники "Основные средства" выводились данные об первоначальной стоимости, амортизации и остаточной стоимости ОС на котором сейчас стоит. При открывания справочника зацикливается на первом элементе и 1с вылетает. Помогите.

[spoiler=Код]
&НаКлиенте
Процедура СписокПриАктивизацииСтроки(Элемент)
    ТекущиеОС = ЭтотОбъект.ТекущийЭлемент.ТекущиеДанные.Ссылка;
    ПолучитьДанныеПоОС(ТекущиеОС);    
КонецПроцедуры

&НаСервере
Функция ПолучитьДанныеПоОС(ТекущиеОС)
    
    СписокСчетов = Новый СписокЗначений;
    СписокСчетов.Добавить(ПланыСчетов.Хозрасчетный.ОСвОрганизации, 01.1);
    СписокСчетов.Добавить(ПланыСчетов.Хозрасчетный.АмортизацияОС_01, 02.1);

    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    ХозрасчетныйОстатки.Счет,
        |    ХозрасчетныйОстатки.Субконто1,
        |    ХозрасчетныйОстатки.СуммаОстатокДт,
        |    ХозрасчетныйОстатки.СуммаОстатокКт
        |ИЗ
        |    РегистрБухгалтерии.Хозрасчетный.Остатки(&Дата, Счет = &СписокСчетов, , Субконто1 = &ОС) КАК ХозрасчетныйОстатки";
    
    Запрос.УстановитьПараметр("Дата", ТекущаяДата());
    Запрос.УстановитьПараметр("ОС", ТекущиеОС);
    Запрос.УстановитьПараметр("СписокСчетов", СписокСчетов);
    
    РезультатЗапроса = Запрос.Выполнить();
    
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл

    КонецЦикла;
    
    
КонецФункции    
[/spoiler]
1 Lolipop
 
01.06.17
09:35
Проблема не с выполнением кода на сервере. Это точно. Была такая ошибка. По-моему, нужно копать в ТекущиеОС = ЭтотОбъект.ТекущийЭлемент.ТекущиеДанные.Ссылка;
2 Ёпрст
 
01.06.17
09:37
(0) в каком месте "зацикливается" ?
3 Альбатрос
 
01.06.17
09:37
ТаблицаФормы (FormTable)
ПриАктивизацииСтроки (OnActivateRow)
Синтаксис:

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

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

В обработчике данного события нельзя использовать серверные методы формы с директивой компиляции &НаСервере.
4 Альбатрос
 
01.06.17
09:37
Обращаем внимание на последнюю строку
5 Альбатрос
 
01.06.17
09:38
Делай через обработчик ожидания
6 Fedor-1971
 
01.06.17
09:39
(0) Отследи переход на сервер

&НаКлиенте
перем УжеНаСервере
&НаКлиенте
Процедура ПриОткрытии()
УжеНаСервере=Ложь;
Конецпроцедуры

&НаКлиенте
Процедура СписокПриАктивизацииСтроки(Элемент)
  Если УжеНаСервере тогда
    Возврат;
  КонецЕсли;
  УжеНаСервере=Истина;
    ТекущиеОС = ЭтотОбъект.ТекущийЭлемент.ТекущиеДанные.Ссылка;
    ПолучитьДанныеПоОС(ТекущиеОС);    
  УжеНаСервере=Ложь;
КонецПроцедуры
7 Fedor-1971
 
01.06.17
09:41
6+ или внеконтестный вызов сервера (НаСервереБезКонтекста) и возвращай структуру чего тебе нужно было от сервера
8 dezss
 
01.06.17
09:42
Счет = &СписокСчетов?
А список счетов это все таки список.
может
Счет В (&СписокСчетов)?

И таки да, &НаСервере не стоит.
Если где-то (в любых других ПриАктивизацииСтроки) есть изменение видимости или любая другая подобная шнягя(имеется ввиду, изменение каких-нибудь свойств элементов формы), то будет вот такое зацикливание.
9 Buster007
 
01.06.17
09:44
(7) лучше хранить ОС, по которому были получены остатки
на форме могут присутствовать др. серверные процедуры, после которых будет выполняться метод при активизации строки и заново считываться остатки
10 Buster007
 
01.06.17
09:45
(0) сделай произвольный запрос и получай остатки там, если ОСов не много, конечно
11 Fedor-1971
 
01.06.17
09:48
(8) не обязательно, ПриАктивацииСтроки выполняются все что есть на форме и в неизвестном порядке, поэтому если один ломанулся НаСервер и что-то изменил в форме получаем лавину беготни "А у меня что-то изменилось?" и "Надо ли мне обновить данные?"

(10) ТС решил поизучать возможности ДС, доберётся и до произвольного запроса с получением остатков
12 IoannVic
 
01.06.17
09:52
(0) Сталкивался с этим. Зацикливание происходит в момент открытия формы. Связано это с тем, что при формирование формы с динамическим списком активизирует первую строку и вызывает событие.
У тебя в этом событие происходит табличное обращение к данным (т.е. запрос) и после возвращение на клиент идет перерисовка формы и опять вызывается при активизации строки возникает зацикливание.
Данная проблема тащится еще с 8.2 и уже не раз была зарегистрирована на багрепорте 1с
Есть два варианта, оба так себе.
1. Сделать произвольный запрос в ДС. Минусы: нагружаешь форму при открытие.
2. Сделать костыль в виде булевы. Которая, хранит был ли пересчет и если был то код не выполняется. Минусы: это костыль.

А вообще самый правильный вариант - это сделать отчет по бух остаткам, потом сделать команду и организовать переход через командный интерфейс формы элемента с параметрами этого элемента. Так завещал 1с
13 Ychenik1c
 
02.06.17
11:19
Всем спасибо. Все работает. Вот код может кому поможет.

[spoiler=Код]

&НаКлиенте
Процедура СписокПриАктивизацииСтроки(Элемент)
    ТекущиеОС = ЭтотОбъект.ТекущийЭлемент.ТекущиеДанные.Ссылка;
    ЗначенияМои = ПолучитьДанныеПоОС(ТекущиеОС);
    БалансоваяСтоиость = ЗначенияМои.Дт;
    Амортизация = ЗначенияМои.Кт;
    ОстаточнаяСтоимость = ЗначенияМои.Дт - ЗначенияМои.Кт;
КонецПроцедуры



&НаСервере
Функция ПолучитьДанныеПоОС(ТекущиеОС)
    
    СписокСчетов = Новый СписокЗначений;
    СписокСчетов.Добавить(ПланыСчетов.Хозрасчетный.ОСвОрганизации, 01.1);
    СписокСчетов.Добавить(ПланыСчетов.Хозрасчетный.АмортизацияОС_01, 02.1);

    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    ХозрасчетныйОстатки.Счет,
        |    ХозрасчетныйОстатки.Субконто1,
        |    ХозрасчетныйОстатки.СуммаОстатокДт,
        |    ХозрасчетныйОстатки.СуммаОстатокКт
        |ИЗ
        |    РегистрБухгалтерии.Хозрасчетный.Остатки(&Дата, Счет В (&СписокСчетов), , Субконто1 = &ОС) КАК ХозрасчетныйОстатки";
    
    Запрос.УстановитьПараметр("Дата", ТекущаяДата());
    Запрос.УстановитьПараметр("ОС", ТекущиеОС);
    Запрос.УстановитьПараметр("СписокСчетов", СписокСчетов);  
    
    ТЗ=Запрос.Выполнить().Выгрузить();
    стСтруктура = Новый Структура("Дт, Кт", 0, 0);
    Для Каждого Строки Из ТЗ Цикл
        Если Строки.СуммаОстатокДт <> 0 Тогда
            стСтруктура.Вставить("Дт", Строки.СуммаОстатокДт);
        ИначеЕсли Строки.СуммаОстатокКт <> 0 Тогда
            стСтруктура.Вставить("Кт", Строки.СуммаОстатокКт);
        КонецЕсли
    КонецЦикла;
    
    Возврат стСтруктура;
КонецФункции    

[/spoiler]
14 Волшебник
 
модератор
02.06.17
11:23
просьба не писать вот эту фигню [spoiler=Код] [/spoiler]
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.