Безопасный код – Option Explicit
Категория: Безопасный код
Название: Option Explicit
GUID: 5c11d53e-1dda-4ccb-9ce2-4ea01a9a142c
Версия: 1 от 26.12.07
Введение
Достаточно распространенной является ситуация, когда некая универсальная функция, объявленная с ключевым параметром Экспорт, в своём теле содержит присваивание неявно объявленных переменных.В этом случае существует вероятность того, что в функции, вызывающей эту универсальную функцию используются переменные с таким же именем, в результате чего, после выполнения универсальной функции, значение такой переменной в вызывающей функции будет изменено.
Пример:
Перем х;
Функция Универсальная() Экспорт
х = 1;
Сообщить("Внутри функции: "+ х);
Возврат "";
КонецФункции
Функция ИспользуетУниверсальную()
х = 6;
Сообщить("До вызова функции: "+ х);
Рез = Универсальная();
Сообщить("После вызова функции: "+ х);
// В этом месте значение х будет равно 1, // а должно быть х = 6
Возврат "";
КонецФункции
Для исключения подобных коллизий необходимо проверить каждую экспортную функцию на предмет полноты блока объявления переменных.
Но, как мы понимаем, это очень тяжелая задача для любой достаточно сложной функции. Поэтому помощь компьютера будет не лишней.
Реализация
При программировании универсальной функции любая внутренняя переменная должна быть объявлена в блоке объявления переменных. Использование переменных уровня приложения, внешнего соединения или модуля желательно свести к минимуму и "всячески документировать".Тестирование
В данной версии документы, переменные общего модуля, модуля внешнего приложения и уровня модуля не отслеживаются как исключения.В ходе теста формируется готовый, предположительно правильный блок объявлений переменных, который можно вставить в тело экспортной функции.
Шаг 1 Проверка общих модулей
Для каждой экспортной функции:
1. Создать список объявленных переменных
2. Найти все переменные из операции присваивание
3. Сформировать, при необходимости правильный блок объявлений переменных
Шаг 2 Проверка модулей объектов и модулей формы
1. Создать список реквизитов объекта
2. Создать список объявленных переменных
3. Создать список переменных модуля
4. Найти все переменные из операции присваивание
5. Сформировать, при необходимости правильный блок объявлений переменных