Перейти к содержанию
#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: Использование параметров сеанса.

См. также
Проверки

#bslls:ExportVariables

Источник

https://its.1c.ru/db/v8std#content:639