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

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

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

Почему нельзя просто "перехватить" стандартные настройки?

Первая мысль, которая приходит в голову, — это попытаться программно получить доступ к данным, которые сохраняют стандартные кнопки. Однако этот механизм является частью платформы и представляет собой своего рода "черный ящик". Настройки сохраняются в системных хранилищах (например, в регистре сведений СохраненныеНастройки или в ХранилищеНастроекДанныхФорм), но их структура и ключи привязаны к конкретному пользователю, форме и элементам управления. Прямая работа с ними для копирования может быть сложной и ненадежной при обновлениях платформы.

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

Программное решение: используем ХранилищеОбщихНастроек

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

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

Шаг 1. Сохранение настроек

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

Сначала нужно подготовить объект ОписаниеНастроек. Он служит для идентификации нашей настройки в хранилище.

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

Посмотрим на пример кода:


// Процедура для сохранения настроек
Процедура СохранитьНастройкиНаСервере()

    // 1. Создаем и заполняем описание для нашей настройки
    ОписаниеНастройки = Новый ОписаниеНастроек;
    ОписаниеНастройки.Представление = "Таблица соответствий для обработки"; // Понятное имя для пользователя
    ОписаниеНастройки.КлючОбъекта = ЭтаФорма; // Привязываем к текущей форме
    ОписаниеНастройки.КлючНастроек = "ТаблицыСоответствийОбработки"; // Уникальный ключ для этих данных

    // 2. Выгружаем данные из табличной части формы в таблицу значений
    ДанныеДляСохранения = Объект.тзСоответствия.Выгрузить();

    // 3. Сохраняем данные в хранилище для ТЕКУЩЕГО пользователя
    ХранилищеОбщихНастроек.Сохранить(
        ЭтаФорма,                               // КлючОбъекта
        "ТаблицыСоответствийОбработки",          // КлючНастроек
        ДанныеДляСохранения,                    // Сохраняемое значение
        ОписаниеНастройки                       // Описание
    );

КонецПроцедуры

Шаг 2. Восстановление настроек (включая чужие)

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

Если мы не передаем четвертый параметр, система загрузит настройки для текущего пользователя.

Если мы передаем в него ссылку на другого пользователя, система загрузит настройки, сохраненные именно этим пользователем. Это и есть то, что нам нужно для копирования!

Проанализируем код восстановления:


// Процедура для загрузки настроек.
// ПользовательДляЗагрузки - необязательный параметр типа СправочникСсылка.Пользователи
Процедура ЗагрузитьНастройкиНаСервере(ПользовательДляЗагрузки = Неопределено)

    // 1. Создаем такое же описание, как и при сохранении, чтобы найти настройку
    ОписаниеНастройки = Новый ОписаниеНастроек;
    ОписаниеНастройки.Представление = "Таблица соответствий для обработки";
    ОписаниеНастройки.КлючОбъекта = ЭтаФорма;
    ОписаниеНастройки.КлючНастроек = "ТаблицыСоответствийОбработки";

    ЗагруженныеДанные = Неопределено;

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

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

КонецПроцедуры

Практическая реализация: создаем интерфейс для копирования

Чтобы пользователи могли этим пользоваться, нужно добавить на форму обработки несколько элементов:

  1. Кнопка "Сохранить мои настройки": в ее обработчике вызываем процедуру СохранитьНастройкиНаСервере().
  2. Кнопка "Восстановить мои настройки": в ее обработчике вызываем ЗагрузитьНастройкиНаСервере() без параметров.
  3. Поле для выбора пользователя: добавим на форму реквизит ПользовательИсточник с типом СправочникСсылка.Пользователи.
  4. Кнопка "Загрузить от пользователя": в ее обработчике вызываем ЗагрузитьНастройкиНаСервере(ПользовательИсточник), передавая выбранного в поле пользователя.

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

Альтернативные и интерактивные способы

Помимо программного метода, существуют и более простые, интерактивные способы переноса настроек, которые не требуют доработки конфигурации.

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

← На главную