Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
03 июл 2024, 05:43

Получение значения текущей ячейки

Автор FanFani, 10 авг 2018, 12:35

0 Пользователей и 1 гость просматривают эту тему.

FanFani

Предприятие 8.2. Обычное приложение
Уже устал, 2 дня бьюсь над парой строчек кода.
Есть документ табличная часть которого состоит
НомерСтроки, СсылкаСправочникСотрудник, Булево1, Булево2, ..... Булево 20, Итого.
Идея в том чтобы при нажатии на галочку, определенно значение закрепленное за  "булево1-20" прибавлялось к Итогу, а при снятии уменьшалось.
Использую я процедуру ПриИзмененииФлажка(Элемент, Колонка). А она отрабатывает как при снятии галки так и при снятии.
Логично сделать проверка на значение = Истина, и вот тут проблема, я не могу получить значение ячейки.
Самый логичный вариант который я пробовал:

СтрокаТЧ = ЭлементыФормы.ТабличнаяЧасть.ТекущиеДанные;  // Этим мы получает строку ТЧ, где есть нужное нам значение. Явно указак СтрокаТЧ."ИмяКолонки" можно получить нужное мне значение, но у меня около 20 колонок, поэтому нужно что-то другое.
ИмяКол = ЭлементыФормы.ТабличнаяЧасть.ТекущаяКолонка.Имя;  //Так я получая имя нужной мне колонки
СтрокаТЧ.ИмяКол   // Не работает, "Поле Объекта не обнаружено".
Нужна помощь, каким образов получить значение ячейки что я выбрал. Может использовать что-то другое, а не ПриИзмененииФлажка


alex0402

Цитата: FanFani от 10 авг 2018, 12:35СтрокаТЧ.ИмяКол   // Не работает

СтрокаТЧ[ИмяКол]

СтрокаТЧ.ИмяКол - так будет работать, если колонка называется ИмяКол.
Спасибо за Сказать спасибо

LexaK

попробуйте, для вашей задачи такой вариант
при любом изменении строки, событие окончание редактирования, простой пересчет в цикле ваших булевых значений,
это только как пример, для более сложных задач - нужны доработки

Процедура ТабличнаяЧасть1ПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования)
СтрокаТЧ = ЭлементыФормы.ТабличнаяЧасть1.ТекущиеДанные;
Если СтрокаТЧ = Неопределено Тогда
Возврат;
КонецЕсли;

СтрокаТЧ.Итог = 0;
Для каждого лкПоле Из СтрокаТЧ Цикл
Если ТипЗнч(лкПоле) = Тип("Булево") Тогда
СтрокаТЧ.Итог = СтрокаТЧ.Итог + ?(лкПоле,1,0);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
если помогло нажмите: Спасибо!

FanFani

LexaK, спасибо. Твой вариант подошел идеально. Я чуть доработал под конкретную задачу, смысла выкладывать не вижу.

AIFrame

И каждый раз перебирать строку в цикле, чтобы сделать +1 или -1?
Meh...
Consider this:
Процедура КнопкаВыполнитьНажатие(Кнопка)
РасчитатьСуммуСтрок();
КонецПроцедуры


Процедура ПриОткрытии()
ИмитацияЗаполнения();
РасчитатьСуммуСтрок();
КонецПроцедуры

Процедура ИмитацияЗаполнения()
СтрокаТЧ = ТабличнаяЧасть1.Добавить();
СтрокаТЧ.Бул1 = Истина;
СтрокаТЧ.Бул2 = Истина;

СтрокаТЧ = ТабличнаяЧасть1.Добавить();
СтрокаТЧ.Бул2 = Истина;

СтрокаТЧ = ТабличнаяЧасть1.Добавить();
СтрокаТЧ.Бул1 = Истина;
СтрокаТЧ.Бул3 = Истина;

СтрокаТЧ = ТабличнаяЧасть1.Добавить();
СтрокаТЧ.Бул1 = Истина;
СтрокаТЧ.Бул2 = Истина;
СтрокаТЧ.Бул3 = Истина;

СтрокаТЧ = ТабличнаяЧасть1.Добавить();

СтрокаТЧ = ТабличнаяЧасть1.Добавить();
СтрокаТЧ.Бул1 = Истина;
КонецПроцедуры

Процедура РасчитатьСуммуСтрок()
ТЧ = ТабличнаяЧасть1.ВыгрузитьКолонки();
МассивКолонок = Новый Массив;
ОписаниеКолонки = Новый Массив;
ОписаниеКолонки.Добавить(Тип("Булево"));
ТипБулево = Новый ОписаниеТипов(ОписаниеКолонки);
Для Каждого Колонка ИЗ ТЧ.Колонки Цикл
Если Колонка.ТипЗначения = ТипБулево Тогда
МассивКолонок.Добавить(Колонка.Имя);
КонецЕсли;
КонецЦикла;
Для Каждого СтрокаТЧ ИЗ ТабличнаяЧасть1 Цикл
СтрокаТЧ.Итог = 0;
Для Каждого ИмяКолонки ИЗ МассивКолонок Цикл
СтрокаТЧ.Итог = СтрокаТЧ.Итог + ?(СтрокаТЧ[ИмяКолонки], 1, 0);
КонецЦикла;
КонецЦикла;
КонецПроцедуры

Процедура ТабличнаяЧасть1ПриИзмененииФлажка(Элемент, Колонка)
СтрокаТЧ = ЭлементыФормы.ТабличнаяЧасть1.ТекущиеДанные;
ИмяКолонки = ЭлементыФормы.ТабличнаяЧасть1.ТекущаяКолонка.Имя;
СтрокаТЧ.Итог = СтрокаТЧ.Итог + ?(СтрокаТЧ[ИмяКолонки], 1, -1);
КонецПроцедуры




LexaK

не-е-е, так хорошо начали, насчет пустого перебора в цикле всех полей строки
(идея была что при окончании редактировании строки это событие один раз возникнет)
и в друг выкладываете такой код

Процедура ТабличнаяЧасть1ПриИзмененииФлажка(Элемент, Колонка)
    СтрокаТЧ = ЭлементыФормы.ТабличнаяЧасть1.ТекущиеДанные;
    ИмяКолонки = ЭлементыФормы.ТабличнаяЧасть1.ТекущаяКолонка.Имя;
    СтрокаТЧ.Итог = СтрокаТЧ.Итог + ?(СтрокаТЧ[ИмяКолонки], 1, -1);
КонецПроцедуры


нет уж, экономить, так экономить, такой код тоже работает :xfbnsdfb: (вообще одна команда осталась)

Процедура ТабличнаяЧасть1ПриИзмененииФлажка(Элемент, Колонка)
Элемент.ТекущиеДанные.Итог = Элемент.ТекущиеДанные.Итог + ?(Элемент.ТекущиеДанные[Колонка.Имя],1,-1);
КонецПроцедуры


если помогло нажмите: Спасибо!

AIFrame

LexaK,
1 + 1 + 1 = 3
3 = 3

Все равно не то. Итог в данном случае не должен являться реквизитом ТЧ, а высчитываться при получении данных из ОформленияСтроки.
Добавлено: 13 авг 2018, 18:27


Цитата: LexaK от 13 авг 2018, 16:36вообще одна команда осталась
А при открытии как считать будешь?

LexaK

э-э-э, вообще речь шла про ТЧ документа, колонка Итог в составе ТЧ, соответственно что при записи рассчитали, то при открытии и получили (при открытии ни чего пересчитывать не надо),
при добавлении новой строки Итог всегда = 0, как и все булевые поля = Ложь

если же документ в какой-то обработке изменяется, поменяли колонки булево без пересчета Итога, это на совести этой обработки т.е. того программиста будет)
если помогло нажмите: Спасибо!

AIFrame

LexaK,
Без экспортного метода пересчета объекта - будет плохая разработка.

FanFani

Цитата: LexaK от 13 авг 2018, 16:36

Процедура ТабличнаяЧасть1ПриИзмененииФлажка(Элемент, Колонка)
Элемент.ТекущиеДанные.Итог = Элемент.ТекущиеДанные.Итог + ?(Элемент.ТекущиеДанные[Колонка.Имя],1,-1);
КонецПроцедуры


Ну да супер короткий вариант :zebzdr:
Хотя странно, я пробовал присваивать имя колонки переменной и потом получить это поле, ругался :mellow:

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск