Создаем две формы.
1. ОбновитьОбработку
2. ФормаОбработки
Основной выставляем - первую.
Код для процедуры при открытии:
&НаСервере
Процедура ПриОткрытииНаСервере()
ОтчетОбъект = РеквизитФормыВЗначение("Объект");
ПутьКФайлу = Новый ДвоичныеДанные( ОтчетОбъект.ИспользуемоеИмяФайла );
Адрес = ПоместитьВоВременноеХранилище(ПутьКФайлу, ЭтаФорма.УникальныйИдентификатор);
ОтчетОбъект.ОбновитьВрешнююОбработку( Адрес, ПутьКФайлу );
КонецПроцедуры
&НаКлиенте
Процедура ПриОткрытии(Отказ)
ПриОткрытииНаСервере();
Отказ = Истина;
ОткрытьФорму("ВнешняяОбработка.АвтоРегистрацияОбработки.Форма.ФормаОбработки");
КонецПроцедуры
В модуле объекта пишем:
Перем мВерсия;
Перем мНаименованиеОбр;
Функция СведенияОВнешнейОбработке() Экспорт
ДанныеДляРег = Новый Структура();
ДанныеДляРег.Вставить("Наименование", мНаименованиеОбр);
ДанныеДляРег.Вставить("БезопасныйРежим", Ложь);
ДанныеДляРег.Вставить("Версия", мВерсия);
ДанныеДляРег.Вставить("Информация", мНаименованиеОбр);
ДанныеДляРег.Вставить("Вид", "ДополнительнаяОбработка");
ТабЗнКоманды = Новый ТаблицаЗначений;
ТабЗнКоманды.Колонки.Добавить("Идентификатор");
ТабЗнКоманды.Колонки.Добавить("Использование");
ТабЗнКоманды.Колонки.Добавить("Представление");
НовСтрока = ТабЗнКоманды.Добавить();
НовСтрока.Идентификатор = "ОткрытьОбработку";
НовСтрока.Использование = "ОткрытиеФормы";
НовСтрока.Представление = "Открыть обработку";
ДанныеДляРег.Вставить("Команды", ТабЗнКоманды);
Возврат ДанныеДляРег;
КонецФункции
&НаСервере
Процедура ОбновитьВрешнююОбработку( Адрес, ПутьКФайлу ) Экспорт
ИмяФайла = Новый Файл(ПутьКФайлу);
ИмяФайла = ИмяФайла.Имя;
СведенияОбр = СведенияОВнешнейОбработке();
//Наищем нужный нам раздел
ИспользуемыеРазделы = Новый Массив;
//Если ВидОбр = Перечисления.ВидыДополнительныхОтчетовИОбработок.ДополнительнаяОбработка Тогда
ИспользуемыеРазделы = ДополнительныеОтчетыИОбработки.РазделыДополнительныхОбработок();
//Иначе
// ИспользуемыеРазделы = ДополнительныеОтчетыИОбработки.РазделыДополнительныхОтчетов();
//КонецЕсли;
РабочийСтол = ДополнительныеОтчетыИОбработкиКлиентСервер.ИмяНачальнойСтраницы();
Раздел = Справочники.ИдентификаторыОбъектовМетаданных.ПустаяСсылка();
Для Каждого Раздел Из ИспользуемыеРазделы Цикл
ПредстРаздела = ДополнительныеОтчетыИОбработки.ПредставлениеРаздела( Раздел );
Если ПредстРаздела = "Руководителю" ТОгда
Раздел = ОбщегоНазначения.ИдентификаторОбъектаМетаданных(Раздел);
Прервать;
КонецЕсли;
КонецЦикла;
СпрВО = Справочники.ДополнительныеОтчетыИОбработки.НайтиПоНаименованию( мНаименованиеОбр );
Если СпрВО.Пустая() Тогда
СпрВО_О = Справочники.ДополнительныеОтчетыИОбработки.СоздатьЭлемент();
СпрВО_О.Наименование = мНаименованиеОбр;
СпрВО_О.БезопасныйРежим = Ложь;
СпрВО_О.Версия = мВерсия;
СпрВО_О.Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.ДополнительнаяОбработка;
СпрВО_О.ИмяОбъекта = ЭтотОбъект.Метаданные().ПолноеИмя();
СпрВО_О.ИмяФайла = ЭтотОбъект.ИспользуемоеИмяФайла; // "SendMessage.epf";
СпрВО_О.Информация = мНаименованиеОбр;
СпрВО_О.ИспользоватьДляФормыОбъекта = Истина;
СпрВО_О.ИспользоватьДляФормыСписка = Истина;
СпрВО_О.Ответственный = ПараметрыСеанса.ТекущийПользователь;
СпрВО_О.Публикация = Истина;
СпрВО_О.РежимСовместимостиРазрешений = Перечисления.РежимыСовместимостиРазрешенийДополнительныхОтчетовИОбработок.Версия_2_1_3;
СпрВО_О.ОбменДанными.Загрузка = Истина;
СпрВО_О.Записать();
Иначе
СпрВО_О = СпрВО.ПолучитьОбъект();
Если СпрВО.Версия < мВерсия Тогда
Возврат;
КонецЕсли;
КонецЕсли;
ДвоичныеДанные = ПолучитьИзВременногоХранилища( Адрес );
//ВремФайл = ПолучитьИмяВременногоФайла("tmp");
//ДвоичныеДанные.Записать( ВремФайл );
ХранилищеОбр = Новый ХранилищеЗначения( ДвоичныеДанные );
СпрВО_О.ХранилищеОбработки = ХранилищеОбр;
//Добавим раздел доступа для каждой команды - Руководителю
СпрВО_О.Команды.Очистить();
Для Каждого ИнфОбОбр из СведенияОбр.Команды Цикл
//Добавим команды
Ком = СпрВО_О.Команды.Добавить();
Ком.Идентификатор = ИнфОбОбр.Идентификатор;
Ком.ВариантЗапуска = Перечисления.СпособыВызоваДополнительныхОбработок[ИнфОбОбр.Использование];
Ком.Представление = ИнфОбОбр.Представление;
Ком.ПоказыватьОповещение = Ложь;
//Добавим раздел доступа - Руководителю
РегДоступа = РегистрыСведений.ПользовательскиеНастройкиДоступаКОбработкам;
НаборДост = РегДоступа.СоздатьНаборЗаписей();
НаборДост.Отбор.ДополнительныйОтчетИлиОбработка.Установить(СпрВО_О.Ссылка);
НаборДост.Отбор.ИдентификаторКоманды.Установить( ИнфОбОбр.Идентификатор );
НаборДост.Отбор.Пользователь.Установить( ПараметрыСеанса.ТекущийПользователь );
НаборДост.Прочитать();
Если НаборДост.Количество() = 0 Тогда
ДовыйДоступ = НаборДост.Добавить();
ИначеЕсли НаборДост.Количество() = 1 Тогда
ДовыйДоступ = НаборДост[0];
КонецЕсли;
ДовыйДоступ.ДополнительныйОтчетИлиОбработка = СпрВО_О.Ссылка;
ДовыйДоступ.ИдентификаторКоманды = ИнфОбОбр.Идентификатор ;
ДовыйДоступ.Пользователь = ПараметрыСеанса.ТекущийПользователь;
ДовыйДоступ.Доступно = Истина;
НаборДост.Записать();
КонецЦикла;
СпрВО_О.ОбменДанными.Загрузка = Истина;
СпрВО_О.Записать();
КонецПроцедуры
мВерсия = "1.1";
мНаименованиеОбр = "Авто регистрация обработки";