Имя: Пароль:
1C
1С v8
Имя колонки ТЗ задается программно
,
0 Fomania
 
03.11.11
14:17
Подскажите пожалуйста, как обратиться к ячейке таблицы и изменить значение, если мне нужно сделать действие такого типа:
СтрокаТаблицыЗначений.ИмяКолонки = СтрокаТаблицыЗначений.ИмяКолонки+Число;
Но имя колонки мне неизвестно, я программно получаю имя колонки из файла - т.е. создается таблица с заранее неизвестным количеством колонок. Как потом к ним обращаться? Может нужно как-то через индекс это делать, но у меня не получилось. Пробовала примерно так:
СтрокаТЗ.Установить(ИндексКолонки, Строка[ИндексКолонки]+Число);
Очень надо, заранее спасибо!
1 Axel2009
 
03.11.11
14:18
Строка["ИмяКолонки"] = Неопределено
2 Starhan
 
03.11.11
14:20
где логика.
Создаю неизвестное количество колонок, как потом к ним обращаться.
У меня закономерный вопрос. Откуда ты знаешь к какой колонке ты хочешь обратиться?
3 izekia
 
03.11.11
14:21
СтрокаТЗ.Установить(ИндексКолонки, Строка[ИндексКолонки]+Число);
это должно работать
или проще
СтрокаТЗ[ИндексКолонки] = СтрокаТЗ[ИндексКолонки] + Число
4 izekia
 
03.11.11
14:21
скорее всего у тебя на этапе получения строки проблема
давай код
5 Reset
 
03.11.11
14:23
(0)
1. Если известно имя колонки, то СтрокаТЗ[ИмяКолонки]=СтрокаТЗ[ИмяКолонки]+Число;

2. Если известен индекс колонки, то
ИмяКолонки=ТЗ.Колонки[Индекс].Имя;
и далее 1.
6 Starhan
 
03.11.11
14:24
надо смортеть как создаешь колонки
7 Reset
 
03.11.11
14:26
+(5)(0) Через Установить():

СтрокаТЗ.Установить(ИндексКолонки, СтрокаТЗ.Получить(ИндексКолонки)+Число);
8 Starhan
 
03.11.11
14:27
(3) ты думаешь ей надо просто к каждой колонке прибвавить полученное число?
я так понял число - это индекс колонки. О_о
9 izekia
 
03.11.11
14:28
(8) я не телепат
(5) выдержка из сп:
СтрокаТаблицыЗначений (ValueTableRow)
Элементы коллекции:

Произвольный
Для объекта доступен обход коллекции посредством оператора Для каждого … Из … Цикл. При обходе выбираются значения в колонке данной строки.
Возможно обращение к значению колонки данной строки посредством оператора [...]. В качестве аргумента передается индекс колонки (нумерация с 0).
10 izekia
 
03.11.11
14:28
так что (3) работает и не надо никакого имени
11 Reset
 
03.11.11
14:29
(9) ??
12 Reset
 
03.11.11
14:29
Через имя тоже работает.
Не понял, к чему это.
13 Starhan
 
03.11.11
14:31
кароче
СтрокаТЗ.Установить(ИндексКолонки, Строка[ИндексКолонки]+Число);

код рабочий если Индекс колонки число в пределах диапозона индексов
а "Число" имеет тип слогаемый с со значением в Строка[ИндексКолонки]
14 Starhan
 
03.11.11
14:33
(13) хотя вру хз чо такое строка
в (3) будет правильно :)
15 izekia
 
03.11.11
14:40
(11) я в ответ на (5) вот на эту часть написал:
"2. Если известен индекс колонки, то
ИмяКолонки=ТЗ.Колонки[Индекс].Имя;
и далее 1.
"
16 izekia
 
03.11.11
14:41
+(15) лишняя операция
17 Reset
 
03.11.11
14:48
(16) :)
А копипаста зачем? Я где-то говорил, что нельзя через число? Где? :)
Или научился копипастить и хвастаешься?

Версия через числовой индекс уже была тебя в (3).
Я просто привел другие варианты. В каких-то случаях они могут быть хуже, в каких-то лучше.
Мне вообще нельзя писать что-то в темах, где ты что-то предложил? Твои ответы единственно верные и точные? Ты один такой профи и все должны молчать и завидовать? :))
18 Fomania
 
03.11.11
14:51
(4) Я выгружаю данные из текстового файла в таблицу. Если выгружать без отбора, получаются такие колонки: ИмяГостя (в гостинице), КодНачисления (за услуги), СуммаНачисления. Мне нужно получить таблицу, где каждый код начисления будет отдельной колонкой, а в ячейке ИмяГостя[КодНачисления] будут суммироваться суммы начисления.

ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("ИмяГостя");
....//считываем файл
СтрокаИзФайла = ПотокЧтенияСтрок.ПолучитьСтроку(Строка); //до этого момента все работает, строки из файла считываются
СтрокаТЗ = ТЗ.Найти(СокрЛП(Сред(СтрокаИзФайла,22,30)),"ИмяГостя");
Если СтрокаТЗ = Неопределено Тогда
   СтрокаТЗ = ТЗ.Добавить();
   СтрокаТЗ.ИмяГостя = СокрЛП(Сред(СтрокаИзФайла,22,30));
КонецЕсли;
СтрокаТЗ = ТЗ.Найти(СокрЛП(Сред(СтрокаИзФайла,22,30)),"ИмяГостя");
КолонкаТЗ = ТЗ.Колонки.Найти(СокрЛП(Сред(СтрокаИзФайла,125,4)));
Если КолонкаТЗ = Неопределено Тогда
   ТЗ.Колонки.Добавить(СокрЛП(Сред(СтрокаИзФайла,125,4)), Новый ОписаниеТипов("Число"), СокрЛП(Сред(СтрокаИзФайла,125,30)), 7);
КонецЕсли;
КолонкаТЗ = ТЗ.Колонки.Найти(СокрЛП(Сред(СтрокаИзФайла,125,4)));
ИндексКолонки = ТЗ.Индекс(КолонкаТЗ);
СтрокаТЗ.Установить(ИндексКолонки, Строка[ИндексКолонки]+Число(Сред(СтрокаИзФайла,156,13)));
19 Reset
 
03.11.11
14:55
(18) Во все не врубался, конец можно заменить на:

Если КолонкаТЗ = Неопределено Тогда
   КолонкаТЗ=ТЗ.Колонки.Добавить(СокрЛП(Сред(СтрокаИзФайла,125,4)), Новый ОписаниеТипов("Число"), СокрЛП(Сред(СтрокаИзФайла,125,30)), 7);
КонецЕсли;
СтрокаТЗ[КолонкаТЗ.Имя]=Строка[ИндексКолонки]+Число(Сред(СтрокаИзФайла,156,13)));
20 izekia
 
03.11.11
14:56
(17) чтобы показать что у меня есть сп. Нет. Нигде.
Нет, хвастаюсь наличием сп.
Можно. Нет. Да, но можно не молча, а еще и восхвалять))
21 Reset
 
03.11.11
14:57
(19) копирование-зло )

СтрокаТЗ[КолонкаТЗ.Имя]=СтрокаТЗ[КолонкаТЗ.Имя]+Число(Сред(СтрокаИзФайла,156,13)));
22 Starhan
 
03.11.11
14:58
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("ИмяГостя");
....//считываем файл

СтрокаИзФайла = ПотокЧтенияСтрок.ПолучитьСтроку(Строка); //до этого момента все работает, строки из файла считываются

СтрокаТЗ = ТЗ.Найти(СокрЛП(Сред(СтрокаИзФайла,22,30)),"ИмяГостя");
Если СтрокаТЗ = Неопределено Тогда
   СтрокаТЗ = ТЗ.Добавить();
   СтрокаТЗ.ИмяГостя = СокрЛП(Сред(СтрокаИзФайла,22,30));
КонецЕсли;
СтрокаТЗ = ТЗ.Найти(СокрЛП(Сред(СтрокаИзФайла,22,30)),"ИмяГостя"); //!!!Зачем ще раз искать строчку?
КолонкаТЗ = ТЗ.Колонки.Найти(СокрЛП(Сред(СтрокаИзФайла,125,4)));
Если КолонкаТЗ = Неопределено Тогда
   ТЗ.Колонки.Добавить(СокрЛП(Сред(СтрокаИзФайла,125,4)), Новый ОписаниеТипов("Число"), СокрЛП(Сред(СтрокаИзФайла,125,30)), 7);
КонецЕсли;
КолонкаТЗ = ТЗ.Колонки.Найти(СокрЛП(Сред(СтрокаИзФайла,125,4)));
ИндексКолонки = ТЗ.Индекс(КолонкаТЗ);
СтрокаТЗ.Установить(ИндексКолонки, Строка[ИндексКолонки]+Число(Сред(СтрокаИзФайла,156,13)));

Зачем ще раз искать строчку?
23 Reset
 
03.11.11
14:59
Короче, перепишите кусок кода девушке, мне работать надо :)
24 izekia
 
03.11.11
14:59
(18) вкратце:
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("ИмяГостя");
....//считываем файл


СтрокаИзФайла = ПотокЧтенияСтрок.ПолучитьСтроку(Строка); //до этого момента все работает, строки из файла считываются


СтрокаТЗ = ТЗ.Найти(СокрЛП(Сред(СтрокаИзФайла,22,30)),"ИмяГостя");
Если СтрокаТЗ = Неопределено Тогда
   СтрокаТЗ = ТЗ.Добавить();
   СтрокаТЗ.ИмяГостя = СокрЛП(Сред(СтрокаИзФайла,22,30));
КонецЕсли;
КолонкаТЗ = ТЗ.Колонки.Найти(СокрЛП(Сред(СтрокаИзФайла,125,4)));
Если КолонкаТЗ = Неопределено Тогда
   КолонкаТЗ = ТЗ.Колонки.Добавить(СокрЛП(Сред(СтрокаИзФайла,125,4)), Новый ОписаниеТипов("Число"), СокрЛП(Сред(СтрокаИзФайла,125,30)), 7);
КонецЕсли;
СтрокаТЗ.Установить(КолонкаТЗ.Имя, Строка[КолонкаТЗ.Имя]+Число(Сред(СтрокаИзФайла,156,13)));
25 Fomania
 
03.11.11
15:00
(22) Почему-то при попытке вывести строку методом Сообщить не удалось получить данные, хотя из Если она работает. хотя по идее и после КонецЕсли данные должны быть доступны
26 Starhan
 
03.11.11
15:03
(24) последняя строчка не правильно
27 Reset
 
03.11.11
15:03
(25) смотри, в (24) все уже более-менее прилично, только последнюю стороку взять из (21) - там ошибка с 1 параметром в "Установить", в остальном правильно (имхо)
28 izekia
 
03.11.11
15:04
(точно, копипаст - зло
29 izekia
 
03.11.11
15:04
читать последнюю как:
СтрокаТЗ[КолонкаТЗ.Имя] = Строка[КолонкаТЗ.Имя]+Число(Сред(СтрокаИзФайла,156,13)));
30 izekia
 
03.11.11
15:05
(27) спасибо за восторженные отзывы)
31 Starhan
 
03.11.11
15:05
(29) опять ошибка. Строка нет такой переменной, есть СтрокаТЗ
32 Reset
 
03.11.11
15:06
Кстати "Строка" нигде не определено(может, До этого кода?), так что открытый вопрос, должно быть
... =Строка[   или  ... =СтрокаТЗ[
33 Reset
 
03.11.11
15:06
(30) Заказывали восхвалять.
34 izekia
 
03.11.11
15:07
(31) да что же делать))
дайте ТС тоже поработать)
35 izekia
 
03.11.11
15:07
(33) )))
36 Fomania
 
03.11.11
15:14
(27) с этой поправкой все заработало!
Спасибо всем огромное!!!
37 Reset
 
03.11.11
15:14
По прежнему не вникая в задачу, провел еще дополнительный рефакторинг (после (24))

ИмяГостя = СокрЛП(Сред(СтрокаИзФайла,22,30));
СтрокаТЗ = ТЗ.Найти(ИмяГостя,"ИмяГостя");
Если СтрокаТЗ = Неопределено Тогда
   СтрокаТЗ = ТЗ.Добавить();
   СтрокаТЗ.ИмяГостя = ИмяГостя;
КонецЕсли;
ИмяКолонки=СокрЛП(Сред(СтрокаИзФайла,125,4));
КолонкаТЗ = ТЗ.Колонки.Найти(ИмяКолонки);
Если КолонкаТЗ = Неопределено Тогда
   КолонкаТЗ = ТЗ.Колонки.Добавить(ИмяКолонки, Новый ОписаниеТипов("Число"), СокрЛП(Сред(СтрокаИзФайла,125,30)), 7);
КонецЕсли;
СтрокаТЗ[ИмяКолонки]=СтрокаТЗ[ИмяКолонки]+Число(Сред(СтрокаИзФайла,156,13)));
38 Fomania
 
03.11.11
15:15
(29) Только там = СтрокаТЗ[КолонкаТЗ.Имя] )
Ошибка? Это не ошибка, это системная функция.