Описание пары важных функций для управляемого интерфейса: СоздатьКолонки() в 1C 8.2, ИзменитьРеквизиты()


Столкнулся с проблемой отсутствия такой функции, как СоздатьКолоноки() в 1С8.2. и нормального описание функции ИзменитьРеквизиты()
Задача такая:
Есть динамически заполняемая таблица значений, надо ее отображать на форме.

В поисках решения пришлось покопаться сети, но тоже нормального решения не нашел, или плохо искал, все как то узко, и трудно, решил сам реализовать.

Решение это Процедура, которую надо создать у себя в модуле формы и передавать параметры, и будет вам счастье)

Вот собственно сама процедура:

//*********************************

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

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

//*********************************

Описание передаваемых параметров:

1) ИмяПоляТаблицыФормы — Имя элемента на форме Таблица, или существующего или который надо создать, не важно. (Пример как у меня «ТаблицаФормы»)

2) ИмяРеквизитаДанныеФормыКоллекция — Имя реквизита формы, его надо создать, пример настройки на картинке (имя должно отличаться от имени элемента формы, желательно) (Пример как у меня «Таблица»)

3) ТаблицаЗначений — Собственно сама таблица с данными из-за которой все это и делалось.)

Ну вот и все. На 1С8.1 это выгляделобы так:

ИмяРеквизитаДанныеФормыКоллекция = ТаблицаЗначени;

ЭлементыФормы.ИмяПоляТаблицыФормы.СоздатьКолонки();

 

19 Comments

  1. Поручик

    Несколько полезных для начинающего статей

    Управляемая форма 1С 8.2 – работа с деревом значений и таблицей значений.

    http://www.obrabotki.com/1s-tree-table-managedforms-1/

    Reply
  2. Поручик

    (0) Код статьи можно раскрасить (с)

    http://infostart.ru/public/19856/

    Reply
  3. lm-alex
    Поручик пишет:

    Несколько полезных для начинающего статей

    Управляемая форма 1С 8.2 – работа с деревом значений и таблицей значений.

    http://www.obrabotki.com/1s-tree-table-managedforms-1/

    Видел эту статью, не могу сказать что она как то мне помогла… тк нужно было самое просто решение и универсальное.

    На счет раскраски, спасибо, как нибудь попробую… Это хорошо бы к разработчикам сайта, чтоб добавили функцию при редактировании: «вставить элемент кода», что б проще было публикации писать.

    Reply
  4. red80
    Столкнулся с проблемой отсутствия такой функции, как СоздатьКолоноки() в 1С8.2…

    .Колонки.Добавить() — не то?

    … и нормального описание функции ИзменитьРеквизиты()

    Разработка управляемого интерфейса (В. А. Ажеронок, А. В. Островерх, М. Г. Радченко, Е. Ю. Хрусталева)

    Reply
  5. lm-alex

    .Колонки.Добавить() — не то? — Причем здесь это? Ты не понял похоже проблемы.

    В 8.1 у табличного поля была функция СоздатьКолонки():

    «ТабличноеПоле (TableBox)

    СоздатьКолонки (CreateColumns)

    Синтаксис:

    СоздатьКолонки()

    Описание:

    Удаляет старые колонки и загружает новые колонки из источника данных.» Вот ее нету в 8.2, тоесть приходится самому создавать реквизиты и элементы. Процедура моя в помощь.

    Про существование книги «Разработка управляемого интерфейса (В. А. Ажеронок, А. В. Островерх, М. Г. Радченко, Е. Ю. Хрусталева)» я знаю, но думаю что у процента 90% ее нету, как и у меня.

    Reply
  6. MYRZILKA123

    Reply
  7. ninch

    Молодец, что не поленился и выложил статью. Недавно похожие проблемы были. Так же где-то нашел такое же описание

    http://forum.mista.ru/topic.php?id=543734

    И очень был этому рад:)

    И кстати всплыла одна проблема с которой так и не смог справиться. После команды ИзменитьРеквизиты() (при условии добавления реквизитов) волшебным образом изменяется форма — едут размеры объектов на форме. наверное это не доработка 1С

    Reply
  8. vec435

    спасибо.пригодится

    Reply
  9. StepByStep

    В случае, если некая таблица должна находиться на какой-то конкретной странице, то тогда:

    ЭлементРеквизита = Элементы.Добавить(ИмяПоляТаблицыФормы, Тип(«ТаблицаФормы»), Родитель);

    и т д.

    в той обработке, что сейчас пишу именно так. Много страниц, много вкладок …

    Reply
  10. нормальный такой

    10й раз перечитываю…

    все равно непонятно как удалять

    создать не проблема, и назначить обработчик события не проблема. как удалить — проблема.

    Reply
  11. lm-alex

    Удалить элементы формы?

    Reply
  12. нормальный такой

    (11) в целом разобрался сам.

    по синтаксис.помощнику внимательно — удаляться могут только программно добавленные элементы/реквизиты формы

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

    Показать

    и после можно удалять такие элементы

    внимание! используется таже процедура формы, просто будем передавать второй параметр с массивом ПУТЕЙ удаляемых реквизитов.

    ЭтаФорма.ИзменитьРеквизиты(<Реквизиты добавления>,<Реквизиты удаления>);

    собственно у меня и была загвостка с этими ПУТЯМИ

    обратите внимание, что при добавление в качестве ПУТИ (3й параметр) я передаю пустую строку

    МассивРеквизитов.Добавить(Новый РеквизитФормы(Имя, Новый ОписаниеТипов(МассивТипов),»»));
    

    в итоге я в массив удаляемых реквизитов передаю ИМЕНА ранее программно добавленых реквизитов

    МассивРеквизитов = Новый Массив;
    МассивРеквизитов.Добавить(Имя);
    ИзменитьРеквизиты(,МассивРеквизитов);
    
    //удаление Элемента
    Элементы.Удалить(нЭлемент);
    
    Reply
  13. folo

    Лучшая статья по данной теме. 4 года как опубликовано и только что ее нашел.

    Все заработало в 5 сек. Автору респект.

    Reply
  14. vovant

    Давно не занимался по стечению обстоятельств управляемыми формами. Вот столкнулся с такой же проблемой. Привык использовать процедуру «СоздатьКолонки()». Спасибо за процедуру «СоздатьТаблицуФормы».

    Я делаю так:

    1. создаю таблицу «ТЗ»;

    2. создаю процедуру

    &НаСервере
    Процедура Заполнить()
    Запрос = Новый Запрос;
    Запрос.Текст = «ВЫБРАТЬ…»;
    ТаблицаЗапроса = Запрос.Выполнить().Выгрузить();
    СоздатьТаблицуФормы(«ТЗ»,»ТЗ»,ТаблицаЗапроса);
    КонецПроцедуры
    
    Reply
  15. Serge_ASB

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

    При повторном открытии (формировании таблицы) ругается… При выборе другого справочника тоже ругается…

    Не все колонки может удалить и не все колонки может пересоздать.

    Как написать, чтобы при необходимости повторно вывести очищался весь реквизит Таблица?

    Файл прилагаю.

    Reply
  16. alul

    Статья хороша, спасибо!

    Но вот столкнулся с такой проблемой: у меня есть реквизит с типом значения булево. Никак не могу получить для данного реквизита поле флажок. В последнем цикле // Добавление элементов форму // для данного реквизита дописал условие

      Если Найти(ЭлементРеквизита.Имя,»ДанныеТаблицыОбязательныйАссортимент») > 0 Тогда
    ЭлементРеквизита.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет;
    ЭлементРеквизита.ОграничениеТипа = Новый ОписаниеТипов(«Булево»);
    ЭлементРеквизита.ГоризонтальноеПоложениеВГруппе = ГоризонтальноеПоложениеЭлемента.Лево;
    ЭлементРеквизита.ГоризонтальноеПоложениеВШапке = ГоризонтальноеПоложениеЭлемента.Лево;
    ЭлементРеквизита.Вид = ВидПоляФормы.ПолеФлажка;
    ЭлементРеквизита.РежимРедактирования = РежимРедактированияКолонки.Вход;
    ЭлементРеквизита.КартинкаШапки = БиблиотекаКартинок.ОбязательныйАссортимент;
    ЭлементРеквизита.ОтображениеПодсказки = ОтображениеПодсказки.Всплывающая;
    ЭлементРеквизита.Подсказка = «Товар входит в обязательный ассортимент»;
    ЭлементРеквизита.Подсказка = «Товар входит в товарную матрицу»;
    ЭлементРеквизита.ШиринаЭлемента = 2;
    Иначе
    ЭлементРеквизита.Вид = ВидПоляФормы.ПолеВвода;
    КонецЕсли;
    

    Показать

    Но 1ска всё-равно реквизит в таблице отображает как ПолеВвода…

    Reply
  17. DikSer

    (9)

    Тип(«ТаблицаФормы»), Родитель);

    (9)

    Reply
  18. lm-alex

    (16) Да, это я не учет, но быстро получилось реализовать.

    При создании таблицы значений, надо обязательно описать тип:

    Массив = Новый Массив;
    Массив.Добавить(Тип(«Булево»));
    ОТБулево = Новый ОписаниеТипов(Массив);
    ТЗ = Новый ТаблицаЗначений;
    //****
    ТЗ.Колонки.Добавить(«КолонкаБулево», ОТБулево);
    

    и в коде когда создаем уже сами элементы формы я сделал проверку на описание типа:

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

    Показать

    Reply
  19. lm-alex

    Или так:

    Если Колонка.ТипЗначения.СодержитТип(Тип(«Булево»)) Тогда
    
    Reply

Leave a Comment

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