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, в модуле объектов переменные в операциях присваивания проверяются дополнительно на наличие в списке реквизитов объекта метаданного.

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

Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

См. также

Тестирование 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    11798    48    1    

22

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

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

12.05.2026    1497    gabrielyants    8    

12

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

Переход на Linux и PostgreSQL – серьезный этап для любой компании. Нагрузочное тестирование помогает пройти его без критических сбоев: заранее выявить узкие места, оценить поведение системы под реальной нагрузкой и снизить риск откатов после запуска. В статье разберем, почему миграция с Microsoft SQL Server и Windows на новую инфраструктуру требует отдельной проверки производительности, какие сценарии стоит включать в тест, как настраивать контур и мониторинг, как оценивать результаты и сколько времени реально занимает такой проект.

29.04.2026    933    kulmaksim    0    

3

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

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

20.04.2026    719    dankrav4    0    

2

Тестирование QA Программист 1С 8.3 Абонемент ($m)

Внешняя обработка позволяет генерировать автотесты.

1 стартмани

16.04.2026    659    1    Triplexx    0    

4

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

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

1 стартмани

10.04.2026    790    1    kiba    2    

8

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

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

10.04.2026    1257    batsy66    0    

8

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

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

03.04.2026    1102    romandredan    0    

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

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