Имя: Пароль:
1C
1С v8
Программное отображение таблицы значений
0 thomY100
 
11.09.12
16:22
Добрый день, возникла такая проблема, необходимо программно вывести таблицу значений на управляемую форму, добавил на форму таблицуформы и прописал в ней путь к данным, но колонки в таблице формы не создались, хотел руками пробежать по полям таблицу значений, но не могу получить к ним доступ ни через объект, ни при помощи РеквизитФормыВЗначение, подскажите, как программно добавить колонки и указать в них путь к данным?
1 1C-band
 
11.09.12
16:23
ТЗНаФорме = ТЗНаСервере;
2 DrShad
 
11.09.12
16:24
весь сабж ни о чем
где код?
3 thomY100
 
11.09.12
16:27
ТаблицаПользователей=Элементы.Добавить("Пользователи",Тип("ТаблицаФормы"),Элементы.ГруппаКонфигурационныеЕдиницы);    
ТаблицаПользователей.ПутьКДанным="Объект.Пользователи";
   
ТаблицаПользователей.Отображение=ОтображениеТаблицы.Список;

Для Каждого Колонка Из Пользователи.Колонки Цикл
       НовыйЭлемент = Элементы.Добавить(Колонка.Имя, Тип("ПолеФормы"), ТаблицаПользователей);
       НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
       НовыйЭлемент.ПутьКДанным = "Колонка.Имя;
КонецЦикла;    




так вот Пользователи.колонки недоступны
4 DrShad
 
11.09.12
16:28
а где ТЗ?
5 Miss1C
 
11.09.12
16:29
(0) Смотри уроки Гилева, там все подробно рассказывается
6 thomY100
 
11.09.12
16:30
Пользователи-Табличная часть которую надо отобразить на форме в таблице формы ТаблицаПользователей

Объект.Пользователи имеет тип данные формы коллекция и не отображает состав поле табличной части
7 thomY100
 
11.09.12
16:30
хоть ссылку на конкретный урок дайте
8 Miss1C
 
11.09.12
16:30
(4)Пользователи - я так думаю это ТЗ)
9 DrShad
 
11.09.12
16:31
(8) а вот нифига
10 thomY100
 
11.09.12
16:31
Еще раз
Пользователи - табличная часть документа
ТаблицаПользователей - таблица формы в которой ее надо отобразить
вопрос, как
11 thomY100
 
11.09.12
16:34
проблема начинается в цикле, либо надо каким-то еще образом создать колонки в таблице формы, отображающие поля табличной части
12 DrShad
 
11.09.12
16:34
где ТЗ? заявленная в сабже?
13 thomY100
 
11.09.12
16:35
опечатался, нет тз, есть тч
14 Miss1C
 
11.09.12
16:35
(0)ЗначениеВДанныеФормы(Таб,Таблица);
15 DrShad
 
11.09.12
16:36
(13) впредь, пожалуйста внимательнее
16 Miss1C
 
11.09.12
16:36
(14)На сервере
17 thomY100
 
11.09.12
16:37
что есть таб в данном случае?
18 thomY100
 
11.09.12
16:38
ну и что есть таблица соответственно
19 Miss1C
 
11.09.12
16:38
(17)Твоя Таблица Значений
20 Miss1C
 
11.09.12
16:41
(5)Базовый курс - 01 модуль - Общие механизмы платформы 1С Предприятие 8.x Версия 2 - Блок 130 - 137
21 thomY100
 
11.09.12
16:44
Хм, написал так:

Док=РеквизитФормыВЗначение("Объект");
   
ЗначениеВДанныеФормы(Док.Пользователи,Объект.МКМ_Пользователи);

но не понял, что это мне дало
22 Miss1C
 
11.09.12
16:44
(11)Таблица формы, это табличное поле?
23 Miss1C
 
11.09.12
16:45
(21)Покажи весь код
24 thomY100
 
11.09.12
16:45
таблица формы это таблица формы
25 thomY100
 
11.09.12
16:46
ТаблицаПользователей=Элементы.Добавить("Пользователи",Тип("ТаблицаФормы"),Элементы.ГруппаКонфигурационныеЕдиницы);    
ТаблицаПользователей.ПутьКДанным="Объект.Пользователи";
   
ТаблицаПользователей.Отображение=ОтображениеТаблицы.Список;

Док=РеквизитФормыВЗначение("Объект");
   
ЗначениеВДанныеФормы(Док.Пользователи,Объект.Пользователи);


вот весь код, но на форме ничего не появилось
26 MaxisUssr
 
11.09.12
16:48
(25)
еще

ТаблицаПользователей.Видимость = Истина
27 thomY100
 
11.09.12
16:48
она сама истина ставится
28 thomY100
 
11.09.12
16:51
не создаются у ТаблицаПользователей с помощью ЗначениеВДанныеФормы подчиненные элементы, потому и не отображается ничего
29 thomY100
 
11.09.12
17:01
ап, вопрос в силе..
30 ChAlex
 
11.09.12
19:01
А встречный вопрос: а что табличную часть документа уже нельзя разместить на форме? Зачем извращаться?
31 thomY100
 
12.09.12
08:51
чтобы обновлять проще, зачем же еще
32 thomY100
 
12.09.12
10:11
собственно со своим вопросом разобрался, но появился другой, как в управляемой форме при записи записать ТЗ в ТЧ объекта?
33 ChAlex
 
12.09.12
10:12
(31) - что проще обновлять, если это отображение табличной части? - я не доезжаю до вашей степени мазохизма
34 ChAlex
 
12.09.12
10:15
(32) - Т=РеквизитФормыВЗначение("Таб"). А дальше обычным образом (хоть загрузкой, хоть обходом...). Естественно все на сервере
35 thomY100
 
12.09.12
10:17
проще обновлять код, а не сравнивать формы каждый раз
36 ChAlex
 
12.09.12
10:22
(35) ну-ну - терзайте дальше. Лет через пяток дойдете до истины. Удачи
37 thomY100
 
12.09.12
10:24
ну так не говорите загадками, а скажите как лучше сделать по вашему, какой смысл вокруг да около ходить
38 Coldboy
 
12.09.12
10:27
(0) не могу понять, причем тута таблица значений, как добавлять колонки в таблицу значений

ТаблицаЗначений = Новый ТаблицаЗначений;
ТаблицаЗначений.Колонки.Добавить(ИмяКолонки); // прочитай про функцию добавить в СП.

Ты наверно хочешь программно добавить колонки в табличное поле на форме, я вас правильно понял?
39 zladenuw
 
12.09.12
10:29
(37) есть книга разработка управляемого интерфейса. там все описано.
40 Coldboy
 
12.09.12
10:31
тзКолонки = Новый ТаблицаЗначений(); //порядок, видимость и ширина колонок
   
   тзКолонки.Колонки.Добавить("Наименование");
   тзКолонки.Колонки.Добавить("Ширина");
   тзКолонки.Колонки.Добавить("Видимость");
   
   //считаем праметры колонок
   Для каждого Колонка Из ЭлементыФормы.ТабличноеПоле1.Колонки Цикл
       СтрокаТЗКолонок = тзКолонки.Добавить();
       СтрокаТЗКолонок.Наименование = Колонка.Имя;
       СтрокаТЗКолонок.Ширина        = Колонка.Ширина;
       СтрокаТЗКолонок.Видимость    = Колонка.Видимость;
       
       ОбработкаПрерыванияПользователя();
   КонецЦикла;
   
   //добавляем новые колонки
   Попытка
       КолонкаТЗ = ТабличноеПоле1.Колонки.Добавить("Колонка3");
   Исключение
       //такая колонка уже есть
   КонецПопытки;
   
   //заполняем данными новую колонку
   Сч = 0;
   Для каждого СтрокаТЗ Из ТабличноеПоле1 Цикл
       Сч = Сч + 1;
       СтрокаТЗ["Колонка3"]    = "3."+Сч;        
       
       ОбработкаПрерыванияПользователя();
   КонецЦикла;
   
   ЭлементыФормы.ТабличноеПоле1.СоздатьКолонки();
   //ЭлементыФормы.ТабличноеПоле1.Данные = "ТабличноеПоле1";
   //ЭтаФорма.Обновить();
   //ЭлементыФормы.ТабличноеПоле1.ОбновитьСтроки();
   //ЭтаФорма.Обновить();
   
   А = 100;


код не мой нашел в просторах интернета.
41 thomY100
 
12.09.12
10:33
это все понятно, проблема в том, что все это в управляемых формах происходит
42 Coldboy
 
12.09.12
10:35
пробывал все делать на &НаСервереБезКонтекста или просто &НаСервере?
43 thomY100
 
12.09.12
10:36
в управляемой форме вообще нет табличного поля, там таблица формы и методы другие
44 Coldboy
 
12.09.12
10:37
// программно создадим колонки на форме
ТипыРеквизита = Новый Массив;
ТипыРеквизита.Добавить(Тип("Строка"));

ОписаниеТиповДляРеквизита = Новый ОписаниеТипов(ТипыРеквизита);

ДобавляемыеРеквизитыТЗ = Новый Массив;
УдаляемыеРеквизитыТЗ = Новый Массив;
Для Каждого Колонка Из ТЗ.Колонки Цикл
НоваяКолонка = Новый РеквизитФормы(Колонка.Имя, ОписаниеТиповДляРеквизита, "РеквизитТЗ", Колонка.Заголовок, Истина);
ДобавляемыеРеквизитыТЗ.Добавить(НоваяКолонка);
КонецЦикла;

РеквизитТЗРеквизиты = РеквизитФормыВЗначение("РеквизитТЗ");
Для Каждого Колонка Из РеквизитТЗРеквизиты.Колонки Цикл
УдаляемыеРеквизитыТЗ.Добавить("РеквизитТЗ." + Колонка.Имя);
КонецЦикла;

пробывал?
45 Coldboy
 
12.09.12
10:37
или вот

&НаСервере
Функция ПроверитьНаличиеРеквизита(ИмяРеквизита, Форма) Экспорт

МассивРеквизитов = Форма.ПолучитьРеквизиты();

Для каждого РеквизитФормы Из МассивРеквизитов Цикл        
Если РеквизитФормы.Имя = ИмяРеквизита Тогда
Возврат Истина;
КонецЕсли;

КонецЦикла;

Возврат Ложь;

КонецФункции // ПроверитьНаличиеРеквизита()

&НаСервере
Процедура ДобавитьРеквизитТаблица(ИмяРеквизита, ТаблицаРеквизита, Форма) Экспорт

ТипРеквизита = Новый Массив;
ТипРеквизита.Добавить(Тип("ТаблицаЗначений"));

ОписаниеТиповРеквизитов = Новый ОписаниеТипов(ТипРеквизита);

НовыйРеквизит = Новый РеквизитФормы(ИмяРеквизита,
ОписаниеТиповРеквизитов);

ДобавляемыеРеквизиты = Новый Массив;
ДобавляемыеРеквизиты.Добавить(НовыйРеквизит);

Для каждого КолонкаТаблицы Из ТаблицаРеквизита.Колонки Цикл

ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(КолонкаТаблицы.Имя,
КолонкаТаблицы.ТипЗначения, ИмяРеквизита))

КонецЦикла;

Форма.ИзменитьРеквизиты(ДобавляемыеРеквизиты);

КонецПроцедуры
46 ChAlex
 
12.09.12
10:39
(37) - вообще-то загадками говорите вы: кроме того что вы хотите разместить таблицу в которой отображать данные табличной части документа - больше ничего. Возникает резонный вопрос: на кой это надо делать. Если хотите получать внятные ответы - удосуждесь внятно описать задачу. А так какие можно дать советы как сделать лучше. Пока только один: почитайте документацию и литературу - которой не мало в инете. И вы увидите что нужно и как делать
47 thomY100
 
12.09.12
10:43
что непонятного-то
программно размещаю объекты на форме, чтобы при обновлении конфигурации сравнивать только модули форм, а не сами формы, вот и все, обычная практика насколько я знаю
48 thomY100
 
12.09.12
10:43
размещаю объекты, которые сам добавил в типовые документы
49 thomY100
 
12.09.12
10:46
в общем сейчас на форме отображается ТЧ, но почему-то строки пустые
50 ChAlex
 
12.09.12
10:50
(48) - в УФ - такая практика порочна. Размещая программно объекты вы сразу АВТОМАТОМ отключаете ОПТИМИЗАЦИЮ УФ. И как результат - форма становится работать тормознуто, а если данных много - то супер тормознуто. Обновление все равно придется делать ручками, проще по-новому закинуть табличную часть а форму повторно, чем реализовывать программную загрузку объектов
51 ChAlex
 
12.09.12
10:53
(49) - а если отображается ТЧ - то программировать ничего не надо - она записывается и считывается платформой. Если она пуста в базе - то и пуста на форме. Если вы ее хотите заполнить при открытии - то заполняйте   в "ПриСозданииНаСервере" - вот и все
52 thomY100
 
12.09.12
10:55
ну там не просто ТЧ, я там страницы создал для размещения, каждый раз при обновлении все это делать геморрой, много данных там не будет

ТЧ сейчас не пуста, но при отображении на форме выводит пустые строки, делаю все, понятное дело, ПриСозданииНаСервере
53 ChAlex
 
12.09.12
11:02
(52) ну значит не буда пишите. Смотрите объекты к которым обращаетесь: если ТЧ то Объект.ТЧ, если Реквизиты формы - то РеквизитВЗначение() - изменение - ЗначениеВРеквизит(), либо доавление в Клиенте через НовСтр=ЭтаФорма.Элементы.ХХХ.Добавить(); НовСтр.Чтото=чемуто;
54 thomY100
 
12.09.12
11:22
в общем код такой

   ТЗПользователей = Новый РеквизитФормы("ТЗПользователей", Новый ОписаниеТипов("ТаблицаЗначений"), "", "Пользователи");
   
   Док=РеквизитФормыВЗначение("Объект");

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

   // пакетное создание и удаление
   ИзменитьРеквизиты(ДобавляемыеРеквизиты);

   // создаем элементы
   Элемент = Элементы.Добавить("Пользователь",Тип("ПолеФормы"),ТаблицаПользователей);
   Элемент.Вид = ВидПоляФормы.ПолеВвода;
   Элемент.ПутьКДанным = "ТЗПользователей.Пользователь";




видимо при создании ТЗ пользователей нужно как-то к ней подцепить колонку, чтобы при выполнении
ЗначениеВДанныеФормы(Док.Пользователи,ЭтаФорма.ТЗПользователей);

в нее записывался пользователь из ТЧ документа, но не знаю как это сделать
55 ChAlex
 
12.09.12
11:33
(54) 1 - зачем     Док=РеквизитФормыВЗначение("Объект");
    2 - Если колонки таблицы значений не определены в конфигураторе - то
       Таб=РеквизитФормыВЗначение("Пользователи","ТаблицаЗначений");
       НовКолонка=Таб.Колонки.Добавить(...)
       .... и далее определение колонок
       ЗначениеВРеквизитФормы(Таб,"Пользователи")
    3 - создание элементов формы
      ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(.....) - далее с праметрамит по документации
      ИзменитьРеквизиты(ДобавляемыеРеквизиты);

- все - структура создана - дальше можно заполнять удалять и прочее
56 ChAlex
 
12.09.12
11:35
+(55) - все объекты создаются за один заход. Добавлять с нужной подчиненность - колонки в том числе.
57 thomY100
 
12.09.12
11:45
сделал вот так




// создаем реквизиты
ДобавляемыеРеквизиты = Новый Массив;
ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("ТЗПользователей", Новый ОписаниеТипов("ТаблицаЗначений"), "", "Пользователи"));    
ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("Пользователь",Новый ОписаниеТипов("СправочникСсылка.Пользователи"),"ТЗПользователей","Пользователь"));

// пакетное создание и удаление
ИзменитьРеквизиты(ДобавляемыеРеквизиты);

ТаблицаПользователей=Элементы.Добавить("Пользователи",Тип("ТаблицаФормы"),Элементы.ГруппаКонфигурационныеЕдиницы);    
ТаблицаПользователей.ПутьКДанным="ТЗПользователей";

ТаблицаПользователей.Отображение=ОтображениеТаблицы.Список;

// создаем элементы
Элемент = Элементы.Добавить("Пользователь",Тип("ПолеФормы"),ТаблицаПользователей);
Элемент.Вид = ВидПоляФормы.ПолеВвода;
Элемент.ПутьКДанным = "ТЗПользователей.Пользователь";



но не понимаю как заполнить реквизит формы таблица пользователей
58 ChAlex
 
12.09.12
11:55
(+57) - хорошо: тогда более подробно и системно

  1 - если в конфигурации таблица значений не определена как реквизит: то сначала создать реквизит таблицы и ее колонки как у вас есть
  2 - создать все элементы отображения на форме как тоже создаете (включая колонки таблицы):
Элемент = Элементы.Добавить("Пользователь",Тип("ПолеФормы"),ТаблицаПользователей);
Элемент.Вид = ВидПоляФормы.ПолеВвода;
Элемент.ПутьКДанным = "ТЗПользователей.Пользователь";

и далее также колонки

  3 - все можете юзать объекты. Чтобы заполнить - теперь 2 пути:
    1 - на сервере преобразовать реквизит в таблицу (РеквизитФормыВЗначение) - заполнять обычным образом, потом вернуть назад в реквизит (ЗначениеВРеквизитФормы)
    либо вариант 2 - на клиенте непосредственно добавить строку в элемент формы: Нов=ЭтаФорма.Элементы.Пользователь.Добавить() -  и далее заполнить поля
59 thomY100
 
12.09.12
12:00
ок, спасибо, последний, наверное, вопрос
когда пытаюсь

ЗначениеВРеквизитФормы(Объект.МКМ_Пользователи,"ТЗПользоваталей");

говорит Недопустимое значение параметра (параметр номер '2')

что не так?
60 thomY100
 
12.09.12
12:07
ну и при попытке

Таб=РеквизитФормыВЗначение("ТЗПользоваталей", Тип("ТаблицаЗначений"))

Недопустимое значение параметра (параметр номер '1')
61 thomY100
 
12.09.12
12:21
все, разобрался, протупил
62 thomY100
 
12.09.12
12:21
спасибо
Ошибка? Это не ошибка, это системная функция.