1с как удалить дополнительный реквизит программно

удаление программно добавленных реквизитов

Я
   Strimteam

02.08.16 — 15:00

Всем доброго дня.

Столкнулся с проблемой:

На форму добавляю свой реквизит типа «Строка», с отображением как «ПолеФормы». Затем при повторной активизации формы хочу проверить — добавлен ли реквизит на форму, и удалить его если он там есть.

Для добавления использую конструкцию:

НовыйРек = Новый РеквизитФормы(СтрЗаменить(ИмяРеквизита,» «,»»),ДопустимыеТипы,,ИмяРеквизита);

МассивРеквизитов = Новый Массив;

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

ЭтаФорма.ИзменитьРеквизиты(МассивРеквизитов);

Но при попытке найти такой реквизит чтобы его удалить на форме — система просто не находит его в Элементы.

Если использовать ЭтаФорма[ИмяРеквизита] — находит конкретно значение типа Строка. Сделать с ней, само собой, ничего нельзя.

Вопрос — как можно удалить элемент, если он был добавлен раньше программно?

  

Партнерская программа EFSOL Oblako

   lera01

1 — 02.08.16 — 15:08

Проверить, если есть — просто не добавлять. Это вариант?

   Strimteam

2 — 02.08.16 — 15:11

(1) Мне скорее надо его удалить, так как имя реквизита могло изменится, и чтобы старый не мешал — сначала пытаюсь убрать ранее добавленные. Так что всё же нужно удалять.

   Nuobu

3 — 02.08.16 — 15:15

   f_vadim

4 — 02.08.16 — 15:21

Элементы.Найти

   f_vadim

5 — 02.08.16 — 15:22

или тут старообрядцы?

   Nuobu

6 — 02.08.16 — 15:23

(4) Тут реквизиты формы, а не элементы.

   f_vadim

7 — 02.08.16 — 15:26

(6) обсыпал голову пеплом. и на всякий случай другие части тела.

   Strimteam

8 — 02.08.16 — 15:28

(3) похоже что всё печально. У меня обработка внутри конфигурации, но созданные реквизиты так же не получить через Метаданные(). Значит пытаться искать элементы по наименованию, а затем «переопределять» элементы на другие реквизиты. Спасибо за ссылку.

   Kuzen

9 — 02.08.16 — 15:31

(0) Так что удалить то надо «Элемент формы» или «Реквизит Формы»?

   Kuzen

10 — 02.08.16 — 15:32

Если реквизит то есть второй параметр у ИзменитьРеквизиты

ИзменитьРеквизиты(<ДобавляемыеРеквизиты>, <УдаляемыеРеквизиты>)

   Strimteam

11 — 02.08.16 — 15:33

(10) Чтобы использовать ИзменитьРеквизиты надо сначала найти этот реквизит, и в массив передать. А я не могу найти такие реквизиты, если они были добавлены на форму программно. Если есть рабочий пример использования — буду признателен.

   Kuzen

12 — 02.08.16 — 15:34

(0) Твой код добавляет реквизит формы, элемент формы она не создает. Поэтому в элементах ты и не находишь скорее всего.

   Strimteam

13 — 02.08.16 — 15:37

(12) Элементы создаю отдельно, и сами элементы найти можно.

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

Но только я реквизит не могу найти, чтобы его удалить затем.

   FIXXXL

14 — 02.08.16 — 15:43

(13) я при добавлении сохраняю в списки

и при удалении чищу по спискам

//управление программно созданными реквизитами

&НаСервере

Процедура ЗафиксироватьПрограммноСозданныеРеквизитыИЭлементы(РеквизитПС)

    
    //при обновлении формы необходимо полное перезаполнение,

    //состав программно сформированных колонок может изменится

    //сохраним названия созданных при открытии формы колонок,

    //перед обновлением информации удалим согласно списка

    
    СписокУдаляемыхРеквизитов.Добавить(РеквизитПС.Путь + «.» + РеквизитПС.Имя);

    СписокУдаляемыхЭлементов.Добавить(РеквизитПС.Имя);

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

&НаСервере

Процедура УдалитьПрограммноСозданныеРеквизитыИЭлементы()

    
    //удаление ранее созданных программно колонок

    
    //убираем элементы формы

    Для каждого ЭлементФ Из СписокУдаляемыхЭлементов Цикл

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

        Если НайденныйЭлементФормы <> Неопределено  Тогда

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

        КонецЕсли;

    КонецЦикла;

    
    //убираем реквизиты формы

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

    Для каждого ЭлементСписка Из СписокУдаляемыхРеквизитов Цикл

        МассивУдаляемыхРеквизитов.Добавить(ЭлементСписка.Значение);

    КонецЦикла;    

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

    
    СписокУдаляемыхРеквизитов.Очистить();

    СписокУдаляемыхЭлементов.Очистить();

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

   1sanekmaloi1

15 — 02.08.16 — 15:45

Зачем его искать?

<УдаляемыеРеквизиты> (необязательный)

Тип: Массив.

Массив, содержащий строки, описывающие пути к удаляемым реквизитам.

Удалять можно только ранее программно добавленные реквизиты.

В массиве Строки с путями и все.

   Kuzen

16 — 02.08.16 — 15:49

//добавить реквизит

    ИмяРеквизита     = «Тест»;

    Путь             = «»;

    НовыйРек         = Новый РеквизитФормы(ИмяРеквизита,Новый ОписаниеТипов(«Строка»,,Новый КвалификаторыСтроки(100)),Путь,ИмяРеквизита);

    МассивРеквизитов = Новый Массив;

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

    ЭтаФорма.ИзменитьРеквизиты(МассивРеквизитов);

    //удалить реквизит

    МассивУдалить = Новый Массив;

    МассивУдалить.Добавить(«Тест»);

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

  

Strimteam

17 — 02.08.16 — 16:12

(16) Спасибо

(15) Спасибо

(14) Спасибо

Так же оказалось полезной функция ЭтаФорма.ПолучитьРеквизиты() . Элементы при добавлении на форму, и работе с формой — нормально по поиску находятся. Если же было обращение к другой форме (у меня открывалась подчинённая форма), то при возврате к оригинальной форме — элементы на форме есть, но через Элементы их в общем списке нет. Зато через ЭтаФорма.ПолучитьРеквизиты() можно увидеть что был реквизит, а значит был и элемент формы.

Всем большое спасибо за решение.

Как удалить дополнительный реквизит без изменения конфигурации

Автор 1cka, 03 апр 2014, 11:22

0 Пользователей и 1 гость просматривают эту тему.

В программах 1С версии 8 предусмотрен специальный механизм создания дополнительных свойств и категорий в режиме пользователя, без изменения конфигурации.
Создала я реквизит для справочника — все получилось, а вот как теперь его удалить? :dfbsdfbsdf:


Установить пометку удаления.

В этом механизме задествованы следующие объекты:
План видов характеристик свойства объектов.
Справочник Значения свойствобъектов
Регистр сведений Значения свойств объектов.


(0)есть такой объект «ПланВидовХарактеристик».
удали ВСЁ своё из него.

Представьте себе, какая была бы тишина, если бы люди говорили только то, что знают


Теги:

  • Форум 1С

  • Форум 1С — ПРЕДПРИЯТИЕ 8.0 8.1 8.2 8.3 8.4

  • Конфигурирование, программирование в 1С Предприятие 8

  • Как удалить дополнительный реквизит без изменения конфигурации

Похожие темы (5)

Рейтинг@Mail.ru

Rambler's Top100

Поиск

При разработке решений возникает необходимость добавить реквизит формы, состав и типы которых зависят от данных. Например при построении динамических деревьев с периодами, или при выводе контактной информации и т.д.

Содержание

  1. Задача
  2. Добавление реквизитов
  3. Удаление реквизитов
  4. Добавление реквизита табличной части
  5. Добавление реквизита с типом Произвольный

1С. Программное добавление и удаление реквизитов формы

Задача

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

Есть некая конфигурация, в форме элемента справочника Номенклатура необходимо программно создавать реквизиты формы и элементы к ним:

  • ЯчейкаХранения, тип СправочникСсылка.ЯчейкиХранения;
  • ТекущийОстаток, тип Число.

Элементы объединить в группу с горизонтальной группировкой. На текущий момент форма имеет следующий вид:

добавить реквизит формы

Добавление реквизитов

В обработчике формы ПриСозданииНаСервере() опишем код, который разбивается на 3 этапа:

  1. Описание и создание реквизитов формы;
  2. Создание элементов формы, объединение в группу без отображения;
  3. Заполнение данных.

Ниже приведен готовый код, код снабжен комментариями и разбит на области для лучшего понимания

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
    #Область ДобавлениеРеквизитовФормы
	
    // Массив для новых реквизитов
    ДобавляемыеРеквизиты	= Новый Массив;
		
    // Опишем ревизиты формы
    Реквизит_ЯчейкаХранения = Новый РеквизитФормы("ЯчейкаХранения",	Новый ОписаниеТипов("СправочникСсылка.ЯчейкиХранения"),	, "Ячейка");
    Реквизит_ТекущийОстаток = Новый РеквизитФормы("ТекущийОстаток",	Новый ОписаниеТипов("Число", , , Новый КвалификаторыЧисла(10, 3)), , "Остаток");
	
    // Для наглядности заполним массив после описания реквизитов формы
    ДобавляемыеРеквизиты.Добавить(Реквизит_ЯчейкаХранения);
    ДобавляемыеРеквизиты.Добавить(Реквизит_ТекущийОстаток);
	
    // Добавим новые реквизиты в форму
    ИзменитьРеквизиты(ДобавляемыеРеквизиты);
	
    #КонецОбласти
	
    #Область ДобавлениеЭлементовФормы
	
    // Горизонтальная группа без отображения на форме
    ГруппаФормы = Элементы.Добавить("Группа_СправочныеДанные", Тип("ГруппаФормы"));
    ГруппаФормы.Вид                        = ВидГруппыФормы.ОбычнаяГруппа;
    ГруппаФормы.Отображение                = ОтображениеОбычнойГруппы.Нет;
    ГруппаФормы.ОтображатьЗаголовок        = Ложь;
    ГруппаФормы.Группировка                = ГруппировкаПодчиненныхЭлементовФормы.Горизонтальная;
	
    // Элементы
	
    НовыйЭлемент = Элементы.Добавить("ЯчейкаХранения", Тип("ПолеФормы"), ГруппаФормы);
    НовыйЭлемент.ПутьКДанным                  = "ЯчейкаХранения";
    НовыйЭлемент.Вид                          = ВидПоляФормы.ПолеВвода;
    НовыйЭлемент.ТолькоПросмотр               = Истина;
	
    НовыйЭлемент = Элементы.Добавить("ТекущийОстаток", Тип("ПолеФормы"), ГруппаФормы);
    НовыйЭлемент.ПутьКДанным                  = "ТекущийОстаток";
    НовыйЭлемент.Вид                          = ВидПоляФормы.ПолеВвода;
    НовыйЭлемент.ТолькоПросмотр               = Истина;
	
    #КонецОбласти
	
    #Область ЗаполнениеДанных
	
    //  Имитируем заполнение данных
    ЭтаФорма.ЯчейкаХранения = ПредопределенноеЗначение("Справочник.ЯчейкиХранения.Распаковка");
    ЭтаФорма.ТекущийОстаток = 12;
	
    #КонецОбласти
	
КонецПроцедуры

После выполнения приведенного кода форма будет выглядеть так:

реквизит программно

Удаление реквизитов

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

    #Область УдалениеРеквизитовФормы
	
    // Массив удаляемых реквизитов
    УдаляемыеРеквизиты = Новый Массив;
    УдаляемыеРеквизиты.Добавить("ЯчейкаХранения");
    УдаляемыеРеквизиты.Добавить("ТекущийОстаток");
	
    // Удалим реквизиты формы
    ИзменитьРеквизиты( , УдаляемыеРеквизиты);
	
    #КонецОбласти

Внимание!!! Удалять можно только реквизиты созданные программно.

Добавление реквизита табличной части

Добавление реквизита и элемента формы для табличной части почти ничем не отличается, необходимо только указать путь «Объект.<ИмяТабличнойЧасти>». Ниже пример добавления реквизита Ячейка в ТЧ Комплектация.

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

Добавление реквизита с типом Произвольный

В одной из задач стало необходимо добавить реквизит с типом Произвольный, но ни СП, ни интернеты ответа не дали. В итоге через несколько попыток было найдено решение

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

Внимание!!! Данные добавленного реквизита сохраняться в ИБ не будут.

Например, есть на управляемой форме программно добавленные реквизиты и соответственно элементы формы (колонки). Программным методотом нужно эти реквизиты и элементы формы удалить.

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

На чтение 4 мин Просмотров 6.9к. Опубликовано 27.12.2017

Платформа 1С:Предприятие позволяет программно добавлять и изменять элементы управляемой формы. Разберемся для чего это может потребоваться.

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

  • При доработке типовых конфигураций для облегчения процедуры последующего обновления. В этом случае будет изменен только модуль формы. Модули намного проще обновлять, чем форму.
  • При реализации некоторых общих алгоритмов. Например, в подсистеме БСП «Запрет редактирования реквизитов объектов» для всех подключенных к подсистеме объектов предусмотрено программное создание кнопки для включения возможности редактирования реквизитов.
  • При реализации некоторых специфических алгоритмов. Например, в справочнике Номенклатура создаются поля для редактирования дополнительных реквизитов.

В управляемой форме можно программно добавить, изменить и удалить:

  • реквизиты;
  • локальные команды;
  • элементы.

Все указанные операции возможны только на сервере.

Программное изменение формы имеет ограничения:

  • Удалить можно только программно добавленные реквизиты/команды/элементы. Нельзя программно удалить объекты, созданные в конфигураторе.
  • Нельзя назначить реквизит основным.

Содержание

  1. Изменение команд формы
  2. Изменение реквизитов формы
  3. Изменение элементов формы

Изменение команд формы

Для управления составом команд у объекта УправляемаяФорма есть коллекция Команды. У коллекции есть несколько методов:

  • Добавить(<ИмяКоманды>)

  • Количество()

  • Найти(<ИмяКоманды>)

  • Удалить(<Команда>)

Коллекция Команды доступна как на клиенте, так и на сервере. Изменять коллекцию (методы Добавить() и Удалить()) можно только на сервере. Искать и получать количество элементов (методы Найти() и Количество()) можно как на клиенте, так и на сервере.

В качестве примера работы с командами формы создадим новую команду ИсторияИзменений с заголовком «История изменений…», которая будет вызвать обработчик ОтобразитьИсторию(). Создание выполняется при открытии формы.

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Команда = Команды.Добавить(«ИсторияИзменений»);
Команда.Действие = «Подключаемый_ОтобразитьИсторию»;
Команда.Заголовок = «История изменений…»;
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ОтобразитьИсторию(Команда)
// действия команды
КонецПроцедуры

Обработчик команды должен располагаться в форме и иметь директиву компиляции &НаКлиенте.

Изменение реквизитов формы

Чтение состава реквизитов формы выполняется функцией ПолучитьРеквизиты(<Путь>), возвращающей массив типа РеквизитФормы. Параметр функции указывает путь к родительскому реквизиту (в виде строки). Если параметр опущен или указана пустая строка, возвращаются реквизиты верхнего уровня.

Изменение реквизитов выполняется методом ИзменитьРеквизиты(<ДобавляемыеРеквизиты>, <УдаляемыеРеквизиты>) объекта УправляемаяФорма. В параметр ДобавляемыеРеквизиты передается массив с элементами типа РеквизитФормы. В параметр УдаляемыеРеквизиты передается массив строк, описывающих пути к удаляемым реквизитам.


Внимание!

Процесс изменения состава реквизитов является достаточно ресурсоемким. Фактически выполняется пересоздание формы. В связи с этим работа с реквизитами формы выполняется в пакетном режиме.


Создадим новый реквизит формы с именем Покупатель:

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

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

Изменение элементов формы

Для управления составом элементов у объекта УправляемаяФорма есть коллекция Элементы. У коллекции есть несколько методов:

  • Вставить(<Имя>, <ТипЭлемента>, <Родитель>, <Элемент>)

  • Добавить(<Имя>, <ТипЭлемента>, <Родитель>)

  • Количество()

  • Найти(<Имя>)

  • Переместить(<Элемент>, <Родитель>, <МестоРасположения>)

  • Удалить(<Элемент>)

Коллекция Элементы доступна как на клиенте, так и на сервере. Изменять коллекцию (методы Вставить(), Добавить(), Переместить() и Удалить()) можно только на сервере. Искать и получать количество элементов (методы Найти() и Количество()) можно как на клиенте, так и на сервере. Элементами коллекции могут быть:

  • ГруппаФормы;
  • ТаблицаФормы;
  • ПолеФормы;
  • КнопкаФормы.

Элементам формы можно программно назначить обработчики событий. Для этих целей предназначен метод УстановитьДействие(<ИмяСобытия>, <Действие>).

Рассмотрим несколько наиболее распространенных на практике примеров работы с командами, реквизитами и элементами формы.

Добавление команды и связанной с ней кнопки:

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

Добавление реквизита и связанного с ним поля ввода:

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

Назначение элементу формы обработчика события:

ЭлементПокупатель.УстановитьДействие(«ПриИзменении», «Подключаемый_ПокупательПриИзменении»);

&НаКлиенте
Процедура Подключаемый_ПокупательПриИзменении(Элемент)
// Действия события
КонецПроцедуры


Внимание!

Процедурам, которые устанавливаются в качестве обработчиков событий из кода с помощью метода УстановитьДействие(), рекомендуется задавать префикс Подключаемый_.



Внимание!

Скачать обработку с примерами программного поиска и изменения реквизитов, команд и элементов управляемой формы можно ЗДЕСЬ.


Понравилась статья? Поделить с друзьями:
  • 1с настройка страховых взносов для малого бизнеса
  • 1с обращение к дополнительным реквизитам по имени
  • 1с общего назначения получить реквизит на клиенте
  • 1с обычные формы как обратиться к реквизиту формы
  • 1с проверка заполнения реквизита формы программно