Как организовать совместное использование настроек внешней обработки разными пользователями в 1С?

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

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

Проблема использования стандартного механизма автоматического сохранения

Если в управляемой форме включено свойство АвтоматическоеСохранениеДанныхВНастройках, платформа использует системное хранилище. Данные туда попадают в разрезе пары «ИмяОбъекта — ИмяПользователя». Проанализируем ситуацию: когда пользователь «Иванов» закрывает обработку, его данные сохраняются. Но когда ту же обработку открывает «Петров», система ищет настройки именно для «Петрова» и, не найдя их, открывает пустую форму. Нам необходимо вмешаться в этот процесс программно.

Вариант 1. Программная загрузка настроек конкретного пользователя

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


// В качестве ключа объекта используем имя нашей обработки
КлючОбъекта = "ВнешняяОбработка_КлиентБанк";
КлючНастроек = "ОсновныеНастройки";
// Указываем имя пользователя, настройки которого являются "эталонными"
ИмяПользователяЭталон = "Администратор";

СтруктураНастроек = ХранилищеНастроекДанныхФорм.Загрузить(КлючОбъекта, КлючНастроек, , ИмяПользователяЭталон);

Если СтруктураНастроек <> Неопределено Тогда
    // Заполняем реквизиты объекта или формы из загруженной структуры
    ЗаполнитьЗначенияСвойств(Объект, СтруктураНастроек);
КонецЕсли;

Важный нюанс: для выполнения метода Загрузить с указанием чужого имени пользователя текущему пользователю требуются права АдминистрированиеДанных. Поскольку давать такие права всем рядовым сотрудникам небезопасно, этот метод лучше использовать в связке с привилегированным режимом (если код выполняется в модуле конфигурации) или рассмотреть другие варианты.

Вариант 2. Использование общего ключа пользователя (пустая строка)

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

При сохранении настроек (например, при нажатии кнопки «Сохранить» или перед закрытием формы):


СтруктураДляСохранения = Новый Структура;
СтруктураДляСохранения.Вставить("Организация", Объект.Организация);
СтруктураДляСохранения.Вставить("БанковскийСчет", Объект.БанковскийСчет);

// Сохраняем под пустым пользователем
ХранилищеОбщихНастроек.Сохранить("МояВнешняяОбработка", "ОбщиеНастройки", СтруктураДляСохранения, , "");

При открытии формы загружаем эти данные аналогичным образом:


Настройки = ХранилищеОбщихНастроек.Загрузить("МояВнешняяОбработка", "ОбщиеНастройки", , "");
Если Настройки <> Неопределено Тогда
    Объект.Организация = Настройки.Организация;
    Объект.БанковскийСчет = Настройки.БанковскийСчет;
КонецЕсли;

В данном примере мы использовали ХранилищеОбщихНастроек. Это более универсальный механизм для хранения произвольных данных, не привязанных жестко к метаданным формы.

Вариант 3. Хранение настроек в регистре сведений (самый надежный способ)

Проанализируем ситуацию: системные хранилища настроек могут быть очищены при обновлении конфигурации, смене версии платформы или банальной очистке кэша пользователем. Если настройки обработки критически важны (например, пути к файлам выгрузки банк-клиента), профессиональные разработчики рекомендуют использовать Регистр сведений.

Преимущества такого подхода:

  1. Настройки не зависят от кэша и профиля пользователя.
  2. Права доступа регулируются стандартными ролями 1С.
  3. Можно хранить историю изменений настроек (кто и когда поменял).
  4. Данные легко переносятся между базами в распределенных системах (РИБ).

Для реализации создайте непериодический регистр сведений (например, ОбщиеНастройкиОбработок) с измерениями ИмяОбработки (строка) и КлючНастройки (строка), и ресурсом ЗначениеНастройки с типом ХранилищеЗначения.

Рассмотрим код сохранения табличной части в такой регистр:


// Сериализуем табличную часть в массив структур для сохранения
ДанныеТЧ = Новый Массив;
Для Каждого СтрокаТЧ Из Объект.ТабличнаяЧасть Цикл
    СтруктураСтроки = Новый Структура("Реквизит1, Реквизит2", СтрокаТЧ.Реквизит1, СтрокаТЧ.Реквизит2);
    ДанныеТЧ.Добавить(СтруктураСтроки);
КонецЦикла;

МенеджерЗаписи = РегистрыСведений.ОбщиеНастройкиОбработок.СоздатьМенеджерЗаписи();
МенеджерЗаписи.ИмяОбработки = "КлиентБанк";
МенеджерЗаписи.КлючНастройки = "НастройкиПоУмолчанию";
МенеджерЗаписи.ЗначениеНастройки = Новый ХранилищеЗначения(ДанныеТЧ);
МенеджерЗаписи.Записать();

Вариант 4. Использование механизмов БСП

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

Посмотрим на пример использования функций БСП для доступа к общим настройкам:


// Использование общего модуля БСП для сохранения
ОбщегоНазначения.ХранилищеОбщихНастроекСохранить("ГруппаНастроек", "Ключ", Настройки);

// Использование для загрузки
Настройки = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("ГруппаНастроек", "Ключ");

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

Особенности сохранения табличных частей

Помните, что прямая запись объекта ДанныеФормыКоллекция (которым является табличная часть на форме) в хранилище часто приводит к ошибкам. Правильный алгоритм работы с табличными частями всегда должен включать промежуточный этап конвертации в коллекцию, которая поддерживает сериализацию (например, ТаблицаЗначений, Массив или Структура). При загрузке мы сначала очищаем текущую таблицу формы Объект.ИмяТаблицы.Очистить(), а затем заполняем её данными с помощью метода ЗаполнитьЗначенияСвойств() в цикле по загруженному массиву.

Подведем итог: для простых задач подойдет использование ХранилищеОбщихНастроек с указанием пустого пользователя (параметр ""). Для более сложных и ответственных решений — использование собственного регистра сведений или механизмов БСП. Это гарантирует, что настройки внешней обработки будут «светиться» у всех пользователей сразу после их сохранения.

← На главную