Как перехватить или программно изменить логику стандартной команды «Изменить форму» в 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке сложных интерфейсов на управляемых формах 1С часто возникает задача ограничить или видоизменить стандартное поведение платформы. Команда «Изменить форму...», доступная в меню «Ещё», предоставляет пользователям широкие возможности по настройке интерфейса, которые не всегда уместны (например, если состав полей должен жестко диктоваться бизнес-логикой или настройками из справочника). Рассмотрим подробно, как можно управлять этим механизмом.

Метод 1. Полная замена стандартной командной панели

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

  1. Откроем свойства КоманднаяПанель формы или конкретного динамического списка.
  2. Снимем флаг «Автозаполнение». Это приведет к тому, что все системные кнопки исчезнут, и мы сможем сформировать состав меню вручную.
  3. Создадим собственную команду формы, назовем её, например, КомандаИзменитьФорму.
  4. Разместим её в командной панели и в обработчике команды пропишем нужную нам логику.

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


&НаКлиенте
Процедура КомандаИзменитьФорму(Команда)
    // Здесь ваша произвольная логика
    Сообщить("Выполняется подготовка интерфейса...");
    
    // Вызываем стандартное окно настройки формы
    ЭтаФорма.ОткрытьОкноНастройкиДанныхФормы();
КонецПроцедуры

Метод 2. Программное ограничение доступа к команде

Если наша задача — просто запретить определенным пользователям менять состав формы, мы можем не отключать автозаполнение, а управлять доступностью элементов программно. Выясним, как это реализовать в модуле формы или через глобальные механизмы (например, в общем модуле МодификацияКонфигурацииПереопределяемый).

Рассмотрим пример кода в обработчике ПриСозданииНаСервере, который ограничивает права для всех, кроме администраторов:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    Если НЕ РольДоступна("ПолныеПрава") Тогда
        // Отключаем возможность настройки формы в целом
        ЭтаФорма.ИзменяетСоставФормы = Ложь;
        
        // Если нужно точечно отключить кнопки в командной панели динамического списка
        Элементы.СписокНастройкаСписка.Доступность = Ложь;
        Элементы.СписокУстановитьСтандартныеНастройки.Доступность = Ложь;
    КонецЕсли;
КонецПроцедуры

Метод 3. Динамическое управление составом полей из справочника

Рассмотрим более сложную ситуацию, описанную в теме: когда состав доступных полей хранится во внешнем справочнике и должен применяться индивидуально для каждого пользователя. В этом случае нам нужно не «перехватывать» кнопку, а программно модифицировать форму перед её открытием.

Проанализируем шаги для реализации такой схемы:

  1. В обработчике ПриСозданииНаСервере считываем настройки из вашего справочника.
  2. Для динамического списка модифицируем Список.ТекстЗапроса, добавляя туда нужные поля.
  3. Программно добавляем элементы формы (колонки) с помощью метода Элементы.Добавить().

Чтобы эти поля корректно взаимодействовали с механизмом «Изменить форму», важно правильно настроить их свойства:


&НаСервере
НовыйЭлемент = Элементы.Добавить("ДополнительноеПоле", Тип("ПолеФормы"), Элементы.Список);
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
НовыйЭлемент.ПутьКДанным = "Список.ДополнительноеПоле";
// Позволяет пользователю управлять видимостью этого поля в стандартном окне настроек
НовыйЭлемент.ПользовательскаяНастройка = Истина; 

Метод 4. Работа с Хранилищем системных настроек

Многие ошибочно полагают, что пользовательские настройки формы нельзя генерировать программно. На самом деле, мы можем управлять ими через ХранилищеСистемныхНастроек. Это позволяет реализовать функционал «принудительного» применения структуры полей.

Посмотрим, как можно прочитать или записать настройки формы программно:


// Ключ настроек обычно имеет вид "Общее/НастройкиФормы/<ИмяФормы>"
КлючОбъекта = "Общее/НастройкиФормы/Справочник.Номенклатура.ФормаСписка";
ТекущиеНастройки = ХранилищеСистемныхНастроек.Загрузить(КлючОбъекта, "");

Если ТекущиеНастройки <> Неопределено Тогда
    // Здесь можно проанализировать объект типа НастройкиФормы
    // И при необходимости перезаписать его для другого пользователя
    ХранилищеСистемныхНастроек.Сохранить(КлючОбъекта, , ТекущиеНастройки, , "ИмяПользователя");
КонецЕсли;

Метод 5. Использование горячих клавиш

Если вам необходимо назначить горячую клавишу для вызова окна «Изменить форму», стандартными средствами это сделать нельзя. Выход один — создать пользовательскую команду (как в Методе 1) и в её свойствах в конфигураторе установить свойство «Сочетание клавиш» (например, Ctrl+Shift+F). В обработчике команды вызываем уже знакомый нам метод ОткрытьОкноНастройкиДанныхФормы().

Важные нюансы и рекомендации

Разберем несколько критических моментов, которые помогут избежать ошибок при программной работе с формами:

Таким образом, хотя прямого события нажатия на системную кнопку «Изменить форму» нет, платформа предоставляет достаточно инструментов для гибкого управления составом формы и поведением пользовательских настроек.

← На главную