Как определить контекст запуска внешней обработки и сохранить её настройки в 1С?

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

При разработке внешних обработок и печатных форм на управляемых формах 1С часто возникает задача: корректно определить, каким образом была открыта обработка — через стандартное меню «Файл — Открыть» или из справочника подсистемы БСП ДополнительныеОтчетыИОбработки, а также сохранить заданные пользователем параметры и настройки. Разберем по шагам, как решить обе эти задачи.

Определение контекста запуска внешней обработки

Когда внешняя обработка или печатная форма открывается через механизмы Библиотеки Стандартных Подсистем (БСП), платформа автоматически передает в обработчик события формы ПриСозданииНаСервере специализированную структуру параметров. Главным признаком запуска обработки из справочника ДополнительныеОтчетыИОбработки является наличие параметра ДополнительнаяОбработкаСсылка.

Проанализируем программный код обработчика события формы:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Проверяем, передан ли параметр ссылки на элемент справочника дополнительных обработок
    Если Параметры.Свойство("ДополнительнаяОбработкаСсылка", Объект.ВнешняяОбработкаСсылка) Тогда
        // Обработка открыта из справочника БСП
        // В реквизит Объект.ВнешняяОбработкаСсылка помещена ссылка на элемент ДополнительныеОтчетыИОбработки
    Иначе
        // Обработка открыта напрямую из файла через «Файл - Открыть»
        Объект.ВнешняяОбработкаСсылка = Справочники.ДополнительныеОтчетыИОбработки.ПустаяСсылка();
    КонецЕсли;
    
КонецПроцедуры

Если разрабатывается внешняя печатная форма, то БСП также передает параметр Параметры.ОбъектыНазначения — массив ссылок на документы или элементы справочников, для которых была вызвана команда печати. Это позволяет сразу получить контекст документов-источников.

Сохранение настроек в элемент справочника дополнительных обработок

Рассмотрим частую ошибку: попытку напрямую записать значение через ссылку (например, Объект.ВнешняяОбработкаСсылка.ХранилищеНастроек = ...). В платформе 1С ссылки доступны исключительно для чтения. Чтобы изменить данные элемента справочника, необходимо получить объект, упаковать структуру параметров в ХранилищеЗначения и выполнить запись.

Разберем пример сохранения структуры настроек по нажатию кнопки на форме:


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

Важные особенности этого способа:

  1. Права доступа: Для записи элемента справочника ДополнительныеОтчетыИОбработки у пользователя должны быть соответствующие права (в типовых конфигурациях они есть только у администраторов). Если обработка должна сохранять настройки обычным пользователем, процедуру записи необходимо выполнять в привилегированном режиме с помощью вызова УстановитьПривилегированныйРежим(Истина).
  2. Область действия: Настройки, записанные непосредственно в элемент справочника, становятся общими для всех пользователей информационной базы.

Альтернативный вариант: сохранение персональных настроек через ХранилищеОбщихНастроек

Если требуется сохранять индивидуальные настройки для каждого пользователя отдельно без блокировки и модификации справочника ДополнительныеОтчетыИОбработки, рекомендуется использовать системный объект ХранилищеОбщихНастроек.

Посмотрим, как выглядит сохранение и чтение параметров:


&НаСервере
Процедура СохранитьНастройкиПользователя()
    
    КлючОбъекта = "ВнешняяОбработка_" + Строка(Объект.ВнешняяОбработкаСсылка.УникальныйИдентификатор());
    КлючНастроек = "ОсновныеПараметры";
    
    СтруктураНастроек = Новый Структура;
    СтруктураНастроек.Вставить("Пароль", Объект.Пароль);
    СтруктураНастроек.Вставить("ОрганизацияПоУмолчанию", Объект.ОрганизацияПоУмолчанию);
    
    ХранилищеОбщихНастроек.Сохранить(КлючОбъекта, КлючНастроек, СтруктураНастроек);
    
КонецПроцедуры

&НаСервере
Процедура ВосстановитьНастройкиПользователя()
    
    КлючОбъекта = "ВнешняяОбработка_" + Строка(Объект.ВнешняяОбработкаСсылка.УникальныйИдентификатор());
    КлючНастроек = "ОсновныеПараметры";
    
    СтруктураНастроек = ХранилищеОбщихНастроек.Загрузить(КлючОбъекта, КлючНастроек);
    
    Если ТипЗнч(СтруктураНастроек) = Тип("Структура") Тогда
        ЗаполнитьЗначенияСвойств(Объект, СтруктураНастроек);
    КонецЕсли;
    
КонецПроцедуры

Штатный механизм сохранения настроек управляемой формы

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

  1. В свойствах управляемой формы найдем свойство АвтоматическоеСохранениеДанныхВНастройках и установим значение Использовать.
  2. В свойстве ХранилищеНастроек выберем ХранилищеОбщихНастроек.
  3. В дереве реквизитов формы выделим нужные реквизиты и включим у них флаг Сохраняемые данные.

В этом случае платформа будет автоматически сохранять и восстанавливать значения выбранных реквизитов при каждом открытии и закрытии формы пользователем.

← На главную