Доброго времени. Кто-нибудь объясните мне как это работает.
Есть подписка на события ОбработкаПолученияФормы. Обработчик мы можем создать только в серверном модуле.
У обработчика есть следующие параметры:
Источник, ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка.

Все вроде понятно. Мы перехватываем получение формы для того чтобы можно было что-нибудь с ней сделать.
Но сделать с ней ничего нельзя.

Пишу код:

```1c
    Если Параметры.Ключ.Пустая() Тогда
    ЭлементОбъект = Источник.СоздатьЭлемент();
    Иначе
    ЭлементОбъект = Параметры.Ключ.ПолучитьОбъект();
    КонецЕсли;
    Ключ = Новый Структура("Ключ", ЭлементОбъект.Ссылка);
    ФормаЭлемента = ЭлементОбъект.ПолучитьФорму("Документ."+Источник.ПустаяСсылка().Метаданные().Имя+".Форма.ФормаОбъекта", Ключ);
```

И... Ничего. Возвращает ФормаЭлемента Неопределено.
Перерыл все что можно.
Логично что форма возвращаться может только на клиенте. Хотя есть в форме процедура "ПриСозданииНаСервере".

Как получить форму для изменения непосредственно перед тем как она будет отображена пользователю, и при этом не привязываться к конкретному документу?
---
Для конфигураций на БСП есть лазейки через процедуры, которые вызываются ПриСозданииНаСервере и передают на сервер форму объекта:
ПодключаемыеКоманды.ПриСозданииНаСервере
ВерсионированиеОбъектов.ПриСозданииНаСервере
Можно в расширении добавить свой код для одной из этих процедур для универсальной обработки открываемой формы на сервере.
---
```1c
    Если Параметры.Свойство("Ключ") И ЗначениеЗаполнено(Параметры.Ключ) Тогда
    ВидОперации = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Параметры.Ключ, "ВидОперации");
    КонецЕсли;
    Если ВидОперации = Перечисления.ВидыОперацийПоступлениеТоваровУслуг.Товары Тогда
    ВыбраннаяФорма = "ФормаДокументаТовары";
    ИначеЕсли ВидОперации = Перечисления.ВидыОперацийПоступлениеТоваровУслуг.Услуги Тогда
    ВыбраннаяФорма = "ФормаДокументаУслуги";
    ИначеЕсли ...
    КонецЕсли;
```
---
Подписка на получение формы вам не подойдёт. Тут скорее подойдёт подписка на ОбработкаЗаполнения объекта. О том, чтобы получать универсально форму перед открытием на сервере в подписке лучше забыть.
---
Обработка заполнения та же серверная процедура. Не подойдет...
---
Зачем вам клиент?
---
Моя задача добавить команду(кнопку) в каждую открываемую форму. Независимо от того какой документ был открыт.
---
Это можно сделать только на сервере. Сделайте расширение процедуры Перед для ПодключаемыеКоманды.ПриСозданииНаСервере и там добавляйте, что хотите. Обработчики команды придётся привязывать к процедурам Подключаемый_ВыполнитьКомандуНаСервере или Подключаемый_ВыполнитьКоманду. В общем, та еще задачка, если не разрешается изменять форму.
---
Спасибо. Так и сделал. Уже летает.
Задача не тривиальная. Сделать расширение для интеграции. В каждой форме должна появиться кнопка "Создать заявку программисту". Создается док в расширении и дальше синхронизируются базы в части этого документа. Т.о. будет сервисная база с заявками и любая конфа (на БСП) сможет использовать это расширение.
---
подписка на события ОбработкаПолученияФормынужна для того, чтобы в определенных условиях можно было открыть ту или иную форму объекта.
(1) Как получить форму для изменения непосредственно перед тем как она будет отображена пользователю, и при этом не привязываться к конкретному документу?В лоб никак. Обычно в ПриСозданииНаСервере вызывают процедуру общего модуля. В УТ11 например в абсолютном большинстве форм вызывается
СобытияФорм.ПриСозданииНаСервере(ЭтаФорма, Отказ, СтандартнаяОбработка);
---
Проверил в БП нет такой процедуры. А жаль - решило бы мой вопрос.
---
Для конфигураций на БСП есть лазейки через процедуры, которые вызываются ПриСозданииНаСервере и передают на сервер форму объекта:
ПодключаемыеКоманды.ПриСозданииНаСервере
ВерсионированиеОбъектов.ПриСозданииНаСервере
Можно в расширении добавить свой код для одной из этих процедур для универсальной обработки открываемой формы на сервере.
---
Спасибо. Я забыл совсем про подключаемые команды... Именно то что нужно. Перехватить создание формы на сервере и добавить туда команду.