|
Как по "полю ввода" определить имя колонки табличного поля | ☑ | ||
---|---|---|---|---|
0
andryuhin
26.11.13
✎
13:00
|
Всем привет.
Есть процедура, которая вызывается при изменении реквизита колонки табличного поля. В процедуру передается сам элемент управления, т.е. "ПолеВвода". А как определить имя колонки? (вариант с обращением к имени ТекущейКолонки НЕ предлагать! Не тот случай, т.к. процедура не всегда вызывается интерактивно) |
|||
1
Ерепень
26.11.13
✎
13:01
|
элемент управления и не интерактивно?
|
|||
2
andryuhin
26.11.13
✎
13:02
|
Иногда НЕ интерактивно
|
|||
3
andryuhin
26.11.13
✎
13:17
|
Вопрос остается: как по элементу управления получить колонку табличного поля, с которой этот элемент связан.
|
|||
4
Пятница Мен
26.11.13
✎
13:19
|
реквизита колонки табличного поля - как не интерактивно? может реквизит не табличного поля, а чего то другого?
|
|||
5
andryuhin
26.11.13
✎
13:21
|
Вот именно табличного поля, будь он не ладен
|
|||
6
Пятница Мен
26.11.13
✎
13:22
|
каким образом он может меняться не интерактивно? он привязан к данным?
|
|||
7
andryuhin
26.11.13
✎
13:26
|
Да, к данным привязан.
Я уже сам запутался. На пальцах попытаюсь озвучить. Есть документ с табличной частью. Табличная часть содержит колонки (реквизиты документа, вроде номенклатура, цена, кол-во, сумма. Все просто.). Есть процедура "РасчетСумм", которая вызывается при изменении реквизитов в табличной части. В эту процедуру передается элемент управления. Нужно узнать, какой реквизит вызвал процедуру. |
|||
8
Повелитель
26.11.13
✎
13:29
|
Ну так ТекущейКолонки.Имя
Цель то озвучь, а то похоже на бред |
|||
9
andryuhin
26.11.13
✎
13:31
|
В документе есть кнопка Заполнить, с ней связана процедура "Заполнить". Из нее тоже вызывается "РасчетСумм".
|
|||
10
andryuhin
26.11.13
✎
13:31
|
Задача сводится к следующей:
До элемента управления я достучаться могу: ЭлементыФормы.ИмяТабличнойЧасти.Колонки.Номенклатура.ЭлементУправления А вот как имея "ЭлементУправления" получить его родителя, в приведенном примере "Номенклатура" |
|||
11
1Сергей
26.11.13
✎
13:33
|
(10) .Родитель
|
|||
12
Повелитель
26.11.13
✎
13:35
|
Ну так:
Процедура РасчетСум(ТекСтрока) ТекСтрока.Сумма = ТекСтрока.Цена * ТекСтрока.Количество; КонецПроцедуры; Процедура Заполонить(); Цикл РасчетСум(ТекСтрока); КонецЦикла; КонецПроцедуры; Процедура НажалиПолеВводаВТабЧасти() ТекущейКолонки.Имя Всякая мутата РасчетСум(ТекСтрока); КонецПроцедуры; |
|||
13
andryuhin
26.11.13
✎
13:39
|
(11) не катит. Нет у поля ввода такого свойства и метода.
(12) да, похоже, что этот способ и остается. Делать через 2 процедуры, а не через 1. Спасибо. |
|||
14
andryuhin
26.11.13
✎
13:43
|
А вот еще один способ додумал:
Процедура РасчетСумм(Элемент) Для Каждого тк из ЭлементыФормы.ИмяТЧ.Колонки Цикл Если Элемент = тк.ЭлементУправления Тогда ВыщемленноеИмяКолонки = тк.Имя; КонецЕсли; КонецЦикла; //--- алгоритм расчета по колонке "ВыщемленноеИмяКолонки" //... КонецПроцедуры |
|||
15
Рэйв
26.11.13
✎
13:47
|
Поставь в ячейку свой обработчик ПриИзменении и не парь себе моск.
|
|||
16
Рэйв
26.11.13
✎
13:48
|
тогда ты точно будешь знать какая колонка вызвала процедуру
|
|||
17
andryuhin
26.11.13
✎
13:51
|
(15) Нужно, чтобы во всех ячейках стояла ОДНА процедура, а не 15 штук для каждой ячейки. Так удобнее при связанных расчетах, когда предыдущая ячейка вызывает пересчет последующих.
|
|||
18
zakidonoff
26.11.13
✎
13:53
|
(0) Никак.
Если встаёт такая необходимость, значит такой код=гавнакод |
|||
19
Рэйв
26.11.13
✎
13:54
|
(17)Сделай одну БОЛЬШУЮ процедуру пересчета всего что там у тебя есть, а в процедурах ПриИзменении ячеек просто ее вызывай.
|
|||
20
George Wheels
26.11.13
✎
13:55
|
(17) Может ПриВыводеСтроки?
|
|||
21
andryuhin
26.11.13
✎
13:56
|
(18) Ух ты, уже и принюхался. Поздравляю с хорошим обонянием. Или ты на вкус определил? В любом случае приятного аппетита.
(19) Все, работает. Спасибо за помощь. Код из поста (14) катит. И из поста (12) тоже. |
|||
22
andryuhin
26.11.13
✎
13:58
|
(19) Так так и сделано в самом начале. Одна БОЛЬШАЯ процедура, которая вызывается ПриИзменении ячеек. НО засада была в том, что эта же процедура вызывается не интерактивно при автопересчете по отдельной кнопке
|
|||
23
Рэйв
26.11.13
✎
14:01
|
(22)Да какая разница если она все пересчитывает?
|
|||
24
andryuhin
26.11.13
✎
14:04
|
(23) НЕТ не все. Только ячейки с 3й по 15ю, или например с 10й по 15ю. В зависимости от того, на какой ячейке стартанули
|
|||
25
НЕА123
26.11.13
✎
14:17
|
как вариант
.Подсказка |
|||
26
palpetrovich
26.11.13
✎
14:25
|
как вариант, если сильно надо:
Процедура ОднаБольшаяПроцедура(ОткудаВызвана="") ... Процедура ТоварыНоменклатураПриИзменении(Элемент) ОднаБольшаяПроцедура("Номенклатура") |
|||
27
andryuhin
26.11.13
✎
15:03
|
(26) Да, это и предлагали в посте (12). Оно самое. Тем не менее, спасибо.
|
|||
28
zakidonoff
26.11.13
✎
15:07
|
(21) Просто ты нарушаешь базовые принципы.
Любая дочерняя функция или процедура должна быть предельно "тупой". Всё, что можно посчитать\задать в родительской процедуре, должно быть задано в ней. В твоём случае - это имя колонки. "Откуда считать" должно определяться не в "одной БОЛЬШОЙ процедуре", а там, откуда она вызывается. |
|||
29
andryuhin
26.11.13
✎
15:23
|
(28) мммм, чтобы не вдаваться в полемику лучше приведу свою проблему:
Есть 15 колонок. На каждой колонке своя формула. Меняем значение 1й колонки, должны пересчитаться все до 15й. Меняем 2ю, должны пересчитаться со 2й по 15ю и т.д. Вполне логично иметь ОДНУ процедуру, описывающую логику расчета всего документа. В результате этот алгоритм расчета можно вызывать как интерактивно (пользователь меняет значение ячейки), так и при неких общих расчетах для всех строк табличной части. В результате не плодится множество процедур, вся логика в одном месте и в нее при необходимости просто вносить изменения. ------ Может я действительно мудрю, предложи вариант, как это реализовать проще. |
|||
30
zakidonoff
26.11.13
✎
15:55
|
(29)
ПроцеДура ПриИзмененииЭлементаКолонка1(Элемент) ТекСтрока = ЭлементыФормы.ТабличноеПоле.ТекущиеДанные(); ПересчитатьФормулы(1, ТекСтрока); КонецПроцеДуры ПроцеДура ПриИзмененииЭлементаКолонка2(Элемент) ТекСтрока = ЭлементыФормы.ТабличноеПоле.ТекущиеДанные(); ПересчитатьФормулы(2, ТекСтрока); КонецПроцеДуры ПроцеДура ПересчитатьФормулы(Коэффициент, ТекСтрока) Если Коэффициент < 2 Тогда //Знач = Формуларассчёта... ТекСтрока["Колонка1"] = Знач; КонецЕсли; Если Коэффициент < 3 Тогда //Знач = Формуларассчёта... ТекСтрока["Колонка2"] = Знач; КонецЕсли; ... КонецПроцеДуры |
|||
31
andryuhin
26.11.13
✎
16:19
|
(30) Да, это сработает, но в таком подходе есть минус (во всяком случае для меня). В модуле много процедур, что не гут для "читаемости" кода. Лишний не нужный код.
Хотя по сути все то же самое. |
|||
32
zakidonoff
26.11.13
✎
16:46
|
(31) А как ещё ты инициируешь срабатывание события по клику на ячейку? Через процедуру изменения таб.поля?
|
|||
33
zakidonoff
26.11.13
✎
16:55
|
(31) Ну так 12 тогда тебя абсолютно всем устраивать должен.
Читаемость это абсолютно не портит. Или ты хотел сразу событие на изменение в ячейке кидать на процедуру расчётссумм()? -) Это явно не тру - запутаешься в условиях только. |
|||
34
andryuhin
26.11.13
✎
18:07
|
(33) да, так и делал. Событие на изменение в ячейке сразу кидал на "РасчетСумм".
|
|||
35
andryuhin
26.11.13
✎
18:12
|
(33) все верно, вариант из (12) вполне устраивает.
(хотя в итоге стал использовать свой с вызовом события из ячейки на "РасчетСумм" и определением внутри, какая ячейка вызвала) |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |