Как в 1С 7.7 программно получить значение из сохраненных настроек формы?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

В процессе разработки на платформе 1С:Предприятие 7.7 программисты часто сталкиваются с необходимостью динамического управления данными в форме. Типичная ситуация: у формы включено стандартное свойство "Сохранять настройки", и при открытии поля заполняются корректно. Однако при интерактивном изменении одних полей значения в других могут очищаться или перезаписываться, и возникает задача — как программно вернуть то самое "первоначальное" значение, которое было загружено из настроек при открытии, не закрывая саму форму?

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

Разберем причину: почему ВосстановитьЗначение() не помогает?

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

В 1С 7.7 существует два принципиально разных механизма хранения данных:

  1. Системные настройки формы: Когда пользователь нажимает кнопку "Сохранить настройки" в заголовке окна или когда форма закрывается с установленным флагом сохранения, данные записываются в специальные файлы конфигурации (обычно это файлы с расширением .lst в каталоге пользователя или файлы 1cv7.cfg). Доступ к этим данным из программного кода встроенного языка крайне ограничен.
  2. Глобальное хранилище значений: Методы СохранитьЗначение() и ВосстановитьЗначение() работают с отдельным списком значений, привязанным к пользователю, но никак не связанным с конкретным файлом настроек конкретной формы, если разработчик не реализовал эту связь принудительно.

Таким образом, когда мы вызываем ВосстановитьЗначение("ГруппаРодитель"), система ищет значение в глобальном хранилище по ключу "ГруппаРодитель", а не в файле настроек формы. Поскольку вручную мы туда ничего не сохраняли, функция возвращает пустое значение или 0.

Способ 1: Кэширование значений при открытии формы

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

В разделе объявлений переменных модуля формы определим переменные для хранения эталонных значений:

Перем Эталон_Поле1, Эталон_Поле2;

Теперь в предопределенной процедуре ПриОткрытии(), которая вызывается уже после того, как система автоматически восстановила настройки в реквизитах формы, зафиксируем эти данные:


Процедура ПриОткрытии()
    // К этому моменту Поле1 уже заполнено из системных настроек
    Эталон_Поле1 = Поле1;
    Эталон_Поле2 = Поле2;
КонецПроцедуры

Теперь, если в процессе работы нам нужно вернуть значение Поле1 к исходному состоянию (например, если в Поле2 было выбрано пустое значение), мы просто обращаемся к нашей переменной:


Процедура ПриИзмененииПоля2()
    Если ПустоеЗначение(Поле2) = 1 Тогда
        // Восстанавливаем из локального кэша
        Поле1 = Эталон_Поле1;
        Форма.Обновить(0);
    КонецЕсли;
КонецПроцедуры

Способ 2: Синхронизация системных настроек и программного хранилища

Если нам требуется более гибкое решение, которое позволяет восстанавливать значения даже после того, как пользователь интерактивно перевыбрал и пересохранил настройки формы в процессе сеанса, воспользуемся предопределенными процедурами ПриЗаписиНастройки() и ПриЧтенииНастройки(). Посмотрим, как это работает.

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

Добавим следующий код в модуль формы:


Процедура ПриЗаписиНастройки(ИмяНастройки)
    // Когда пользователь сохраняет настройки формы под каким-то именем,
    // мы дублируем нужное нам значение в глобальное хранилище
    СохранитьЗначение("ЗапаснойВариант_Поле1", Поле1);
КонецПроцедуры

Процедура ПриЧтенииНастройки(ИмяНастройки)
    // Когда пользователь выбирает другую настройку из списка,
    // обновляем наше "запасное" значение
    СохранитьЗначение("ЗапаснойВариант_Поле1", Поле1);
КонецПроцедуры

Теперь программное восстановление будет работать корректно, так как ключ в хранилище будет всегда актуален:


Если ПустоеЗначение(Поле2) = 1 Тогда
    ВремЗнач = "";
    ВосстановитьЗначение("ЗапаснойВариант_Поле1", ВремЗнач);
    Поле1 = ВремЗнач;
КонецЕсли;

Особенности работы с типом СписокЗначений

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

Если ваш реквизит формы является списком значений, метод ВосстановитьЗначение() не возвращает новый объект, а заполняет существующий. Рассмотрим пример:


// Правильный подход для СпискаЗначений
МойСписок = СоздатьОбъект("СписокЗначений"); // Обязательно инициализируем объект
ВосстановитьЗначение("ИмяНастройкиСписка", МойСписок);
// Теперь МойСписок содержит восстановленные элементы

Если вы попытаетесь использовать функцию как возвращающую значение (Сз = ВосстановитьЗначение(...)) для объекта типа СписокЗначений, вы можете получить пустой результат или ошибку типов, так как в 7.7 этот метод в контексте объектов ведет себя как процедура, модифицирующая переданный параметр.

Выводы и рекомендации

Подводя итог нашему анализу, можно выделить следующие рекомендации для работы в 1С 7.7:

Использование этих подходов позволит сделать интерфейс ваших обработок и отчетов более "умным" и дружелюбным к пользователю, избавляя его от необходимости повторного ввода данных при случайных изменениях.

← На главную