Как сохранить и восстановить настройки отбора компоновки данных в документе 1С

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

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

Постановка задачи и выбор способа хранения

Рассмотрим ситуацию: у нас есть форма «Групповое создание документов», на которой размещен КомпоновщикНастроек. Пользователь устанавливает сложные фильтры по номенклатуре, характеристикам или складам. Нам требуется, чтобы каждый созданный документ хранил в себе этот уникальный отбор. Это позволит при открытии документа точно понимать, какие позиции в него попали и по какому принципу они были отобраны.

Основным механизмом для решения этой задачи в платформе 1С:Предприятие 8.3 является использование реквизита с типом ХранилищеЗначения. Этот тип данных позволяет упаковать практически любой объект 1С (включая структуры настроек компоновки) в бинарный вид и сохранить его в базе данных.

Шаг 1: Подготовка метаданных документа

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

  1. Найдем нужный документ (в нашем примере это УстановкаЦенНаИзделияВГородах).
  2. Создадим новый реквизит с именем ОтборНастроек.
  3. Установим для него тип ХранилищеЗначения.

Важный нюанс: данные в ХранилищеЗначения нельзя напрямую отобразить в списке документов или использовать в запросах. Если вам требуется видеть текстовое описание отбора в списке, рекомендуется создать дополнительный строковый реквизит, куда вы будете записывать «человекочитаемое» представление фильтра.

Шаг 2: Программное сохранение настроек при создании документа

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

Проанализируем пример кода, выполняющего массовое создание документов:


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

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

Шаг 3: Разница между «Настройками» и «Пользовательскими настройками»

При работе с СКД важно понимать различие между двумя коллекциями настроек. Рассмотрим, что лучше сохранять:

  1. КомпоновщикНастроек.Настройки — это полная схема настроек, включающая отборы, группировки и выбранные поля.
  2. КомпоновщикНастроек.ПользовательскиеНастройки — это только те элементы, которые вынесены пользователю «на форму» (отмечены звездочкой).

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

Шаг 4: Восстановление настроек в форме документа

Теперь выясним, как получить сохраненные данные обратно при открытии формы документа. Этот процесс выполняется в несколько этапов на сервере.

Проанализируем процедуру ПриЧтенииНаСервере или создание обработчика в форме документа:


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

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

Шаг 5: Получение «человеческого» представления отбора

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

Рассмотрим, как программно получить строку представления:


// Пример получения текстового описания
Настройки = КомпоновщикНастроек.ПолучитьНастройки();
ТекстОтбора = "";
Для каждого Элемент Из Настройки.Отбор.Элементы Цикл
    Если Элемент.Использование Тогда
        ТекстОтбора = ТекстОтбора + Строка(Элемент.ЛевоеЗначение) + " " + 
                      Строка(Элемент.ВидСравнения) + " " + 
                      Строка(Элемент.ПравоеЗначение) + "; ";
    КонецЕсли;
КонецЦикла;

Такой подход позволит вам контролировать корректность сохраняемых данных и выводить информацию пользователю в понятном виде.

Дополнительные рекомендации и риски

При реализации данного механизма следует учитывать несколько важных моментов:

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

← На главную