При разработке внешних обработок и печатных форм на управляемых формах 1С часто возникает задача: корректно определить, каким образом была открыта обработка — через стандартное меню «Файл — Открыть» или из справочника подсистемы БСП ДополнительныеОтчетыИОбработки, а также сохранить заданные пользователем параметры и настройки. Разберем по шагам, как решить обе эти задачи.
Когда внешняя обработка или печатная форма открывается через механизмы Библиотеки Стандартных Подсистем (БСП), платформа автоматически передает в обработчик события формы ПриСозданииНаСервере специализированную структуру параметров. Главным признаком запуска обработки из справочника ДополнительныеОтчетыИОбработки является наличие параметра ДополнительнаяОбработкаСсылка.
Проанализируем программный код обработчика события формы:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Проверяем, передан ли параметр ссылки на элемент справочника дополнительных обработок
Если Параметры.Свойство("ДополнительнаяОбработкаСсылка", Объект.ВнешняяОбработкаСсылка) Тогда
// Обработка открыта из справочника БСП
// В реквизит Объект.ВнешняяОбработкаСсылка помещена ссылка на элемент ДополнительныеОтчетыИОбработки
Иначе
// Обработка открыта напрямую из файла через «Файл - Открыть»
Объект.ВнешняяОбработкаСсылка = Справочники.ДополнительныеОтчетыИОбработки.ПустаяСсылка();
КонецЕсли;
КонецПроцедуры
Если разрабатывается внешняя печатная форма, то БСП также передает параметр Параметры.ОбъектыНазначения — массив ссылок на документы или элементы справочников, для которых была вызвана команда печати. Это позволяет сразу получить контекст документов-источников.
Рассмотрим частую ошибку: попытку напрямую записать значение через ссылку (например, Объект.ВнешняяОбработкаСсылка.ХранилищеНастроек = ...). В платформе 1С ссылки доступны исключительно для чтения. Чтобы изменить данные элемента справочника, необходимо получить объект, упаковать структуру параметров в ХранилищеЗначения и выполнить запись.
Разберем пример сохранения структуры настроек по нажатию кнопки на форме:
&НаСервере
Процедура СохранитьНастройкиВСправочникНаСервере()
Если Не ЗначениеЗаполнено(Объект.ВнешняяОбработкаСсылка) Тогда
ВызватьИсключение "Не удалось определить элемент справочника дополнительных обработок. Сохранение невозможно.";
КонецЕсли;
// Формируем структуру с сохраняемыми значениями
СтруктураНастроек = Новый Структура;
СтруктураНастроек.Вставить("Пароль", Объект.Пароль);
СтруктураНастроек.Вставить("ПечататьКопии", Объект.ПечататьКопии);
СтруктураНастроек.Вставить("ОрганизацияПоУмолчанию", Объект.ОрганизацияПоУмолчанию);
// Получаем объект справочника для редактирования
ОбъектСправочника = Объект.ВнешняяОбработкаСсылка.ПолучитьОбъект();
// Помещаем данные в хранилище значений со сжатием
ОбъектСправочника.ХранилищеНастроек = Новый ХранилищеЗначения(СтруктураНастроек, Новый СжатиеДанных(9));
// Записываем изменения
ОбъектСправочника.Записать();
КонецПроцедуры
Важные особенности этого способа:
ДополнительныеОтчетыИОбработки у пользователя должны быть соответствующие права (в типовых конфигурациях они есть только у администраторов). Если обработка должна сохранять настройки обычным пользователем, процедуру записи необходимо выполнять в привилегированном режиме с помощью вызова УстановитьПривилегированныйРежим(Истина).Если требуется сохранять индивидуальные настройки для каждого пользователя отдельно без блокировки и модификации справочника ДополнительныеОтчетыИОбработки, рекомендуется использовать системный объект ХранилищеОбщихНастроек.
Посмотрим, как выглядит сохранение и чтение параметров:
&НаСервере
Процедура СохранитьНастройкиПользователя()
КлючОбъекта = "ВнешняяОбработка_" + Строка(Объект.ВнешняяОбработкаСсылка.УникальныйИдентификатор());
КлючНастроек = "ОсновныеПараметры";
СтруктураНастроек = Новый Структура;
СтруктураНастроек.Вставить("Пароль", Объект.Пароль);
СтруктураНастроек.Вставить("ОрганизацияПоУмолчанию", Объект.ОрганизацияПоУмолчанию);
ХранилищеОбщихНастроек.Сохранить(КлючОбъекта, КлючНастроек, СтруктураНастроек);
КонецПроцедуры
&НаСервере
Процедура ВосстановитьНастройкиПользователя()
КлючОбъекта = "ВнешняяОбработка_" + Строка(Объект.ВнешняяОбработкаСсылка.УникальныйИдентификатор());
КлючНастроек = "ОсновныеПараметры";
СтруктураНастроек = ХранилищеОбщихНастроек.Загрузить(КлючОбъекта, КлючНастроек);
Если ТипЗнч(СтруктураНастроек) = Тип("Структура") Тогда
ЗаполнитьЗначенияСвойств(Объект, СтруктураНастроек);
КонецЕсли;
КонецПроцедуры
Выясним также, как использовать встроенный функционал платформы для автосохранения реквизитов формы:
АвтоматическоеСохранениеДанныхВНастройках и установим значение Использовать.ХранилищеНастроек выберем ХранилищеОбщихНастроек.В этом случае платформа будет автоматически сохранять и восстанавливать значения выбранных реквизитов при каждом открытии и закрытии формы пользователем.