Имя: Пароль:
1C
 
Как отловить добавление строки в табличную часть в форме?
0 Гений 1С
 
гуру
06.04.06
15:55
Вот во всяких подборах любят добавлять строки в форму в табличную часть.
Как отловить программное добавление строки в форму?
А заодно можно ли отловить изменение в конкретной ячейке?
1 Гений 1С
 
гуру
06.04.06
15:55
В ячейке - программное изменение имеется ввиду...
2 Vozhd
 
06.04.06
16:08
(0) ПриИзмененииДанных() не работает?
3 Гений 1С
 
гуру
06.04.06
17:09
(2) неа, не работает - ни при программном, ни при интерактивном добавлении.
Я попробовал ПриПолученииДанных - она срабатывает для каждой строки, видимой в форме, но если строки добавляются за пределами видимости (слишком много строк), то естественно это событие не возникает.
4 dimoff
 
06.04.06
17:10
через ПодключитьОбработчикИзмененияДанных
5 Гений 1С
 
гуру
06.04.06
17:16
(4) Тоже пробовал, замечательно работает для ручной правки:
ПодключитьОбработчикИзмененияДанных("ЭлементыФормы.ТЧ.ТекущиеДанные.Реквизит1", "ИзменениеДанных", истина);
ПодключитьОбработчикИзмененияДанных("ЭлементыФормы.ТЧ.ТекущиеДанные.Реквизит2", "ИзменениеДанных", истина);
ПодключитьОбработчикИзмененияДанных("ЭлементыФормы.ТЧ.ТекущиеДанные", "ИзменениеДанных", истина);

Но на программное изменение не реагирует.
6 Гений 1С
 
гуру
06.04.06
17:26
Вот еще вопрос возниг, коспода - в той же теме.

Мне нужно для каждой строки документа хранить вспомогательные данные типа структура, как это можно обеспечить?

Завести вспом.таблицу и связываться по индексу строки не хочется - если строку удалить, все полетит нафиг.
7 dimoff
 
06.04.06
17:38
При удалении строки удаляй элемент массива данных, тогда ничего не полетит
8 Гений 1С
 
гуру
06.04.06
17:39
(7) Надо еще следить за соответсвием, эх, а по грамотному низзя???
9 dimoff
 
06.04.06
17:45
Не вижу в этом ничего неграмотного и про соответствие не понял
10 Гений 1С
 
гуру
06.04.06
18:28
ну ты согласен, что мне надо отслеживать удаление? А это криво
11 Гений 1С
 
гуру
06.04.06
18:28
То бишь слишком сложно для задачи связывания двух таблиц по индексу
12 dimoff
 
06.04.06
18:32
(10) Согласен что надо отслеживать удаление, значение слова "криво" не понимаю.
13 Гений 1С
 
гуру
06.04.06
18:42
(12) Объяснил в 11
14 dimoff
 
06.04.06
18:44
Лучше б не объяснял
15 Vozhd
 
06.04.06
19:46
(5) А у меня работает. И при ручном изменении и при программном. Что я делаю не так?
16 Гений 1С
 
гуру
07.04.06
10:56
Погоняй этот код, у меня не пашет:


//На форму кинуть табличное поле с именем ТЧ и реквизитами Реквизит1, Реквизит2 типа строка.
//Использовать стандартную пустую форму с кнопкой выполнить.


Процедура КнопкаВыполнитьНажатие(Кнопка)
   // Вставить содержимое обработчика.
   Стр=ТЧ.Добавить();
   Стр.Реквизит1="1";
   ТЧ.Добавить();
КонецПроцедуры

Процедура ПриОткрытии()
   // Вставить содержимое обработчика.
   ПодключитьОбработчикИзмененияДанных("ТЧ", "ИзменениеДанных", истина);
   ПодключитьОбработчикИзмененияДанных("ЭлементыФормы.ТЧ.ТекущиеДанные.Реквизит1", "ИзменениеДанных", истина);
   ПодключитьОбработчикИзмененияДанных("ЭлементыФормы.ТЧ.ТекущиеДанные.Реквизит2", "ИзменениеДанных", истина);
   //ПодключитьОбработчикИзмененияДанных("ЭлементыФормы.ТЧ.ТекущиеДанные.НомерСтроки", "ИзменениеДанных", истина);
   ПодключитьОбработчикИзмененияДанных("ЭлементыФормы.ТЧ.ТекущиеДанные", "ИзменениеДанных", истина);
КонецПроцедуры

Процедура ИзменениеДанных(Реквизит)
   Если Найти(Реквизит,".ТЧ.")<>Неопределено Тогда
       Сообщить(""+Реквизит+?(ЭлементыФормы.ТЧ.ТекущаяСтрока=Неопределено, "()","("+ЭлементыФормы.ТЧ.ТекущаяСтрока.НомерСтроки+")"));
   КонецЕсли;
   Сообщить(Реквизит);
КонецПроцедуры

Процедура ТЧПриПолученииДанных(Элемент, ОформленияСтрок)
   // Вставить содержимое обработчика.
   Для Каждого ОформлениеСтроки ИЗ ОформленияСтрок Цикл
       //Сообщить("ПолучениеДанных:" +ТекущаяДата()+" Номер строки"+ОформлениеСтроки.ДанныеСтроки.НомерСтроки);
       
       
   КонецЦикла
КонецПроцедуры

Процедура ТЧПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
   // Вставить содержимое обработчика.
   //Сообщить("При выводе строки:" +ТекущаяДата()+" Номер строки"+ДанныеСтроки.НомерСтроки);
КонецПроцедуры
17 Гений 1С
 
гуру
07.04.06
10:57
(16) при программном добавлении событие  ИзменениеДанных не вызывается, при интерактивном - вызывается
18 Vozhd
 
07.04.06
11:10
(16) А почему этот код должен работать? Отслеживаются изменения не тех данных, вот и не работает...
19 Гений 1С
 
гуру
07.04.06
11:11
(18) Вождь, будь другом, подскажи тупому, что надо поправить
20 Гений 1С
 
гуру
07.04.06
11:11
ПодключитьОбработчикИзмененияДанных("ЭлементыФормы.ТЧ.ТекущиеДанные", "ИзменениеДанных", истина); - тоже не работает.
21 х86
 
07.04.06
11:17
"Завести вспом.таблицу и связываться по индексу строки не хочется - если строку удалить, все полетит нафиг."

а если использовать Структура или соответствие с ключом - СтрокаТЧ ? тогда при удалении не надо будет отрабатывать удаление из структуры.
Хотя не факт что взлетит
22 Гений 1С
 
гуру
07.04.06
11:25
(21) такая мысль была, но выборка по конкретному номеру быстрее, чем поиск по ключу. :) Пока что то, что вы предлагаете в (21) - самое оптимальное.
23 Vozhd
 
07.04.06
11:27
(19) ПодключитьОбработчикИзмененияДанных("ЭлементыФормы.ТЧ", "ИзменениеДанных", истина);
24 Гений 1С
 
гуру
07.04.06
11:34
(23) Вождь, ты просто гений, но ты знаешь, не взлетело!!! Не работает и такой вариант, я его проверял, кстати.
Вот все варианты, что я проверяю:
25 Гений 1С
 
гуру
07.04.06
11:34
ПодключитьОбработчикИзмененияДанных("ТЧ", "ИзменениеДанных", истина);
   ПодключитьОбработчикИзмененияДанных("ЭлементыФормы.ТЧ.ТекущиеДанные.Реквизит1", "ИзменениеДанных", истина);
   ПодключитьОбработчикИзмененияДанных("ЭлементыФормы.ТЧ.ТекущиеДанные.Реквизит2", "ИзменениеДанных", истина);
   ПодключитьОбработчикИзмененияДанных("ЭлементыФормы.ТЧ.ТекущиеДанные", "ИзменениеДанных", истина);
   ПодключитьОбработчикИзмененияДанных("ТЧ", "ИзменениеДанных", истина);
   ПодключитьОбработчикИзмененияДанных("ЭлементыФормы.ТЧ", "ИзменениеДанных", истина);
26 Гений 1С
 
гуру
07.04.06
11:34
(23) Что, Вождь, теория вошла в противоречие с практикой? Бывает...
27 Vozhd
 
07.04.06
11:46
(24) А у меня не только взлетает, но и не падает. Может это от того, что я не гений?
28 Vozhd
 
07.04.06
12:04
(27) Понял с чем связаны проблемы. Если у объекта нет свойств, то и изменения данных не зафиксировать. У табличных частей свойств нет, а у многих других источников данных для табличный полей свойства есть...
Так что придется Вам на время забыть о событиях...
29 Гений 1С
 
гуру
07.04.06
12:15
(28) Что за свойства? Не очень понял, разжуйте плиз мне глупому...
30 Гений 1С
 
гуру
07.04.06
12:16
"табличных частей свойств нет, а у многих других источников данных для табличный полей"  - распишите эту фразу правильно, непонятно
31 Гений 1С
 
гуру
07.04.06
12:18
(28) Кстати, при интерактивном изменении-то все работает... :(
32 Гений 1С
 
гуру
07.04.06
12:21
Попробовал добавить Реквизит3 типа Номенклатура - все то же самое.
33 Vozhd
 
07.04.06
12:34
(31) У табличной части нет свойств. Нет свойств, значит нет данных. Нет данных, значит нет и их изменения.
У табличного поля свойства есть. Например, ТекущаяСтрока. При интерактивном вводе новой строки, значение свойства ТекущаяСтрока изменяется, следовательно происходит изменение данных, а раз подключен обработчик, то он вызывается...
34 Vozhd
 
07.04.06
12:35
(33) Например, у отборов свойства есть, а раз так, то изменение данных будет вызываться хоть при програмном, хоть при интерактивном изменении.
35 Гений 1С
 
гуру
07.04.06
12:49
Мда, логика платформы понятна, хоть и крива... :(
С мечтой о красивой обработке событий формы придется расстатца. :(
36 Гений 1С
 
гуру
07.04.06
12:50
Я бы еще смирился с необработкой добавления новой строки, но вот если программно меняются ячейки ТЧ, это не отлавливаетца. Пичально.
37 Vozhd
 
07.04.06
12:53
(36) Напишите свои процедуры для работы с табличными частями (добавление строк, удаление строк, изменение ячейки и т.д.) и работайте через эти процедуры.
38 Гений 1С
 
гуру
07.04.06
12:57
(37) Вождь, как обойти, я знаю, но все способы - кривые. Вообще проблема касается того, что например в типовой в поступление добавляется строка подбором (программно) и мне еще нужно выискивать всевозможные способы программного изменения табличных частей
39 Vozhd
 
07.04.06
13:14
(38) А может не надо напролом лезть со своим пониманием логики в чужую программу? Может сначала изучить логику авторов?
40 Гений 1С
 
гуру
07.04.06
13:22
(39) Извиняйте - работа такая - тюнинг типовых. В моем случае надо реагировать на изменение номенклатуры любым способом.
41 Vozhd
 
07.04.06
13:24
(40) Ну что ж, вам, гениям, виднее...
42 Гений 1С
 
гуру
07.04.06
13:24
(41) Аминь, RIP
43 Гений 1С
 
гуру
07.04.06
14:38
(33)
Пардон, вопрос не исчерпан...
В твоей логике есть небольшой изъян.
При программном изменении не вызывается:
ЭлементыФормы.ТЧ.ТекущиеДанные.Реквизит1

Зато при интерактивном вызывается:
ЭлементыФормы.ТЧ.ТекущиеДанные.Реквизит1

По логике они должны или оба не вызываться, или вызываться всегда.

Обоснуй!
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа. Фредерик Брукс-младший