В процессе разработки на платформе 1С:Предприятие 7.7 программисты часто сталкиваются с необходимостью динамического управления данными в форме. Типичная ситуация: у формы включено стандартное свойство "Сохранять настройки", и при открытии поля заполняются корректно. Однако при интерактивном изменении одних полей значения в других могут очищаться или перезаписываться, и возникает задача — как программно вернуть то самое "первоначальное" значение, которое было загружено из настроек при открытии, не закрывая саму форму?
В этой статье мы подробно разберем, почему стандартные методы могут не работать, проанализируем внутренние механизмы платформы и рассмотрим несколько эффективных способов решения этой задачи.
Для начала проанализируем ситуацию, с которой столкнулся автор темы. Попытка использовать функцию ВосстановитьЗначение() для получения данных, сохраненных через стандартный механизм настроек формы (галочка в свойствах формы), обречена на неудачу. Выясним причину этого поведения.
В 1С 7.7 существует два принципиально разных механизма хранения данных:
.lst в каталоге пользователя или файлы 1cv7.cfg). Доступ к этим данным из программного кода встроенного языка крайне ограничен.СохранитьЗначение() и ВосстановитьЗначение() работают с отдельным списком значений, привязанным к пользователю, но никак не связанным с конкретным файлом настроек конкретной формы, если разработчик не реализовал эту связь принудительно.Таким образом, когда мы вызываем ВосстановитьЗначение("ГруппаРодитель"), система ищет значение в глобальном хранилище по ключу "ГруппаРодитель", а не в файле настроек формы. Поскольку вручную мы туда ничего не сохраняли, функция возвращает пустое значение или 0.
Рассмотрим самый простой и надежный "классический" подход. Если нам нужно иметь возможность "откатиться" к настройкам, которые были загружены при старте, мы можем просто запомнить их в переменные модуля формы. Проанализируем, как это реализовать на практике.
В разделе объявлений переменных модуля формы определим переменные для хранения эталонных значений:
Перем Эталон_Поле1, Эталон_Поле2;
Теперь в предопределенной процедуре ПриОткрытии(), которая вызывается уже после того, как система автоматически восстановила настройки в реквизитах формы, зафиксируем эти данные:
Процедура ПриОткрытии()
// К этому моменту Поле1 уже заполнено из системных настроек
Эталон_Поле1 = Поле1;
Эталон_Поле2 = Поле2;
КонецПроцедуры
Теперь, если в процессе работы нам нужно вернуть значение Поле1 к исходному состоянию (например, если в Поле2 было выбрано пустое значение), мы просто обращаемся к нашей переменной:
Процедура ПриИзмененииПоля2()
Если ПустоеЗначение(Поле2) = 1 Тогда
// Восстанавливаем из локального кэша
Поле1 = Эталон_Поле1;
Форма.Обновить(0);
КонецЕсли;
КонецПроцедуры
Если нам требуется более гибкое решение, которое позволяет восстанавливать значения даже после того, как пользователь интерактивно перевыбрал и пересохранил настройки формы в процессе сеанса, воспользуемся предопределенными процедурами ПриЗаписиНастройки() и ПриЧтенииНастройки(). Посмотрим, как это работает.
Эти процедуры вызываются платформой в моменты, когда пользователь взаимодействует со стандартным диалогом сохранения настроек формы. Мы можем использовать их, чтобы дублировать системные настройки в программное хранилище.
Добавим следующий код в модуль формы:
Процедура ПриЗаписиНастройки(ИмяНастройки)
// Когда пользователь сохраняет настройки формы под каким-то именем,
// мы дублируем нужное нам значение в глобальное хранилище
СохранитьЗначение("ЗапаснойВариант_Поле1", Поле1);
КонецПроцедуры
Процедура ПриЧтенииНастройки(ИмяНастройки)
// Когда пользователь выбирает другую настройку из списка,
// обновляем наше "запасное" значение
СохранитьЗначение("ЗапаснойВариант_Поле1", Поле1);
КонецПроцедуры
Теперь программное восстановление будет работать корректно, так как ключ в хранилище будет всегда актуален:
Если ПустоеЗначение(Поле2) = 1 Тогда
ВремЗнач = "";
ВосстановитьЗначение("ЗапаснойВариант_Поле1", ВремЗнач);
Поле1 = ВремЗнач;
КонецЕсли;
Важно помнить о нюансе, упомянутом в синтакс-помощнике и обсужденном на форуме: работа с объектами типа СписокЗначений через ВосстановитьЗначение() требует особого внимания. Проанализируем правильный алгоритм работы с этим типом данных.
Если ваш реквизит формы является списком значений, метод ВосстановитьЗначение() не возвращает новый объект, а заполняет существующий. Рассмотрим пример:
// Правильный подход для СпискаЗначений
МойСписок = СоздатьОбъект("СписокЗначений"); // Обязательно инициализируем объект
ВосстановитьЗначение("ИмяНастройкиСписка", МойСписок);
// Теперь МойСписок содержит восстановленные элементы
Если вы попытаетесь использовать функцию как возвращающую значение (Сз = ВосстановитьЗначение(...)) для объекта типа СписокЗначений, вы можете получить пустой результат или ошибку типов, так как в 7.7 этот метод в контексте объектов ведет себя как процедура, модифицирующая переданный параметр.
Подводя итог нашему анализу, можно выделить следующие рекомендации для работы в 1С 7.7:
СохранитьЗначение/ВосстановитьЗначение. Это разные механизмы.ПриЗаписиНастройки и ПриЧтенииНастройки, чтобы синхронизировать системные действия пользователя с вашим программным кодом.Форма.Обновить() после программного изменения реквизитов, чтобы пользователь сразу увидел результат на экране.Использование этих подходов позволит сделать интерфейс ваших обработок и отчетов более "умным" и дружелюбным к пользователю, избавляя его от необходимости повторного ввода данных при случайных изменениях.