Меню


Курсы СтимулСправочникПолезные материалы1С:Предприятие 8.2РазработчикамСоглашения при написании ко…

1С:Предприятие 8.2 /
Разработчикам /
Соглашения при написании кода

Оглавление

Использование глобальных переменных в программных модулях

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

Примеры некорректного использования и исключений из этого правила приведены далее. Рекомендации по оформлению переменных в коде программных модулей см. в статье Структура модуля.

2. Неоправданные примеры использования переменных в модулях объектов (справочников, документов, наборов записей, обработок, отчетов и пр.).

2.1. Для передачи параметров между обработчиками подписок на события и в обработчики событий модуля объекта из внешнего кода рекомендуется использовать свойство объекта ДополнительныеСвойства. Например, неправильно:

Перем КонвертацияФайлов Экспорт;
Процедура ПередЗаписью(Отказ)
	Если КонвертацияФайлов Тогда 
		...
	 КонецПроцедуры 
	// вызывающий код
	ФайлОбъект.КонвертацияФайлов = Истина;
	ФайлОбъект.Записать();

Правильно:

Процедура ПередЗаписью(Отказ)
	Если ДополнительныеСвойства.Свойство("КонвертацияФайлов") Тогда 
		...
	КонецПроцедуры
	// вызывающий код
	ФайлОбъект.ДополнительныеСвойства.Вставить("КонвертацияФайлов", Истина);
	ФайлОбъект.Записать();

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

 Перем ПредыдущееЗначениеОрганизации; // значение реквизита " Организация " до записи объекта в базу
 Процедура ПередЗаписью(Отказ)
	 ПредыдущееЗначениеОрганизации = ...; // с помощью запроса выясняем значение до записи объекта в базу
 КонецПроцедуры
 Процедура ПриЗаписи(Отказ)
	 Если ПредыдущееЗначениеРеквизита <> Организация Тогда
		 // отрабатываем изменение значения реквизита при записи
		 ...
	 КонецЕсли;
 КонецПроцедуры

2.2. Для обработки кодов возврата (ошибок) в логике программного модуля рекомендуется использовать строковые константы.
Например, неправильно:

Перем НетОшибок,
Ошибка_ОбработкиПроверкиЗаполнения, // возникает, если обработка  проверки заполнения  вернула отказ
Ошибка_ЗаписиОбъекта, // возникает, если во время записи объекта возникло исключение
Ошибка_БлокировкиОбъекта, // возникает, при попытке блокировки объекта

Процедура ВыполнитьПерерасчет()
	...
	Результат = ОбработатьДокументы(...);
	Если Результат = Ошибка_ЗаписиОбъекта Тогда
		...
	ИначеЕсли Результат = Ошибка_БлокировкиОбъекта Тогда
		...
	ИначеЕсли 
		...
КонецПроцедуры

...
////////////////////////////////////////////////////////////////////////////////
// ИНИЦИАЛИЗАЦИЯ МОДУЛЯ
НетОшибок = 1;
Ошибка_ОбработкиПроверкиЗаполнения = 2;
Ошибка_ЗаписиОбъекта = 3;
Ошибка_БлокировкиОбъекта = 4;

правильно:

Процедура ВыполнитьПерерасчет()
	...
	Результат = ОбработатьДокументы(...);
	Если Результат = "ОшибкаЗаписиОбъекта" Тогда
		...
	ИначеЕсли Результат = "ОшибкаБлокировкиОбъекта" Тогда
		...
	ИначеЕсли 
		...
КонецПроцедуры

2.3. Для кеширования долго-вычисляемых и часто-используемых значений в процедурах и функциях рекомендуется применять модули с повторным использованием возвращаемых значений на время вызова сервера.

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

3. Неоправданные примеры использования переменных в модулях форм.

3.1. Для кеширования долго-вычисляемых и часто-используемых значений в процедурах и функциях рекомендуется применять модули с повторным использованием возвращаемых значений.

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

3.2. Для хранения и передачи промежуточных результатов вычислений между разными процедурами и функциями формы следует использовать

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

&НаКлиенте
Перем ПорядковыйНомерИзображения; // счетчик-нумератор для  наименования  файлов при сканирования нескольких  изображений 
...
&НаКлиенте
Процедура ВнешнееСобытие(Источник, Событие, Данные)
	Если Источник = "TWaIN" И Событие = "Imageacquired" Тогда
		Если ПорядковыйНомерИзображения =  Неопределено  Тогда
			ПорядковыйНомерИзображения = 1;
		КонецЕсли; 
		ПорядковыйНомерИзображения = ПорядковыйНомерИзображения + 1;
		//  Сохранение  отсканированного документа в файл с номером ПорядковыйНомерИзображения
		// ...
	КонецЕсли; 
КонецПроцедуры

4. Переменные управляемого и обычного приложения следует использовать для хранения «клиентских параметров сеанса». Подробнее см. статью Использование параметров сеанса.


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


Подписка на новости RSS     Добавьте в закладки Google fusion     Мы в Google+    

 

Мы ВКонтакте

 

Мы на Facebook