Имя: Пароль:
1C
1С v8
Создание колонок ТаблицыЗначений без лишней писанины
, , ,
0 CMblCL
 
29.04.16
12:42
Есть ли встроенная функция или, возможно, функция в одной из типовых конфигураций, которая позволяет создать колонки, например в ТаблицеЗначений, без лишней писанины.

То есть вместо:

Таблица = Новый ТаблицаЗначений;
Таблица.Колонки.Добавить("Колонка1");
Таблица.Колонки.Добавить("Колонка2");
Таблица.Колонки.Добавить("Колонка3");
Таблица.Колонки.Добавить("Колонка4");
Таблица.Колонки.Добавить("Колонка5");
Таблица.Колонки.Добавить("Колонка6");
Таблица.Колонки.Добавить("Колонка7");
Таблица.Колонки.Добавить("Колонка8");
Таблица.Колонки.Добавить("Колонка9");
Таблица.Колонки.Добавить("Колонка10");
Таблица.Колонки.Добавить("Колонка11");
Таблица.Колонки.Добавить("Колонка12");
Таблица.Колонки.Добавить("Колонка13");
Таблица.Колонки.Добавить("Колонка14");
Таблица.Колонки.Добавить("Колонка15");
Таблица.Колонки.Добавить("Колонка16");
Таблица.Колонки.Добавить("Колонка17");
Таблица.Колонки.Добавить("Колонка18");
Таблица.Колонки.Добавить("Колонка19");
Таблица.Колонки.Добавить("Колонка20");

Что-то типа:

Таблица = Новый ДеревоЗначений;
Колонки = "Колонка1, Колонка2, Колонка3, Колонка4, Колонка5, Колонка6, Колонка7, Колонка8, Колонка9, Колонка10
    |Колонка11, Колонка12, Колонка13, Колонка14, Колонка15, Колонка16, Колонка17, Колонка18, Колонка19, Колонка20";
СоздатьКолонки(Таблица, Колонки);

Предвидя ответы типа "Напиши сам, ты что не программист?", я уже написал подобную процедуру. Я хочу узнать есть ли подобный функционал впринципе.

//Создает колонки в таблице, если они не существуют
//Колонки: Строка вида "НазваниеКолонки1, НазваниеКолонки2, НазваниеКолонки3"
//Таблица: Таблица любого типа, у которой есть свойство "Колонки"
Процедура СоздатьКолонки(Таблица, Знач Колонки = "") Экспорт
    Колонки = СтрЗаменить(Колонки, Символы.ПС, "");
    Колонки = СтрЗаменить(Колонки, ",", Символы.ПС);
    Если ПустаяСтрока(Колонки) Тогда
        Возврат
    КонецЕсли;
    
    МассивКолонок = Новый Массив;
    Для Сч = 1 По СтрЧислоСтрок(Колонки) Цикл
        МассивКолонок.Добавить(СокрЛП(СтрПолучитьСтроку(Колонки, Сч)));
    КонецЦикла;
    
    Для Каждого Колонка Из МассивКолонок Цикл
        Если Таблица.Колонки.Найти(Колонка) = Неопределено Тогда
            Таблица.Колонки.Добавить(Колонка);
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры
1 drcrasher
 
29.04.16
12:45
а если нужно типизировать колонки?
2 Тролль главный
 
29.04.16
12:46
(0) а нахрена МассивКолонок вообще?
3 aleks_default
 
29.04.16
12:46
Не помню когда последний раз вручную создавал таблицу значений, и тем более колонки.  Обычно таблица всегда уже есть(как выгрузка из запроса, например), можно скопировать существующую.
4 Тролль главный
 
29.04.16
12:48
+(3) в обработках это табличные части
5 CMblCL
 
29.04.16
12:50
(1) Если нужно типизировать колонки, задавать ширину или представление, то тут уж проще добавлять по одной. Но как часто это бывает нужно?
6 Тролль главный
 
29.04.16
12:53
(5) в запросы совать можно только типизированные
7 CMblCL
 
29.04.16
12:54
(2) И правда не нужен, всё можно делать в 1м цикле.
8 aleks_default
 
29.04.16
12:54
Таблица значений, с нетипизированными колонками использует  большое количество памяти. Поэтому в экзамене на специалиста, например, выгрузка результата запроса в таблицу без необходимости = -1 балл.  
И тем более нафига большое количество колонок в таблице? Обычно обхожусь меньше десятка.
Имхо это признак гов*нокода.
9 Repey
 
29.04.16
13:06
(8) А разве выгрузка результата запроса в таблицу значений дает нетипизированные колонки?
Смутно помнится, что когда-то проделывал такой финт ушами, как выполнение запроса "выбрать первые 1 .." с полями нужных типов, потом выгружал в ТЗ, потом ее чистил, набивал нужными данными - и обратно в запрос. Работало.
А теперь мне такой способ создания таблиц с типизированными полями почему-то не нравится.
10 1Сергей
 
29.04.16
13:08
(9) запрос делает составные поля. Конкретный тип значения + NULL
11 CMblCL
 
29.04.16
13:12
(8) Естественно без гов*нокода тут не обошлось. База много раз переписанная, встречаются ТЗ с 22 колонками во многих местах и каждый раз эта простыня.
12 mingw
 
29.04.16
13:12
(0) Зачем столько колонок? Что мешает в одну колонку сохранять СЗ, ТЗ, массив или структуру? В ячейки. В каждой строке.
13 CMblCL
 
29.04.16
13:23
(12) Я не совсем понимаю что вы имеете ввиду.
Но в любом случае не избежать точно такого же количества колонок\строк.
14 Ёпрст
 
29.04.16
13:36
Процедура СоздатьКолонки(Таблица, Знач Колонки = "") Экспорт

    Для Каждого Колонка Из СтрРазделить(Колонки,",",Ложь) Цикл
        Если Таблица.Колонки.Найти(Колонка) = Неопределено Тогда
            Таблица.Колонки.Добавить(Колонка);
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры
15 Новиков
 
29.04.16
13:37
(0) Есть правда не явно и без типов, заточено под ЗначениеВСтрокуВнутр.

РеквизитЗначение = ТаблицаИзСтроки(ЗначениеРеквизита);
16 1Сергей
 
29.04.16
13:38
(14) что-то я прохлопал функцию СтрРазделить
Давно такая появилась?
17 trad
 
29.04.16
13:39
18 1Сергей
 
29.04.16
13:41
ого. отстаём, отстаём
19 CMblCL
 
29.04.16
13:48
(14) Спасибо за пример, но СтрРазделить() реализовано в версии 8.3.6.1977.
Мне это не подойдет, так как версия 8.2.19.130 в режиме совместимости с 8.1.
20 aleks_default
 
29.04.16
13:53
(9)неправильно выразился
Таблица значений, а тем более с нетипизированными колонками, использует  большое количество памяти.
21 Ёпрст
 
29.04.16
14:02
можно еще извратом, через значениевстрокувнутр и обратно.
22 Новиков
 
29.04.16
14:07
(21) я в (15) как раз таки и привел строчку для гугленья в типовой. Туда если заглянуть, там элегантно обходится момент, когда поднять из внутр не удалось.
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший