При разработке сложных инструментов автоматизации, таких как обработки для группового создания документов, часто возникает необходимость не просто сформировать новые объекты, но и «запомнить» условия, при которых они были созданы. В этой статье мы подробно разберем, как сохранить параметры отбора из формы в реквизит документа и как в дальнейшем восстановить эти настройки для повторного использования или анализа.
Рассмотрим ситуацию: у нас есть форма «Групповое создание документов», на которой размещен КомпоновщикНастроек. Пользователь устанавливает сложные фильтры по номенклатуре, характеристикам или складам. Нам требуется, чтобы каждый созданный документ хранил в себе этот уникальный отбор. Это позволит при открытии документа точно понимать, какие позиции в него попали и по какому принципу они были отобраны.
Основным механизмом для решения этой задачи в платформе 1С:Предприятие 8.3 является использование реквизита с типом ХранилищеЗначения. Этот тип данных позволяет упаковать практически любой объект 1С (включая структуры настроек компоновки) в бинарный вид и сохранить его в базе данных.
Прежде всего, нам необходимо модифицировать структуру документа. Перейдем в конфигуратор и выполним следующие действия:
УстановкаЦенНаИзделияВГородах).ОтборНастроек.Важный нюанс: данные в ХранилищеЗначения нельзя напрямую отобразить в списке документов или использовать в запросах. Если вам требуется видеть текстовое описание отбора в списке, рекомендуется создать дополнительный строковый реквизит, куда вы будете записывать «человекочитаемое» представление фильтра.
Разберем процесс сохранения настроек в момент программного формирования документов. Допустим, на форме обработки у нас есть объект КомпоновщикНастроек, путь к данным которого связан с настройками компоновки. Нам нужно передать текущее состояние отбора в создаваемый объект ДокументОбъект.
Проанализируем пример кода, выполняющего массовое создание документов:
// Фрагмент кода в обработке группового создания
Для каждого СтрокаГорода Из ГородаЗаполнения Цикл
ДокументОбъект = Документы.УстановкаЦенНаИзделияВГородах.СоздатьДокумент();
ДокументОбъект.Дата = ДатаДокумента;
ДокументОбъект.Автор = Пользователи.ТекущийПользователь;
// Помещаем настройки отбора в ХранилищеЗначения
// Мы сохраняем не весь компоновщик, а именно объект Настройки.Отбор
ДокументОбъект.ОтборНастроек = Новый ХранилищеЗначения(КомпоновщикНастроек.Настройки.Отбор);
ДокументОбъект.ЗаполнитьЦены(ДанныеЗаполнения);
ДокументОбъект.Записать(РежимЗаписиДокумента.Запись);
КонецЦикла;
В данном примере мы используем конструктор Новый ХранилищеЗначения(Объект). В качестве объекта мы передаем КомпоновщикНастроек.Настройки.Отбор. Это позволяет сохранить именно те элементы отбора (левое значение, вид сравнения, правое значение), которые были интерактивно или программно заданы пользователем.
При работе с СКД важно понимать различие между двумя коллекциями настроек. Рассмотрим, что лучше сохранять:
Если ваша задача — восстановить форму именно в том виде, в котором её видел пользователь, лучше сохранять Настройки целиком. Однако, если вы хотите сохранить только логику фильтрации, достаточно сохранить Отбор. Мы рекомендуем сохранять объект Настройки, так как это более универсальный подход.
Теперь выясним, как получить сохраненные данные обратно при открытии формы документа. Этот процесс выполняется в несколько этапов на сервере.
Проанализируем процедуру ПриЧтенииНаСервере или создание обработчика в форме документа:
&НаСервере
Процедура ВосстановитьОтборИзХранилища()
// Получаем значение из реквизита объекта
СохраненныйОтбор = Объект.ОтборНастроек.Получить();
Если ТипЗнч(СохраненныйОтбор) = Тип("ОтборКомпоновкиДанных") Тогда
// Загружаем отбор в текущий компоновщик формы
// Обратите внимание: путь может зависеть от структуры вашей формы
КомпоновщикНастроек.Настройки.Отбор = СохраненныйОтбор;
КонецЕсли;
КонецПроцедуры
После выполнения этого кода элементы отбора появятся в таблице компоновщика на форме. Однако помните, что после программного изменения настроек компоновщика может потребоваться вызвать метод КомпоновщикНастроек.Инициализировать(), если форма создается «с нуля» без привязки к существующей схеме компоновки данных.
Часто программисты задаются вопросом: как проверить, что именно сохранилось в ХранилищеЗначения, не загружая это в форму? Для визуализации отбора в удобном текстовом виде (например, для записи в комментарий) можно использовать КомпоновщикМакетаКомпоновкиДанных.
Рассмотрим, как программно получить строку представления:
// Пример получения текстового описания
Настройки = КомпоновщикНастроек.ПолучитьНастройки();
ТекстОтбора = "";
Для каждого Элемент Из Настройки.Отбор.Элементы Цикл
Если Элемент.Использование Тогда
ТекстОтбора = ТекстОтбора + Строка(Элемент.ЛевоеЗначение) + " " +
Строка(Элемент.ВидСравнения) + " " +
Строка(Элемент.ПравоеЗначение) + "; ";
КонецЕсли;
КонецЦикла;
Такой подход позволит вам контролировать корректность сохраняемых данных и выводить информацию пользователю в понятном виде.
При реализации данного механизма следует учитывать несколько важных моментов:
ХранилищаЗначения может возникнуть ошибка или элемент отбора просто исчезнет. Всегда используйте конструкцию Попытка ... Исключение при чтении настроек.СериализаторXDTO), что позволит более гибко обрабатывать изменения структуры данных.ХранилищеЗначения работает быстро, старайтесь не сохранять избыточные данные (например, все доступные поля компоновки), если вам нужен только простой фильтр.Таким образом, мы рассмотрели полный цикл работы с параметрами отбора: от их захвата в форме группового создания до надежного хранения в теле документа и последующего восстановления. Использование ХранилищаЗначения в сочетании с объектами КомпоновщикНастроек делает систему гибкой и удобной для конечного пользователя.