Как реализовать счетчик нажатий на кнопку во внешней обработке с сохранением значения после перезапуска 1С

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

При разработке внешних обработок на платформе 1С:Предприятие 8.3 начинающие программисты часто сталкиваются с задачей сохранения состояния данных. Обычные переменные в коде существуют только до тех пор, пока открыта форма или выполняется процедура. Чтобы реализовать счетчик, который «помнит» свое значение даже после закрытия программы, необходимо использовать механизмы платформенного хранения настроек или сохраняемых реквизитов формы.

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

Причина ошибки: почему значение сбрасывается или возникает ошибка переменной

Разберем типичную ошибку новичка. Рассмотрим код, который часто пытаются написать на начальном этапе:


&НаКлиенте
Процедура Команда1(Команда)     
    Реквизит1 = 0; // ОШИБКА: Обнуление при каждом нажатии
    Реквизит1 = Реквизит1 + 1;
    Сообщить(Реквизит1);
КонецПроцедуры

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

Решение 1: Использование автоматического сохранения настроек формы

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

Разберем по шагам, как это настроить:

  1. Откроем редактор внешней обработки и перейдем на вкладку «Данные».
  2. Создадим новый реквизит (не формы, а объекта или формы — в данном случае удобнее создать Реквизит формы) с именем СчетчикНажатий и типом Число.
  3. Перейдем на закладку «Формы» и откроем основную форму обработки.
  4. В правой панели свойств самой формы (нужно нажать на корень дерева элементов формы) найдем раздел «Использование».
  5. Установим флаг «Автоматическое сохранение данных в настройках».
  6. В поле «Хранилище настроек» обычно оставляют ХранилищеСтандартныхНастроек.
  7. Теперь самое важное: перейдем в список реквизитов формы (правая верхняя часть редактора), выберем наш реквизит СчетчикНажатий и в его свойствах установим галочку «Сохранение».

После этих манипуляций код кнопки будет выглядеть предельно просто:


&НаКлиенте
Процедура КомандаНажатие(Команда)
    // Обращаемся к реквизиту формы напрямую
    СчетчикНажатий = СчетчикНажатий + 1;
    Сообщить("Кнопка нажата раз: " + СчетчикНажатий);
КонецПроцедуры

Важный нюанс: Чтобы данные сохранились гарантированно, форма должна быть закрыта корректно. Если нужно сохранить значение немедленно в момент нажатия, проанализируем использование метода ЭтаФорма.ЗаписатьВНастройки().

Решение 2: Программное управление через ХранилищеОбщихНастроек

Если автоматическое сохранение по каким-то причинам не подходит (например, нужно хранить разные счетчики для разных условий), воспользуемся объектом ХранилищеОбщихНастроек. Этот метод позволяет программно записывать и считывать данные из системной базы данных 1С, привязывая их к пользователю.

Рассмотрим алгоритм реализации:

1. При открытии формы нам нужно восстановить значение. Это делается в процедуре ПриСозданииНаСервере:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    // КлючОбъекта - это имя нашей настройки, КлючНастроек - уточнение (например, имя пользователя)
    ЗначениеНастройки = ХранилищеОбщихНастроек.Загрузить("МояОбработкаСчетчик", "ОбщийСчетчик");
    
    Если ЗначениеНастройки <> Неопределено Тогда
        СчетчикНажатий = ЗначениеНастройки;
    Иначе
        СчетчикНажатий = 0;
    КонецЕсли;
КонецПроцедуры

2. При нажатии на кнопку мы увеличиваем значение и сохраняем его:


&НаКлиенте
Процедура КомандаНажатие(Команда)
    СчетчикНажатий = СчетчикНажатий + 1;
    СохранитьСчетчикНаСервере(СчетчикНажатий);
    Сообщить("Текущий номер нажатия: " + СчетчикНажатий);
КонецПроцедуры

&НаСервере
Процедура СохранитьСчетчикНаСервере(Значение)
    ХранилищеОбщихНастроек.Сохранить("МояОбработкаСчетчик", "ОбщийСчетчик", Значение);
КонецПроцедуры

Решение 3: Работа с реквизитами объекта

Если СчетчикНажатий был создан как реквизит самой Обработки (на вкладке «Данные» в корне объекта), а не как реквизит формы, то обращение к нему в коде управляемой формы имеет свои особенности. Выясним причину ошибки «Неопределенная переменная» в этом контексте.

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


&НаКлиенте
Процедура Команда1(Команда)
    // Правильное обращение к реквизиту обработки
    Объект.СчетчикНажатий = Объект.СчетчикНажатий + 1;
    Сообщить(Объект.СчетчикНажатий);
КонецПроцедуры

Однако помните: реквизиты объекта во внешней обработке (.epf) не сохраняются автоматически между сеансами работы программы, если они не привязаны к механизму сохранения настроек формы, описанному в первом решении. Использование Объект.Реквизит полезно только для удержания значения в рамках одного сеанса работы с открытым окном обработки.

Сравнение методов сохранения

Проанализируем, какой метод выбрать в зависимости от ситуации:

Для учебной версии и большинства практических задач Решение №1 (флаги сохранения в свойствах формы) является стандартным и наиболее правильным подходом в среде управляемого приложения 1С.

← На главную