|
Зацикливание ПриАктивацииСтроки Бух 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]
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |