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

1. Nicholas 887 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 Сейчас в теме
Вот еще вопрос в тему. Открываю стандартные команды формы, но там нет тех команд, которые пропадают в командной панели формы, если у нее, КП формы, убрать автозаполнение. То есть через автозаполнение КП формы заполняются команды, которых нет в списке стандартных команд формы. Я в тупике. Где найти эти стандартные команды, которые привязаны к форме и заполняются при автозаполнении КП?
Оставьте свое сообщение
Вакансии
1С аналитик
Москва
зарплата от 210 000 руб.
Полный день

Руководитель направления 1С
Москва
зарплата от 350 000 руб.
Полный день

1С Программист
Москва
зарплата от 180 000 руб.
Полный день

Программист 1С
Москва
зарплата от 180 000 руб. до 220 000 руб.
Полный день

Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)