Как дорабатывать форму через нейросеть без ошибок: чего модель не узнает из Form.xml
Мы получили в клиенте две типовые формы УТ для Казахстана 3.4.4.87 и сверили их с Form.xml из выгрузки той же версии. Форма элемента номенклатуры: все 856 элементов из XML в открытой форме нашлись, ни один не потерялся. Но 127 из них, видимые по XML, у пользователя скрыты, и среди них поле Артикул. Модель, которой дали только Form.xml, об этом не узнает: в файле поле видимое.
XML при этом остаётся лучшим, что можно дать модели, имена в нём полные. Только одних имён мало. В перехвате формы, который мы разберём ниже, четыре ошибки: две закрывает Form.xml, третью видно только в модуле формы, а четвёртую только в открытой форме. Отсюда и метод: модели на вход три источника, на выходе сверка с выгрузкой и базой.
Что модель получает из Form.xml
Form.xml лежит в выгрузке конфигурации в файлы (Конфигуратор, "Конфигурация - Выгрузить конфигурацию в файлы", или проект EDT). Для формы номенклатуры это Catalogs\Номенклатура\Forms\ФормаЭлемента\Ext\Form.xml, а модуль формы рядом, в Ext\Form\Module.bsl. Сверка с открытой формой дала такой расклад:
| Форма | Элементов в XML | Нашлись в открытой форме | Добавились при открытии | Видимы в XML, скрыты в работе |
|---|---|---|---|---|
| Номенклатура, форма элемента | 856 | 856 | 82 | 127 |
| Контрагенты, форма списка | 102 | 102 | 126 | 2 |
Добавленное при открытии оказалось служебным: кнопки командной панели и контекстных меню, подменю, расширенные подсказки к ним. Часть рисует платформа, часть кодом добавляют подключаемые команды БСП (подменю печати, отчётов, "Создать на основании"). У формы списка добавленного даже больше, чем было в XML, и всё оно тоже служебное.Полей ввода среди 82 и 126 добавленных нет ни одного. Значит, по именам полей, групп и страниц XML полный, пока в базе не заведены дополнительные реквизиты: на полигоне таких полей не появилось. Где они есть, БСП добавляет поля в ПриСозданииНаСервере через УправлениеСвойствами, и в XML их не будет.
Опираться надо именно на имена из файла, угадывать их по шаблону нельзя. На форме номенклатуры 102 обработчика событий элементов, и 39 из них названы не по схеме "ИмяЭлементаСобытие". На 29 событиях висит одна процедура СвернутьРазвернутьГруппу, это нажатия на декорации "открыть" и "закрыть". Остальные 10 названы каждый по-своему, как у переключателя шаблона ценника:
<RadioButtonField name="ИспользоватьОбщийШаблонЦенника" id="1438"> <DataPath>ИспользоватьИндивидуальныйШаблонЦенника</DataPath> ... <Events> <Event name="OnChange">ИспользоватьИндивидуальныйШаблонЦенникПриИзменении</Event> </Events> </RadioButtonField>
Элемент называется ИспользоватьОбщийШаблонЦенника, привязан к реквизиту формы с другим именем, а обработчик у него общий со вторым переключателем, ИспользоватьИндивидуальныйШаблонЦенника. Оба переключателя смотрят в один реквизит-число: 0 значит общий шаблон, 1 индивидуальный. Буквы "а" в ...ЦенникПриИзменении нет, это не опечатка, так в типовой. Процедуры ИспользоватьОбщийШаблонЦенникаПриИзменении в модуле формы нет вовсе.
Размер мешает отдавать файл целиком: Form.xml номенклатуры весит 356 307 байт. Его можно ужать до сводки элементов, обработчиков и команд, это умеет, например, скил form-info из открытого набора cc-1c-skills. Но и полный XML, и сводка отвечают только на вопрос "как называется". Как форма выглядит у пользователя, из них не узнать.
Чего в Form.xml нет
Первое и самое заметное - видимость. В XML у поля Артикул свойства Visible нет вовсе, то есть оно видимое. В открытой форме нового элемента на полигоне у него Видимость = Ложь. Из XML этого не узнать, а поиск по модулю формы на 4 502 строки тоже не поможет: строки Элементы.Артикул.Видимость там нет. Видимость полей карточки ставит цикл в процедуре НастроитьФорму, а имена элементов приходят в него строками из модуля менеджера справочника, для полей вроде Артикул по настройкам вида номенклатуры:
ВидимостьЭлементов = НастройкиВидимостиИЗаголовков.ВидимостьЭлементов; ... Для Каждого ЭлементВидимость Из ВидимостьЭлементов Цикл Если Элементы.Найти(ЭлементВидимость.Ключ) <> Неопределено Тогда Элементы[ЭлементВидимость.Ключ].Видимость = ЭлементВидимость.Значение; КонецЕсли; ...
Снимали форму нового элемента, у которого вид не заполнен, и у заполненной карточки набор скрытых будет другим. Но порядок понятен: из 127 скрытых у 119 в XML нет никакого следа. У остальных 8 там стоит функциональная опция на реквизите или команде формы, а включена ли она в базе, файл не скажет.
Насколько это частая история, видно по всей конфигурации. В выгрузке УТ для Казахстана 3.4.4.87 1 508 форм документов и справочников и 1 434 модуля этих форм:
| Что | В XML | Кодом в модуле формы |
|---|---|---|
| видимость элементов | функциональные опции на реквизитах и командах формы у 348 форм | .Видимость = в 607 модулях |
| условное оформление | у 37 форм | процедура УстановитьУсловноеОформление в 400 модулях |
| кнопки печати, отчётов, "Создать на основании" | нет | ПодключаемыеКоманды.ПриСозданииНаСервере в 562 модулях |
| поля дополнительных реквизитов | нет | УправлениеСвойствами.ПриСозданииНаСервере в 113 модулях |
Условное оформление в XML есть у 37 форм из 1 508, а строится кодом в 400 модулях из 1 434. У формы номенклатуры в XML ноль правил оформления, а в модуле четыре, и собирает их первая строка ПриСозданииНаСервере:
&НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) УстановитьУсловноеОформление(); ... &НаСервере Процедура УстановитьУсловноеОформление() УсловноеОформление.Элементы.Очистить(); Элемент = УсловноеОформление.Элементы.Добавить(); ...
Запомните это Очистить(), оно сработает в разделе про расширения.
Отсюда состав входа для модели. Form.xml или его сводка даёт имена. Модуль формы, хотя бы ПриСозданииНаСервере и процедуры, которые она вызывает, показывает, что форма достраивает и прячет при создании. А что пользователь видит в работе, ни файлы, ни модуль не скажут: это надо снять с открытой формы или написать модели словами ("поле Артикул у нас скрыто, вкладка такая-то выключена опцией").
Снять форму с работающей базы: что выходит
Первая мысль - получить форму кодом прямо из базы и отдать модели её такой, какая она есть. На сервере это не работает. Глобальный ПолучитьФорму в серверном коде не компилируется: "Процедура или функция с указанным именем не определена". Документы.РеализацияТоваровУслуг.ПолучитьФорму("ФормаДокумента") через Выполнить на сервере отвечает "Интерактивные операции недоступны". Это проверяли на сервере другой типовой, УТ 11.5, платформа 8.3.27.
На клиенте форма получается без открытия окна, и на полигоне снимок сняли так. Упрощённый фрагмент процедуры замера, которая собирает скрытые элементы:
&НаКлиенте Процедура ПоказатьСкрытые(Команда) // Истина в четвёртом параметре: всегда новый экземпляр формы Ф = ПолучитьФорму("Справочник.Номенклатура.Форма.ФормаЭлемента", , , Истина); Скрытые = Новый Массив; Для Каждого Эл Из Ф.Элементы Цикл Попытка Если Не Эл.Видимость Тогда Скрытые.Добавить(Эл.Имя); КонецЕсли; Исключение // как в замере: каждое свойство читается под Попыткой КонецПопытки; КонецЦикла; Сообщить(СтрСоединить(Скрытые, ", ")); КонецПроцедуры
ПолучитьФорму выполняет ПриСозданииНаСервере целиком, поэтому видимость в снимке такая, какой её оставил этот обработчик для пользователя, под которым сняли. Клиентский ПриОткрытии при получении формы не выполняется, а у формы номенклатуры он обновляет подключаемые команды, так что кнопки в живом окне могут отличаться. На форме номенклатуры снимок занял 1 172 мс на получение и 440 мс на обход, один прогон.
Остальное на клиенте не читается, и это тоже результат замера:
| Что | В открытой форме на клиенте |
|---|---|
| путь к данным элементов | не прочитан ни у одного: "Поле объекта не обнаружено (ПутьКДанным)" |
обработчики событий (ПолучитьДействие) |
0 из 102, которые есть в XML: "Метод недоступен на клиенте" |
| условное оформление | "Условное оформление недоступно на клиенте" |
реквизиты формы (ПолучитьРеквизиты) |
"Метод недоступен на клиенте" |
И форма документа может не получиться совсем. Форма реализации на полигоне не создалась: "Не удалось заполнить поле "Организация". Возможно, в информационной базе не введено ни одной организации!". ПриСозданииНаСервере заполняет новый документ по умолчанию и падает там, где заполнять нечем.
Снимок с открытой формы дополняет XML одной вещью, фактической видимостью, и зависит от пользователя, функциональных опций и данных. Всё остальное даёт только выгрузка.
Перехват формы в расширении: где ломается угаданное
Больше всего угадывать приходится в модуле формы в расширении. Форму сперва заимствуют в расширение, а потом пишут перехваты к процедурам её модуля, и если модели не дали выгрузку, каждое имя в перехвате взято из головы. Вот перехват, написанный по догадке, без формы перед глазами. Задача: подсветить пустой артикул и после смены шаблона ценника требовать заполнения поля шаблона.
&НаСервере &Перед("ПриСозданииНаСервере") Процедура Расш1_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) Элемент = УсловноеОформление.Элементы.Добавить(); Поле = Элемент.Поля.Элементы.Добавить(); Поле.Поле = Новый ПолеКомпоновкиДанных("Артикул"); Отбор = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); Отбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Артикул"); Отбор.ВидСравнения = ВидСравненияКомпоновкиДанных.НеЗаполнено; Элемент.Оформление.УстановитьЗначениеПараметра("ОтметкаНезаполненного", Истина); КонецПроцедуры &НаКлиенте &После("ИспользоватьОбщийШаблонЦенникаПриИзменении") Процедура Расш1_ИспользоватьОбщийШаблонЦенникаПриИзменении(Элемент) Элементы.ИндивидуальныйШаблонЦенника.АвтоОтметкаНезаполненного = Истина; КонецПроцедуры
Синтаксически здесь всё чисто. Четыре проблемы находит сверка, и каждую ловит свой источник:
- Модуль формы.
&Передвыполняется до типовойПриСозданииНаСервере, а та первой строкой вызываетУстановитьУсловноеОформление(), которая начинает сУсловноеОформление.Элементы.Очистить(). Правило, добавленное в&Перед, стирается раньше, чем форма откроется. Нужен&После. - Снимок открытой формы. Поле
Артикулв форме нового элемента на полигоне скрыто. Оформление ляжет на поле, которого пользователь не видит, и доработка "не работает", хотя код верный. - Form.xml. В
&После("...")пишется имя процедуры модуля формы, и в XML оно стоит в тегеEventэлемента. Угадывать его по схеме "элемент плюс событие" нельзя. ПроцедурыИспользоватьОбщийШаблонЦенникаПриИзменениинет, настоящая называетсяИспользоватьИндивидуальныйШаблонЦенникПриИзменении, и она общая для двух переключателей. Перехват сработает на обоих. - Form.xml. Элемента
ИндивидуальныйШаблонЦенникана форме нет. Поле шаблона называетсяШаблонЦенника, а переключателиИспользоватьОбщийШаблонЦенникаиИспользоватьИндивидуальныйШаблонЦенника.
Тот же перехват после сверки:
&НаСервере &После("ПриСозданииНаСервере") Процедура Расш1_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) Элемент = УсловноеОформление.Элементы.Добавить(); Поле = Элемент.Поля.Элементы.Добавить(); Поле.Поле = Новый ПолеКомпоновкиДанных(Элементы.Артикул.Имя); Отбор = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); Отбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Артикул"); Отбор.ВидСравнения = ВидСравненияКомпоновкиДанных.НеЗаполнено; Элемент.Оформление.УстановитьЗначениеПараметра("ОтметкаНезаполненного", Истина); КонецПроцедуры &НаКлиенте &После("ИспользоватьИндивидуальныйШаблонЦенникПриИзменении") Процедура Расш1_ИспользоватьИндивидуальныйШаблонЦенникПриИзменении(Элемент) // процедура общая для двух переключателей: сработает на любом из них Элементы.ШаблонЦенника.АвтоОтметкаНезаполненного = (ИспользоватьИндивидуальныйШаблонЦенника = 1); КонецПроцедуры
Имя для оформления теперь берётся у элемента: Элементы.Артикул.Имя даёт ту же строку, но если поля с таким именем на форме нет, код упадёт при первом же создании формы, а не промолчит. Про видимость код ничего не исправит. В форме нового элемента на полигоне скрыты и Артикул, и поле ШаблонЦенника, и оба переключателя. Это вопрос к настройке вида номенклатуры, и задать его модели можно, только если она знает, что поля скрыты.
Что сделает платформа с расширением, где в &После стоит имя несуществующей процедуры, мы не проверяли. Дешевле не доводить до этого: имя из аннотации ищется в Module.bsl из выгрузки строкой Процедура ИмяИзАннотации(. Нет такой строки - перехватывать нечего.
Что проверить в ответе модели
Имена элементов и процедур формы сверяются с выгрузкой: каждое Элементы.Имя ищем в Form.xml как name="Имя", каждое имя из &Перед, &После, &Вместо ищем в Module.bsl. Это пять минут поиска по двум файлам, и так находятся две проблемы из четырёх. Третья ловится чтением ПриСозданииНаСервере: что типовая делает до и после вашего перехвата. Четвёртая только снимком видимости или вопросом к тому, кто работает в базе.
Остальное в коде формы к самой форме не относится. Внутри ПриСозданииНаСервере модель пишет запросы, обращается к справочникам и регистрам, зовёт методы БСП. Это мы проверяем обработкой "Проверка кода и запросов нейросети": вставляете код, она компилирует каждую процедуру без выполнения, сверяет с метаданными вашей базы имена справочников, документов, регистров и значений перечислений, проверяет, есть ли вызванный метод в общем модуле, и прогоняет тексты запросов. Рядом с ошибкой стоят настоящие имена, и список кнопкой копируется обратно в чат. Как она ловит выдуманный метод БСП, не вызывая его, разобрано в статье про проверку кода нейросети.
Чего обработка не делает: имена элементов формы и имена в аннотациях перехвата она сейчас не сверяет. Это по-прежнему поиск по выгрузке, описанный выше.
Как мерили
Полигон: типовая УТ для Казахстана 3.4.4.87, тонкий клиент 8.3.27.1606, замер 01.11.2026. Снимали три формы: элемента номенклатуры, списка контрагентов и документа реализации. Третья не создалась (нет организации), поэтому в таблицах две. Формы брались для нового объекта и не записывались. Сверка шла с Form.xml и Module.bsl из выгрузки той же версии конфигурации, она же дала счёт по 1 508 формам и 1 434 модулям. Сопоставляли элементы по имени. Серверные вызовы ПолучитьФорму проверяли отдельно, на типовой УТ 11.5, платформа 8.3.27. Нейросеть в замере не участвовала: перехват выше написан нами по догадке, чтобы показать, где сверка ловит угаданное.
Другие наши инструменты
- Стенд проверки запросов нейросети - 30 заданий к типовой УТ 11.5 с эталонами: запрос модели выполняется и сверяется с эталоном построчно.
- Выгрузка структуры метаданных 1С для нейросети - дать модели настоящие имена объектов и реквизитов до того, как она начнёт писать код.
- Права спросившего - запрос нейросети к базе выполняется с правами того, кто спросил.
- Анализ кода внешних обработок - проверить чужую обработку до того, как класть её в базу.
Вопрос
Как вы даёте модели форму, когда дорабатываете её через нейросеть: целиком XML, сводку или описываете словами? И попадались ли вам доработки, которые "не работают" только потому, что поле у пользователя скрыто?
Вступайте в нашу телеграмм-группу Инфостарт
Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».
- 0% комиссии — оплата напрямую исполнителю;
- Исполнители любого масштаба — от отдельных специалистов до команд под проект;
- Прямой обмен контактами между заказчиком и исполнителем;
- Безопасная сделка — при необходимости;
- Рейтинги, кейсы и прозрачная система откликов.