Правка формы 1С и мобильный клиент: сравнение выгрузок указало 13 изменений из 13, платформа 8.3.27 отметила 7
Разработка - Инструментарий разработчика
Файлы
ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.
Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний
Оформите подписку на компанию для решения рабочих задач
Оформить подписку и скачать решение со скидкойВы можете заказать платную доработку или адаптацию этой разработки под вашу конфигурацию на «Бирже заказов».
- 0% комиссии — оплата напрямую исполнителю;
- Исполнители любого масштаба — от отдельных специалистов до команд под проект;
- Прямой обмен контактами между заказчиком и исполнителем;
- Безопасная сделка — при необходимости;
- Рейтинги, кейсы и прозрачная система откликов.
/CheckModules делят код на три контекста: мобильное приложение-клиент, мобильный клиент и мобильное приложение-сервер. Я сняла с платформы таблицу для 44 сочетаний директивы и условия #Если, для шести вариантов директивы в форме и для четырёх общих модулей с разными флагами, а также перечни типов, которых нет в мобильном контексте: 10, 4 и 9 типов. Назначение использования конфигурации и формы на эти проверки не влияет. Платформа приняла выдуманный ключ -FooBar без сообщения, поэтому успешный прогон мобильных ключей нужно подтверждать контрольной ошибкой.form_diff_mobile.py на 13 изменениях форм «Нано-УТ 2.0»; ответы платформы 8.3.27.2130 на загрузку выгрузки, на /CheckModules с обычными и мобильными ключами и на /CheckConfig; таблицы контекстов, снятые с платформы; прогон на чистой выгрузке УТ 11.5.22.77.make_series.py собраны 13 вариантов с одним изменением формы; каждый загружен в файловую базу командой /LoadConfigFromFiles, затем выполнены четыре проверки; те же пары выгрузок сравнил form_diff_mobile.py; отдельные опыты на платформе дали таблицы контекстов; на УТ сделана копия на жёстких ссылках, в ней заменены пять файлов.Сравнение двух выгрузок отвечает на вопрос, что изменилось в формах и кто на это ссылается. Платформа отвечает на другой вопрос: компилируется ли код в каждом из мобильных контекстов. Оба ответа нужны, потому что пересекаются они только частично: часть правок платформа отклоняет при загрузке, часть видит только мобильная проверка, а часть не видит никакая.
- Загрузка выгрузки отклоняет
DataPathк удалённому реквизиту формы или объекта,/CheckConfig -HandlersExistenceнаходит команду без обработчика,/CheckModulesс мобильными ключами находит типы, которых нет в мобильном контексте. - Обращение
Элементы.Имяк удалённому элементу, строкуОткрытьФормус прежним именем формы, смену директивы и выход формы из мобильной области платформа не отмечает. - Условие
#Если Не МобильноеПриложениеКлиент И Не МобильныйКлиент Тогдаубирает код из обоих клиентских мобильных контекстов, и платформа это подтверждает.
перед выпуском формы, которая работает в мобильном клиенте, нужны оба прохода, сравнение выгрузок и мобильные проверки платформы; журнал решений по найденному делает проверку повторяемой.
Для кого: разработчики и ведущие разработчики 1С, которые выпускают конфигурацию с мобильным приложением или мобильным клиентом и хотят заранее видеть, какие правки форм заденут мобильные контексты.
Форму в основной конфигурации правят каждую неделю: убирают реквизит, переименовывают команду, добавляют процедуру. Если конфигурация работает и в мобильном приложении или мобильном клиенте, правка может сломать их так, что в обычном клиенте этого не видно. Я написала скрипт form_diff_mobile.py, который сравнивает две выгрузки конфигурации и показывает, что в формах удалено и переименовано, где на это ещё ссылаются и какой код попадает в мобильные контексты платформы. Затем сделала на «Нано-УТ 2.0» 13 изменений форм и для каждого записала, что сказал скрипт и что сказала платформа 8.3.27.2130. Ложные находки искала на чистой выгрузке УТ 11.5.22.77.
Стенд и порядок работы
| Условие | Значение |
|---|---|
| Платформа | 1С:Предприятие 8.3.27.2130 x86, пакетный Конфигуратор (DESIGNER), файловая база |
| Стенд | «Нано-УТ 2.0»: учебная конфигурация, 68 форм, 49 модулей форм; назначение конфигурации PlatformApplication, у форм назначение не задано |
| Выгрузка УТ | 11.5.22.77, 4850 форм; у форм справочников (1199 из 1199) назначение PlatformApplication и MobilePlatformApplication; выгрузка только читалась |
| Инструмент | form_diff_mobile.py, Python 3.12.10, только стандартная библиотека |
| Компьютер | Windows 11 Pro, Intel Core i5-2400, 7,9 ГБ ОЗУ, SATA SSD; рабочая машина с открытыми приложениями |
| Метод | серия из 13 изменений с загрузкой каждого в файловую базу; четыре проверки платформы на вариант; опыты по контекстам; прогон на УТ с пятью заложенными правками |
Выводы относятся к платформе 8.3.27.2130, одной небольшой учебной конфигурации и одной выгрузке УТ. Мобильные приложения на телефоне и мобильный клиент в браузере телефона я не запускала.
Что платформа считает мобильным
Платформа проверяет мобильный код в трёх контекстах. В журнале они подписаны так: «Мобильное приложение-клиент» (дальше МПК), «Мобильный клиент» (МК) и «Мобильное приложение-сервер» (МПС). Команды:
Команда /CheckModules с выдуманным ключом -FooBar вернула код 0 и сообщение «Синтаксических ошибок не обнаружено!». Поэтому ключи -MobileClient и остальные я подтвердила контрольной ошибкой. В клиентскую процедуру формы добавлен Новый COMОбъект("Excel.Application"). Обычный контроль модулей прошёл чисто, а мобильные проверки вернули код 101 и «Тип не определен (COMОбъект)» с подписью «Проверка: Мобильное приложение-клиент» и «Проверка: Мобильный клиент».
Директивы и общие модули
Опыт platform_probe.py добавляет в форму процедуры с одной и той же строкой Новый COMОбъект("A") и смотрит, в каких контекстах платформа её проверила:
| Что содержит код | Контексты, где платформа проверила строку |
|---|---|
процедура формы с &НаКлиенте |
МПК, МК |
процедура формы с &НаСервере или &НаСервереБезКонтекста |
МПС |
| процедура формы без директивы | МПС |
процедура формы с &НаКлиентеНаСервереБезКонтекста |
МПК, МК, МПС |
процедура формы с &НаКлиентеНаСервере |
ни в одном |
| общий модуль с флагом «Клиент (управляемое приложение)» | МПК, МК |
| общий модуль с флагом «Сервер» | МПС |
| общий модуль с обоими флагами | МПК, МК, МПС |
| общий модуль только с «Внешнее соединение» | ни в одном |
Процедура без директивы в модуле формы компилируется как серверная. Директива &НаКлиентеНаСервере в проверках не получила замечаний ни в одном контексте, поэтому скрипт код такой процедуры не разбирает.
Условия препроцессора
При независимой проверке 26.10 я обнаружила три ошибки первой версии: снятие внешнего #Если не меняло тело процедуры и оставалось без проверки типов; замена только строкового литерала исчезала при сравнении; смена регистра имени обработчика давала ложную ошибку отсутствующей процедуры. В версии 1.1 сравнение хранит значения литералов отдельно от кода, имена BSL сопоставляются без учёта регистра, а для типов сравнивается число вхождений каждой строки в каждом мобильном контексте. Это учитывает смену директивы и флагов общего модуля и не выдаёт прежнюю активную строку за новую при добавлении или удалении защищённого повтора. Тринадцать дополнительных тестов довели набор инструмента до 74. Проверки этих исправлений выполнены на мини-выгрузках и через CLI; телефон и мобильный клиент в них не запускались.
Для 11 флагов и для каждого флага с Не (22 условия) под директивами &НаКлиенте и &НаСервере платформа показала, в каких контекстах строка внутри #Если ... Тогда проверяется. Получилась таблица истинности:
| Флаг | МПК | МК | МПС |
|---|---|---|---|
Клиент |
да | да | нет |
Сервер |
нет | нет | да |
МобильноеПриложениеКлиент |
да | нет | нет |
МобильныйКлиент |
нет | да | нет |
МобильноеПриложениеСервер |
нет | нет | да |
ТонкийКлиент, ВебКлиент, ТолстыйКлиентОбычноеПриложение, ТолстыйКлиентУправляемоеПриложение, ВнешнееСоединение, МобильныйАвтономныйСервер |
нет | нет | нет |
Практический вывод для кода: условие Не МобильноеПриложениеКлиент И Не МобильныйКлиент оставляет клиентский код только для обычных клиентов, а Не МобильноеПриложениеСервер убирает серверный код из мобильного приложения. Проверка этого условия вынесена в серию (вариант s05).
Типы, которых нет в мобильном контексте
Опыт перебирает 62 типа конструктором Новый <Тип> в клиентской и серверной процедурах (124 пробы) и сравнивает ответ мобильного контекста с ответом обычного контекста той же стороны: тонкого клиента для клиентских процедур и сервера для серверных. В список попадает тип, которого нет в мобильном контексте и который есть в обычном.
| Контекст | Типы |
|---|---|
| МПК | COMОбъект, ТекстовыйДокумент, ГеографическаяСхема, ГрафическаяСхема, WSОпределения, FTPСоединение, ПреобразованиеXSL, СхемаКомпоновкиДанных, ПроцессорКомпоновкиДанных, ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент |
| МК | COMОбъект, ГеографическаяСхема, ГрафическаяСхема, ПреобразованиеXSL |
| МПС | COMОбъект, ТекстовыйДокумент, ГеографическаяСхема, ГрафическаяСхема, FTPСоединение, ПреобразованиеXSL, ПостроительЗапроса, ПостроительОтчета, HTTPСервисОтвет |
ТекстовыйДокумент попал в МПК и МПС и не попал в МК: клиентская процедура с ним проходит -MobileClient и не проходит -MobileAppClient. Для остальных 49 типов из перебора мобильные контексты отвечают так же, как обычные. Например, ТабличныйДокумент, ЧтениеXML, ЗаписьJSON, Файл и Структура не получили замечаний ни в одном контексте.
Назначение использования не влияет
В «Нано-УТ» конфигурация назначена только PlatformApplication. Я проверила один и тот же вариант с COMОбъект в четырёх видах: как есть; с добавленным в конфигурацию MobilePlatformApplication; с назначением формы только PlatformApplication; с обоими изменениями. Платформа приняла назначение (обратная выгрузка показала его у формы) и дала в каждом виде одни и те же замечания: по одному в МПК и МК и два в проверке конфигурации. Мобильные проверки /CheckModules идут по всем формам независимо от UsePurposes.
Что делает скрипт
form_diff_mobile.py читает две выгрузки (два каталога или два коммита git) и ничего в них не пишет. Режим --git берёт из ревизий только *.xml и *.bsl, а изменённые файлы узнаёт командой git diff. Запуск:
Скрипт сопоставляет объекты двух выгрузок: реквизиты, команды и элементы формы по id, форму по uuid, реквизиты объекта по uuid, процедуры по имени и по совпадению тела (так находится переименование). Для всего удалённого и переименованного он ищет оставшиеся ссылки: DataPath элементов, идентификаторы и строки в модуле формы, Элементы.Имя и Элементы["Имя"], полное имя формы в строках ОткрытьФорму всех модулей и в свойствах объектов, вызовы удалённой процедуры в том же модуле. Для каждой процедуры он считает мобильные контексты по таблицам из предыдущего раздела и ищет в новых и изменённых строках типы из перечня. Уровни находок: ОШИБКА, если остались ссылки, нет обработчика или платформа не знает тип; ВНИМАНИЕ для удалений и смен без ссылок; СВЕДЕНИЯ для добавлений и изменений свойств. Коды находок описаны в README.md архива.
Чего скрипт не делает: он не компилирует BSL, не видит вызовы методов, которых нет в мобильной платформе, ищет ссылки по имени без разбора областей видимости и не разбирает расширения, модули объектов и менеджеров, макеты и права.
Серия из 13 изменений «Нано-УТ»
Скрипт make_series.py собирает из выгрузки «Нано-УТ 2.0» 13 вариантов. В каждом ровно одно изменение формы. Загрузка варианта и четыре проверки платформы заняли от 36 до 45 секунд на каждый вариант, который загрузился.

Рисунок 1. Вариант s04: скрипт нашёл Новый COMОбъект в клиентской процедуре и указал два контекста, МК и МПК.

Рисунок 2. Тот же вариант на платформе: обычный контроль модулей чист, мобильные проверки и проверка конфигурации возвращают код 101.
| Вариант | Изменение | Скрипт | Платформа |
|---|---|---|---|
| s01 | Удалён реквизит формы СправкаОбУчете, на него ссылаются элемент и модуль |
ОШИБКА ATTR_REMOVED, 2 ссылки |
Загрузка отклонена: «Неверный путь к данным» |
| s02 | Удалена кнопка СоздатьЗакрытиеЗаказа, модуль обращается к Элементы.СоздатьЗакрытиеЗаказа |
ОШИБКА ITEM_REMOVED, 1 ссылка |
Все проверки чисты |
| s03 | Команда переименована вместе с действием, процедура в модуле осталась со старым именем | ОШИБКА HANDLER_MISSING, ВНИМАНИЕ CMD_RENAMED |
/CheckConfig: «Отсутствует обработчик»; контроль модулей чист |
| s04 | Новый COMОбъект в клиентской процедуре |
ОШИБКА MOBILE_TYPE (МК, МПК), СВЕДЕНИЯ PROC_ADDED |
Мобильные проверки: «Тип не определен (COMОбъект)»; обычный контроль чист |
| s05 | Тот же код под #Если Не МобильноеПриложениеКлиент И Не МобильныйКлиент Тогда |
СВЕДЕНИЯ PROC_ADDED |
Все проверки чисты |
| s06 | Новый ТекстовыйДокумент в серверной функции |
ОШИБКА MOBILE_TYPE (МПС), СВЕДЕНИЯ PROC_ADDED |
МПС: «Тип не определен (ТекстовыйДокумент)»; обычный контроль и мобильный клиент чисты |
| s07 | Команда Печать переведена с &НаКлиенте на &НаСервере |
ВНИМАНИЕ PROC_DIRECTIVE (МК, МПК, МПС) |
Все проверки чисты |
| s08 | Удалён реквизит документа Комментарий, элемент с DataPath остался |
ОШИБКА OBJATTR_REMOVED, 1 ссылка |
Загрузка отклонена: «Неверный путь к данным» |
| s09 | Переименована форма возврата, форма продажи открывает её по прежнему имени | ОШИБКА FORM_RENAMED, 1 ссылка |
Все проверки чисты |
| s10 | У формы возврата убрано мобильное назначение, её открывает форма продажи | ОШИБКА FORM_PURPOSE, 1 ссылка |
Все проверки чисты |
| s11 | Добавлено десять элементов других видов | СВЕДЕНИЯ: 10 элементов и 10 реквизитов | Все проверки чисты |
| s12 | Удалена процедура ЗаполнитьЦены, команда на неё ссылается |
ОШИБКА HANDLER_MISSING, ВНИМАНИЕ PROC_REMOVED |
/CheckConfig: «Отсутствует обработчик»; контроль модулей чист |
| s13 | Удалена серверная процедура, которую вызывает другая процедура формы | ОШИБКА PROC_REMOVED, 1 ссылка (вызов) |
Все четыре проверки: «Процедура или функция с указанным именем не определена» |
Что остановила загрузка
Варианты s01 и s08: удалён реквизит формы СправкаОбУчете и реквизит документа Комментарий, а элементы с DataPath к ним остались. /LoadConfigFromFiles вернул код 1 и сообщение «Неверный путь к данным» с именем файла Form.xml. После такой загрузки мобильные проверки уже не нужны: выгрузка не принимается. Скрипт в обоих случаях дал ОШИБКУ со ссылкой на элемент, а в s01 ещё и на строку модуля, где реквизит присваивается.
Что нашла проверка
Варианты s03 и s12: у команды нет обработчика (команда переименована вместе с действием, процедура осталась со старым именем; процедура удалена, а команда осталась). Такое находит только /CheckConfig с ключом -HandlersExistence («Отсутствует обработчик»); обычный и мобильный контроль модулей оставались чистыми. Вариант s13: удалена процедура, которую вызывает другая процедура формы. Её нашли все четыре проверки: «Процедура или функция с указанным именем не определена».
Варианты s04 и s06 показали мобильную специфику. Новый COMОбъект в клиентской процедуре отмечают МПК и МК, а обычный контроль нет. Новый ТекстовыйДокумент в серверной функции отмечает только МПС: клиентские мобильные проверки и обычный контроль чисты. Вариант s05 повторяет s04 под условием Не МобильноеПриложениеКлиент И Не МобильныйКлиент: все проверки чисты, скрипт отметил только добавленную процедуру.
Где платформа молчит
В варианте s02 из формы заказа удалена кнопка, а модуль в ПриСозданииНаСервере продолжает обращаться к Элементы.СоздатьЗакрытиеЗаказа. Все проверки чисты, скрипт даёт ОШИБКУ со строкой модуля. В s09 переименована форма возврата, а форма продажи открывает её по прежнему имени строкой: платформа молчит, скрипт указывает вызов. В s10 у формы возврата убрано мобильное назначение, при этом её открывает форма продажи: платформа не реагирует, скрипт связывает смену назначения с вызывающим кодом. В s07 команда Печать переведена с &НаКлиенте на &НаСервере: платформа чиста, скрипт отмечает смену директивы и три контекста, в которых процедура теперь компилируется. Вариант s11 добавил десять элементов других видов (HTML-поле, календарь, индикатор, ползунок и другие): форма загрузилась, проверки прошли, скрипт перечислил добавления как сведения. Поддерживаются ли эти виды элементов на телефоне, платформенные проверки не показывают; для таких правок в чек-листе остаётся открытие формы на тестовом клиенте.

Рисунок 3. Вариант s02: все проверки платформы чисты, скрипт указывает обращение к удалённой кнопке.
Чистая УТ 11.5: ложные находки и заложенные правки
Для скрипта, который сравнивает две выгрузки, ложной находкой считается любая находка там, где ничего не менялось. Проверка в двух шагах. Первый: выгрузка УТ 11.5.22.77 сравнивается с копией на жёстких ссылках, и находок должно быть 0. Второй: в копии заменены пять файлов, и скрипт должен найти ровно эти правки.
| Правка | Ожидаемые находки |
|---|---|
Удалён реквизит РазрешитьРедактированиеВладельца формы РазблокированиеРеквизитов (справочник БанковскиеСчетаКонтрагентов); на него ссылаются элемент и две строки модуля |
ATTR_REMOVED со ссылками |
Команда КомандаОК формы РеквизитыБанка переименована вместе с действием |
CMD_RENAMED, HANDLER_MISSING |
В модуль формы элемента справочника АктыОтбораПробЗЕРНО добавлена клиентская процедура с Новый COMОбъект |
MOBILE_TYPE, PROC_ADDED |
У формы РазблокированиеРеквизитов справочника БанковскиеСчетаОрганизаций убрано мобильное назначение |
FORM_PURPOSE |
Удалена кнопка ТолькоДействующие формы списка БанковскиеСчетаКонтрагентов; на неё ссылаются три строки модуля |
ITEM_REMOVED со ссылками |
Сравнение выгрузки с копией на жёстких ссылках дало 0 находок за 8,3 с. Первая версия скрипта читала содержимое всех форм, модулей и объектов, и то же сравнение у неё заняло 318 с (журнал ut-edits-v1.txt в архиве-компаньоне). Теперь файл, который в обеих выгрузках одна и та же жёсткая ссылка, пропускается без чтения, и в режиме --git список изменённых файлов приходит из git diff. Ускорение по размеру и времени изменения файла я сначала пробовала и отвергла: тест на переименовании той же длины (Печать и Выдать) показал, что при одинаковых размере и времени записи правка остаётся незамеченной.
В прогоне версии 1.0 от 25.10 сравнение с копией, где заменены пять файлов, заняло 11,1 с, включая поиск вызовов формы с изменённым назначением по всем 4850 формам и общим модулям. Находок семь, по одной группе на правку, и других нет. У формы РазблокированиеРеквизитов справочника БанковскиеСчетаОрганизаций нет вызовов по имени, поэтому смена назначения получила уровень ВНИМАНИЕ без ссылок. Удалённый реквизит получил три ссылки (элемент и две строки модуля), удалённая кнопка списка тоже три (три строки модуля).
Повтор версии 1.1 от 26.10 также дал 0 находок на неизменённой копии и ровно 7 на копии с пятью правками. Создание копии на жёстких ссылках заняло 53,8 с, сравнение без изменений 11,0 с, с правками 430,3 с. Во время повтора шли другие локальные проверки; причину отличия от прежних 11,1 с я не установила. Эти прогоны не служат сравнением скорости версий. Новый журнал revision-1.1/ut-recheck.txt приложен отдельно от исторического.

Рисунок 4. Сравнение выгрузки УТ 11.5.22.77 с копией, где заменены пять файлов: семь находок.
Как применить перед выпуском
Чек-лист из архива-компаньона ведёт по порядку: сравнить выгрузки скриптом, собрать базу кандидата, выполнить четыре проверки платформы, закрыть то, что платформа не видит, и записать решение. К чек-листу приложена таблица «находка, что сделать, чем закрыть». Находка FORM_RENAMED закрывается правкой строк ОткрытьФорму, потому что имя формы в строке платформа не проверяет. Находка MOBILE_TYPE закрывается вынесением кода на сервер или условием #Если, и результат подтверждает мобильный контроль модулей.
В конвейер скрипт включается скриптом ci/check_mobile.cmd: он принимает репозиторий и две ревизии, пишет report.txt и возвращает код 1 при находках уровня ОШИБКА. Заполненный журнал выпуска по серии из 13 изменений показывает, как записать решение по каждой находке.
Файлы к статье
К статье приложены два архива.
Инструмент mobile-forms-25-3-tool.zip содержит form_diff_mobile.py, README с таблицами находок и контекстов, 74 теста и выгрузку «Нано-УТ 2.0» со скриптом stand/make_series.py. Запуск из корня распакованного архива:
Компаньон mobile-forms-25-3-companion.zip содержит чек-лист выпуска, заполненный журнал выпуска, команды платформы, отчёты по 13 вариантам (изменение, ответ скрипта, ответ платформы), скрипты опытов на платформе (platform_series.py, platform_probe.py, platform_purposes.py), скрипт проверки на УТ (ut_edits.py), ci/check_mobile.cmd, журналы запусков и 22 теста. Тесты компаньона не запускают платформу: они сверяют журналы между собой.

Рисунок 5. Тесты обоих архивов из чистой распаковки: 74 у инструмента и 22 у компаньона.
Итог
На 13 изменениях форм «Нано-УТ» платформа 8.3.27.2130 отметила 7: два отклонила загрузка, пять нашли проверки модулей и конфигурации. Скрипт указал все 13 изменений и ссылки, которые остались после 8 из них. Из шести изменений, которые платформа пропустила, четыре скрипт отнёс к уровням ОШИБКА и ВНИМАНИЕ. Мобильные проверки платформы полезны там, где важен тип: COMОбъект и ТекстовыйДокумент они находят в тот же день, когда код добавлен. Обращения к элементам, строки с именами форм и смену назначения форм сравнение выгрузок находит, а платформа нет.
Практический смысл: между выпусками стоит сравнивать выгрузки скриптом и прогонять четыре команды платформы, а решение по каждой находке записывать в журнал. Всё, что платформа не проверяет, остаётся на ручную проверку формы на тестовом клиенте.
Выводы относятся к платформе 8.3.27.2130, файловой базе, учебной конфигурации и одной выгрузке УТ. Устройства, клиент-серверный режим, расширения и другие версии платформы в проверку не вошли; таблицы контекстов и типов для другой версии нужно снимать заново скриптами компаньона.
Вступайте в нашу телеграмм-группу Инфостарт