Довідковий матеріал

Використання глобальних змінних у програмних модулях

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

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

Приклади некоректного використання та винятків із цього правила наведено далі. Рекомендації щодо оформлення змінних у коді програмних модулів див. у статті Структура модуля.

2. Необґрунтовані приклади використання змінних у модулях об'єктів (довідників, документів, наборів записів, обробок, звітів тощо).

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

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

Правильно:

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

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

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

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

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

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

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

правильно:

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

2.3. Для кешування значень, які довго обчислюються та часто використовуються, у процедурах і функціях рекомендується застосовувати модулі з повторним використанням значень, що повертаються, на час виклику сервера.

Винятком із цього правила є випадки, коли з міркувань безпеки повертати результат обчислення в експортній функції неприпустимо. У цьому разі їх розміщують у локальній змінній модуля.

3. Необґрунтовані приклади використання змінних у модулях форм.

3.1. Для кешування значень, які довго обчислюються та часто використовуються, у процедурах і функціях рекомендується застосовувати модулі з повторним використанням значень, що повертаються.

При цьому не слід кешувати статичну інформацію та інформацію, що легко обчислюється. Зокрема, не слід кешувати в клієнтських змінних модуля форми значення наперед визначених елементів і переліків. Для їх отримання на клієнті призначено метод ПредопределенноеЗначение.

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

  • Параметри процедур і функцій – для передавання результатів ланцюжком викликів дочірніх процедур і функцій у контексті одного виклику.
  • Реквізити форми – якщо потрібно зберігати проміжні результати між різними викликами з клієнта. (Слід мати на увазі, що значення серверних змінних модуля форми не зберігаються між викликами з клієнта.)

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

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

4. Змінні керованого та звичайного застосунку слід використовувати для зберігання «клієнтських параметрів сеансу». Докладніше див. статтю Використання параметрів сеансу.

Записатися телефоном