Область применения: управляемое приложение, мобильное приложение, обычное приложение.
1. В большинстве случаев, вместо переменных программных модулей следует использовать более подходящие средства разработки платформы 1С:Предприятие. Поскольку область видимости (использования) таких переменных сложно контролировать, то они зачастую становятся источником трудновоспроизводимых ошибок.
Примеры некорректного использования и исключений из этого правила приведены далее. Рекомендации по оформлению переменных в коде программных модулей см. в статье Структура модуля.
2. Неоправданные примеры использования переменных в модулях объектов (справочников, документов, наборов записей, обработок, отчетов и пр.).
2.1. Для передачи параметров между обработчиками подписок на события и в обработчики событий модуля объекта из внешнего кода рекомендуется использовать свойство объекта ДополнительныеСвойства. Например, неправильно:
Перем КонвертацияФайлов Экспорт;
Процедура ПередЗаписью(Отказ)
Если КонвертацияФайлов Тогда
...
КонецПроцедуры
// вызывающий код
ФайлОбъект.КонвертацияФайлов = Истина;
ФайлОбъект.Записать();
Правильно:
Процедура ПередЗаписью(Отказ)
Если ДополнительныеСвойства.Свойство("КонвертацияФайлов") Тогда
...
КонецПроцедуры
// вызывающий код
ФайлОбъект.ДополнительныеСвойства.Вставить("КонвертацияФайлов", Истина);
ФайлОбъект.Записать();
В то же время, для передачи внутренних параметров между обработчиками событий модуля объекта целесообразно использовать неэкспортные переменные модуля объекта, которые недоступны из внешнего кода.
Например:
Перем ПредыдущееЗначениеОрганизации; // значение реквизита "Организация" до записи объекта в базу
Процедура ПередЗаписью(Отказ)
ПредыдущееЗначениеОрганизации = ...; // с помощью запроса выясняем значение до записи объекта в базу
КонецПроцедуры
Процедура ПриЗаписи(Отказ)
Если ПредыдущееЗначениеРеквизита <> Организация Тогда
// отрабатываем изменение значения реквизита при записи
...
КонецЕсли;
КонецПроцедуры
2.2. Для обработки кодов возврата (ошибок) в логике программного модуля рекомендуется использовать строковые константы.
Например, неправильно:
Перем НетОшибок,
Ошибка_ОбработкиПроверкиЗаполнения, // возникает, если обработка проверки заполнения вернула отказ
Ошибка_ЗаписиОбъекта, // возникает, если во время записи объекта возникло исключение
Ошибка_БлокировкиОбъекта, // возникает, при попытке блокировки объекта
Процедура ВыполнитьПерерасчет()
...
Результат = ОбработатьДокументы(...);
Если Результат = Ошибка_ЗаписиОбъекта Тогда
...
ИначеЕсли Результат = Ошибка_БлокировкиОбъекта Тогда
...
ИначеЕсли ...
КонецПроцедуры
...
НетОшибок = 1;
Ошибка_ОбработкиПроверкиЗаполнения = 2;
Ошибка_ЗаписиОбъекта = 3;
Ошибка_БлокировкиОбъекта = 4;
правильно:
Процедура ВыполнитьПерерасчет()
...
Результат = ОбработатьДокументы(...);
Если Результат = "ОшибкаЗаписиОбъекта" Тогда
...
ИначеЕсли Результат = "ОшибкаБлокировкиОбъекта" Тогда
...
ИначеЕсли ...
КонецПроцедуры
2.3. Для кеширования долго-вычисляемых и часто-используемых значений в процедурах и функциях рекомендуется применять модули с повторным использованием возвращаемых значений на время вызова сервера.
Исключение из этого правила составляют случаи, когда по соображениям безопасности возвращать результат вычисления в экспортной функции недопустимо. В этом случае они размещаются в локальной переменной модуля.
3. Неоправданные примеры использования переменных в модулях форм.
3.1. Для кеширования долго-вычисляемых и часто-используемых значений в процедурах и функциях рекомендуется применять модули с повторным использованием возвращаемых значений.
При этом не следует кешировать статическую и легко вычисляемую информацию. В частности, не следует кешировать в клиентских переменных модуля формы значения предопределенных элементов и перечислений. Для их получения на клиенте предназначен метод ПредопределенноеЗначение.
3.2. Для хранения и передачи промежуточных результатов вычислений между разными процедурами и функциями формы следует использовать
Исключение из этого правила составляют случаи использования клиентских переменных формы для хранения промежуточных результатов в обработчиках ожидания формы, в обработчиках внешних событий и в клиентских обработчиках событий элементов формы.
Например:
&НаКлиенте
Перем ПорядковыйНомерИзображения; // счетчик-нумератор для наименования файлов при сканирования нескольких изображений
...
&НаКлиенте
Процедура ВнешнееСобытие(Источник, Событие, Данные)
Если Источник = "TWAIN" И Событие = "ImageAcquired" Тогда
Если ПорядковыйНомерИзображения = Неопределено Тогда
ПорядковыйНомерИзображения = 1;
КонецЕсли;
ПорядковыйНомерИзображения = ПорядковыйНомерИзображения + 1;
// Сохранение отсканированного документа в файл с номером ПорядковыйНомерИзображения
// ...
КонецЕсли;
КонецПроцедуры
4. Переменные управляемого и обычного приложения следует использовать для хранения «клиентских параметров сеанса». Подробнее см. статью Использование параметров сеанса.