Имя: Пароль:
1C
1С v8
Создать новый реквизит ТЧ и добавить его в ТЧ программно
0 pasha801
 
25.11.24
22:45
ТаблицаТовары = Элементы.ТЧГлавная;
    НовыйРеквизит = Элементы.Добавить("Вес", Тип("ПолеФормы"), ТаблицаТовары);
    НовыйРеквизит.Заголовок = "Вес";
    НовыйРеквизит.ПутьКДанным = "Объект.ТЧГлавная.Вес";
    НовыйРеквизит.Вид = ВидПоляФормы.ПолеВвода;

Реквизит создается, но выходит ошибка когда присваивается значение в ПутьКДанным:

Ошибка при установке значения атрибута контекста (ПутьКДанным)
    НовыйРеквизит.ПутьКДанным = "Объект.ТЧГлавная.Вес";
по причине:
Недопустимое значение
1 Asmody
 
25.11.24
22:51
потому что твой НовыйРеквизит - это не реквизит.
2 Asmody
 
25.11.24
22:53
для начала рекомендую определиться с тем, реквизит чего ты хочешь создать программно. а потом попытаться понять - можно ли это сделать в принципе
3 pasha801
 
25.11.24
22:58
(2) реквизит табличной части? можно ли?
4 Asmody
 
25.11.24
23:10
(3) нет. Структура метаданных программно не изменяется
5 pasha801
 
25.11.24
23:31
(4) т.е. решения моего вопроса нету? просто хочу чтобы добавлялась колонка или колонки в тч. получается нужно заранее создать эти реквизиты
6 Asmody
 
26.11.24
00:20
(5) колонку в таблицу формы динамически добавить можно. и связать ее с динамически добавленным реквизитом формы тоже можно. и даже как-то где-то потом эти данные хранить.
Но требует ли задача таких сложностей?
7 PR
 
26.11.24
00:29
(5) А куда по-твоему будет записываться значение твоего "реквизита", когда ты в форме нажмешь Записать?
8 Мультук
 
гуру
26.11.24
06:28
(0)

Пример

https://1c-programmer-blog.ru/programmirovanie/kak-programmno-dobavit-kolonku-v-tablichnuyu-chast-upravlyaemoj-formy.html



(7)

Никуда не будет записываться.
Будет считаться "на лету" и показываться пользователю
9 RVN
 
26.11.24
06:59
(7) Куда ты запрограммируешь - туда и будет записываться.
10 Stepashkin
 
26.11.24
07:21
(0) Вы создаете не реквизит, а элемент формы. А реквизит у вас - это Объект.ТЧГлавная. А вес, я так понимаю, это колонка табличной части.
11 программистище
 
26.11.24
08:18
реквизит тч создается по типу:
    ДобавляемыеРеквизиты = Новый Массив;
    НовыйРеквизит = Новый РеквизитФормы("Вес",Новый ОписаниеТипов("Число"),"Объект.ТЧГлавная","Вес");
    ДобавляемыеРеквизиты.Добавить(НовыйРеквизит);
    ЭтотОбъект.ИзменитьРеквизиты(ДобавляемыеРеквизиты);

А потом уже свой код по созданию элемента формы
12 pasha801
 
27.11.24
21:00
(7) записывать никуда не надо, самое главное чтобы в данный момент в тч вывело
(8) благодарю, то что нужно
(11) спасибо
Ребята, всем спасибо, помогли разобраться
13 Волшебник
 
27.11.24
21:07
И зачем всё это?
14 pasha801
 
27.11.24
22:03
(13) с экселя выгружаю данные в тч, а из тч уже в нужный документ
15 pasha801
 
28.11.24
00:37
(11) не подскажете, как теперь записать данные в эту колонку:
пытаюсь добавлять запись так
КолонкаДанных = Объект.ТЧГлавная.Добавить();
незнаю как продолжить, обратиться к реквизиту созданному
16 Garykom
 
гуру
28.11.24
02:21
Интересно, движок у машины перебирать тоже сам?
И к врачам не ходим, в интернете спрашиваем как лечиться?
17 Prog111
 
28.11.24
06:47
(0) У тебя в конфигураторе, в табличной части есть реквизит "Вес"? Не на форме, а слева, в разделе с метаданными?
18 Stepashkin
 
28.11.24
07:13
(14) Сделайте обработку. В ней не программно создайте ТЧ с колонками, в них грузите данные из колонок экселя, а потом на основе этих данных создавайте документ. В свое время у меня на такое дело ушло пару часов, если не меньше, не помню. А вообще, в интернете куча примеров, научитесь получать информацию из сети, если постулатов не читали. И совет, если возможно создавать интерактивно - создавайте, не нужно кодить.
19 DrZombi
 
гуру
28.11.24
07:33
(0) Держи, наборчик инструментов.

Функции в помощь, для создания элементов на форме УФ

#Область Дополнительные_Функции

Функция ПолучитьСвойствоДопРеквизита(ИмяСвойства) Экспорт
    
    Запрос = Новый Запрос;
    Запрос.УстановитьПараметр("Имя", ИмяСвойства);
    Запрос.Текст =
    "ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1
    |    ДополнительныеРеквизитыИСведения.Ссылка КАК Ссылка,
    |    ДополнительныеРеквизитыИСведения.Имя КАК Имя,
    |    ДополнительныеРеквизитыИСведения.ПометкаУдаления КАК ПометкаУдаления,
    |    ДополнительныеРеквизитыИСведения.Наименование КАК Наименование
    |ИЗ
    |    ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения КАК ДополнительныеРеквизитыИСведения
    |ГДЕ
    |    ДополнительныеРеквизитыИСведения.Имя = &Имя
    |
    |УПОРЯДОЧИТЬ ПО
    |    ПометкаУдаления";
    
    РезЗапроса = Запрос.Выполнить();
    Если РезЗапроса.Пустой() Тогда
        Возврат Неопределено;
    КонецЕсли;
    
    Выбор = РезЗапроса.Выбрать();
    Выбор.Следующий();
    
    стрСвойства = Новый Структура("Ссылка,Имя,ПометкаУдаления,Наименование");
    ЗаполнитьЗначенияСвойств(стрСвойства, Выбор);
    
    Возврат стрСвойства;
КонецФункции

Функция НайтиРеквизитПоНаименованию(МассРекв, ИмяРеквизита)
    Перем РезФункци,СчИндекса,КолВо,Реквизит;
    
    РезФункци = Неопределено;
    
    СчИндекса = 0;
    КолВо = МассРекв.Количество();
    Пока КолВо > 0 Цикл
        Реквизит = МассРекв[КолВо-1];
        
        СчИндекса = СчИндекса + 1;
        Если Реквизит.Имя = ИмяРеквизита Тогда
            РезФункци = СчИндекса - 1;
            Прервать;
        КонецЕсли;
        
        КолВо = КолВо - 1;
    КонецЦикла;
    
    Возврат РезФункци;
КонецФункции

Функция ДобавитьЭлементНаФорму(ИмяЭлемента, ПутьКДанным, ЭлементТаблицы_Список, ЭлементТаблицы_После, Элементы)
    
    ЭлементФормы = Элементы.Найти(ИмяЭлемента);
    Если ЭлементФормы = Неопределено и ЭлементТаблицы_Список <> Неопределено Тогда
        Если ЭлементТаблицы_После = Неопределено Тогда
            ЭлементФормы = Элементы.Добавить(ИмяЭлемента, Тип("ПолеФормы"), ЭлементТаблицы_Список);
        Иначе
            ЭлементФормы = Элементы.Вставить(ИмяЭлемента, Тип("ПолеФормы"), ЭлементТаблицы_Список, ЭлементТаблицы_После);
        КонецЕсли;
        ЭлементФормы.Вид = ВидПоляФормы.ПолеВвода;
        Если ПутьКДанным <> Неопределено И ЗначениеЗаполнено(ПутьКДанным) Тогда
            Попытка
                ЭлементФормы.ПутьКДанным = ПутьКДанным;
            Исключение
            КонецПопытки;
        КонецЕсли;
    КонецЕсли;
    
    Возврат ЭлементФормы;
КонецФункции

//ГруппаФормы
Функция ДобавитьГруппуНаФорму(ИмяЭлемента, ЭлементТаблицы_Список, ЭлементТаблицы_После, Элементы)
    
    ЭлементФормы = Элементы.Найти(ИмяЭлемента);
    Если ЭлементФормы = Неопределено и ЭлементТаблицы_Список <> Неопределено Тогда
        Если ЭлементТаблицы_После = Неопределено Тогда
            ЭлементФормы = Элементы.Добавить(ИмяЭлемента, Тип("ГруппаФормы"), ЭлементТаблицы_Список);
        Иначе
            ЭлементФормы = Элементы.Вставить(ИмяЭлемента, Тип("ГруппаФормы"), ЭлементТаблицы_Список, ЭлементТаблицы_После);
        КонецЕсли;
        ЭлементФормы.Вид = ВидГруппыФормы.ОбычнаяГруппа;
    КонецЕсли;
    
    Возврат ЭлементФормы;
КонецФункции

//ТаблицаФормы
Функция ДобавитьТаблицуНаФорму(ИмяЭлемента, ПутьКДанным, ЭлементТаблицы_Список, ЭлементТаблицы_После, Элементы)
    
    ЭлементФормы = Элементы.Найти(ИмяЭлемента);
    Если ЭлементФормы = Неопределено и ЭлементТаблицы_Список <> Неопределено Тогда
        Если ЭлементТаблицы_После = Неопределено Тогда
            ЭлементФормы = Элементы.Добавить(ИмяЭлемента, Тип("ТаблицаФормы"), ЭлементТаблицы_Список);
        Иначе
            ЭлементФормы = Элементы.Вставить(ИмяЭлемента, Тип("ТаблицаФормы"), ЭлементТаблицы_Список, ЭлементТаблицы_После);
        КонецЕсли;
        ЭлементФормы.ПутьКДанным = ПутьКДанным;
    КонецЕсли;
    
    Возврат ЭлементФормы;
КонецФункции

//ДобавитьГруппуКнопокНаФорму
Функция ДобавитьГруппуКнопокНаФорму(ИмяЭлемента, ЭлементТаблицы_Список, ЭлементТаблицы_После, Элементы)
    
    ЭлементФормы = Элементы.Найти(ИмяЭлемента);
    Если ЭлементФормы = Неопределено и ЭлементТаблицы_Список <> Неопределено Тогда
        Если ЭлементТаблицы_После = Неопределено Тогда
            ЭлементФормы = Элементы.Добавить(ИмяЭлемента, Тип("ГруппаФормы"), ЭлементТаблицы_Список);
        Иначе
            ЭлементФормы = Элементы.Вставить(ИмяЭлемента, Тип("ГруппаФормы"), ЭлементТаблицы_Список, ЭлементТаблицы_После);
        КонецЕсли;
        ЭлементФормы.Вид = ВидГруппыФормы.ГруппаКнопок;
    КонецЕсли;
    
    Возврат ЭлементФормы;
КонецФункции

Функция ДобавитьГруппуКолонокНаФорму(ИмяЭлемента, ЭлементТаблицы_Список, ЭлементТаблицы_После, Элементы)
    
    ЭлементФормы = Элементы.Найти(ИмяЭлемента);
    Если ЭлементФормы = Неопределено и ЭлементТаблицы_Список <> Неопределено Тогда
        Если ЭлементТаблицы_После = Неопределено Тогда
            ЭлементФормы = Элементы.Добавить(ИмяЭлемента, Тип("ГруппаФормы"), ЭлементТаблицы_Список);
        Иначе
            ЭлементФормы = Элементы.Вставить(ИмяЭлемента, Тип("ГруппаФормы"), ЭлементТаблицы_Список, ЭлементТаблицы_После);
        КонецЕсли;
        ЭлементФормы.Вид = ВидГруппыФормы.ГруппаКолонок;
    КонецЕсли;
    
    Возврат ЭлементФормы;
КонецФункции

Функция ДобавитьСтраницуНаФорму(ИмяЭлемента, ЭлементТаблицы_Список, ЭлементТаблицы_После, Элементы)
    
    ЭлементФормы = Элементы.Найти(ИмяЭлемента);
    Если ЭлементФормы = Неопределено и ЭлементТаблицы_Список <> Неопределено Тогда
        Если ЭлементТаблицы_После = Неопределено Тогда
            ЭлементФормы = Элементы.Добавить(ИмяЭлемента, Тип("ГруппаФормы"), ЭлементТаблицы_Список);
        Иначе
            ЭлементФормы = Элементы.Вставить(ИмяЭлемента, Тип("ГруппаФормы"), ЭлементТаблицы_Список, ЭлементТаблицы_После);
        КонецЕсли;
        ЭлементФормы.Вид = ВидГруппыФормы.Страница;
    КонецЕсли;
    
    Возврат ЭлементФормы;
КонецФункции

Функция ДобавитьСтраницыНаФорму(ИмяЭлемента, ЭлементТаблицы_Список, ЭлементТаблицы_После, Элементы)
    
    ЭлементФормы = Элементы.Найти(ИмяЭлемента);
    Если ЭлементФормы = Неопределено и ЭлементТаблицы_Список <> Неопределено Тогда
        Если ЭлементТаблицы_После = Неопределено Тогда
            ЭлементФормы = Элементы.Добавить(ИмяЭлемента, Тип("ГруппаФормы"), ЭлементТаблицы_Список);
        Иначе
            ЭлементФормы = Элементы.Вставить(ИмяЭлемента, Тип("ГруппаФормы"), ЭлементТаблицы_Список, ЭлементТаблицы_После);
        КонецЕсли;
        ЭлементФормы.Вид = ВидГруппыФормы.Страницы;
    КонецЕсли;
    
    Возврат ЭлементФормы;
КонецФункции

Функция ДобавитьДекорациюНаФорму(ИмяЭлемента, ЭлементТаблицы_Список, ЭлементТаблицы_После, Элементы)
    
    ЭлементФормы = Элементы.Найти(ИмяЭлемента);
    Если ЭлементФормы = Неопределено и ЭлементТаблицы_Список <> Неопределено Тогда
        Если ЭлементТаблицы_После = Неопределено Тогда
            ЭлементФормы = Элементы.Добавить(ИмяЭлемента, Тип("ДекорацияФормы"), ЭлементТаблицы_Список);
        Иначе
            ЭлементФормы = Элементы.Вставить(ИмяЭлемента, Тип("ДекорацияФормы"), ЭлементТаблицы_Список, ЭлементТаблицы_После);
        КонецЕсли;
        ЭлементФормы.Вид = ВидДекорацииФормы.Надпись;
    КонецЕсли;
    
    Возврат ЭлементФормы;
КонецФункции

//....

//Получить картинку оп наименованию...
Функция ПолучитьИзБиблиотекиКартинку(ИмяКартинки)
    
    Попытка
        Возврат БиблиотекаКартинок[ИмяКартинки];
    Исключение
        Возврат Неопределено;
    КонецПопытки;
    
КонецФункции

#КонецОбласти



Функция по созданию реквизитов на форме, просто пример

Процедура СоздатьРеквизитыФормыДокумента_ИмяДокументаДляПростотыПоиска(Форма, ИмяИндексаРеквизитов, Путь)
    
    МассРекв = Форма.ПолучитьРеквизиты(Путь);
    
    ИмяРеквизита = "" + ИмяИндексаРеквизитов; //"ПериодНачисленияСтрокой";
    ИндексРеквизита = НайтиРеквизитПоНаименованию(МассРекв, ИмяРеквизита);
    
    Если ИндексРеквизита = Неопределено Тогда
        ДобавляемыеРеквизиты = Новый Массив;
        
        // Опишем ревизиты формы - ПериодНачисленияСтрокой
        ТипНеопределено = Неопределено;
        НовыйТип = Новый ОписаниеТипов(ТипНеопределено);
        НовыйРеквизит = Новый РеквизитФормы(ИмяРеквизита, НовыйТип, Путь, "Настройка формы", Ложь);
        ДобавляемыеРеквизиты.Добавить(НовыйРеквизит);
        
        ТипНеопределено = Неопределено;
        НовыйТип = Новый ОписаниеТипов("Строка");
        НовыйРеквизит = Новый РеквизитФормы("ЛогОшибокСообщений", НовыйТип, Путь, "Лог ошибок сообщений", Ложь);
        ДобавляемыеРеквизиты.Добавить(НовыйРеквизит);
        
        Форма.ИзменитьРеквизиты(ДобавляемыеРеквизиты);
    КонецЕсли;
    
КонецПроцедуры



Сама Функция, которая все делает, один раз ПриСозданииФормы, или ПриЧтенииДанных

Процедура ДобавитьНаФормуЭлемента_ИмяДокументаДляПростотыПоиска(ЭтотОбъект_) Экспорт
    
    Элементы = ЭтотОбъект_.Элементы;
    Форма     = ЭтотОбъект_.ЭтаФорма;
    //Объект     = Форма.Объект;
    Команды     = Форма.Команды;
    
    
    //Добавить реквизиты формы...
    ИмяИндексаРеквизитов = "НастройкаФормы";
    СоздатьРеквизитыФормыДокумента_ИмяДокументаДляПростотыПоиска(Форма, ИмяИндексаРеквизитов, "");
    
    
    //... Добавить Команду
    ИмяКоманды_О_001 = "ЗагрузитьПакетФайлов";
    ИмяКоманды_О_Элемента = ИмяКоманды_О_001;
    Если Команды.Найти(ИмяКоманды_О_Элемента) = Неопределено Тогда
        Картинка = ПолучитьИзБиблиотекиКартинку("ВнешнийИсточникДанных");
        
        Команда = Команды.Добавить(ИмяКоманды_О_Элемента); //Имя команды
        Команда.Заголовок = "Загрузить пакет файлов";
        Команда.Действие  = "ЗагрузитьПакетФайлов"; //Имя связанной процедуры
        Команда.Подсказка = "Загрузить пакет файлов XLSX... или любых Екселек... не вижу смысла ограничиваться...";
        Команда.Отображение = ?(Картинка = Неопределено,ОтображениеКнопки.Текст,ОтображениеКнопки.КартинкаИТекст);
        Если Картинка <> Неопределено Тогда
            Команда.Картинка = Картинка;
        КонецЕсли;
        Команда.ИзменяетСохраняемыеДанные = Ложь;
    КонецЕсли;
    
    
    //ФормаГруппа1
    ЭлементФормы_Осн = Форма.КоманднаяПанель;
    ЭлементФормы_Перед = Неопределено; //Элементы.Найти("ИмяРеквизитаНаФорме");
    Если ЭлементФормы_Перед <> Неопределено Тогда
        ЭлементФормы_Осн = ЭлементФормы_Перед.Родитель;
    КонецЕсли;
    
    //Добавим группу кнрпок
    ИмяЭлемента = "ФормаГруппа1";
    ГруппаКнопок_01 = ДобавитьГруппуКнопокНаФорму(ИмяЭлемента, ЭлементФормы_Осн, ЭлементФормы_Перед, Элементы);
    ГруппаКнопок_01.Вид = ВидГруппыФормы.ГруппаКнопок;
    ГруппаКнопок_01.Заголовок = "Режим открытия форм...";
    ГруппаКнопок_01.Отображение = ОтображениеГруппыКнопок.Компактное;
    
    ИмяКоманды_О_Элемента = ИмяКоманды_О_001;
    ЭлементФормы_Кнопка1 = Элементы.Найти(ИмяКоманды_О_Элемента);
    Если ЭлементФормы_Кнопка1 = Неопределено Тогда
        ЭлементФормы_Кнопка1 = Элементы.Добавить(ИмяКоманды_О_Элемента, Тип("КнопкаФормы"), ГруппаКнопок_01);
        ЭлементФормы_Кнопка1.Вид         = ВидКнопкиФормы.КнопкаКоманднойПанели;
        ЭлементФормы_Кнопка1.ИмяКоманды     = ИмяКоманды_О_Элемента;
        ЭлементФормы_Кнопка1.ТолькоВоВсехДействиях = Ложь;
        //ЭлементФормы_Кнопка1.ПоложениеВКоманднойПанели = ПоложениеКнопкиВКоманднойПанели.ВДополнительномПодменю;
    КонецЕсли;
    
    
    
    
    ЭлементФормы_Осн = Форма;
    ЭлементФормы_Перед = Неопределено; //Элементы.Найти("ИмяРеквизитаНаФорме2");
    Если ЭлементФормы_Перед <> Неопределено Тогда
        ЭлементФормы_Осн = ЭлементФормы_Перед.Родитель;
    КонецЕсли;
    
    ИмяЭлемента = "ГруппировкаЛога";
    ПутьКДаннымЗаголовка = "";
    Группа_01 = ДобавитьГруппуНаФорму(ИмяЭлемента, ЭлементФормы_Осн, ЭлементФормы_Перед, Элементы);
    Группа_01.ОтображатьЗаголовок = Ложь;
    Группа_01.Группировка = ГруппировкаПодчиненныхЭлементовФормы.ГоризонтальнаяВсегда;
    
    ЭлементФормы_Список = Элементы.Найти("Список");
    Если ЭлементФормы_Список <> Неопределено Тогда
        Элементы.Переместить(ЭлементФормы_Список, Группа_01);
    КонецЕсли;
    
    ИмяЭлемента = "ЛогОшибокСообщений";
    ПутьКДанным = "ЛогОшибокСообщений";
    ЭлементФормы = ДобавитьЭлементНаФорму(ИмяЭлемента, ПутьКДанным, Группа_01, Неопределено, Элементы);
    ЭлементФормы.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Верх;
    ЭлементФормы.МногострочныйРежим = Истина;
    ЭлементФормы.КнопкаОчистки = Истина;
    ЭлементФормы.АвтоМаксимальнаяШирина = Ложь;
    ЭлементФормы.АвтоМаксимальнаяВысота = Ложь;
    ЭлементФормы.РедактированиеТекста = Ложь;
    ЭлементФормы.АвтоПереносСтрок = Ложь;
    
КонецПроцедуры

20 DrZombi
 
гуру
28.11.24
07:39
+(0)(19) Вот так создаются доп реквизиты в табличной части объекта, на форме... Как бы он там есть, но в базу не пишется.
Только для визуализации

    СоздатьРеквизитыФормыДокумента_РезервыПоОплатеТруда(Форма, "ЦветСтроки", "Объект.ОценочныеОбязательстваПоСотрудникам");
21 DrZombi
 
гуру
28.11.24
07:42
+(0)(19) А вот так добавить на форме списка поля, которых там автором не предусмотрено, а хочется :)

    ИмяЭлемента = "Ответственный_Списка";
    ПутьКДанным = "Список.Ссылка.Ответственный";
    ЭлементФормы = ДобавитьЭлементНаФорму(ИмяЭлемента, ПутьКДанным, ЭлементТаблицы_Список, ЭлементТаблицы_После, Элементы);
22 DrZombi
 
гуру
28.11.24
07:47
+(0)Помни одно и главное, составной тип, который на форме, нельзя однозначно добавить его составляющие реквизиты.
Т.е. К примеру у тебя Есть ссылка Типа "Контрагент" И "ФизЛицо", т.е. Два справочника в одном реквизите.

Так вот, такую конструкцию на форме "Элемента" не вывести через точку "Объект.ТабличнаяЧасть.КонтрагентФизик.Код"... Увы оно так не умеет (Не путай с динамическим списком) :)
23 Волшебник
 
28.11.24
09:46
(14)(15) А почему бы не создать реквизит "Вес" в структуре табличной части в дереве конфигурации?
Зачем вы ебёте всем мозги?