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