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

1. Nicholas 889 30.03.20 12:07 Сейчас в теме
В свойствах управляемой формы можно регулировать состав стандартных команд (см. скриншот). Каким образом те же действия можно сделать программно (нужно отключить несколько стандартных команд)?
Прикрепленные файлы:
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
8. winapi 60 01.09.22 09:23 Сейчас в теме
(1) А зачем вы хотите это сделать программно? Для разграничений каких-то прав?
2. burgomister 59 30.03.20 16:06 Сейчас в теме
Программное добавление и изменение элементов управляемых форм
Программное добавление и изменение элементов управляемых форм
Платформа 1С:Предприятие позволяет программно добавлять и изменять элементы управляемой формы. Разберемся для чего это может потребоваться.


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

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

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

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

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

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

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

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

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

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

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

Внимание!

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Внимание!
Процедурам, которые устанавливаются в качестве обработчиков событий из кода с помощью метода УстановитьДействие(), рекомендуется задавать префикс Подключаемый_.
Показать
Bas_ERP_UX; +1 Ответить
3. 7OH 69 12.04.21 20:42 Сейчас в теме
У вас вышло ? Тоже интересно как отключить доступность стандартной команды.
4. jimmiloster 25.05.21 09:18 Сейчас в теме
(3) Их в интерактивном режим на форме не найти, но они будут созданы динамически и настраивать их можно программно так же, как любые другие команды. Обращайтесь по имени ФормаПровестиИЗакрыть, ФормаОтменитьПроведение и т.д.
Элементы.ФормаОтменаПроведения.Доступность = Ложь;
mikael1709; akocur; VladC#; Cmapnep; volkov-mv; +5 Ответить
5. volkov-mv 14.01.22 09:32 Сейчас в теме
(4) Спасибо за подсказку! А есть идея как включить отключенную по умолчанию кнопку? В этом случае она не создается динамически как я понял.
6. 7OH 69 11.08.22 12:39 Сейчас в теме
Апну тему.
Опять надо достучаться до этого списка.
Табличная часть на форму выводится программно, дабы не менять форму.
Надо , например, убрать команду "скопировать", но оставить добавить или изменить.
Вот как добраться до этого самого списка "состав команд" то ?
DmitrySinichnikov; JohnConnor; user1126060; +3 Ответить
7. KNM.Work 01.09.22 08:36 Сейчас в теме
(6)
Доброго времени суток!
Передо мной встала аналогичная проблема.

Сначала думал создавать КП программно и без автозаполнения, после чего добавлять в неё только нужные стандартные команды.
Копал в эту сторону минут 15-20, не нашёл ничего интересного. Решил пойти немного другим путём.

В моем случае, источник действий для командной панели генерируется программно.
Если точнее, то либо ПриЧтенииНаСервере (если это существующий объект), либо ПриСозданииНаСервере (если это форма нового).

В момент создания объекта и до окончания обработки указанных событий, командная панель ещё пуста, и стандартные команды в неё не выведены.
Зато, на момент обработки события "ПриОткрытии" они уже есть.

Добавил туда процедуру, внутри которой донастроил нужным образом стандартные команды.

Не самое красивое решение, но работает.
ЩитниковаАА; user591389_aska_rabota; Bas_ERP_UX; +3 Ответить
9. MaCCapAkIII 21.03.23 15:45 Сейчас в теме
Вот еще вопрос в тему. Открываю стандартные команды формы, но там нет тех команд, которые пропадают в командной панели формы, если у нее, КП формы, убрать автозаполнение. То есть через автозаполнение КП формы заполняются команды, которых нет в списке стандартных команд формы. Я в тупике. Где найти эти стандартные команды, которые привязаны к форме и заполняются при автозаполнении КП?
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот