Как сохранить настройки и значения реквизитов внешней обработки в 1С без внешних файлов?

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

При разработке внешних обработок в среде «1С:Предприятие 8» программисты часто сталкиваются с задачей сохранения пользовательских настроек. Это могут быть пути к каталогам обмена, токены авторизации внешних сервисов, заполненные таблицы соответствия или дефолтные значения реквизитов. Требовать от пользователя заполнять эти данные заново при каждом открытии крайне неэффективно, а сохранение в локальные файлы (например, XML, JSON или текстовые файлы) на диске несет риски безопасности, усложняет администрирование в клиент-серверных архитектурах и не работает в веб-клиентах.

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

Способ 1. Автоматическое сохранение данных в настройках управляемой формы (без написания кода)

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

Выясним, как настроить этот инструмент прямо в конфигураторе:

  1. Откроем форму нашей внешней обработки в конфигураторе.
  2. В окне свойств формы найдем раздел «Сохранение данных».
  3. Установим свойство «Автоматическое сохранение данных в настройках» в значение Использовать (в некоторых релизах платформы это свойство называется просто «Сохранение данных в настройках»).
  4. После включения этой опции обратим внимание на список реквизитов формы. Рядом со стандартными колонками (Имя, Тип) появится новая колонка с иконкой в виде дискеты — «Сохранение».
  5. Достаточно просто проставить галочки в этой колонке напротив тех реквизитов формы, значения которых платформа должна автоматически запоминать.

Проанализируем преимущества этого подхода: нам не требуется писать ни одной строчки программного кода в обработчиках ПриОткрытии или ПриЗакрытии. Платформа самостоятельно сериализует значения выбранных реквизитов в системную таблицу настроек текущего пользователя при закрытии формы и восстановит их при следующем запуске.

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

Способ 2. Программное использование Хранилища общих настроек

Если автоматического сохранения платформы недостаточно (например, нам нужно сохранять настройки по кнопке или выполнять сложную валидацию перед записью), мы можем использовать объект платформы ХранилищеОбщихНастроек. Этот метод работает в управляемом приложении и заменяет устаревшие методы толстого клиента СохранитьЗначения и ВосстановитьЗначения, которые корректно функционируют только в режиме толстого клиента.

Рассмотрим пример программной реализации. Для этого мы создадим структуру настроек и сохраним ее при закрытии формы, а при открытии восстановим.

Посмотрим на пример кода сохранения настроек формы:


&НаКлиенте
Процедура ПриЗакрытии(ЗавершениеРаботы)
    
    // Формируем структуру настроек для сохранения
    СтруктураНастроек = Новый Структура;
    СтруктураНастроек.Вставить("АдресСервера", Объект.АдресСервера);
    СтруктураНастроек.Вставить("ИспользоватьПрокси", Объект.ИспользоватьПрокси);
    СтруктураНастроек.Вставить("ТаймаутСоединения", Объект.ТаймаутСоединения);
    
    СохранитьНастройкиНаСервере(СтруктураНастроек);
    
КонецПроцедуры

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

Теперь разберем, как восстановить сохраненные параметры при инициализации формы. Для этого задействуем обработчик ПриСозданииНаСервере:


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

Преимущество этого метода в полной контролируемости процесса разработчиком. Мы можем гибко управлять тем, какие именно данные, в какой момент и с какими дефолтными значениями будут загружены в интерфейс.

Способ 3. Создание общих настроек для всех пользователей через «виртуального пользователя»

Часто возникает ситуация, когда настройки подключения к внешнему сервису должны быть едиными для всех пользователей информационной базы (например, параметры авторизации в службе доставки или API интеграции). Если сохранять их обычным образом через ХранилищеОбщихНастроек, каждый пользователь будет вынужден настраивать интеграцию индивидуально.

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

Проанализируем синтаксис метода: ХранилищеОбщихНастроек.Сохранить(КлючОбъекта, КлючНастроек, Значение, ОписаниеНастроек, ИмяПользователя). Пятым параметром мы можем передать произвольную строку, например, "ОбщиеНастройкиИнтеграции". Этого пользователя не существует в справочнике или списке пользователей ИБ, но платформа создаст изолированную запись в таблице настроек именно под этим строковым идентификатором.

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

Выясним, как элегантно обойти это ограничение с помощью встроенного механизма привилегированного режима:


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

Аналогично чтение общих параметров должно выполняться в привилегированном режиме, чтобы рядовые пользователи без прав администратора могли беспрепятственно прочитать настройки подключения:


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

Способ 4. Ловушка Безопасного режима во внешних обработках

Продолжая разбор предыдущего способа, рассмотрим критически важный нюанс. Начинающие разработчики часто сталкиваются с тем, что код вызова привилегированного режима отлично работает при тестировании локально через меню «Файл — Открыть», но выдает ошибку прав доступа при интеграции в рабочую базу через справочник дополнительных отчетов и обработок БСП.

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

Чтобы решить эту проблему, нам необходимо правильно зарегистрировать обработку в БСП. В модуле объекта внешней обработки в функции СведенияОВнешнейОбработке() мы должны явно затребовать отключение безопасного режима или запросить необходимые разрешения.

Посмотрим на пример настройки параметров регистрации обработки с отключением безопасного режима:


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

После такой регистрации администратор системы при подключении обработки в режиме предприятия увидит предупреждение о том, что обработка требует повышенных привилегий. После подтверждения обработка сможет успешно вызывать привилегированный режим и сохранять настройки в контексте виртуального пользователя для всей базы данных.

Способ 5. Использование штатного хранилища БСП (Дополнительные отчеты и обработки)

Если конфигурация построена на базе БСП (а это практически все современные типовые решения), то у справочника ДополнительныеОтчетыИОбработки есть штатный реквизит ХранилищеНастроек с типом ХранилищеЗначения. Это идеальное место для сохранения конфигурационных параметров внешней обработки.

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

Разберем по шагам схему реализации этого метода:

  1. При запуске команды в форму обработки передается ссылка на текущий элемент справочника дополнительных обработок (параметр ДополнительнаяОбработкаСсылка).
  2. Мы считываем структуру данных из реквизита справочника.
  3. При сохранении мы программно перезаписываем значение этого реквизита.

Посмотрим на пример кода записи настроек напрямую в элемент справочника БСП:


&НаСервере
Процедура СохранитьНастройкиВЭлементСправочника(СсылкаНаОбработку, СтруктураНастроек)
    
    // Получаем объект справочника БСП для изменения данных
    ОбъектСправочника = СсылкаНаОбработку.ПолучитьОбъект();
    
    // Помещаем структуру параметров в хранилище значений
    ОбъектСправочника.ХранилищеНастроек = Новый ХранилищеЗначения(СтруктураНастроек);
    
    // Записываем элемент справочника
    ОбъектСправочника.Записать();
    
КонецПроцедуры

Для чтения настроек перед открытием формы мы можем применить следующий серверный метод:


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

Этот способ является стандартом разработки крупных корпоративных систем в экосистеме «1С». Он обеспечивает максимальную стабильность, независимость от профилей пользователей операционной системы и корректную работу в сценариях автоматического выполнения регламентных заданий по расписанию.

Способ 6. Ограничения облачных инфраструктур (1С:Fresh)

Если вы разрабатываете обработку для публикации в сервисе «1С:Fresh» или аналогичных облачных провайдерах приложений, вам придется столкнуться с жесткой автоматической модерацией (аудитом кода). Одно из важнейших правил безопасности в облаках — строгий запрет на отключение безопасного режима. Любая попытка прописать БезопасныйРежим = Ложь или использовать УстановитьПривилегированныйРежим приведет к отклонению обработки аудиторами.

Как же сохранять настройки в таких условиях? Единственным легитимным вариантом остается использование ХранилищеОбщихНастроек строго в контексте текущего авторизованного пользователя:

  1. Никогда не передавайте имя пользователя (пятый параметр) в метод ХранилищеОбщихНастроек.Сохранить().
  2. Никогда не используйте вызовы привилегированного режима в коде сохранения.

Платформа автоматически сохранит настройки для текущего активного сеанса пользователя. Да, в этом случае каждому сотруднику придется заполнить параметры интеграции один раз при первом запуске, но это плата за безопасность и соответствие жестким стандартам облачной архитектуры «1С:Fresh».

Подводя итог, выбор метода сохранения настроек внешней обработки зависит от условий эксплуатации вашей разработки. Для простых индивидуальных обработок идеален первый способ с автоматическим сохранением реквизитов формы. Для сложных интеграционных решений в локальных базах прекрасно подойдет связка ХранилищеОбщихНастроек с использованием виртуального пользователя под привилегированным режимом. А для тяжелых систем с регламентными заданиями лучшим выбором станет задействование штатного реквизита дополнительных отчетов БСП.

← На главную