Имя: Пароль:
1C
1С v8
Программное создание элементов формы (3 вложенные таблицы)
0 freelancer83
 
20.10.15
12:00
Доброго времени суток. Помогите разобраться с ошибкой.
Есть задача программно добавить реквизиты и элементы формы
Проблема в том, что реквизиты - это 3 вложенные таблицы, для примера:
есть таблица классы школы Таблица2, к ней привязана таблица учеников класса Таблица22, а к таблице учеников в свою очередь привязана таблица предметов с оценками учеников Таблица223. С помощью конструктора можно разместить реквизиты и соответствующие элементы на форме (таблицы формы), но при программном формировании (добавление элемента "Т223") появляется ошибка
{Форма.Форма.Форма(87)}: Ошибка при установке значения атрибута контекста (ПутьКДанным)
    НовЭл.ПутьКДанным = "Элементы.Т22.ТекущиеДанные.Таблица223";
по причине:
Недопустимое значение

Код процедуры
&НаСервере
Процедура Команда2НаСервере()
    //ДобавляемыеРеквизиты=Новый Массив;
    //СуществующиеРеквизиты = Новый Массив;
    //ЗарплатаКадры.ЗаполнитьМассивИменРеквизитовФормы(ЭтаФорма, СуществующиеРеквизиты);
    //СуществующиеРеквизиты.Удалить(СуществующиеРеквизиты.Найти("Реквизит777"));
    //СуществующиеРеквизиты.Удалить(СуществующиеРеквизиты.Найти("Объект"));
    //ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("Реквизит1",Новый ОписаниеТипов("Дата"),,"Реквизит1"));
    //Массив=Новый Массив;    
    //Массив.Добавить(Тип("ТаблицаЗначений"));
    //ОписаниеТиповТаблицаЗначений = Новый ОписаниеТипов(Массив);
    //ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("Таблица2",ОписаниеТиповТаблицаЗначений,,"Таблица2"));
    //ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("Столбец21",Новый ОписаниеТипов("Строка"),"Таблица2" ,"Столбец21"));
    //ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("Таблица22",ОписаниеТиповТаблицаЗначений,"Таблица2"  ,"Таблица22"));
    //ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("Столбец221",Новый ОписаниеТипов("Строка"),"Таблица2.Таблица22","Столбец221"));
    //ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("Столбец222",Новый ОписаниеТипов("Строка"),"Таблица2.Таблица22","Столбец222"));
    //ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("Таблица223",ОписаниеТиповТаблицаЗначений,"Таблица2.Таблица22","Таблица223"));
    //ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("Столбец2231",Новый ОписаниеТипов("Строка"),"Таблица2.Таблица22.Таблица223","Столбец2231"));
    ////СформироватьРеквизитыФормы(Дерево.Строки,ДобавляемыеРеквизиты);            
    //ИзменитьРеквизиты(ДобавляемыеРеквизиты,СуществующиеРеквизиты);                      ЗарплатаКадры.УдалитьПодчиненныеЭлементыГруппы(ЭтаФорма,Элементы.ГруппаПрограммныеЭлементы);
НовЭл=Элементы.Добавить("Реквизит1",Тип("ПолеФормы"),Элементы.ГруппаПрограммныеЭлементы);    
    НовЭл.Вид = ВидПоляФормы.ПолеВвода;
    НовЭл.ПутьКДанным = "Реквизит1";
    НовЭл=Элементы.Добавить("Т2",Тип("ТаблицаФормы"),Элементы.ГруппаПрограммныеЭлементы);    
    //НовЭл.Вид = ВидПоляФормы.ПолеВвода;    
    НовЭл.ПутьКДанным = "Таблица2";
    //ЭлТаблица22=НовЭл;
    НовЭл=Элементы.Добавить("Столбец21",Тип("ПолеФормы"),НовЭл);    
    НовЭл.Вид = ВидПоляФормы.ПолеВвода;
    НовЭл.ПутьКДанным = "Таблица2.Столбец21";    НовЭл=Элементы.Добавить("Т22",Тип("ТаблицаФормы"),Элементы.ГруппаПрограммныеЭлементы);
    НовЭл.ПутьКДанным = "Элементы.Т2.ТекущиеДанные.Таблица22";
    ЭлТаблица22=НовЭл;
    НовЭл=Элементы.Добавить("Столбец221",Тип("ПолеФормы"),ЭлТаблица22);    
    НовЭл.Вид = ВидПоляФормы.ПолеВвода;
    НовЭл.ПутьКДанным = "Элементы.Т2.ТекущиеДанные.Таблица22.Столбец221";    
    
    НовЭл=Элементы.Добавить("Столбец222",Тип("ПолеФормы"),ЭлТаблица22);    
    НовЭл.Вид = ВидПоляФормы.ПолеВвода;
    НовЭл.ПутьКДанным = "Элементы.Т2.ТекущиеДанные.Таблица22.Столбец222";    
    
    НовЭл=Элементы.Добавить("Т223",Тип("ТаблицаФормы"),Элементы.ГруппаПрограммныеЭлементы);
////////////////////////////////////////////////////////////////////////////////////////////
    НовЭл.ПутьКДанным = "Элементы.Т22.ТекущиеДанные.Таблица223";//ЗДЕСЬ ошибка
////////////////////////////////////////////////////////////////////////////////////////////
//................................
КонецПроцедуры

Управляемые формы, тестировал обработку в БП (3.0.40.36)
на платформах 1С:Предприятие 8.3 (8.3.6.2237) и 1С:Предприятие 8.3 (8.3.6.2332)
Реквизиты формы (3 вложенные таблицы) создаются без проблем, для упрощения в конфигураторе на форму обработки вручную уже добавлен реквизит Таблица2 и закоментирован рабочий код программного добавления реквизита формы вложенных таблиц.

Прошу помочь разобраться: это ошибка платформы или неправильно привязываю элемент формы к реквизиту. Как привязать программно созданный элемент формы ТаблицаФормы к вложенной таблице 3-го уровня, с учетом того, что для 1-го и 2-го уровней все нормально работает. Если добавить вручную 3 таблицы на форме (можно наверно и 4 и 5 ) и вручную связать, то никаких проблем не возникает.
скриншот реквизитов формы в конфигураторе
https://drive.google.com/file/d/0ByV6nmoaKkjFdDZRd1lOUGVlcG8/view?usp=sharing
Тестовая обработка находится по адресу
https://drive.google.com/file/d/0ByV6nmoaKkjFdHZ5MU5zVHdVeWM/view?usp=sharing
1 БатКор
 
20.10.15
12:10
Кто поставил тебе такую задачу? не проще ли открывать форму списка с необходимым отбором?
2 freelancer83
 
20.10.15
12:15
К сожалению, без создания таблиц нельзя, вложенность данных может быть произвольной, дерево тоже не подходит, состав таблиц (количество и типы столбцов) на разных уровнях может отличаться. Требуется интерактивность на форме. При активизации строки таблицы на любом уровне нужно на этой же форме отображать данные связанных таблиц
3 Горогуля
 
20.10.15
12:19
4 aleks_default
 
20.10.15
12:26
(2) Не убедил в необходимости программного создания реквизитов.
(0)  НовЭл.ПутьКДанным = "Элементы.Т22.ТекущиеДанные.Таблица223"; это путь к реквизиту формы, а не к элементу формы. Должно быить "НовЭл.ПутьКДанным = "Таблица223".
5 freelancer83
 
20.10.15
12:39
(4) Структура реквизитов формы и, соответственно, элементов формы неизвестна заранее (структура становится известной при создании формы, это дерево где строка описывает реквизит формы или таблицу формы), приведенный пример Классы - Ученики - Оценки просто иллюстрирует проблему, это может быть и 4-уровневая таблица, и может быть одна таблица. На форме без дополнительных нажатий нужно видеть данные вложенных таблиц.
"НовЭл.ПутьКДанным = "Таблица223"
недопустимое значение
6 hhhh
 
20.10.15
12:42
а реквизит Таблица223 уже добавил?
7 aleks_default
 
20.10.15
12:43
(6)Не, не добавил. Я код глянул в (0). Он закоментил добавление рекизитов.
8 aleks_default
 
20.10.15
12:45
(5) ты просто пока не понимаешь какой геморой на свою задницу сочиняешь программно создавая структуру формы...
9 aleks_default
 
20.10.15
12:47
лучше пока не поздно переформулировать задачу
10 freelancer83
 
20.10.15
12:49
(8) Согласен, но может кто-нибудь с такой проблемой сталкивался, перепробовал много вариантов, постоянно попадаю на эту ошибку. Мистяне, помогите, пожалуйста, все время у вас читаю решения и ответы на разные проблемы.
11 aleks_default
 
20.10.15
12:52
(10) Тебе сказали уже. Перед созданием элеменов формы нужно сначала создавать реквизиты формы, которые и будут указываться как путь к данным элемента формы
12 freelancer83
 
20.10.15
12:55
(9) Если не смогу решить проблему создания 3-го уровня, тогда придется полностью отказаться от программного формирования реквизитов, чего очень не хотелось бы.
Но почему на втором уровне такой проблемы нет? элемент формы (ТаблицаФормы) на 2-м уровне программно создается без проблем. Для 3 уровня используется тот же принцип.
13 freelancer83
 
20.10.15
12:59
(11)  "для упрощения в конфигураторе на форму обработки вручную уже добавлен реквизит Таблица2"
На форму обработки в режиме конфигуратора уже добавлена Таблица2 (Реквизит формы) со всеми вложенными таблицами в т.ч. и Таблица223
У меня не получается даже не добавить, а всего-то связать Элемент формы "Т223" с существующей таблицей "Таблица223"
14 freelancer83
 
20.10.15
13:09
Процедуру можно сократить до безобразия
&НаСервере
Процедура Команда2НаСервере()    
    ЗарплатаКадры.УдалитьПодчиненныеЭлементыГруппы(ЭтаФорма,Элементы.ГруппаПрограммныеЭлементы);
    НовЭл=Элементы.Добавить("Т2",Тип("ТаблицаФормы"),Элементы.ГруппаПрограммныеЭлементы);    
    НовЭл.ПутьКДанным = "Таблица2";
    НовЭл=Элементы.Добавить("Т22",Тип("ТаблицаФормы"),Элементы.ГруппаПрограммныеЭлементы);
    НовЭл.ПутьКДанным = "Элементы.Т2.ТекущиеДанные.Таблица22";
    НовЭл=Элементы.Добавить("Т223",Тип("ТаблицаФормы"),Элементы.ГруппаПрограммныеЭлементы);
    НовЭл.ПутьКДанным = "Элементы.Т22.ТекущиеДанные.Таблица223";
КонецПроцедуры
и все равно ошибка на последней строке процедуры
{Форма.Форма.Форма(124)}: Ошибка при установке значения атрибута контекста (ПутьКДанным)
    НовЭл.ПутьКДанным = "Элементы.Т22.ТекущиеДанные.Таблица223";
по причине:
Недопустимое значение
15 hhhh
 
20.10.15
15:02
(14) ну таблица 223 где у вас тут создается?? , вы увиливаете от вопроса.
16 freelancer83
 
20.10.15
15:15
(15) ни в коем случае не увиливаю, выше уже написал, чтобы уменьшить вероятность ошибки, чтобы предельно упростить условия задачи, реквизит Таблица223 добавил вручную. Он уже есть в реквизитах формы. Или вы считате, что я не могу программно создать элемент формы для созданного в конфигураторе реквизита формы? Также я писал, что код создания реквизитов формы до 3-го уровня (наверно и для любых уровней) срабатывает без проблем. Даже если удалить с формы все реквизиты и раскомментировать код создания реквизитов это ничего не дает, проверял, появляется та же ошибка
17 hhhh
 
20.10.15
15:26
(16) ну значит он добавлен не как колонка Таблицы 22.
18 hhhh
 
20.10.15
15:29
(16) может просто создать 3 закладки Таблица 1, Таблица 2 и Таблица 3, и при переключении в них устанавливать отбор соответствующий? Нафига вы через задний проход делаете? В колонку Таблицу вставляете?
19 freelancer83
 
20.10.15
15:39
(18) В этом что-то есть, спасибо, я попробую, но вопрос остается актуальным. Самое главное, почему для 2-х уровней работает, а на 3-м ошибка. Еще я заметил в отладчике, что для элементов формы Т2 и Т22 есть свойство "ОтборСтрок" а у созданного элемента Т223 такого свойства нет
20 freelancer83
 
20.10.15
15:42
УПС, извините, "ОтборСтрок" появляется по установки свойства "ПутьКДанным", значит у Т223 это свойство появится после удачного связывания с Таблица223
21 aleks_default
 
20.10.15
15:49
В КОЛОНКУ ТАБЛИЦУ вставляет? О, господи...
22 БатКор
 
20.10.15
18:40
Да лучше создавать ТЗ и СЗ и при необходимость впихивать в ТЧ, лучше думаю так будет
23 БатКор
 
20.10.15
18:41
Сорян за тавтологию
24 Mort
 
20.10.15
20:03
Программное создание элементов в 1с сделано на "отстаньте". Условное оформление формы игнорится, пути к данным не ставятся, платформенные команды не назначаются.
25 freelancer83
 
20.10.15
20:47
Написал в отдел тех. поддержки "1С" уже неделю как. Пока тишина. Наверно не дождусь от них ответа.
26 Мимохожий Однако
 
20.10.15
21:30
(0) Почему именно программно? Очень интересно. Программно можно создать только элементы формы, но не реквизиты.
27 EvgeniuXP
 
20.10.15
21:41
открой ГруппаКонтактнаяИнформация в БСП и посмотри как программно добавляют табличку :)
28 EvgeniuXP
 
20.10.15
21:42
(26) кто это сказал, что нельзя?
29 БатКор
 
20.10.15
21:42
постановка задачи не корректная. "все говорят о мухе, а ты про слона да про слона". Однако, здравствуйте!!!)
30 Мимохожий Однако
 
20.10.15
21:50
(28)Ну, так помоги страдальцу. И я поучусь.
31 hhhh
 
20.10.15
21:56
(26) можно создать и реквизиты.
32 Мимохожий Однако
 
20.10.15
22:13
Набросились )) Ну, спровоцировал маленько...Может кто и поможет ТС.
Однако мне действительно не понятна причина рождения столь чудного технического задания.
33 Мимохожий Однако
 
20.10.15
22:15
В УТ11 есть примеры создания реквизитов формы в виде таблиц в общих модулях "Планирование", "Анкетирование"...
34 freelancer83
 
20.10.15
22:19
(33) Спасибо, посмотрю
35 EvgeniuXP
 
20.10.15
22:58
(34) там ничего сложного, процедуру ИзменитьРеквизиты ищи.
36 freelancer83
 
21.10.15
18:54
(18) Спасибо большое за наводку. Используя Свойство элемента формы (тип ТаблицаФормы) ОтборСтрок удалось связать таблицы 3, 4 уровней вложенности, без использования колонки таблицы тип ТаблицаЗначений
Получается, что при использовании вложенности таблиц больше 2 (только программное добавление) нужно использовать свойство ТаблицаФормы - ОтборСтрок. Программно, используя свойство ТаблицаФормы - ПутьКДанным невозможно связать таблицы 3-го и более уровней вложенности
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс