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) Спасибо

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

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

vpivo

7 / 7 / 3

Регистрация: 09.01.2018

Сообщений: 210

1

1C 8.x

Добавил доп.реквизит. не могу удалить

07.10.2020, 18:58. Показов 6402. Ответов 2

Метки нет (Все метки)


УТ 11… Добавил новый реквизит для «Склады и магазины»… Не могу удалить… В НСИ и администрирование -> Дополнительные реквизиты его не вижу, но запрос (выполняю в известной обработке «Консоль запросов»)

1C
1
ВЫБРАТЬ * ИЗ ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения

Возвращает в том числе и его.
Как удалить? Подскажите.



0



1808 / 1228 / 442

Регистрация: 16.01.2015

Сообщений: 5,394

07.10.2020, 19:34

2

НСИ-Сервис-Удаление помеченных объектов. Если волнует только консоль, к запросу отбор ГДЕ Пометка = Ложь



1



7 / 7 / 3

Регистрация: 09.01.2018

Сообщений: 210

07.10.2020, 20:00

 [ТС]

3

1С неисчерпаем, как Windows…
Увидел «галку» «Показать неиспользуемые», включил, появились, пометил на удаление, окончательно удалил.
Не знаю… но «галку» увидел, когда у всех складов с определенным значением доп.реквизита нажал «крест».
Что это значит в 1С-е — не знаю, по логике нормальных СУБД — это прописать NULL.
Всем спасибо.



0



На чтение 6 мин Просмотров 1.4к. Опубликовано 05.10.2020

Содержание

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Внимание!

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Внимание!

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

Внимание!

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

Остались вопросы?
Спросите в комментариях к статье.

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

Как получить значение дополнительного реквизита:

Пример: мы делаем печатную форму документа «Заказ клиента» и хотим вывести на неё значение определённого дополнительного реквизита — «Должность покупателя».

Используем вложенный запрос, в котором соединяем левым соединением таблицу «Дополнительные реквизиты» документа «Заказ клиента» с Планом видов характеристик «Дополнительные реквизиты и сведения». Устанавливаем условие: заголовок дополнительного реквизита должен быть таким – «Должность покупателя». Таблицы соединяем по ссылке на «Заказ клиента».

Получается вот такой запрос:

Также можно использовать метод НайтиПоНаименованию ( «***» ) .

Переменная Ссылка – это ссылка на «Договор контрагента».

Проверка на предмет того, что дополнительный реквизит заполнен:

Как изменить значения дополнительных реквизитов:

Задействуем общий модуль УправлениеСвойствами , который входит в состав БСП.

Комментарии

У вас ошибка в коде:
МассивСтруктур.Добавить(Новый Структура(«Свойство, Значение», ДопРеквизитДатаОтправки, ТекущаяДата());

Не хватает закрывающей скобки.

У вас ошибка в коде:
МассивСтруктур.Добавить(Новый Структура(«Свойство, Значение», ДопРеквизитДатаОтправки, ТекущаяДата());

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

Сейчас форма имеет следующий вид:

После добавления новых элементов она будет иметь вид:

Итак, добавляем реквизиты:

  • ЕдиницаИзмерения , тип СправочникСсылка.ЕдиницыИзмерения ;
  • ТекущийОстаток , тип Число .

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

Теперь посмотрим, как можно изменить основной реквизит формы. Изменим табличную часть Состав документа РасходнаяНакладная :

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

  • Распечатать

Оцените статью:

  1. 5
  2. 4
  3. 3
  4. 2
  5. 1

(0 голосов, среднее: 0 из 5)

Поделитесь с друзьями!

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

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

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

Содержание

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

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

Задача

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Понравилась статья? Поделить с друзьями:

Другие крутые статьи на нашем сайте:

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии