Имя: Пароль:
1C
1С v8
Событие ПриВыводеСтроки грузит процессор
0 romaku
 
06.09.11
17:17
Добрый день

В Табличном поле документа есть событие ПриВыводеСтроки, к нему прицеплена процедура:


Процедура ТабличноеПолеДвиженияПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
   
   Если ДанныеСтроки.СтатусПересчета = Перечисления.СтатусПересчета.Manual или (Не Данныестроки.СчетДт.Валютный и Не Данныестроки.СчетКт.Валютный) тогда
       Элемент.колонки.Сумма.ТолькоПросмотр = Ложь;
       Элемент.колонки.Сумма2.ТолькоПросмотр = Ложь;
   Иначе
       Элемент.колонки.Сумма.ТолькоПросмотр = Истина;
       Элемент.колонки.Сумма2.ТолькоПросмотр = Истина;
   КонецЕсли;    
   
КонецПроцедуры

Проблема в том, что эта процедура очень сильно грузит процессор. Если  эти строчки закомментировать, то все нормально. Как сделать по другому? Может на другое событие как-то перевесить? Можно ли как-то поймать получение фокуса на "ПолеВвода"?

Смысл процедуры в том, что доступность редактирования ячейки в строке зависит от значение другой ячейки в этой же строке.

Спасибо.
1 pavig
 
06.09.11
17:24
Не Данныестроки.СчетДт.Валютный и Не Данныестроки.СчетКт.Валютный

замени на

Не (Данныестроки.СчетДт.Валютный ИЛИ Данныестроки.СчетКт.Валютный)

но проблема не в этом

озвучь плиз платформу, ОС и прочее
2 unregistered
 
06.09.11
17:31
(0) Бред какой-то.

И какой смысл менять свойство ВСЕЙ КОЛОНКИ в событии ПриВыводеСтроки?

В итоге получим, что у всего табличного поля свойство "ТолькоПросмотр" колонок Сумма и Сумма будет таким, какие счета в самой последней выведенной строке.

Маразм.....
3 unregistered
 
06.09.11
17:32
(2)* "Сумма и Сумма" = "Сумма и Сумма2"
4 Megas
 
06.09.11
17:33
Да и вообще лучше в при получении данных это делать. Хотя в твоём случае пофиг =)
5 ptiz
 
06.09.11
17:34
Феерично.
6 kosts
 
06.09.11
17:46
Попробуй примерно так переписать.

Перем СоответствиеСчетовВалютныйЛи;
Перем Перечисления_СтатусПересчета_Manual;

Процедура ТабличноеПолеДвиженияПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
   Если ДанныеСтроки.СтатусПересчета = Перечисления_СтатусПересчета_Manual или (Не СоответствиеСчетовВалютныйЛи(Данныестроки.СчетДт) = Истина и Не СоответствиеСчетовВалютныйЛи(Данныестроки.СчетКт) = Истина) тогда
   Иначе
   КонецЕсли;    
КонецПроцедуры

Перечисления_СтатусПересчета_Manual = Перечисления.СтатусПересчета.Manual;

СоответствиеСчетовВалютныйЛи = новый соответствие;
СоответствиеСчетовВалютныйЛи.Добавить(Счет1, Счет1.Валютный);
СоответствиеСчетовВалютныйЛи.Добавить(Счет2, Счет2.Валютный);
...
7 Euguln
 
06.09.11
17:48
Такое надо делать в событиях "ПередНачаломИзменения" или "ПриНачалеРедактирования" или на крайний случай "ПриАктивизацииСтроки"
8 wertyu
 
06.09.11
17:52
(0) лучше заведи ещё один реквизит в ТЧ типа булево и меняй его в ПриИзменении у полей ввода "СтатусПересчета", "СчетДт" и "СчетКт"
9 romaku
 
06.09.11
17:52
спасибо за критику. сделал через ПриАктивизацииКолонки. ПриАктивизацииЯчейки - слишком часто проверяется условие, ПриАктивизацииСтроки - не учитываются изменения текущей активности.

ПС. Будьте снисходительней, я начинающий
10 unregistered
 
06.09.11
18:07
В (6) херня какая-то бестолковая...
Что даст соответствие?...
А такое его заполнение СоответствиеСчетовВалютныйЛи.Добавить(Счет2, Счет2.Валютный) - это просто слов нет...
11 kosts
 
06.09.11
18:12
(10) Это идея, возможно синтаксис не точно, в целом рабочее решение.
12 kosts
 
06.09.11
18:27
В общем я бы сделал как-то так.

Перем СоответствиеСчетовВалютныйЛи;
Перем Перечисления_СтатусПересчета_Manual;

Процедура ТабличноеПоле1ПриПолученииДанных(Элемент, ОформленияСтрок)
   
   Для Каждого ОформлениеСтроки Из ОформленияСтрок Цикл
       ДанныеСтроки = ОформлениеСтроки.ДанныеСтроки;
       Если ДанныеСтроки.СтатусПересчета = Перечисления_СтатусПересчета_Manual или
           (Не СоответствиеСчетовВалютныйЛи[Данныестроки.СчетДт] и Не СоответствиеСчетовВалютныйЛи[Данныестроки.СчетКт])
       тогда
       Иначе
       КонецЕсли;    
   КонецЦикла;

КонецПроцедуры

Перечисления_СтатусПересчета_Manual = Перечисления.СтатусПересчета.Manual;
СоответствиеСчетовВалютныйЛи = новый Соответствие;

Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
              |    Хозрасчетный.Ссылка КАК Счет,
              |    Хозрасчетный.Валютный КАК Валютный
              |ИЗ
              |    ПланСчетов.Хозрасчетный КАК Хозрасчетный";
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
   СоответствиеСчетовВалютныйЛи.Вставить(Выборка.Счет, Выборка.Валютный);    
КонецЦикла;
13 Euguln
 
06.09.11
18:31
(10) +1
(12) код не решает задачу в (0).
14 kosts
 
06.09.11
18:35
(13) Пусть автор (0) скажет решает или нет
15 GANR
 
06.09.11
18:37
В типовых конфах 8.0-8.1 ситуация обходится событием ПриПолученииДанных, в 8.2 - динамическими списками.
16 GANR
 
06.09.11
18:38
(15) Пардон, если от значения в этой-же строке - тут только ПриНачале редактирования или какое-то ещё событие.
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.