Имя: Пароль:
1C
1С v8
Как по "полю ввода" определить имя колонки табличного поля
,
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) вполне устраивает.

(хотя в итоге стал использовать свой с вызовом события из ячейки на "РасчетСумм" и определением внутри, какая ячейка вызвала)
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший