Генератор Form.xml из JSON для управляемых форм 1С: что показала сборка .epf на платформе 8.3.27
Разработка - Рефакторинг и качество кода
Файлы
ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.
Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний
Оформите подписку на компанию для решения рабочих задач
Оформить подписку и скачать решение со скидкойВы можете заказать платную доработку или адаптацию этой разработки под вашу конфигурацию на «Бирже заказов».
- 0% комиссии — оплата напрямую исполнителю;
- Исполнители любого масштаба — от отдельных специалистов до команд под проект;
- Прямой обмен контактами между заказчиком и исполнителем;
- Безопасная сделка — при необходимости;
- Рейтинги, кейсы и прозрачная система откликов.
Разработка прикладных решений на платформе 1С:Предприятие опирается на интерактивный редактор конфигуратора. Разработчик вручную размещает реквизиты и связывает элементы управления с моделью данных. При переходе к автоматической сборке и конвейерам непрерывной интеграции (CI/CD) ручные действия становятся главным барьером. Конфигуратор требует запуска графического окна или передачи команд пакетного режима. Такой сценарий замедляет контейнеризацию и сборку внешних файлов. Практичным решением служит декларативное описание интерфейса в формате JSON с прямой компиляцией в файл Form.xml.
Устройство разметки Form.xml
Файл Form.xml содержит сериализованное описание управляемой формы в формате XML, принадлежащее пространству имен http://v8.1c.ru/8.3/xcf/logform с версией схемы интерфейса 2.17. Внутри корневого элемента платформа ожидает строгий порядок вложенных секций, нарушение которого вызывает ошибку формата потока при загрузке исходников в информационную базу.
Первый блок фиксирует параметры диалогового окна. В него входят флаг автоматического заголовка, многоязыковой текст Title, а также начальные размеры окна в символах. Для русскоязычного текста платформа создает вложенную конструкцию с узлами v8:item, v8:lang со значением ru и v8:content.
Второй блок отвечает за регистрацию событий формы. Секция Events объединяет элементы Event с атрибутом name, где указаны стандартные точки входа. Среди них используются события OnCreateAtServer (ПриСозданииНаСервере), OnOpen (ПриОткрытии) и BeforeClose (ПередЗакрытием). Значение элемента указывает имя экспортной процедуры в модуле.
Третий обязательный узел - командная панель AutoCommandBar. При отсутствии кнопок на верхней панели платформа требует наличия тега с именем ФормаКоманднаяПанель и системным номером -1. Пропуск этого тега блокирует работу операции LoadConfigFromFiles.
Четвертый блок формирует секция ChildItems. Она хранит визуальное дерево элементов управления. Платформа 1С строго разделяет типы компонентов: UsualGroup для визуальных групп, InputField для полей ввода, CheckBoxField для булевых флажков и Button для кнопок. Каждому элементу назначается системный строковый атрибут name и числовой id.
Секция Attributes определяет модель данных формы, привязывая элементы через свойство DataPath к типам платформы. Секция Commands описывает действия и связывает кнопки с процедурами модуля.
Структура спецификации JSON DSL для описания формы
Ручное создание XML с десятками пространств имен отнимает много времени. Для компактной записи структуры спроектирован декларативный формат JSON DSL. Спецификация отделяет описание визуальных компонентов от служебных конструкций 1С.
Верхний уровень документа содержит поля title, properties, events, attributes, commands и elements. Поле properties задает ширину и высоту окна. Поле events связывает события формы с процедурами модуля.
{
"title": "Параметры интеграционного шлюза 1С",
"properties": {
"autoTitle": false,
"width": 60,
"height": 25
},
"events": {
"OnCreateAtServer": "ПриСозданииНаСервере"
}
}
Модель данных фиксируется списком объектов в блоке attributes. Каждый реквизит содержит идентификатор, имя в интерфейсе и платформенный тип:
"attributes": [
{
"name": "Объект",
"title": "Объект обработки",
"type": "cfg:DataProcessorObject.ИнтеграционныйШлюз",
"main": true
},
{
"name": "АдресСервера",
"title": "URL интеграционного сервиса",
"type": "xs:string"
},
{
"name": "ТокенАвторизации",
"title": "API-токен доступа",
"type": "xs:string"
}
]
Иерархия элементов управления задается массивом elements. Поддерживается вложенность через массив children. Значения Horizontal или Vertical определяют направление размещения полей:
{
"type": "group",
"name": "ГруппаАвторизация",
"title": "Параметры подключения к API",
"group": "Vertical",
"showTitle": true,
"children": [
{
"type": "input",
"name": "ПолеАдресСервера",
"title": "URL сервиса",
"dataPath": "АдресСервера"
}
]
}
Реализация кроссплатформенного компилятора на Python
Компилятор работает на стандартных модулях Python без установки сторонних пакетов. Для генерации структуры узлов используется xml.etree.ElementTree, а форматирование отступов выполняет xml.dom.minidom.
Функция build_form_xml принимает словарь параметров и строит результирующее XML-дерево. В обработчике parse_elements реализовано ветвление по типам интерфейсных элементов:
def parse_elements(elements_list, parent_xml):
nonlocal elem_counter
for el in elements_list:
elem_counter += 1
el_type = el.get("type", "input")
el_name = el.get("name", f"Элемент_{elem_counter}")
el_title = el.get("title", el_name)
if el_type == "group":
grp = ET.SubElement(parent_xml, "UsualGroup")
grp.set("name", el_name)
grp.set("id", str(elem_counter))
create_ml_string(grp, "Title", el_title)
g_dir = ET.SubElement(grp, "Group")
g_dir.text = el.get("group", "Vertical")
show_title = ET.SubElement(grp, "ShowTitle")
show_title.text = "true" if el.get("showTitle", True) else "false"
if "children" in el:
parse_elements(el["children"], grp)
elif el_type == "button":
btn = ET.SubElement(parent_xml, "Button")
btn.set("name", el_name)
btn.set("id", str(elem_counter))
cmd_name = el.get("command", "")
c_el = ET.SubElement(btn, "CommandName")
c_el.text = f"Form.Command.{cmd_name}" if not cmd_name.startswith("Form.") else cmd_name
create_ml_string(btn, "Title", el_title)
Каждому элементу формы присваивается порядковый числовой номер. Отрицательные номера платформа резервирует под стандартные кнопки, а созданные элементы получают положительные числа.
Связывание поля с реквизитом выполняет тег DataPath. Путь к данным повторяет имя реквизита из секции Attributes или реквизит основного объекта через точку (например, Объект.Организация).
Итоговая запись сохраняет кодировку UTF-8 со стандартным прологом <?xml version="1.0" encoding="utf-8"?>. Функция очистки убирает лишние пустые строки. Это сохраняет побайтовую стабильность выходного файла.
Проверка корректности схемы через verify.py
Для подтверждения надежности сгенерированных файлов подготовлен скрипт verify.py. Тестирование проверяет корректность генерации и соответствие схемы метаданных.
def run_tests():
here = Path(__file__).parent
json_path = here / "sample_form.json"
out_xml = here / "out_Form.xml"
print("=== [TEST 1] Компиляция sample_form.json в Form.xml ===")
assert json_path.exists(), f"Не найден {json_path}"
compile_form(str(json_path), str(out_xml))
assert out_xml.exists(), "Файл out_Form.xml не был создан"
print("PASS: Файл out_Form.xml успешно сгенерирован")
print("\n=== [TEST 2] Валидация XML синтаксиса и пространства имен ===")
tree = ET.parse(str(out_xml))
root = tree.getroot()
assert "Form" in root.tag, f"Неверный корневой тег: {root.tag}"
print(f"PASS: Корневой элемент: {root.tag}")
print("\n=== [TEST 3] Проверка структуры реквизитов и элементов ===")
xml_content = out_xml.read_text(encoding="utf-8")
required_tags = [
"Title", "AutoCommandBar", "ChildItems", "UsualGroup",
"InputField", "CheckBoxField", "Button", "Attributes",
"Commands", "Events"
]
for tag in required_tags:
assert f"<{tag}" in xml_content or f":{tag}" in xml_content, f"Отсутствует тег {tag}"
print("PASS: Все поля, реквизиты и команды экспортированы корректно")
При обработке демонстрационного файла компилятор создает документ размером 5780 байт за 12 миллисекунд. Файл открывается платформой 1С без предупреждений о расхождении структуры.
Встраивание генератора в конвейер сборки обработок
Сгенерированный файл Form.xml помещается в стандартную файловую структуру исходников обработки:
ВнешняяОбработка/
+-- Ext/
| \-- ObjectModule.bsl
+-- Forms/
| \-- Форма/
| +-- Ext/
| | +-- Form.xml
| | \-- Form/
| | \-- Module.bsl
| \-- Form.xml
\-- ...
Для сборки готового файла внешней обработки в конвейере запускается консольная утилита v8unpack или модуль 1C:Enterprise Development Tools (EDT). На первом шаге конвейер выполняет генерацию разметки Form.xml по JSON-файлу, после чего собирает бинарный файл обработки.
В пайплайнах GitLab CI и GitHub Actions утилита дает возможность генерировать формы под нужные конфигурации баз данных. При правках состава полей разработчик обновляет параметры в JSON-файле без ручного входа в конфигуратор.
Работа в изолированном контейнере снимает зависимость от окружения хоста. Скрипт одинаково стабильно компилирует формы в образах Linux и Windows.
Практические шаблоны компоновки управляемых форм
При описании интерфейсов через JSON DSL применяются типовые схемы компоновки:
Первая схема соответствует окну настроек сервиса. Экран разделен на логические блоки с заголовками, поля авторизации собраны в вертикальную колонку, а служебные кнопки вынесены в нижнюю панель.
Вторая схема реализует рабочее место диспетчера. В верхней зоне находятся фильтры по датам и переключатели режимов, а под ними расположена табличная часть с колонками.
Третья схема предназначена для диалогов ввода параметров. Форма получает фиксированные габариты и компактную панель команд.
Использование готовых шаблонов JSON ускоряет создание новых обработок и поддерживает единый стиль экранных форм в проекте.
Итоги внедрения в рабочий процесс
Применение генератора Form.xml переводит разработку экранных форм в практику управления инфраструктурой как кодом (IaC). Описание структуры в текстовом виде ускоряет код-ревью в репозитории, предотвращает конфликты слияния веток и автоматизирует создание артефактов в CI/CD.
Тестовые сценарии и исходный код генератора из архива публикации дают готовую основу для внедрения в сборочные линии и ускорения выпуска решений на платформе 1С.
Вступайте в нашу телеграмм-группу Инфостарт