TestIB8x - 0003 - Безопасный код - Option Explicit - первая реализация

16.01.08

Разработка - Тестирование QA

Был момент, когда захотелось задвинуть этот тест подальше, т.к. в Платформе 8.х защита от небрежного кодирования проработана хорошо. Достаточно перестать использовать экспортные переменные уровня приложения, внешнего соединения и переменные уровня модуля. После этого можно "клепать" код, даже не вымыв перед этим руки и не промыв мозги Ж-).
Спасибо, комментариям на прошлое обсуждение и нескольким письмам на мыло - сподвигли на завершение начатого.
Тест получился большой - более 900 строк на JScript, но кое-какие моменты все-таки остались ...

Предисловие к описанию реализации

Тест входит в состав TestIB8x v. 1.0.1 (выложен на основном сайте brix8x.stavr.ru, сюда буду выкладывать более крупные версии) Также поднят баг-трекер (bts.stavr.ru), есть возможность оставить свои замечания и пожелания.

В ходе реализации возникла одна проблема, решить которую сам пока не могу.

Средствами платформы не получается получить полный список реквизитов формы!

Таким образом, при проверке события ПриОткрытии() формы элемента, например, нет возможности оценить код типа "формаДата = ТекущаяДата()" как корректный или нет, есть вероятность, что формаДата - реквизит формы элемента.

Можно, конечно, выдвинуть идею о том, что если реквизит есть, то он должен быть на форме, после чего, создав OLE соединение получить форму (ПолучитьФорму()) и проанализировать все ЭлементыФормы на значение свойства Элемент.Данные; Но уж очень это некрасиво.

Можно, конечно, дописать в стандарт требование присваивать значения реквизитам формы через конструкцию ЭтаФорма.формаДата, т.к. нам все равно нужен красивый способ, глядя на код, понимать о чём это присваивание. Но задав это требование, мы не можем обеспечить проверку на его выполнение, а пустые слова никому не нужны.

Таким образом, я пока вижу один выход: Найти способ получать информацию о реквизитах форм из файла .cf.
На данный момент как это делается не знаю.
Никаких исходников в помощь нет. Желающих написать ActiveX наподобие старого доброго Rainbow тоже.
Буду рад любой помощи - ссылки на исходники, создание компоненты, другой способ получения реквизитов форм (есть ведь еще интерфейсные тесты).

А пока "ложные" срабатывания теста можно подавить, дополняя файл настроек теста.

0003 - Безопасный код – Option Explicit


Категория: Безопасный код
Название: Option Explicit
GUID: 5c11d53e-1dda-4ccb-9ce2-4ea01a9a142c
Версия: 2 от 15.01.08

Введение

Рассмотрим ситуацию с функцией, претендующей на роль универсальной, объявленной с ключевым параметром Экспорт, или еще нет, но тем не менее делающую нечто очень полезное.

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

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

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

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

Но вот код, указанный ниже потенциально небезопасен.

Пример:
Перем Ном;
Функция Универсальная() Экспорт

Ном = 1;

Возврат «»;

КонецФункции
Функция ИспользуетУниверсальную()

Перем Ном;

Ном = 6;
Сообщить(Ном); // Ном = 6

Рез =Универсальная();

Сообщить(Ном);
// Ном = 1, а ожидаем 6
Возврат «»;
КонецФункции

 

Возможно, так и задумано и переменная уровня модуля должна получить своё новое значение именно таким образом. Но с точки зрения сопровождения такая функция является функцией с «побочными» эффектами.

То же самое произойдет, если переменная Ном объявлена как экспортная в модуле приложения или внешнего соединения.

И это – плохой стиль программирования.

Желательно явно указывать все переменные, которые изменят свое значение или необходимы для работы функции в списке параметров или в качестве возвращаемого значения.

Реализация

1. Самый кардинальный метод 1 – полный отказ от использования переменных уровня приложения, внешнего соединения и модуля. В этом случае контролировать объявления локальных переменных нет необходимости, платформа нас защитит. Недостаток метода – функции из этой конфигурации могут приводить к ошибкам будучи перенесенными в другие, более лояльные конфигурации.
2. Кардинальный метод 2 – полный контроль за необходимостью объявления всех переменных, используемых в функции. Данный подход позволит получить действительно безопасный код, но требует большой внимательности даже для небольших по размеру функций.
3. В меру интеллектуальный метод – каждая функция проверяется на предмет наличия побочных присваиваний, но при этом присваивание значений переменным уровня приложения , модуля допустимы. Недостаток тот же, что и для первого метода – возможные проблемы при переносе функции в другие конфигурации.

Для каждой конфигурации может быть выбран любой из этих методов. Главное – документировать этот выбор и контролировать исполнение.

Особняком стоит объем проверяемых функций – Все или только экспортные, а также Проверять ли общие модули.

Выбор максималистов скорее всего Все, выбор минималистов – только экспортные, выбор пофигистов – тоже очевиден …

Тестирование

Объекты тестирования:
• Модуль приложения (AppModule)
• Модуль внешнего соединения (ComModule)
• Модуль сеанса [для 8.1] (SessionModule)
• Общие модули (CommonModules)
• Модули менеджера значений константы (ConstantModules)
• Модули объектов (ObjectModules)
• Модули форм (FormModules)
Параметры проверки объекта (список без учета специфики):
• Запрет экспортных переменных (disableExportVars)
• Запрет переменных модуля (disableModuleVars)
• Запрет необъявленных локальных переменных в локальных функциях (disableLocalVarsInExportFunc)
• Запрет необъявленных локальных переменных в экспортных функциях (disableLocalVarsInLocalFunc)

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

Т.к. COM-соединение позволяет получить список реквизитов объекта конфигурации, в модуле объекта мы можем определить присваивания реквизитам в контексте объекта.

Т.к. мы не имеем красивого способа получить список реквизитов формы, при тесте возможны «ложные» срабатывания на модуль формы в местах присваивания значений реквизитам формы.

Существует два решения данной проблемы:
1. Через конструкцию ЭтаФорма.Реквизит, тем более, что нам все равно нужно визуально отличать реквизиты форм от просто переменных.
2. Через занесение имени реквизита формы в файл исключений.

Ситуация может кардинально измениться, когда тест сможет оперировать метаданными непосредственно из файла .cf.

Шаг 1 Проверка каждого объекта проверки по четырем показателям


1. Проверить объявления экспортных переменных
2. Проверить объявления переменных уровня модуля
3. Проверить качество экспортных функций
4. Проверить качество локальных функций

Для пункта 4 и 5, в модуле объектов переменные в операциях присваивания проверяются дополнительно на наличие в списке реквизитов объекта метаданного.

Вступайте в нашу телеграмм-группу Инфостарт

См. также

Тестирование QA DevOps и автоматизация разработки Программист Пользователь 1С:Предприятие 8 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Налоговый учет Платные (руб)

Автотесты 1С - готовые тестовые сценарии, предназначенные для регресс-тестирования функционала конфигурации после обновления типовым релизом. Сценарии проверяют интерактивное заполнение форм документов, справочников и результат проведения документов. Сценарий – feature-файл, разработанный с помощью vanessa-automation. Запуск сценария выполняется интерактивно с помощью vanessa-automation или с помощью vanessa-runner в CI-системах. Доступно тестирование тонкого клиента. Поддерживаемые версии конфигураций 1С:Бухгалтерия предприятие 3.0 и версии КОРП: 3.0.190.11.

5368 руб.

20.01.2022    11458    48    1    

21

DevOps и автоматизация разработки Тестирование QA Программист Пользователь 1С:Предприятие 8 1С:Зарплата и Управление Персоналом 3.x Россия Бухгалтерский учет Платные (руб)

Автотесты 1С - готовые тестовые сценарии, предназначенные для регресс-тестирования функционала конфигурации после обновления типовым релизом. Сценарии проверяют интерактивное заполнение форм документов, справочников и результат проведения документов. Сценарий – feature-файл, разработанный с помощью vanessa-automation. Запуск сценария выполняется интерактивно с помощью vanessa-automation или с помощью vanessa-runner в CI-системах. Доступно тестирование тонкого клиента. Поддерживаемые версии конфигураций 1С:Зарплата и Управление Персоналом 3 и версии КОРП: 3.1.35.48.

5000 руб.

05.08.2024    5712    36    1    

20

Тестирование QA DevOps и автоматизация разработки Программист 1С:Предприятие 8 1С:ERP Управление предприятием 2 1С:Комплексная автоматизация 2.х Россия Бухгалтерский учет Налоговый учет Платные (руб)

Готовые тестовые сценарии, предназначенные для регресс-тестирования функционала конфигурации после обновления типовым релизом. Сценарии проверяют интерактивное заполнение форм документов, справочников и результат проведения документов. Сценарии возможно использовать как для vanessa-automation, так и для СППР. Поддерживаемые версии конфигураций ERP2 и КА2: 2.5.22.145.

5000 руб.

04.07.2022    13436    50    1    

39

Тестирование QA Программист 1С 8.3 1С:Управление торговлей 10 1С:Управление производственным предприятием Абонемент ($m)

Сценарный анализ и тестирование документов "SmokeLab" (обычные формы): автоподбор документов, сценарное тестирование, анализ изменений, проверка форм и проведение, поддержка COM и JSON-логирование.

1 стартмани

10.04.2026    375    1    kiba    2    

7

Тестирование QA Программист Бесплатно (free)

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

10.04.2026    449    batsy66    0    

6

Перенос данных 1C Тестирование QA Программист Бесплатно (free)

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

03.04.2026    613    romandredan    0    

6

Тестирование QA Программист Бесплатно (free)

Когда проект небольшой, а релизы выходят редко, тестирование чаще всего строится интуитивно. Что-то проверили, что-то упустили – в худшем случае исправили по факту. Такой подход может работать годами, пока система не начинает расти. В данном случае рост проекта привел к устойчивой проблеме: релизы проходили тестирование, но уже после установки на продуктив появлялись ошибки, критические для бизнес-процессов. Частота post-deploy инцидентов росла, что снижало доверие пользователей, а команда все чаще работала в режиме реагирования вместо плановой разработки.

23.03.2026    952    str3am    1    

2

Тестирование QA Программист Бесплатно (free)

Рассматриваем практический подход к автоматизации тестирования в среде 1С, который позволяет эффективно работать даже при ограниченных ресурсах и большом разнообразии систем. Объясняем, как построена пирамида автотестов, и как используется подход DDT. В статье описан собственный фреймворк тестирования, обеспечивающий универсальность, расширяемость и удобство поддержки. Она будет полезна специалистам любого уровня, которые работают с автоматизацией тестирования в 1С и смежных системах.

26.02.2026    928    K_Mixa    0    

2
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Cheshirscy 21.01.08 10:11 Сейчас в теме
На счет реквизитов формы.
Я выкручивался так. Посмотри что дает метод "ЗначениеВСтрокуВнутр" для объекта "форма", вот по этому тексту как раз можно понять какие реквизиты есть у формы, но правда текст долго анализируется, хотя.. может если его регулярными выражениями попытать....
2. brix8x 530 22.01.08 10:02 Сейчас в теме
Спасибо огромное! Этого вполне достаточно. Один минутс - нужно получать через OLE, через COM нельзя.
Но самое классное, что те же самые данные можно получать в будущем из .cf.
Поэтому пока оставлю .cf в покое и научусь парсить полученные данные Ж-)
3. native-api 30 11.07.24 14:17 Сейчас в теме
Форма БСП ФормаОтчета для получения списка предопределенных реквизитов (чтобы отличить их от динамически создаваемых для настроек отчета) в ПриСозданииНаСервере вызывает ПолучитьРеквизиты().

ФормаКлиентскогоПриложения (ClientApplicationForm)
ПолучитьРеквизиты (GetAttributes)
Синтаксис:
ПолучитьРеквизиты(<Путь>)
Параметры:
<Путь> (необязательный)
Тип: Строка.
Указывает путь к родительскому реквизиту. Если параметр опущен или указана пустая строка, возвращаются реквизиты верхнего уровня.
Возвращаемое значение:
Тип: Массив.
Массив объектов РеквизитФормы.
Описание:
Получает описание реквизитов формы.
Доступность:
Сервер, мобильное приложение (сервер), мобильный автономный сервер.
Использование в версии:
Доступен, начиная с версии 8.2.
Показать
Для отправки сообщения требуется регистрация/авторизация