helpf.pro
Регистрация

v8: v8: Управляемые формы. произвольная ТаблицаЗначений на форме отчета.

snfr1c
09.11.2011 09:44Прочитано: 7049
Добрый день.
Столкнулся с проблемой повторного вывода на форму результатов СКД, если количество колонок в результате меняется.
Формирую СКД - по номенклатуре и складам, с возможностью выбора/отбора номенклатуры и вывода/отбора складов.
после этого преобразую таблицу содержащую 3 колонки в другую таблицу значений где склады являются колонками. получая в итоге таблицуЗначений где количество колонок произвольное + колонка номенклатура (первая колонка)
далее передаю в процедуру для вывода на форму таблицуЗначений
Код 1C v 8.2 УП
 
&НаСервере
Процедура ОбновитьДеревоНаФорме_вариант(Знач ТаблицаДанных)

МассивДобавляемыхРеквизитов = Новый Массив;
МассивУдаляемыхРеквизитов = Новый Массив;

ЭлементФормы = Элементы.Найти("ДеревоРезультата");
Если ЭлементФормы <> Неопределено Тогда
ЭтаФорма.Элементы.Удалить(ЭлементФормы);
КонецЕсли;

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

Если ЭтаФорма.Элементы.Найти("Дерево_" + Колонка.Имя) <> Неопределено Тогда
МассивУдаляемыхРеквизитов.Добавить("ДеревоРезультата." + Колонка.Имя);
КонецЕсли;
КонецЦикла;

ИзменитьРеквизиты(МассивДобавляемыхРеквизитов,МассивУдаляемыхРеквизитов);
ЗначениеВРеквизитФормы(ТаблицаДанных,"ДеревоРезультата");


ЭлементФормы = Элементы.Найти("Дерево");
Если ЭлементФормы <> Неопределено Тогда
Элементы.Удалить(ЭлементФормы);
КонецЕсли;

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

КонецПроцедуры


1 раз выводится нормально. ошибка возникает когда при последующем выводе количество колонок меньше чем было до этого.
я что то делаю не так, а что "не так" понять не могу.
Yandex
Возможно, вас также заинтересует
Реклама на портале
snfr1c
09.11.2011 10:54Ответ № 1
помогли с решением вопроса.
после формирования СКД добавил перед выводом на форму очистку реквизитов
Код 1C v 8.2 УП
 
&НаСервере
Процедура УдалитьРеквизиты2()
ЭлементФормы = Элементы.Найти("Таблица_Значений");
Если ЭлементФормы <> Неопределено Тогда
МассивУдаляемыхРеквизитов = Новый Массив;
РеквизитыТаблицыЦен = ПолучитьРеквизиты("Таблица_Значений");
Для Каждого Реквизит Из РеквизитыТаблицыЦен Цикл
МассивУдаляемыхРеквизитов.Добавить("Таблица_Значений." + Реквизит.Имя);
КонецЦикла;

ЭтаФорма.ИзменитьРеквизиты(,МассивУдаляемыхРеквизитов);
КонецЕсли;

КонецПроцедуры

Изменил процедуру вывода на форму - сделал её с добавлением реквизита программно
snfr1c
09.11.2011 11:00Ответ № 2
измененная процедура, надо бы в "тутошний букварь" поместить все процедурки - само решение очень хорошее и универсальное. также можно выводить и деревозначений
Код 1C v 8.2 УП
 
&НаСервере
Процедура Рабочий_вариант(Знач ТаблицаОбъект)


// Создание и заполнение "обычного" объекта прикладного типа ТаблицаЗначений или ДеревоЗначений,
// который будет отображен на управляемой форме

//так как мы заполняем таблицу на форме из запроса, то количество колонок и строк может быть разным
//желательно удалить эту форму


ЭлементФормы = Элементы.Найти("Таблица_Значений");

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


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

ИзменитьРеквизиты(МассивДобавляемыхРеквизитов);

// Преобразование объекта прикладного типа Таблица_Значений
// в реквизит управляемой формы (данные формы)
ЗначениеВРеквизитФормы(ТаблицаОбъект, "Таблица_Значений");

//удаляем старую форму
Если ЭлементФормы <> Неопределено Тогда
ЭтаФорма.Элементы.Удалить(ЭлементФормы);
КонецЕсли;


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

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

КонецПроцедуры

snfr1c
09.11.2011 12:40Ответ № 3
Вопрос закрыт!
Подсказка: Для быстрого поиска ответов - используйте 'Поиск'
Вы не можете отправить комментарий анонимно, пожалуйста войдите или зарегистрируйтесь.