Имя: Пароль:
1C
1C 7.7
v7: Создание таблиц значений в цикле.
0 Zhuravlik
 
03.10.11
01:50
Хочу динамически создать несколко тз в Цикле, так, чтобы переменная для ТЗ менялась в этом цикле, как-то так:

для сч = 1 по 5 Цикл


ИмяТаблицы = СоздатьОбъект("ТаблицаЗначений");
//Как сделать так, чтобы
//

КонеЦикла
1 Zhuravlik
 
03.10.11
01:51
ИмяТаблицы = СоздатьОбъект("ТаблицаЗначений");
//Как сделать так, чтобы

//ИмяТаблицы формировалось из Строк "ТЗ"+Строка(сч) например?

чтобы на выходе было пять таблиц - тз1, тз2, тз3, тз4, тз5?
КонеЦикла
2 Sereja
 
03.10.11
01:56
(0) Пиши 5 таблиц в строки другой ТЗ и получай их потом по индексу
3 Zhuravlik
 
03.10.11
02:10
(2) Нет, мне надо создать заранее неизвестное количество ТЗ, и так, чтобы можно было к ним потом обращаться по имени.
Про таблицы в таблице я тоже думал, но этот метод пройдет только через "ЗначениеВстрокуВнутр()", а это для меня долго. Я подумал, может через шаблоны можно сделать? Может я просто недопонимаю как они работают? Но повозившись, убрал и этот вариант. Теперь думаю может скрипт какой можно вставить, только как такой написать незнаю.
4 Ardi
 
03.10.11
02:18
"ЗначениеВстрокуВнутр()" не нужно. Можно без этого.

А ещё бывают массивы.
5 Zhuravlik
 
03.10.11
02:26
(4) Без этого будет храниться только ссылка на ТЗ. Т.е. ТЗ УЖЕ должна существовать. А если я создаю динамически, и делаю напр. так:

тз = СоздатьОбъект("ТаблицаЗначений");
для сч = 1 по 5 Цикл

тз.новаяКолонка("тз"+Строка(сч), "ТаблицаЗначений");
КонецЦикла;

тз.НоваяСтрока();

для сч = 1 по 5 Цикл
времТЗ = СоздатьОбъект("ТаблицаЗначений");

//Заполняю времТЗ

тз.УстановитьЗначение(1, сч, времТЗ);
КонецЦикла;



Так сохраняеться ссылка на времТЗ, а не сама таблица. И на выходе все ТЗ в результирующей будут одинаковы, равнятся последнему значению времТЗ. Надеюсь не коряво выразил, что хотел сказать)
Т.е. чтобы получить таблицу таблиц, их надо сохранять  в строки и получать из строк.
6 Zhuravlik
 
03.10.11
02:28
+ Речь даже не о том, а о динамическом создании переменных. Можно перефразировать изначальный вопрос так "Как мне создать заранее неизвестное количество переменных, с именем равным текущему счетчику их количества?"
7 Ardi
 
03.10.11
02:28
ссылок на ТЗ не бывает.
8 Ardi
 
03.10.11
02:29
ну или бывают. но тут не ссылка
9 Ardi
 
03.10.11
02:30
или использовать "Выгрузить()" чтобы скопировать ТЗ с колонками
10 Zhuravlik
 
03.10.11
02:31
11 Zhuravlik
 
03.10.11
02:32
(9) мне уже больше интересно про динам. создание переменных... Выгрузить я тоже об этом дусал, но кажется все то же будет, даж не пробовал. Сейчас попробую...
12 Ardi
 
03.10.11
02:36
Процедура Сформировать()
   Перем масс[100];
   
   тз0=СоздатьОбъект("таблицаЗначений");
   тз0.НоваяКолонка("Колонка1",,,,,,,);
   тз0.выгрузить(масс[1]);
   тз0.выгрузить(масс[2]);
   тз0.выгрузить(масс[3]);
   
   масс[1].НоваяСтрока();
   масс[2].НоваяСтрока();
   масс[2].НоваяСтрока();
   масс[3].НоваяСтрока();
   масс[3].НоваяСтрока();
   масс[3].НоваяСтрока();    
   
   Сообщить(масс[1].КоличествоСтрок());
   Сообщить(масс[2].КоличествоСтрок());
   Сообщить(масс[3].КоличествоСтрок());
КонецПроцедуры
13 Aleksey
 
03.10.11
02:42
СписокТЗ=СоздатьОбъект("СписокЗначений");
   
Для й=1 по 5 Цикл
  ТЗ = СоздатьОбъект("ТаблицаЗначений");          
  ТЗ.НоваяКолонка("Кол1");
       
  ТЗ.НоваяСтрока();
  ТЗ.Кол1=й;
       
  СписокТЗ.ДобавитьЗначение(ТЗ);
КонецЦикла;

//Проверка    
Для й=1 по 5 Цикл
  ТекТЗ=СписокТЗ.ПолучитьЗначение(й);
  Сообщить(""+ТекТЗ.ПолучитьЗначение(1,1));
КонецЦикла;
14 Zhuravlik
 
03.10.11
02:46
Группировка=СоздатьОбъект("ТаблицаЗначений");    
   спТаблицГруппировок = СоздатьОбъект("ТаблицаЗначений");
   спТаблицГруппировок.НоваяКолонка("Группировка", "ТаблицаЗначений");    
   Для сч=1 По спГруппировок.РазмерСписка()  Цикл
       Если спГруппировок.Пометка(сч) = 0 Тогда
           Продолжить;
       КонецЕсли;

       Переиндексирование(Группировка);
           спТаблицГруппировок.НоваяСтрока();
        Группировка.Выгрузить(спТаблицГруппировок.Группировка);
   КонецЦикла;
15 Zhuravlik
 
03.10.11
02:47
Все пустое... Через массив?..
16 Aleksey
 
03.10.11
02:49
(15) Загони Группировка=СоздатьОбъект("ТаблицаЗначений");    в цикл и сравни результат
17 Ardi
 
03.10.11
02:49
спГруппировок.РазмерСписка() - размер списка это метод СПИСКАзначений а не ТАБЛИЦЫ
18 Ardi
 
03.10.11
02:50
цикл не сработал
19 Zhuravlik
 
03.10.11
02:52
Цикл сработал, я не уточнил, извиняюсь. спГРУППИРОВОК - это список значений на форме.
20 Aleksey
 
03.10.11
02:52
Он вообще должен ругнуться на размер списка
да и спТаблицГруппировок.НоваяКолонка("Группировка", "ТаблицаЗначений");  - врядли 1С это поймет
21 Aleksey
 
03.10.11
02:53
(19) А что тогда вот это такое?

  спТаблицГруппировок = СоздатьОбъект("ТаблицаЗначений");
   спТаблицГруппировок.НоваяКолонка("Группировка", "ТаблицаЗначений");
22 Aleksey
 
03.10.11
02:53
Туплю...
23 Zhuravlik
 
03.10.11
02:55
(17) нет, все пустое все равно...
(21) спТаблицГруппировок - это и есть таблица таблиц, я создаю в ней колонку Группировка, с типом "ТаблицаЗначений", это понятно для 1С. В цикле На ТипЗначенияСТР все норм...
24 Zhuravlik
 
03.10.11
03:04
Группировка=СоздатьОбъект("ТаблицаЗначений");    
   спТаблицГруппировок = СоздатьОбъект("ТаблицаЗначений");
   спТаблицГруппировок.НоваяКолонка("Группировка", "ТаблицаЗначений");    
   Для сч=1 По спГруппировок.РазмерСписка()  Цикл
       Если спГруппировок.Пометка(сч) = 0 Тогда
           Продолжить;
       КонецЕсли;

       Переиндексирование(Группировка);
           спТаблицГруппировок.НоваяСтрока();
        спТаблицГруппировок.Группировка = Группировка;
   КонецЦикла;

Заработало))))
25 GreyK
 
03.10.11
05:11
(24) Так работать не будет, у ткбя во всех строках спТаблицГруппировок одна и та-же ТЗ.
26 Песец
 
03.10.11
06:07
(24)
...
//спТаблицГруппировок.Группировка = Группировка;
спТаблицГруппировок.Группировка.Загрузить(Группировка);
...

Загрузить
Скопировать структуру и значения таблицы значений.

Синтаксис:

Загрузить(<ТаблицаЗначений>)

Англоязычный синоним:

Load

Параметры:

<ТаблицаЗначений>
Значение типа «Таблица значений». Структура и значения для загрузки.


Описание:

Метод Загрузить позволяет скопировать структуру и значения таблицы значений. Прежняя структура колонок таблицы значений при этом очищается.

Пример:

НовТабл = СоздатьОбъект("ТаблицаЗначений");

НовТабл.Загрузить(СтарТабл);

(с) ЖКК


// Присвоить значение переменной по ее имени.
// в глоб.модуль:
Функция Присвоить(Чему,Что) Экспорт
    Чему = Что;
    Возврат "";
КонецФункции
// варианты вызова:
// Шаблон("[Присвоить("+ИмяПеременной+",ПеременнаяСоЗначением)]");
// Шаблон("[Присвоить("+ИмяПеременной+","+ИмяПеременнойСоЗначением+")]");
// Пример: пусть у нас на форме есть 5 числовых реквизитов К1, К2, ... К5
Для н=1 по 5 Цикл
    Шаблон("[Присвоить("+("К"+н)+","+(н)+")]");
КонецЦикла;

Если в качестве параметров ф-ии Присвоить() могут передаваться ТаблицаЗначений или СписокЗначений, то нужно её изменить на:
Функция Присвоить(Чему,Что)
    Если Найти(ТипЗначенияСтр(Что),"Значений")>0 Тогда
         Чему=СоздатьОбъект(ТипЗначенияСтр(Что));
         Что.Выгрузить(Чему);
    Иначе
         Чему = Что;
    КонецЕсли;
    Возврат "";
КонецФункции

(с) Синор
27 GreyK
 
03.10.11
06:41
(24) Вот так будет работать:

   спТаблицГруппировок = СоздатьОбъект("ТаблицаЗначений");
   спТаблицГруппировок.НоваяКолонка("Группировка", "ТаблицаЗначений");    
   Для сч=1 По спГруппировок.РазмерСписка()  Цикл
       Если спГруппировок.Пометка(сч) = 0 Тогда
           Продолжить;
       КонецЕсли;
       
       спТаблицГруппировок.НоваяСтрока();
       спТаблицГруппировок.Группировка = СоздатьОбъект("ТаблицаЗначений");
       Переиндексирование(спТаблицГруппировок.Группировка);//Не знаю что делает эта функция.
   КонецЦикла;
28 Песец
 
03.10.11
08:31
(1) Переменные должны быть (явно или неявно) объявлены. Если количество нужных переменных заранее неизвестно, используй сз или тз.

Процедура Проба()
   ТаблицаТаблиц=СоздатьОбъект("ТаблицаЗначений");
   ТаблицаТаблиц.НоваяКолонка("тз");//для хранения заранее неизвестного количества таблиц значений
   Для н=1 по 5 Цикл
       тз=СоздатьОбъект("ТаблицаЗначений"); //создаем и заполняем таблицу
       тз.НоваяКолонка("колонка");
       тз.НоваяСтрока();
       тз.колонка = "строка "+н;
       ТаблицаТаблиц.НоваяСтрока();
       ТаблицаТаблиц.тз=СоздатьОбъект("ТаблицаЗначений");//сюда сохраним очередную таблицу
       ТаблицаТаблиц.тз.Загрузить(тз);        
   КонецЦикла;
   ТаблицаТаблиц.ВыбратьСтроки();//проверим что получилось
   Пока ТаблицаТаблиц.ПолучитьСтроку() = 1 Цикл
       Сообщить("строка "+ТаблицаТаблиц.НомерСтроки+" таблицы таблиц");
       внутренняятз=создатьобъект("ТаблицаЗначений");
       ТаблицаТаблиц.тз.Выгрузить(внутренняятз);
       внутренняятз.ВыбратьСтроки();
       Пока внутренняятз.ПолучитьСтроку() = 1 Цикл
           сообщить("-содержимое строки "+ внутренняятз.НомерСтроки +" внутренней таблицы="+внутренняятз.колонка);
       КонецЦикла;
   КонецЦикла;
КонецПроцедуры
29 smaharbA
 
03.10.11
08:42
баянище
30 Ёпрст
 
03.10.11
08:46
(29) пока виден только тупняк :)))
31 Mikeware
 
03.10.11
08:47
(30) Но, согласись, изысканный тупняк.... :-)
32 smaharbA
 
03.10.11
08:49
+ если надо заполнить одним и тем же, но не ссылкой, есть старый тупо-эффективный метод знаениев+значениеиз

а так (30) ))
33 VladZ
 
03.10.11
08:58
(0) И в чем проблема?
34 VladZ
 
03.10.11
09:02
ТЗТаблиц = СоздатьОБъект("ТаблицаЗначений");
ТЗТаблиц.НоваяКолонка("ТЗ");

Для сч = 1 по КолвоНужныхТаблиц Цикл
 ТЗТаблиц.НоваяСтрока();
 ТЗТаблиц.ТЗ = СоздатьОБЪект("ТаблицаЗначений");
 ИнициализацияКолонок(ТЗТаблиц.ТЗ);
 ЗаполнитьТаблицу(ТЗТаблиц.ТЗ);
КонецЦикла;

(0) Открой тайну, что ваяешь?
35 Мимохожий Однако
 
03.10.11
09:03
(0)Если ТЗ создавал в цикле,  то и читать будешь в цикле. При этом имя ТЗ не имеет значения. Имеет значение только индекс строки первоначального цикла. А реализаций может быть огромное количество. Опиши задачу, в которой хочешь это использовать.ИМХО, надо обсуждать не выбранный механизм, а постановку задачи.
36 Zhuravlik
 
04.10.11
16:30
в (24) не тот код вставил. Пользуюсь этим:


 
   спТаблицГруппировок = СоздатьОбъект("ТаблицаЗначений");
   спТаблицГруппировок.НоваяКолонка("Группировка", "ТаблицаЗначений");    
   Для сч=1 По спГруппировок.РазмерСписка()  Цикл
       Если спГруппировок.Пометка(сч) = 0 Тогда
           Продолжить;
       КонецЕсли;
Группировка=СоздатьОбъект("ТаблицаЗначений");  
       Переиндексирование(Группировка);
           спТаблицГруппировок.НоваяСтрока();
        спТаблицГруппировок.Группировка = Группировка;
   КонецЦикла;

Все работает)

(34) Спасибо, попробую. Пишу процедуру для вывода заранее неизвестного колмчества группировок в таблицу. Начальник на работе показал способ, как он это делает, а мне загорелось этот способ универсализировать.
37 Cthulhu
 
04.10.11
16:34
СЗ из ТЗ.
38 Zhuravlik
 
04.10.11
16:35
(37) ?