Программный вывод таблицы значений на управляемую форму 8.2

Обработка демонстрирует пример вывода таблицы значений с произвольной структурой на управляемую форму 8.2. Вывод таблицы реализован в виде отдельной процедуры, в которую таблица значений передается в качестве параметра. Это позволяет встроить её в общий модуль, и удобно использовать при необходимости.

Внешняя обработка. Таблица значений добавлена в реквизиты и элементы формы (для размещения на форме в нужном месте). Структура таблицы не определена (колонок нет). Вывод осуществляется одной процедурой, в качестве параметра в которую передаётся таблица значений. Дополнительно можно для созданной таблицы определить обработчики событий.

22 Comments

  1. Algiz

    Код в одну процедуру можно было и без обработки выложить…если уж выкладываете

    Reply
  2. petrov_al

    Можно подробнее, алгоритм что вы используете?

    Reply
  3. hiduk

    (2) petrov_al,

    &НаСервере
    Процедура ВывестиТаблицуНаФорму(УФ,ИмяТЗНаФорме,ТЗ, ТЗОбработчиковСобытий = Неопределено) Экспорт
    
    // СОЗДАНИЕ РЕКВИЗИТОВ ФОРМЫ
    МассивДобавляемыхРеквизитов = Новый Массив;
    
    Для Каждого Колонка Из ТЗ.Колонки Цикл
    МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы(Колонка.Имя, Колонка.ТипЗначения,ИмяТЗНаФорме ,Колонка.Заголовок));
    КонецЦикла;
    
    МассивУдаляемыхРеквизитов = УФ.ПолучитьРеквизиты(ИмяТЗНаФорме);
    МассивИменУдаляемыхРеквизитов = Новый Массив;
    
    Для каждого Элемент Из МассивУдаляемыхРеквизитов Цикл
    МассивИменУдаляемыхРеквизитов.Добавить(ИмяТЗНаФорме + «.» + Элемент.Имя);
    КонецЦикла;
    
    УФ.ИзменитьРеквизиты(МассивДобавляемыхРеквизитов,МассивИменУдаляемыхРеквизитов);
    
    // СОЗДАНИЕ ЭЛЕМЕНТОВ ФОРМЫ
    Для каждого Элемент Из МассивУдаляемыхРеквизитов Цикл
    УдаляемыйЭлемент = УФ.Элементы.Найти(ИмяТЗНаФорме + Элемент.Имя);
    УФ.Элементы.Удалить(УдаляемыйЭлемент);
    КонецЦикла;
    
    Для Каждого Колонка Из ТЗ.Колонки Цикл
    НоваяКолонка = УФ.Элементы.Добавить(ИмяТЗНаФорме + Колонка.Имя, Тип(«ПолеФормы»), УФ.Элементы[ИмяТЗНаФорме]);
    НоваяКолонка.Заголовок = Колонка.Заголовок;
    НоваяКолонка.ПутьКДанным = ИмяТЗНаФорме + «.» + Колонка.Имя;
    НоваяКолонка.Вид = ВидПоляФормы.ПолеВвода;
    НоваяКолонка.РежимРедактирования = РежимРедактированияКолонки.ВходПриВводе;
    КонецЦикла;
    
    УФ[ИмяТЗНаФорме].Загрузить(ТЗ);
    
    // Привязка обработчиков событий
    Если ТЗОбработчиковСобытий = Неопределено Тогда
    Возврат;
    КонецЕсли;
    
    Для Каждого Строка Из ТЗОбработчиковСобытий Цикл
    УФ.Элементы[Строка.ИмяЭлемента].УстановитьДействие(Строка.ИмяСобытия, Строка.ИмяЭлемента + Строка.ИмяСобытия);
    КонецЦикла;
    
    КонецПроцедуры
    

    Показать

    Reply
  4. nixel

    Типовое создание элементов/реквизитов управляемой формы.

    В чем уникальность публикации? Или просто как визуализация книжек по упр. интерфейсу?

    Reply
  5. hiduk

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

    Особенностью обработки считаю универсальную процедуру, т.к. в инете есть примеры с конкретной структурой.

    Reply
  6. morfeus

    (5) hiduk, Большое спасибо за помощь!!! В 82 из мелочи любят выдумывать сложности. Туда сюда гонять реквизиты и т д. Не понимаю зачем так заморачиваться… Сам не додумался. Большое спасибо! Получилось с вашей помощью !!!!

    Reply
  7. bayce

    Код очень универсальный получился.

    Очень удобно.

    Reply
  8. Styvi

    Спасибо за готовое решение…

    Скопировал код, буду использовать в ближайшее время — ибо пока обходился без заполнения таблиц на УФ…

    Reply
  9. prodines

    Я пробовал вышеуказанный код — у меня не работало удаление таблицы значений из управляемой формы. В итоге сделал свою модификацию:

    Удаление таблицы значений из управляемой формы

    Удалять реквизиты таблицы значений нет нужды — достаточно удалить саму таблицу значений.

    &НаСервере
    Процедура УдалитьТЗ(УФ, НомерТЗ=»1″) Экспорт
    
    ИмяТаблицы = «МояТаблицаЗначений»;
    
    ИмяТЗНаФорме = ИмяТаблицы + НомерТЗ;
    // Если удаляемая таблица значений действительно присутствует на данной управляемой форме
    Если НЕ УФ.Элементы.Найти(ИмяТЗНаФорме) = Неопределено Тогда
    // Сначала удалим реквизит «Таблица значений» из УФ
    МассивИменУдаляемыхРеквизитов = Новый Массив;
    
    МассивИменУдаляемыхРеквизитов.Добавить(ИмяТЗНаФорме);
    
    УФ.ИзменитьРеквизиты(,МассивИменУдаляемыхРеквизитов);
    
    УдаляемыйЭлемент = УФ.Элементы.Найти(ИмяТЗНаФорме);
    
    Если НЕ УдаляемыйЭлемент = Неопределено Тогда
    // Теперь удалим элемент формы, который служил для визуального отображения
    // удалённого реквизита УФ «Таблица значений»
    УФ.Элементы.Удалить(УдаляемыйЭлемент);
    
    КонецЕсли;
    
    КонецЕсли;
    
    КонецПроцедуры
    

    Показать

    Ну и до кучи — процедура вывода таблицы значений на управляемую форму:

    &НаСервере
    Процедура _ПечатьТЗ_УФ(ТЗ, Форма, НомерТЗ=»1″) Экспорт
    //http://bilbo.com.ua/tablitsa-znacheniy-v-upravlyaemoy-forme.html
    
    УдалитьТЗ(Форма, НомерТЗ); //моё добавление
    
    //Имеем исходную таблицу значений с именем «ТЗ»
    //Добавляем реквизит формы
    ИмяТЗ = «МояТаблицаЗначений» + НомерТЗ;
    МассивРеквизитов = Новый Массив;
    МассивРеквизитов.Добавить(Новый РеквизитФормы(ИмяТЗ, Новый ОписаниеТипов(«ТаблицаЗначений»), «», ИмяТЗ));
    
    Для Каждого Колонка Из ТЗ.Колонки Цикл
    МассивРеквизитов.Добавить(Новый РеквизитФормы(Колонка.Имя, Колонка.ТипЗначения, ИмяТЗ, Колонка.Заголовок));
    КонецЦикла;
    
    Форма.ИзменитьРеквизиты(МассивРеквизитов);
    
    //Помещаем Элементы на форму
    Таблица = Форма.Элементы.Добавить(ИмяТЗ, Тип(«ТаблицаФормы»));
    Таблица.ПутьКДанным = ИмяТЗ;
    Таблица.Отображение = ОтображениеТаблицы.Список;
    
    Для Каждого Колонка Из ТЗ.Колонки Цикл
    
    НовыйЭлемент = Форма.Элементы.Добавить(ИмяТЗ + «_» + Колонка.Имя, Тип(«ПолеФормы»), Таблица);
    НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
    НовыйЭлемент.ПутьКДанным = ИмяТЗ + «.» + Колонка.Имя;
    
    КонецЦикла;
    
    //переносим таблицу значений на форму
    Форма.ЗначениеВРеквизитФормы(ТЗ,ИмяТЗ);
    
    КонецПроцедуры

    Показать

    Reply
  10. tolyan_ekb

    Можно ли в добавленной таблице вызвать процедуру ПриАктивацииСтроки и т.п.?

    Reply
  11. AleksSF

    Здравствуйте.

    А как сделать группы. Ну чтобы при отображении на форме несколько колонов были объединены в Группу колонок.

    Reply
  12. hiduk

    (10) tolyan_ekb, Можно наверное:) Попробуйте определить переменную ТЗОбработчиковСобытий как ТЗ. Добавить туда строку, колонка ИмяСобытия = «ПриАктивацииСтроки». А в модуле формы определить процедуру с именем «ИмяТаблицы» + «ПриАктивацииСтроки». В общем поройте в этом направлении.

    Reply
  13. hiduk

    (11) AleksSF, Добрый день! Группы сделать можно, но сложно:)

    Reply
  14. AleksSF

    (13) hiduk,

    Повозился немного и сделал. В принципе не так сложно.

    Но я делал для своей конфы, поэтому не доводил ее до универсальности.

    Если интересно могу прислать.

    Reply
  15. Crush

    Спасибо! Программно добавил колонки в тз и долго мучился с выводом их на форму. Постоянно была Ошибка при установке значения атрибута контекста (ПутьКДанным) по причине: Недопустимое значение.

    Оказалось что перед добавлением элементов формы нужно еще реквизиты формы добавить (ИзменитьРеквизиты).

    Если бы в коде (3) была проверка на ПрограммноСозданныйРеквизит да и еще для внешней обработки, то юзал бы Ваш код «as is»:)

    Reply
  16. hiduk

    Раз уж используете данный материал, стоит заглянуть и сюда: http://infostart.ru/public/171514/. Там больше примеров. Но они сложнее для понимания.

    Reply
  17. prodines

    Я немного подправил код вывода ТЗ: ранее он позволял вывести на управляемую форму только одну таблицу значений. Либо нужно было удалять сначала одноимённую ТЗ. Теперь ничего удалять не надо, и можно выводить на форму сколько угодно ТЗ, причём процедура принимает только один параметр — саму таблицу значений и ничего лишнего:

    &НаСервере
    Процедура ВывестиТЗНаФорму(ТЗ)
    
    ИсходноеИмяТЗ = «МояТаблицаЗначений»;
    
    МаксНомерТЗ = 0;
    
    МассивРеквизитов = ПолучитьРеквизиты();
    
    Для каждого Реквизит Из МассивРеквизитов Цикл
    
    Если Лев(Реквизит.Имя, СтрДлина(ИсходноеИмяТЗ)) = ИсходноеИмяТЗ Тогда
    
    СтрНомер = Прав(Реквизит.Имя, СтрДлина(Реквизит.Имя) — СтрДлина(ИсходноеИмяТЗ));
    
    Номер = Число(СтрНомер);
    
    Если Номер > МаксНомерТЗ Тогда
    
    МаксНомерТЗ = Номер;
    
    КонецЕсли;
    
    КонецЕсли;
    
    КонецЦикла;
    
    ИмяТЗ = ИсходноеИмяТЗ + Строка(МаксНомерТЗ+1);
    
    //Имеем исходную таблицу значений с именем «ТЗ»
    //Добавляем реквизит формы
    МассивРеквизитов = Новый Массив;
    МассивРеквизитов.Добавить(Новый РеквизитФормы(ИмяТЗ, Новый ОписаниеТипов(«ТаблицаЗначений»), «», ИмяТЗ));
    
    Для Каждого Колонка Из ТЗ.Колонки Цикл
    МассивРеквизитов.Добавить(Новый РеквизитФормы(Колонка.Имя, Колонка.ТипЗначения, ИмяТЗ, Колонка.Заголовок));
    КонецЦикла;
    
    ИзменитьРеквизиты(МассивРеквизитов);
    
    //Помещаем Элементы на форму
    Таблица = Элементы.Добавить(ИмяТЗ, Тип(«ТаблицаФормы»));
    Таблица.ПутьКДанным = ИмяТЗ;
    Таблица.Отображение = ОтображениеТаблицы.Список;
    
    Для Каждого Колонка Из ТЗ.Колонки Цикл
    
    НовыйЭлемент = Элементы.Добавить(ИмяТЗ + «_» + Колонка.Имя, Тип(«ПолеФормы»), Таблица);
    НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
    НовыйЭлемент.ПутьКДанным = ИмяТЗ + «.» + Колонка.Имя;
    
    КонецЦикла;
    
    //переносим таблицу значений на форму
    ЗначениеВРеквизитФормы(ТЗ,ИмяТЗ);
    
    КонецПроцедуры
    

    Показать

    Но ещё интереснее было бы печатать таблицу значений в независимый табличный документ. Как бы это сделать?

    Reply
  18. fixin

    Спасибо за обработку, очень удобнов вставлять и юзать. Даже внутрь не лазил процедур, юзал как функцию.

    Если у таблицы тип содержит массив, не выводится.

    Пришлось сделать проверку, ну и потом добавление колонок в попытке-исключении.

     Для Каждого Колонка Из ТЗ.Колонки Цикл
    Если Колонка.ТипЗначения.СодержитТип(Тип(«Массив»)) Тогда
    Продолжить;
    КонецЕсли;
    МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы(Колонка.Имя, Колонка.ТипЗначения,ИмяТЗНаФорме ,Колонка.Заголовок));
    КонецЦикла;
    
    …
    Для Каждого Колонка Из ТЗ.Колонки Цикл
    НоваяКолонка = УФ.Элементы.Добавить(ИмяТЗНаФорме + Колонка.Имя, Тип(«ПолеФормы»), УФ.Элементы[ИмяТЗНаФорме]);
    НоваяКолонка.Заголовок = Колонка.Заголовок;
    Попытка
    НоваяКолонка.ПутьКДанным = ИмяТЗНаФорме + «.» + Колонка.Имя;
    Исключение КонецПопытки;
    НоваяКолонка.Вид = ВидПоляФормы.ПолеВвода;
    НоваяКолонка.РежимРедактирования = РежимРедактированияКолонки.ВходПриВводе;
    КонецЦикла; 

    Показать

    Reply
  19. tinkerbell

    Спасибо за открытый код в комментариях! Даже скачивать не пришлось))

    Reply
  20. starik-2005

    (20) https://infostart.ru/public/574802/ — тут побольше кода.

    Reply
  21. v.l.

    (1) Школота зоробатывоет.

    Reply
  22. marat.coolls

    (9)

    &НаСервере

    Процедура УдалитьТЗ(УФ, НомерТЗ=»1″) Экспорт

    ИмяТаблицы = «МояТаблицаЗначений»;

    ИмяТЗНаФорме = ИмяТаблицы + НомерТЗ;

    // Если удаляемая таблица значений действительно присутствует на данной управляемой форме

    Если НЕ УФ.Элементы.Найти(ИмяТЗНаФорме) = Неопределено Тогда

    // Сначала удалим реквизит «Таблица значений» из УФ

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

    МассивИменУдаляемыхРеквизитов.Добавить(ИмяТЗНаФорме);

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

    УдаляемыйЭлемент = УФ.Элементы.Найти(ИмяТЗНаФорме);

    Если НЕ УдаляемыйЭлемент = Неопределено Тогда

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

    // удалённого реквизита УФ «Таблица значений»

    УФ.Элементы.Удалить(УдаляемыйЭлемент);

    КонецЕсли;

    КонецЕсли;

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

    Показать

    СПАСИБО ОГРОМНОЕ

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *