Використання глобальних змінних у програмних модулях
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. Змінні керованого та звичайного застосунку слід використовувати для зберігання «клієнтських параметрів сеансу». Докладніше див. статтю Використання параметрів сеансу.