1С. Программное добавление и удаление реквизитов формы
При разработке решений возникает необходимость добавить реквизит формы, состав и типы которых зависят от данных. Например при построении динамических деревьев с периодами, или при выводе контактной информации и т.д.
Задача
Для наглядности разберем простой пример, в котором можно было обойтись только элементами формы, но мы создадим и реквизиты.
Есть некая конфигурация, в форме элемента справочника Номенклатура необходимо программно создавать реквизиты формы и элементы к ним:
Элементы объединить в группу с горизонтальной группировкой. На текущий момент форма имеет следующий вид:
Добавление реквизитов
В обработчике формы ПриСозданииНаСервере() опишем код, который разбивается на 3 этапа:
Ниже приведен готовый код, код снабжен комментариями и разбит на области для лучшего понимания
После выполнения приведенного кода форма будет выглядеть так:
Удаление реквизитов
Для удаления необходимо передать массив содержащий пути реквизитов в качестве второго параметра метода формы ИзменитьРеквизиты().
Внимание. Удалять можно только реквизиты созданные программно.
Добавление реквизита табличной части
Добавление реквизита и элемента формы для табличной части почти ничем не отличается, необходимо только указать путь «Объект. ». Ниже пример добавления реквизита Ячейка в ТЧ Комплектация.
Добавление реквизита с типом Произвольный
В одной из задач стало необходимо добавить реквизит с типом Произвольный, но ни СП, ни интернеты ответа не дали. В итоге через несколько попыток было найдено решение
Внимание. Данные добавленного реквизита сохраняться в ИБ не будут.
не могу программно удалить значения Дополнительных реквизитов справочника
Добрый день.
подскажите что делаю не так?
Создал дополнительные реквизиты справочника, заполнил их программно.
После этого выяснилось что заполнил их неверными значениями.
Встал вопрос как их теперь также программно удалить?
Покурил форумы, нашел, что нужно очистить эти значения в Справочнике.ЗначенияСвойствОбъектов.
Почистил, но в Дополнительных реквизитах Справочника поля все также заполнены и при обращении к ним запросам все значение выплывают.
Подскажите плиз, как их очистить?
спрСерии = Справочники.СерииНоменклатуры.Выбрать();
ПараметрыОтбора = Новый Структура;
ПараметрыОтбора.Вставить(«Свойство»,ДопРеквизитБуквКод);
Пока спрСерии.Следующий() Цикл
ОбъектСерия = спрСерии.ПолучитьОбъект();
Массив = ОбъектСерия.ДополнительныеРеквизиты.НайтиСтроки(ПараметрыОтбора);
Для Каждого ЭлементМассива из Массив Цикл
ОбъектСерия.ДополнительныеРеквизиты.Удалить(ЭлементМассива);
КонецЦикла;
КонецЦикла;
ДопРеквизитБуквКод = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию(«Буквенный код»);
спрЗнСвв = Справочники.ЗначенияСвойствОбъектов.НайтиПоНаименованию(СокрЛП(БуквКод). ДопРеквизитБуквКод);
Если спрЗнСвв = Справочники.ЗначенияСвойствОбъектов.ПустаяСсылка() Тогда
ЗначениеСвойства = Справочники.ЗначенияСвойствОбъектов.СоздатьЭлемент();
ЗначениеСвойства.Владелец = ДопРеквизитБуквКод;
ЗначениеСвойства.Наименование = СокрЛП(БуквКод);
ЗначениеСвойства.ПолноеНаименование = БуквКод;
ЗначениеСвойства.записать();
КонецЕсли;
УФ: программное создание/удаление таблицы формы
Помогите, пожалуйста, разобраться:
1)Не получается программно удалить таблицу на форме.
ТаблицаФормы = Элементы.Добавить(«МояНоваяТаблица», Тип(«ТаблицаФормы»));
ТаблицаФормы.ПутьКДанным = «ДокументыНаСкладе»;
НоваяКолонкаТаблицы = Элементы.Добавить(«КолонкаДокумент», Тип(«ПолеФормы»), ТаблицаФормы);
НоваяКолонкаТаблицы.ПутьКДанным = «ДокументыНаСкладе.Документ»;
2) На форме есть реквизит типа Динамический список.
Визуально в конструкторе формы я вижу доступные поля таблицы. Как получить этот же список в коде программно?
(1) читала, создание таблицы на форме делала по ней.. Про удаление ничего не нашла.
Что значит «получить реквизит через метод»?
(2) я не реквизит формы программно добавляю, а элемент формы. И именно его, саму ТаблицуФормы, не получается удалить.
Реквизит формы (который динамический список) создан в конструкторе формы, его я в данный момент не трогаю.
Добавить (Add)
Синтаксис:
(6) на форме уже есть реквизит с именем ДокументыНаСкладе. Второй такой же не создается, это бы привело к ошибке.
Удалить хочу только элемент формы, реквизит не трогать..
(7) спасибо, сейчас попробую..
Повторюсь, если создание и удаление таблицы формы происходит в ОДНОЙ процедуре (т.е. между ними нет обновления отображения, как я понимаю), код ошибки не вызывает.
но на этапе удаления реквизита таблицы в мУдаляемыхРеквизитов должен быть один элемент реквизит формы типа «ТаблицаФормы»
полсе первого оператора у элемента формы «уйдет» путь к данным и он станет невидим, но элемент без пути тоже надо удалить, как-то так
(12), (13) а если мне не нужно удалять РЕКВИЗИТ с формы?
Хотя программное создание и удаление реквизита меня вполне устроит =)
РЕЗЮМЕ: Ошибка не возникает, если реквизит также создавать программно и удалять ПЕРЕД удалением самой таблицы данных. Причем вручную удалять колонки не обязательно, при удалении ТаблицыФормы они удаляются сами.
Если кому интересно, работающий код:
А как на счет того, чтобы программно получить список доступных колонок из динамического списка? Есть варианты?
(15) доступных слишком расплывчато.
по отборам тоже не сложно
разве не выдает вам коллекцию колонок дин. списка на клиенте со всей палитрой свойств?)
(19) вы не создали реквизиты(колонки) в блоке кода, а лишь элементы(колонки)
// Сформируем массивы реквизитов формы и элементов(колонок) относительно добавляемых колонок
+(20) и только после создание реквизиов-колонок имеет смысл создавать элементы-колонки, т.к. у нас уже будут программно созданные пути и связи списка данных с реквизитами-колонками.
(20) мой вопрос сводится к тому, как получить «ТзИсточника.Колонки», если ТзИсточника имеет тип «Динамический список».
И далее 2 варианта источника данных для него:
2) Произвольный запрос.
Программно я реквизиты-колонки не создавала, указания основной таблицы (или запроса) было достаточно, чтобы они создались платформой автоматически.
Можно ли, не создавая ПРОГРАММНО реквизиты-колонки, получить их список, как я его вижу в конструкторе формы?
Все же просто при динамическом создании
+(25) или если реквизиты-колонки уже родились, то вы их правильно не связяли с элементами-колонками. см. последний блок кода.
(23) Я делал через доступные поля отбора. Через ж, конечно, может кто подскажет, как сделать лучше?