Тесты в расширении конфигурации 1С: Vanessa ADD, xddTestRunner и CI в Jenkins

05.10.26

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

Пошагово переносим модульные тесты из EPF в расширение конфигурации 8.3, подключаем Vanessa ADD и xddTestRunner и выводим тот же прогон в Jenkins. Разберём заимствование модулей, заглушки через переопределение и минимальную обвязку ЗаполнитьНаборТестов.

Приём 1. Зачем переносить тесты из EPF в расширение

Тема статьи: модульные тесты в расширениях конфигурации 1С:Предприятие 8.3, прогон через Vanessa ADD и xddTestRunner и включение того же набора в CI, в том числе Jenkins. Если вы уже писали хУнит-тесты во внешних обработках, задача здесь та же, но код лежит рядом с общими модулями конфигурации, а не в отдельном каталоге EPF.

В экосистеме 1С давно два привычных пути автотестов. Первый: тесты на языке 1С в стиле xUnit внутри Vanessa ADD. Второй: сценарии на Gherkin через Vanessa Automation. Gherkin удобен для UI, но это другой язык и другой контур сопровождения; для проверки функций общих модулей чаще берут код 1С.

У второго пути узкое место не в синтаксисе assert, а в подключении к проекту. Исторически внешний код в 1С жил во внешних обработках, и фреймворки, включая Vanessa ADD, умели обходить каталоги EPF, узнавать тестовые обработки и грузить их в раннер. Чем больше тестов, тем сильнее «epf hell»: параллель с dll hell, только вместо библиотек у вас десятки epf с самодельной иерархией.

Структурировать EPF по функциям редко получается: полного дерева функциональности у команды обычно нет. По подсистемам конфигурации тоже спотыкаемся: объекты «не входящие ни в одну подсистему» превращаются в длинный список, и всё равно приходится придумывать свою таксономию каталогов на диске.

С расширениями конфигурации (штатный механизм платформы 8.3) тестовый код становится частью метаданных: общие модули расширения, те же подсистемы, тот же поиск и сравнение/объединение, что у прикладного кода. Главная мысль простая: тесты в расширении - это те же общие модули, что вы и так сопровождаете; Vanessa ADD даёт тонкую обвязку регистрации, а xddTestRunner и CI подхватывают их без зоопарка обработок.

Я выгружаю расширение Tests в тот же репозиторий, что и cf; на схеме видно, куда на диске ложатся модули по сравнению с каталогом epf.

 

Репозиторий: cf, расширение Tests и модули.bsl
Репозиторий: cf, расширение Tests и модули.bsl

 

На схеме выше я сознательно противопоставил два способа хранения: бинарные EPF в сторонней папке и исходники расширения Tests рядом с конфигурацией. Второй вариант не отменяет дисциплины в Git, зато дерево тестов в раннере повторяет дерево общих модулей, а не список файлов epf.

Отдельное тестовое расширение (имя вроде Tests или Тест, префикс имён Тест) я оформляю как addon/patch по правилам вашей поставки. В продуктивной базе его можно не подключать; для Jenkins достаточно СИ-базы, куда расширение подключается всегда.

Порядок применения при обновлении основной конфигурации тот же, что у любого расширения: сначала платформа и конфигурация, затем расширения, затем проверка заимствований.

 

Приём 2. Заимствование модуля и заглушки через &Вместо

Расширение для тестов опирается на два механизма платформы, без общей лекции про все возможности расширений. Первый: заимствование существующего общего модуля конфигурации в расширение с префиксом, например Тест.

 

Контекст: Приём 2. Заимствование модуля и заглушки через &Вместо

 

Контекст: Приём 2. Заимствование модуля и заглушки через &Вместо

После заимствования модуль в расширении видит прикладной код так, как нужно для white-box проверок: доступны экспортные функции и процедуры, и внутренние, неэкспортные, если вы вызываете их из тестового модуля в том же расширении по правилам заимствования. Так проверяется логика, которую снаружи модуля не вызовешь.

Второй механизм: переопределение методов &Вместо и &После. Для модульных тестов это штатный способ заглушить HTTP, SOAP, почту или обращение к файловой системе без правок основной конфигурации. Один раз показываю паттерн на условном общем модуле обмена с НТТР-сервисом.

Чтобы не тянуть реальный HTTP в унит-прогон, фиксирую обмен на схеме: прикладной вызов остаётся прежним, подменяется только транспорт в расширении Tests.

 

Заглушка HTTP в расширении Tests
Заглушка HTTP в расширении Tests

 

На диаграмме запрос «уходит» в заглушку расширения, а не во внешний сервис. В модуле расширения процедура с &Вместо возвращает заранее подготовленную структуру или JSON, который разбирает прикладной код. Боевое расширение интеграций и тестовое лучше не смешивать: заглушки живут только в Tests, иначе на CI вы рискуете подменить поведение там, где нужен реальный обмен.

Пример фрагмента заглушки (имена модулей подставьте свои):

&Вместо("ВыполнитьHTTPЗапрос")
Функция Тест_ВыполнитьHTTPЗапрос(ПараметрыЗапроса)
	Ответ = Новый Структура;
	Ответ.Вставить("КодСостояния", 200);
	Ответ.Вставить("Тело", "{""status"":""ok""}");
	Возврат Ответ;
КонецФункции

Тело ответа для обмена можно держать в макете или JСОН-файле выгрузки расширения; для статьи достаточно показать, что возвращается структура, которую ждёт прикладной разбор.

{
  "status": "ok",
  "items": [
    {"id": "00000000-0000-0000-0000-000000000001", "qty": 1}
  ]
}

 

Приём 3. Минимальный проект: первый тест в общем модуле расширения

Беру учебный контур: один общий модуль прикладной логики с функцией проверки ссылки, условно СсылкаСуществует(Ссылка). Справочник может быть любым; важна сама функция, которая отличает битую ссылку от существующей.

 

Контекст: Приём 3. Минимальный проект: первый тест в общем модуле расширения

 

Контекст: Приём 3. Минимальный проект: первый тест в общем модуле расширения

Шаги в конфигураторе или EDT: создать расширение Tests, задать префикс Тест, заимствовать общий модуль, где лежит СсылкаСуществует. Добавить общий модуль Тест_ИмяПрикладногоМодуля (сервер, вызов сервера по вашим правилам).

Проверка на несуществующий UUID: формируем ссылку с заведомо несуществующим идентификатором и ждём Ложь. Так отсекаем регресс, когда функция начинает «верить» любой ссылке.

Функция Тест_СсылкаСуществует_НесуществующийИдентификатор() Экспорт
	
	Идентификатор = Новый УникальныйИдентификатор("aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee");
	НесуществующаяСсылка = Справочники.Номенклатура.ПолучитьСсылку(Идентификатор);
	Результат = ИмяПрикладногоМодуля.СсылкаСуществует(НесуществующаяСсылка);
	
	Возврат Результат;
	
КонецФункции

Имя справочника замените на свой объект метаданных; метод ПолучитьСсылку по UUID - штатный способ получить ссылку без записи в базе. Локально, до Vanessa ADD, можно временно вызвать функцию из консоли кода в той же СИ-базе и убедиться, что возвращается Ложь.

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

Запрос ниже повторяет типичную проверку «есть ли объект в базе» по ссылке; параметр передаём явно, без выборки всех полей.

ВЫБРАТЬ
	Номенклатура.Ссылка КАК Ссылка
ИЗ
	Справочник.Номенклатура КАК Номенклатура
ГДЕ
	Номенклатура.Ссылка = &Ссылка

Для несуществующего UUID результат пустой; прикладная функция должна интерпретировать это как «ссылки нет». Если у вас другой справочник, замените имя таблицы в запросе.

 

Приём 4. Обвязка Vanessa ADD: ЗаполнитьНаборТестов и утверждения

Код проверки почти не меняется по сравнению с ЕРF-тестом; меняется форма регистрации. В общем модуле расширения добавляем процедуру ЗаполнитьНаборТестов, как того требует Vanessa ADD.

 

Контекст: Приём 4. Обвязка Vanessa ADD: ЗаполнитьНаборТестов и утверждения

 

Контекст: Приём 4. Обвязка Vanessa ADD: ЗаполнитьНаборТестов и утверждения

Процедура ЗаполнитьНаборТестов(НаборТестов, КонтекстВанесса) Экспорт
	
	НаборТестов.Добавить("Тест_СсылкаСуществует_НесуществующийИдентификатор");
	
КонецПроцедуры

Контекст Ванесса передаётся вторым параметром: через него подключаются плагины. Для утверждений я подключаю «БазовыеУтверждения» и в теле теста оставляю две содержательные строки плюс одну служебную функцию на модуль.

Процедура Тест_СсылкаСуществует_НесуществующийИдентификатор(КонтекстВанесса) Экспорт
	
	Результат = Тест_СсылкаСуществует_НесуществующийИдентификаторЗначение();
	КонтекстВанесса.Плагин("БазовыеУтверждения").Проверить(Не Результат);
	
КонецПроцедуры

Функция Тест_СсылкаСуществует_НесуществующийИдентификаторЗначение()
	// вычисление результата, как в предыдущем фрагменте
	Возврат Ложь;
КонецФункции

Проверить(Не Результат) читается как «ожидаем, что ссылка не существует». Если плагин не найден, раннер упадёт при загрузке; это быстрее, чем silent pass. Сравнение с EPF: раньше та же процедура жила в обработке, теперь в.bsl рядом с заимствованным модулем.

Имена процедур в наборе должны совпадать с экспортными процедурами тестов; опечатка в строке Добавить даёт «тест прошёл мимо» без выполнения тела.

 

Приём 5. Загрузка и прогон в xddTestRunner

Открываю xddTestRunner (клиент тестирования или связка с Vanessa ADD, как настроено у вас). Ищу пункт загрузки тестов из расширения конфигурации, формулировка в интерфейсе может чуть отличаться по версии ADD.

 

Контекст: Приём 5. Загрузка и прогон в xddTestRunner

 

Контекст: Приём 5. Загрузка и прогон в xddTestRunner

Дальше выбор: загрузить одно расширение Tests или обойти все общие модули конфигурации. Для daily work я выбираю расширение: меньше шума, дерево группируется по общим модулям так же, как в метаданных.

После загрузки в дереве вижу узлы общих модулей расширения и зарегистрированные тесты. Запускаю прогон; красный тест смотрю по стеку и сообщению БазовыхУтверждений. Зелёный прогон в IDE - только половина цели; вторую половину закрывает CI.

Если тест не появился, проверяю: процедура ЗаполнитьНаборТестов экспортная, имя теста совпадает с добавленным в набор, расширение подключено к базе, модуль серверный там, где нужен серверный контекст.

Практический выигрыш для сопровождения: рефакторинг общего модуля и его тестового двойника в одном расширении идёт одним поиском по конфигурации; подсистемы Tests видны в дереве метаданных, а не только в README каталога epf.

 

Приём 6. Сопровождение в Git, отдельная IB и цепочка Jenkins

Общие модули расширения выгружаются в Git или EDT рядом с основной конфигурацией: каталог расширения, файлы модулей.bsl, manifest расширения. EPF в репозитории как бинарники хуже диff-ятся и хуже стыкуются с code review.

Для прогона использую отдельную информационную базу. Параметры запуска клиента тестирования и xddTestRunner задаю явно: сервер, база, пользователь, пароль через безопасное хранилище Jenkins. При необходимости базу сбрасываю из dt или поднимаю заново штатными средствами администрирования платформы, без самодельных «скриптов заказчика» в качестве единственного способа.

Для Jenkins мне важнее цикл целиком, чем вид job в UI; ниже порядок шагов от commit до exit code.

 

CI: выгрузка, IB, xddTestRunner, exit code
CI: выгрузка, IB, xddTestRunner, exit code

 

Цикл на схеме - тот же объект автоматизации, что вы грузите руками: сборка/выгрузка конфигурации и расширения, развёртывание IB, запуск Vanessa Automation, vanessa-runner или аналога из командной строки, код возврата job как критерий успеха. Конкретный Jenkinsfile зависит от ваших агентов и способа выгрузки; магии в самом Jenkins нет, важно, что раннер после «Загрузить тесты из расширения» видит тот же набор.

Типовая последовательность шагов job, которую я закладываю в pipeline: checkout репозитория; compile/load cf и cfe расширения в СИ-базу; запуск раннера с ключами non-interactive; архив junit или текстового лога при поддержке вашей версии ADD. Успех = нулевой exit code и отсутствие упавших тестов в отчёте.

Изоляция данных: не гоняю тесты на копии прода с живыми персональными данными. Отдельная IB с урезанным набором или с демо-дт экономит время на разбор инцидентов «тест изменил документ».

На агенте Jenkins я фиксирую версию платформы и список подключённых расширений в логе job; иначе «зелёный вчера» не воспроизводится, если агент обновили без вашего ведома.

 

Приём 7. Границы подхода и где чаще ошибаются

Тесты в расширении не отменяют клиентский или тонкий контекст для УИ-сценариев. Модульные и многие интеграционные проверки общих модулей - зона расширения плюс ADD; Gherkin и Vanessa Automation остаются для сценариев интерфейса. Смешивать в одном разделе инструкции не буду: это разные жанры прогона.

Полный отказ от EPF для всех видов тестов не обещаю. Обработка может жить, если так исторически устроен раннер или если тест по смыслу - отчёт. Цель - убрать epf hell для модульных тестов прикладных общих модулей.

При обновлении основной конфигурации заимствования могут потребовать повторного принятия изменений в расширении Tests. Я после каждого обновления конфигурации прогоняю compare расширения и один смоке-прогон xddTestRunner на СИ-базе.

Частый промах: забыть отключить тестовое расширение на продуктивной базе не только «на словах», но в списке подключённых расширений. Второй: заглушки &Вместо в боевом ратсн-расширении. Третий: гонять тесты на базе, где нет нужных метаданных основной конфигурации.

Вопрос: можно ли оставить старые ЕРF-тесты и параллельно расширение? Ответ: да, на переходный период; xddTestRunner позволяет грузить и обработки, и расширение. Я постепенно переношу модули, начиная с общих модулей с чистой логикой.

Вопрос: нужен ли EDT или хватит конфигуратора? Ответ: для статьи достаточно любого способа править расширение; в Гит-командах удобнее EDT, но механизм заимствования тот же.

Вопрос: что считать готовностью к CI? Ответ: один и тот же набор из расширения проходит локально в xddTestRunner и на агенте Jenkins без ручного клика «загрузить» в GUI; падение job воспроизводимо при сломанном тесте.

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

1С 8.3 расширения конфигурации Vanessa ADD xddTestRunner модульное тестирование CI/CD Jenkins тесты 1С расширение конфигурации модульные тесты CI заимствование общего модуля ЗаполнитьНаборТестов

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

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

См. также

Инструментарий разработчика Нейросети DevOps и автоматизация разработки Тестирование QA Разработчик 1С 8.3 Бесплатно (free)

Открытый набор правил и скриптов на GitHub для ИИ-агента (агента искусственного интеллекта: Claude Code, Codex и других). Агент сам снимает опись машины, предлагает путь проверки кода: плагин Unica или BSL Language Server со справкой платформы. С вашего «да» ставит недостающее, затем выгружает внешнюю обработку, заводит git и доводит её до зелёного теста YAxUnit. Оба пути проверены с нуля свежим агентом на копии демобазы «Управление торговлей» 11.5, платформа 8.3.27. Новая часть: для задач по данным базы агент выгружает конфигурацию в XML, строит карту объектов и пишет запросы только по именам, найденным в выгрузке. Внутри гайд «Unica на Windows» с известными ошибками и проверенными обходами.

10.11.2026    406    Iliaelagin    0    

1

Тестирование QA Разработчик 1С:Предприятие 8 Бесплатно (free)

Когда полная сборка автотестов занимает полчаса, даже небольшая автоматизация может изменить рабочий процесс. Рассказываю, как Python-утилита Phase Switcher постепенно превратилась в KOT for 1C — open-source расширение для VS Code. KOT 3.0 объединяет в одной рабочей среде библиотеку шагов и сценариев, IntelliSense, поддержку СППР и самостоятельных feature Vanessa Automation, исследователь форм, запись действий и управление выполнением через MCP. В статье — история разработки проекта от небольшой Python-утилиты до расширения для VS Code, практические примеры, неудачные эксперименты и решения, которые помогли инструменту прижиться в нашей команде.

02.11.2026    458    alexiosus    0    

2

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

Резкий рост числа пользователей, консолидация систем или миграция в облако требуют заранее понять, выдержит ли инфраструктура новую нагрузку. Рассказываем, как с помощью LLM команда за 16 недель подготовила и провела нагрузочные тесты для шести баз: автоматизировала анализ технологических журналов и журналов регистрации, формирование реалистичных сценариев и создание обработок для «1С:Тест-центра» и JMeter. Показываем, как оркестратор, AI-агенты и MCP-серверы помогают сократить объем ручной работы, а также объясняем, почему контроль со стороны 1С-эксперта по-прежнему остается обязательным. Разбираем архитектуру решения, уже работающие инструменты и направления дальнейшей автоматизации нагрузочного тестирования.

31.10.2026    527    gabrielyants    0    

5

Инструментарий разработчика Тестирование QA Разработчик Стажер 1С 8.3 Абонемент ($m)

Проверила пять пакетных команд платформы 8.3.27 на контрольном расширении Нано-УТ: они обнаружили 4 из 28 заложенных пунктов. В набор входят ошибки применимости, предупреждения и сведения для ручного разбора. Проверка XML-выгрузки отметила все 28 пунктов и 15 из 15 на похожем слепом наборе. Показываю журналы, ограничения и сценарий обновления основной конфигурации. Прилагаются инструмент с 69 тестами и материалы опыта.

7 стартмани

28.10.2026    387    Ninel_S    2    

2

Инструментарий разработчика Мобильная разработка Тестирование QA Разработчик 1С 8.3 Абонемент ($m)

Скрипт form_diff_mobile.py сравнивает две выгрузки конфигурации 1С и показывает, что в формах удалено и переименовано, где на это ещё ссылаются и какой код попадает в мобильные контексты. На «Нано-УТ 2.0» сделано 13 изменений форм: платформа 8.3.27.2130 отметила 7, в остальных шести промолчала, и в четырёх из них скрипт нашёл обращение к удалённому элементу, строку с прежним именем формы, смену директивы или выход формы из мобильной области. На чистой УТ 11.5 сравнение с копией дало 0 находок, а с копией с пятью правками ровно семь. В архивах скрипт, 74 теста, стенд, чек-лист выпуска, журнал выпуска и скрипты опытов на платформе.

7 стартмани

27.10.2026    343    Ninel_S    0    

1

Тестирование QA Разработчик 1С 8.3 Абонемент ($m)

Прогнала через 1С 8.3.27 и валидатор .NET 21 файл XML по одной схеме: базовый пример и типичные отклонения. Вердикты совпали в 20 случаях (у .NET включены предупреждения), дата без времени дала расхождение. В архиве - схема, тесты, закреплённая версия учебной базы и исправленный сценарий проверки, включая выгрузку и обратное чтение 30 продаж.

1 стартмани

26.10.2026    339    Ninel_S    0    

1

Рефакторинг и качество кода Тестирование QA Системный администратор Разработчик 1С 8.3 Абонемент ($m)

В базе 1С на PostgreSQL копятся индексы, которыми никто не пользуется: их создаёт флажок «Индексировать» у реквизитов или их добавляют вручную. Каждый такой индекс замедляет запись: в опыте на тестовой таблице восемь лишних индексов сделали вставку 300 000 строк в четыре-шесть раз дольше. Скрипт на Python смотрит статистику PostgreSQL и показывает, какие индексы ни разу не использовались и какой реквизит 1С их создал. На нашей конфигурации «Нано-УТ» он нашёл четыре ненужных индекса документа и один дубль, добавленный вручную. После того как я сняла флажки и обновила конфигурацию, индексов стало 227 вместо 234, данные не пострадали. В архиве скрипт, запросы и примеры.

5 стартмани

23.10.2026    505    Ninel_S    4    

1

Рефакторинг и качество кода Тестирование QA Разработчик 1С 8.3 Абонемент ($m)

Скрипт, который должен был проверять код 1С в Docker, на деле проверял только, что файл не пустой: из 11 модулей с ошибками он пропустил все. Я переписала проверку и сравнила её с самой 1С на тех же 11 модулях из нашей конфигурации «Нано-УТ». Новый скрипт нашёл незакрытые «Если», процедуры и скобки в 10 случаях из 11. Вызов несуществующей процедуры находит только сама 1С. В архиве скрипт, файлы для Docker, примеры с ошибками и журналы проверки.

5 стартмани

23.10.2026    491    Ninel_S    4    

0
Для отправки сообщения требуется регистрация/авторизация