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