Предпродажная подготовка расширения 1С: что покажут выгрузка и Конфигуратор
Разработка - Инструментарий разработчика
Файлы
ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.
Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний
Оформите подписку на компанию для решения рабочих задач
Оформить подписку и скачать решение со скидкойВы можете заказать платную доработку или адаптацию этой разработки под вашу конфигурацию на «Бирже заказов».
- 0% комиссии — оплата напрямую исполнителю;
- Исполнители любого масштаба — от отдельных специалистов до команд под проект;
- Прямой обмен контактами между заказчиком и исполнителем;
- Безопасная сделка — при необходимости;
- Рейтинги, кейсы и прозрачная система откликов.
Перед продажей расширения нужна проверка, которая сравнивает его с основной конфигурацией и смотрит на то, что важно покупателю: свойства, перехваты, опасные вызовы, роли, мусор. Пакетные команды платформы делают это частично, и каждая свою часть.
- Привилегированный общий модуль отвергает /UpdateDBCfg, несовпадение режима совместимости видят /UpdateDBCfg и /CheckCanApply, команду формы без обработчика находит /CheckConfig только с ключом -HandlersExistence.
- Перехват исчезнувшей процедуры и устаревшее тело под
&ИзменениеИКонтрольвидит только /CheckCanApplyConfigurationExtensions. Обновление базы и проверки модулей и конфигурации после «обновления типовой» вернули код 0. - Неизвестные ключи /CheckConfig платформа принимает молча, поэтому тишина в журнале ничего не говорит о том, какие проверки прошли.
- ext_precheck.py нашёл 28 из 28 и 15 из 15 вслепую и проверяет одно расширение за 0,23–0,35 с, даже против выгрузки УТ 11.5, без базы и без платформы.
- В архиве инструмента программа, 69 тестов и README; в архиве к статье чек-лист, отчёты всех прогонов и расширенная PDF-версия статьи с полными журналами.
Проверка расширения перед продажей начинается со сравнения выгрузки расширения с выгрузкой основной конфигурации покупателя. Пакетные команды платформы остаются вторым шагом, и из них обязательно нужна /CheckCanApplyConfigurationExtensions.
Для кого: разработчики 1С, которые продают или передают заказчикам свои расширения и хотят найти дефекты до того, как их найдёт покупатель или его обновление типовой.
Расширение готово к продаже на Инфостарте или в Маркетплейсе. Перед отправкой его обычно прогоняют штатными проверками Конфигуратора и, если те молчат, считают чистым. Я заложила в контрольное расширение 28 дефектов, которые обходятся покупателю дорого, и проверила, сколько из них найдут пять пакетных команд платформы и сколько найдёт мой инструмент проверки выгрузки. Потом повторила то же на новом наборе вслепую и «обновила типовую» под работающим расширением.
Стенд
| Условие | Значение |
|---|---|
| Платформа | 1С:Предприятие 8.3.27.2130 x86, пакетный Конфигуратор (DESIGNER), файловые базы |
| Основная конфигурация | «Нано-УТ 2.0», учебная конфигурация; для замера времени ещё выгрузка УТ 11.5.22.77 (48 157 файлов, 12 290 модулей) |
| Контрольные расширения | NanoClean: два перехвата, своя обработка, роль, подсистема. NanoDirty: 28 дефектов и 5 ловушек. NanoBlind: 15 дефектов и 3 ловушки, собран отдельно, список запечатан |
| Настоящие расширения | NOPik, наше расширение, в двух версиях: файл .cfe от 20.09 и выгрузка от 25.09 |
| Инструмент | ext_precheck.py, Python 3.12.10, только стандартная библиотека |
| Компьютер | Windows 11 Pro, Intel Core i5-2400, 7,9 ГБ ОЗУ, SATA SSD |
Что проверяет инструмент
Инструмент читает XML-выгрузку расширения, а с ключом --base ещё и выгрузку основной конфигурации. Расширение он не запускает и в базу не загружает, пишет только в каталог отчёта. Каждая находка в отчёте содержит правило, важность, объект, файл и строку, цитату и что сделать.
| Правило | Что проверяет |
|---|---|
| P1 | пустые Поставщик, Синоним, Версия; версия не из цифр с точками |
| P2 | пустой префикс имён и собственные объекты без префикса: риск совпадения имён с чужим расширением у покупателя |
| P3 | режим совместимости расширения не совпадает с основной конфигурацией |
| P4 | назначение расширения; «Исправление» на продажу – предупреждение |
| P5 | &Перед, &После, &Вместо, &ИзменениеИКонтроль на процедуру или модуль, которых нет в основной конфигурации; &После на функцию |
| P6 | под &ИзменениеИКонтроль копия тела в расширении расходится с телом в основной конфигурации вне блоков #Вставка и #Удаление |
| P7 | заимствованный объект, в котором ничего не изменено и не добавлено |
| P8 | собственный объект, на который нигде нет ссылок |
| P9 | привилегированный общий модуль |
| P10 | опасные вызовы: Выполнить(, Вычислить(, УстановитьБезопасныйРежим(Ложь), COMОбъект, ЗапуститьПриложение, HTTPСоединение, УдалитьФайлы, ПодключитьВнешнююКомпоненту и английские имена; комментарии, строки и Запрос.Выполнить() пропускаются |
| P11 | следы отладки: Сообщить( в серверном коде, закомментированный код длиннее 10 строк, команды без обработчика или без элемента формы |
| P12 | в расширении нет роли, которая даёт права на его собственные объекты |
Запуск:
Выгрузки делаются Конфигуратором:
Можно передать сразу файл .cfe (--cfe файл.cfe --platform <путь к 1cv8.exe>). Тогда инструмент сам создаёт временную пустую базу, загружает расширение и выгружает его. На NOPik.cfe этот режим занял 12,7 с, находки совпали с проверкой выгрузки.
28 дефектов: что нашли пакетные команды
В таблице «дефект» означает заложенный пункт контрольного набора. Среди них есть ошибки применимости, предупреждения и сведения для ручного разбора. Например, более низкий режим совместимости расширения, назначение «Исправление» или HTTPСоединение сами по себе не доказывают неисправность. Поэтому 28 из 28 — покрытие этого набора замечаний, а не оценка способности находить любые ошибки расширений.
Расширение NanoDirty я собрала на копии «Нано-УТ» так, чтобы на каждое правило пришлось от одного до трёх дефектов. Список заложенного записан в файл до первого прогона инструмента. Туда же положила ловушки, на которых находок быть не должно: Выполнить( в комментарии, Вычислить( внутри строки, Запрос.Выполнить(), правильный перехват и команду, которая используется только в подсистеме.
На стенде выполнен следующий набор пакетных команд: загрузка /LoadConfigFromFiles -Extension, /UpdateDBCfg -Extension, /CheckModules с ключами -ThinClient -WebClient -Server -ExternalConnection -ThickClientOrdinaryApplication -ExtendedModulesCheck, /CheckConfig с пятнадцатью ключами, включая -UnreferenceProcedures, -HandlersExistence и -EmptyHandlers, и /CheckCanApplyConfigurationExtensions.
| Дефекты | Сколько | Нашла платформа | Нашёл инструмент |
|---|---|---|---|
| Свойства, префикс, режим совместимости, назначение (P1–P4) | 6 | 0 | 6 |
| Перехват на несуществующую процедуру, устаревшее тело (P5, P6) | 2 | 2, только /CheckCanApply |
2 |
| Лишние заимствования, неиспользуемые модули (P7, P8) | 4 | 0 | 4 |
| Привилегированный общий модуль (P9) | 1 | 1, отказ /UpdateDBCfg |
1 |
| Опасные вызовы (P10) | 8 | 0 | 8 |
| Следы отладки, команды без обработчика или элемента (P11) | 6 | 1, /CheckConfig -HandlersExistence |
6 |
| Нет роли (P12) | 1 | 0 | 1 |
| Всего | 28 | 4 | 28 |
Про режим совместимости нужна точность. В выгрузке расширения два свойства: CompatibilityMode (режим совместимости) и ConfigurationExtensionCompatibilityMode (режим совместимости расширения). В NanoDirty первое совпадало с основной (8.3.27), а второе было ниже (8.3.20). Это допустимо, платформа промолчала, а инструмент выдал сведение, без ошибки. Если же расходится первое, контролируемое свойство, как в NOPik.cfe и NanoBlind, отказывают /UpdateDBCfg и /CheckCanApply, а инструмент выдаёт ошибку P3.
Ловушки находок не дали. Всего у инструмента 29 находок, из них ошибок 3, предупреждений 21, сведений 5. Каждая относится к заложенному дефекту, лишних нет: на дефект с пустым префиксом пришлись две находки, о самом префиксе и об объектах без него.

Прогон ext_precheck.py на расширении NanoDirty: сводка находок по правилам
По ходу выяснилось кое-что о самой платформе.
Неизвестные ключи /CheckConfig платформа принимает молча. Ключ -НесуществующийФлаг дал код возврата 0 и «Ошибок не обнаружено». Без ключей /CheckConfig -Extension NanoDirty тоже вернул «Ошибок не обнаружено». Из всех ключей на этом расширении сработал только -HandlersExistence: код 101 и «Отсутствует обработчик». Тишина в журнале проверки ничего не говорит о том, какие проверки на самом деле прошли.
/CheckCanApplyConfigurationExtensions платформе известна, это я проверила отдельно: на применимом расширении она возвращает код 0 и пустой вывод, на неприменимом код 1 и текст, на несуществующее имя расширения отдельное сообщение.
Привилегированный общий модуль в расширении платформа не пропускает: /UpdateDBCfg -Extension отказывает с текстом «Использование привилегированных общих модулей в расширении недопустимо».
Слепая проверка: 15 дефектов, которых я не видела
Правила инструмента я дописывала, уже имея на руках NanoDirty и его список, поэтому 28 из 28 – проверка на своём наборе. Чтобы убрать эту оговорку, второй набор, NanoBlind, собирал отдельный субагент: 15 дефектов (по одному на правило, у P11 три подпункта) и ловушки, на которых находок быть не должно. Список он записал в запечатанный файл. Я прогнала инструмент, сохранила отчёт и только потом открыла список. Контрольная сумма инструмента до прогона и в момент прогона совпала, правок не было.
| Заложено | Нашёл инструмент | Нашла платформа | |
|---|---|---|---|
| Дефекты | 15 | 15 | 4 целиком и 1 подпункт из 3 |
| Ловушки (комментарий, строка, верный перехват) | 3 | 0 находок | – |
Платформа на слепом наборе нашла режим совместимости 8.3.24 при основной 8.3.27 (/UpdateDBCfg и /CheckCanApply), перехват несуществующей процедуры и изменённое тело (/CheckCanApply), привилегированный модуль (/UpdateDBCfg) и одну команду формы без процедуры из трёх команд-дефектов (/CheckConfig).
Слепой набор собран по образцу первого, поэтому виды дефектов те же, а мишени перехватов, тексты и значения другие. Проверка показывает, что инструмент не подогнан под конкретный экземпляр, но не проверяет новые жанры дефектов.
Обновление типовой: что сказала платформа
Самый неприятный для продавца случай такой: у покупателя выходит новый релиз типовой, процедура, которую перехватывает расширение, переименована, а тело под &ИзменениеИКонтроль поменялось. Я воспроизвела это на чистом расширении NanoClean. В нём два перехвата:
в общем модуле ТоварыУчет и &ИзменениеИКонтроль("ПолучитьОстаток") в общем модуле СкладСервер, где вместо Возврат Выборка.Остаток; возвращается остаток с бонусом.
До обновления расширение применяется: /UpdateDBCfg -Extension NanoClean и /CheckCanApplyConfigurationExtensions вернули код 0, проверки модулей и конфигурации чисты, собственная функция расширения во внешнем соединении вернула ожидаемое значение. У инструмента ни ошибок, ни предупреждений, только сведение о назначении «Дополнение».
Затем я «обновила типовую» в той же базе:
ТоварыУчет.Приходпереименована вПриходТовара, вызовы в основной конфигурации исправлены, так что сама она осталась рабочей.- В теле
СкладСервер.ПолучитьОстатокстрокаВозврат Выборка.Остаток;заменена наВозврат Окр(Выборка.Остаток, 3);, ровно там, где расширение вставляет свой текст. - Новая основная загружена через
/LoadConfigFromFilesи/UpdateDBCfg.
Ответ платформы:
| Команда | Код | Вывод |
|---|---|---|
/UpdateDBCfg (основная) |
0 | «Обновление конфигурации успешно завершено» |
/UpdateDBCfg -Extension NanoClean |
0 | пусто |
/CheckModules ... -Extension NanoClean |
0 | «Синтаксических ошибок не обнаружено!» |
/CheckConfig ... -Extension NanoClean |
0 | «Ошибок не обнаружено» |
/CheckCanApplyConfigurationExtensions -Extension NanoClean |
1 | «Не найден метод "Приход", указанный в аннотации метода "НК_ПриходПосле"» и «Текст метода "НК_ПолучитьОстаток" не соответствует методу "ПолучитьОстаток"» |

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

ext_precheck.py после обновления: P5 и P6 нашли обе поломки
P5 сообщает, что процедуры Приход в основной конфигурации больше нет, а P6 показывает, какая строка в теле ПолучитьОстаток изменилась: в основной теперь Возврат Окр(Выборка.Остаток, 3);, а в копии расширения прежнее Возврат Выборка.Остаток;. Код возврата 1, весь запуск вместе со стартом Python – 0,25 с.
Находки инструмента и /CheckCanApply здесь совпадают. Разница в том, что нужно для проверки: платформе нужна база с новой основной конфигурацией и загруженным расширением, инструменту две выгрузки. Продавец может проверить расширение против нового релиза типовой, как только получит его выгрузку, не создавая базу.
Что увидит пользователь в клиентском приложении после такого обновления, я не проверяла: на стенде запускался только пакетный Конфигуратор. Внешнее соединение для показа не годится: на этом стенде перехваты &Вместо и &ИзменениеИКонтроль в нём не сработали даже до обновления.
Наше расширение NOPik
Две версии нашего расширения NOPik оказались хорошей проверкой на настоящем коде.
| NOPik.cfe от 20.09 | Выгрузка NOPik от 25.09 | |
|---|---|---|
| Назначение | Адаптация | Дополнение |
| Режим совместимости | 8.3.17 | 8.3.20 |
| Поставщик, версия | infolimp.ru, 0.0.00 |
пусто, пусто |
| Общие модули | 2 | 3, плюс HTTP-сервис и константа |
| Платформа | /UpdateDBCfg -Extension и /CheckCanApply отказали: «Значение контролируемого свойства РежимСовместимости ... не совпадает»; проверки модулей и конфигурации без ошибок |
/CheckModules: «Возможно ошибочный параметр» в модуле СКД; /CheckConfig: HTTP-сервис и элемент формы не поддерживаются мобильной платформой; /CheckCanApply код 0 |
| ext_precheck.py | 1 ошибка (P3, режим совместимости), 1 предупреждение (версия из одних нулей), 3 сведения | 0 ошибок, 4 предупреждения (пустые Поставщик и Версия, константа НОПик_TokenAuth нигде не читается, в выгрузке отсутствует файл прав роли), 3 сведения, в том числе HTTPСоединение |
Все 7 находок на выгрузке от 25.09 сопоставлены с файлами. Пустые свойства и отсутствие прямых ссылок на константу подтверждаются выгрузкой. У роли отсутствует Rights.xml: это повод проверить полноту выгрузки, а не доказательство отсутствия прав в исходном расширении. Динамические обращения поиск по имени может пропустить. HTTPСоединение здесь — сведение о сетевом вызове, а не ошибка.
В обратную сторону тоже работает: «Возможно ошибочный параметр» нашла платформа, а инструмент синтаксис не проверяет. Порядок получается такой: сначала инструмент по выгрузке, потом пакетные команды платформы.
Сколько это стоит по времени
| Случай | Время |
|---|---|
| ext_precheck.py на одном расширении, основная «Нано-УТ» | 0,23–0,30 с (медиана 5 запусков, вместе со стартом Python) |
| то же, основная УТ 11.5.22.77 | 0,33–0,35 с: читаются только Configuration.xml и перехваченные модули |
режим --cfe: временная база, загрузка, выгрузка, проверка |
12,7 с |
| платформа: загрузка, обновление, /CheckModules, /CheckConfig, /CheckCanApply на одно расширение | около 21–22 с, по 4–5 с на команду |
Пределы
- Слепой набор NanoBlind собран по образцу NanoDirty: виды дефектов те же. Как инструмент справится с дефектами другого рода, этот опыт не показывает.
- Поведение расширения в клиентском приложении после обновления типовой не проверялось.
- Правила P5 и P6 проверены только на общих модулях. Полнота поиска и сопоставления перехватов в модулях форм и объектов этим опытом не подтверждена.
- Правило P8 ищет ссылки по имени. Имя, собранное в строке (
"ОбщийМодуль." + Имя), оно не видит и может назвать объект неиспользуемым. - Формат выгрузки проверен на платформе 8.3.27. На выгрузках до 8.3.17 инструмент не испытывался.
- Расширения других авторов в опыт не входили: настоящего кода в наборе два расширения, контрольных три.
Что проверить у себя
- Выгрузите расширение и основную конфигурацию той версии, на которую рассчитан покупатель:
/DumpConfigToFiles <каталог> -Extension <имя>и/DumpConfigToFiles <каталог основной>. - Запустите
python ext_precheck.py <расширение> --base <основная> --out report. Ошибки P3, P5, P6, P9 исправьте до отправки: с ними расширение у покупателя либо не применится, либо перехват перестанет работать. - Пройдите предупреждения P7, P8, P10, P11: лишние заимствования, неиспользуемые объекты, опасные вызовы, следы отладки. Опасный вызов, который нужен, опишите в инструкции к продукту.
- Когда выходит новый релиз типовой, повторите шаг 2 с его выгрузкой. Этот прогон покажет перехваты, которые сломало обновление.
- После этого запустите пакетные команды платформы на базе с загруженным расширением:
/CheckCanApplyConfigurationExtensions -Extension <имя>,/CheckModules -ThinClient -Server -ExternalConnection -ExtendedModulesCheck -Extension <имя>и/CheckConfig ... -HandlersExistence -Extension <имя>. Синтаксис и мобильную платформу видят только они.
Файлы к статье
Инструмент ext-precheck-27-1-tool.zip. Это проверка из статьи, готовая к работе на вашем расширении: ext_precheck.py с правилами P1–P12, модуль разбора BSL, 69 тестов на фикстурах из настоящих выгрузок платформы и README с запуском, кодами возврата и пределами. Платформа 1С для проверки выгрузки не нужна, только для режима --cfe. Отчёт выходит в двух видах: report.md для человека и report.json для сборочной линии, а ненулевой код возврата при ошибках позволяет поставить проверку в сборку перед каждой выдачей релиза. Распаковывайте Проводником Windows, 7-Zip или Python: unzip из Git Bash портит кириллические имена файлов. Тесты из чистой распаковки:
Архив к статье ext-precheck-27-1-companion.zip. Заполненный чек-лист «перед отправкой расширения» с пометкой, чем проверяется каждый пункт и что показал опыт; отчёты всех прогонов из статьи (NanoDirty, NanoBlind, NanoClean до и после обновления, обе версии NOPik); команды повторения опыта по шагам; скрипты стенда, которые собирают контрольные расширения и гоняют пакетные команды; расширенная PDF-версия статьи с полными журналами платформы и полными таблицами находок.
Итог
Пять пакетных команд платформы вместе нашли 4 пункта из 28; на слепом наборе — 4 пункта целиком и один подпункт пятого из 15. Каждая видит свою часть: /UpdateDBCfg отвергает привилегированный модуль и несовпадающий режим совместимости, /CheckConfig с ключом -HandlersExistence находит команду без обработчика, /CheckCanApplyConfigurationExtensions находит перехват исчезнувшей процедуры и устаревшее тело под &ИзменениеИКонтроль. Пустые свойства, лишние заимствования, неиспользуемые объекты, опасные вызовы, следы отладки и отсутствие роли не показала ни одна. Инструмент по выгрузке нашёл 28 из 28 и 15 из 15, ни разу не сработал на ловушках и проверяет расширение быстрее чем за полсекунды.
Практический смысл в порядке работы. Перед каждой отправкой выгрузка расширения сравнивается с выгрузкой основной конфигурации той версии, на которой оно будет работать у покупателя, а при выходе нового релиза типовой этот прогон повторяется. Потом расширение загружается в базу, и запускаются пакетные команды, в том числе /CheckCanApplyConfigurationExtensions, которую легко забыть: после «обновления типовой» только она из пяти команд показала сломанные перехваты.
Опыт ограничен одной учебной основной конфигурацией, двумя настоящими и тремя контрольными расширениями, платформой 8.3.27.2130 и пакетным режимом без клиентского приложения.
Вступайте в нашу телеграмм-группу Инфостарт