---
name: 1c-info-screen-form
description: Creating a read-only modal info form with grouped tables and shared description field for a 1С battle/inspection screen (Veritas project)
source: auto-skill
extracted_at: '2026-06-12T01:01:08.789Z'
---

# Создание информационно-справочной read-only формы боя/игры

Целевой проект: `D:\1C\VeritasGit\Veritas\DataProcessors\ТестированиеЗнаний`

## Контекст

Форма боя содержит несколько табличных реквизитов, которые игрок должен видеть в свёрнутом виде:
- Параметры/эффекты (баффы/дебаффы) на игроке
- Параметры/эффекты на противнике
- Пассивные умения/модификаторы
- Карты в колоде/стопках

Требуется создать **модальную read-only форму**, которая показывает все эти данные сгруппированно, и имеет общее поле описания, обновляющееся при выборе строки в таблицах.

## Шаг 1. Добавить кнопку "i" (справка) в HUD основной формы

### В `Form.xml` основной формы:

**A. Добавить команду** в секцию `<Commands>`:

```xml
<Command name="ИнформацияОБое" id="N">
    <Title>
        <v8:item>
            <v8:lang>ru</v8:lang>
            <v8:content>i</v8:content>
        </v8:item>
    </Title>
    <ToolTip>
        <v8:item>
            <v8:lang>ru</v8:lang>
            <v8:content>Информация о бое</v8:content>
        </v8:item>
    </ToolTip>
    <Picture>
        <xr:Ref>StdPicture.FormHelp</xr:Ref>
        <xr:LoadTransparent>true</xr:LoadTransparent>
    </Picture>
    <Action>ИнформацияОБое</Action>
</Command>
```

Где `id="N"` — следующий свободный номер команды (посмотреть последний в `<Commands>`).

**B. Добавить кнопку** в нужное место HUD. Например, в `HUD_СтрокаРесурсовИгрока` (рядом с индикатором энергии):

```xml
<Button name="HUD_КнопкаИнформация" id="M">
    <Type>UsualButton</Type>
    <Representation>Picture</Representation>
    <GroupHorizontalAlign>Right</GroupHorizontalAlign>
    <CommandName>Form.Command.ИнформацияОБое</CommandName>
    <Width>2</Width>
    <ExtendedTooltip name="HUD_КнопкаИнформацияРасширеннаяПодсказка" id="M+1"/>
</Button>
```

### В `Module.bsl` основной формы:

**Добавить обработчик команды (передача массивами структур):**

> **⚠️ Важно:** `ТаблицаЗначений` недоступна на клиенте в мобильном приложении. Данные нужно собирать в массивы структур.

```bsl
&НаКлиенте
Процедура ИнформацияОБое(Команда)
    // Инициализация.
    ПараметрыФормы = Новый Структура;
    // Формирование массива параметров игрока.
    МассивПараметровИгрока = Новый Массив;
    Для Каждого ТекСтрока Из ПараметрыИгрока Цикл
        СтруктураПараметра = Новый Структура;
        СтруктураПараметра.Вставить("ВидПараметра", ТекСтрока.ВидПараметра);
        СтруктураПараметра.Вставить("ЗначениеПараметра", ТекСтрока.ЗначениеПараметра);
        МассивПараметровИгрока.Добавить(СтруктураПараметра);
    КонецЦикла;
    ПараметрыФормы.Вставить("ПараметрыИгрока", МассивПараметровИгрока);
    // Аналогично для ПараметрыПротивника, Модификаторы, Карты
    // ...
    // Открыть форму с блокировкой окна владельца (бой на паузе)
    ОткрытьФорму("Обработка.ТестированиеЗнаний.Форма.ФормаИнформацииОБое",
        ПараметрыФормы, ЭтаФорма, , , , , РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецПроцедуры
```

> **Важно:** Для мобильного клиента используйте `ОткрытьФорму` с `РежимОткрытияОкнаФормы.БлокироватьОкноВладельца` вместо `ОткрытьФормуМодально`.

### Альтернатива: передача ValueTable (только для серверных вызовов)

Если данные собираются на сервере — можно использовать ValueTable:

```bsl
&НаСервере
Процедура ПодготовитьДанныеНаСервере()
    ТаблицаПараметров = Новый ТаблицаЗначений;
    ТаблицаПараметров.Колонки.Добавить("ВидПараметра");
    ТаблицаПараметров.Колонки.Добавить("ЗначениеПараметра");
    // ... заполнение ...
    Возврат ТаблицаПараметров;
КонецПроцедуры
```

## Шаг 2. Создать новую форму ФормаИнформацииОБое

Создаются 3 файла + регистрация в родительском `ТестированиеЗнаний.xml`. Подробная инструкция по созданию файлов — в навыке `1c-new-form`.

### 2.1 Параметры (Parameters)

В `Ext\Form.xml` секция `<Parameters>`. **Тип параметра ОБЯЗАТЕЛЕН** — параметры без `<Type>` приводят к ошибке загрузки конфигурации.

**Вариант A — ValueTable (рекомендуемый):**

```xml
<Parameters>
    <Parameter name="ПараметрыИгрока">
        <Type><v8:Type>v8:ValueTable</v8:Type></Type>
    </Parameter>
    <Parameter name="ПараметрыПротивника">
        <Type><v8:Type>v8:ValueTable</v8:Type></Type>
    </Parameter>
    <Parameter name="Модификаторы">
        <Type><v8:Type>v8:ValueTable</v8:Type></Type>
    </Parameter>
    <Parameter name="Карты">
        <Type><v8:Type>v8:ValueTable</v8:Type></Type>
    </Parameter>
</Parameters>
```

При этом в модуле формы `ПриСозданииНаСервере` данные копируются прямым присваиванием:

```bsl
ЭффектыИгрока = Параметры.ПараметрыИгрока;   // реквизит формы = таблица из параметра
```

**Вариант B — Массив структур:**

```xml
<Parameters>
    <Parameter name="ПараметрыИгрока">
        <Type><v8:Type>v8:Array</v8:Type></Type>
    </Parameter>
    <!-- ... -->
</Parameters>
```

В модуле — итерация по массиву и заполнение реквизита-ValueTable строками.

### 2.2 Реквизиты (Attributes)

Для отображения таблиц формы нужны реквизиты типа `v8:ValueTable`:

```xml
<Attributes>
    <!-- Стандартный для формы обработки -->
    <Attribute name="Объект" id="1">
        <Type><v8:Type>cfg:DataProcessorObject.ТестированиеЗнаний</v8:Type></Type>
        <MainAttribute>true</MainAttribute>
    </Attribute>
    <!-- Табличные реквизиты -->
    <Attribute name="ЭффектыИгрока" id="2">
        <Type><v8:Type>v8:ValueTable</v8:Type></Type>
        <Columns>
            <Column name="ВидПараметра" id="1">
                <Type><v8:Type>cfg:EnumRef.ВидыПараметровИгроков</v8:Type></Type>
            </Column>
            <Column name="ЗначениеПараметра" id="2">
                <Type><v8:Type>xs:decimal</v8:Type>
                    <v8:NumberQualifiers><v8:Digits>7</v8:Digits><v8:FractionDigits>3</v8:FractionDigits><v8:AllowedSign>Any</v8:AllowedSign></v8:NumberQualifiers>
                </Type>
            </Column>
        </Columns>
    </Attribute>
    <Attribute name="ЭффектыПротивника" id="3">
        <!-- Аналогичная структура -->
    </Attribute>
    <Attribute name="МодификаторыТаблица" id="4">
        <Type><v8:Type>v8:ValueTable</v8:Type></Type>
        <Columns>
            <Column name="Модификатор" id="1">
                <Type><v8:Type>cfg:CatalogRef.Модификаторы</v8:Type></Type>
            </Column>
        </Columns>
    </Attribute>
    <Attribute name="КартыТаблица" id="5">
        <Type><v8:Type>v8:ValueTable</v8:Type></Type>
        <Columns>
            <Column name="Карта" id="1">
                <Type><v8:Type>cfg:CatalogRef.Карты</v8:Type></Type>
            </Column>
        </Columns>
    </Attribute>
    <Attribute name="ТекстОписания" id="6">
        <Title><v8:item><v8:lang>ru</v8:lang><v8:content>Описание</v8:content></v8:item></Title>
        <Type><v8:Type>xs:string</v8:Type><v8:StringQualifiers><v8:Length>0</v8:Length><v8:AllowedLength>Variable</v8:AllowedLength></v8:StringQualifiers></Type>
    </Attribute>
</Attributes>
```

### 2.3 Структура элементов формы (ChildItems)

Форма состоит из групп, каждая содержит таблицу:

```
┌────────────────────────────────┐
│ [Заголовок секции]             │
│ ┌────────────────────────────┐ │
│ │ Таблица 1 (эффекты игрока) │ │
│ └────────────────────────────┘ │
│ [Заголовок секции]             │
│ ┌────────────────────────────┐ │
│ │ Таблица 2 (эффекты врага)  │ │
│ └────────────────────────────┘ │
│ [Заголовок секции]             │
│ ┌────────────────────────────┐ │
│ │ Таблица 3 (модификаторы)   │ │
│ └────────────────────────────┘ │
│ [Заголовок секции]             │
│ ┌────────────────────────────┐ │
│ │ Таблица 4 (карты)          │ │
│ └────────────────────────────┘ │
│ ┌────────────────────────────┐ │
│ │ Поле описания (многостроч.)│ │
│ └────────────────────────────┘ │
│ [ Закрыть ]                    │
└────────────────────────────────┘
```

**Каждая таблица** настраивается так:

```xml
<Table name="ЭффектыИгрокаТаблица" id="10">
    <DataPath>ЭффектыИгрока</DataPath>
    <RowPicture>None</RowPicture>
    <UseAlternationRowColor>true</UseAlternationRowColor>
    <ContextMenu name="ЭффектыИгрокаТаблицаКонтекстноеМеню" id="11"/>
    <ExtendedTooltip name="ЭффектыИгрокаТаблицаРасширеннаяПодсказка" id="12"/>
</Table>
```

**Поле описания:**

```xml
<InputField name="ТекстОписанияПоле" id="50">
    <DataPath>ТекстОписания</DataPath>
    <ReadOnly>true</ReadOnly>
    <MultiLine>true</MultiLine>
    <Title>
        <v8:item>
            <v8:lang>ru</v8:lang>
            <v8:content>Описание</v8:content>
        </v8:item>
    </Title>
    <HorizontalStretch>true</HorizontalStretch>
    <BackgroundColor>web:LightYellow</BackgroundColor>
    <ContextMenu name="ТекстОписанияПолеКонтекстноеМеню" id="51"/>
    <ExtendedTooltip name="ТекстОписанияПолеРасширеннаяПодсказка" id="52"/>
</InputField>
```

**Кнопка закрытия:**

```xml
<Button name="ЗакрытьФорму" id="60">
    <Type>UsualButton</Type>
    <HorizontalStretch>true</HorizontalStretch>
    <CommandName>Form.Command.Закрыть</CommandName>
    <Title>
        <v8:item>
            <v8:lang>ru</v8:lang>
            <v8:content>Закрыть</v8:content>
        </v8:item>
    </Title>
    <ExtendedTooltip name="ЗакрытьФормуРасширеннаяПодсказка" id="61"/>
</Button>
```

**Команда закрытия:**

```xml
<Command name="Закрыть" id="1">
    <Title><v8:item><v8:lang>ru</v8:lang><v8:content>Закрыть</v8:content></v8:item></Title>
    <Action>Закрыть</Action>
</Command>
```

### 2.4 Модуль формы (Module.bsl)

```bsl
&НаКлиенте
Процедура Закрыть(Команда)
	Закрыть();
КонецПроцедуры

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	// Инициализация: заполнение таблиц из переданных массивов
	МассивПараметровИгрока = Параметры.ПараметрыИгрока;
	Для Каждого ТекЭлемент Из МассивПараметровИгрока Цикл
		НоваяСтрока = ЭффектыИгрока.Добавить();
		НоваяСтрока.ВидПараметра = ТекЭлемент.ВидПараметра;
		НоваяСтрока.ЗначениеПараметра = ТекЭлемент.ЗначениеПараметра;
	КонецЦикла;
	// Аналогично для ЭффектыПротивника, МодификаторыТаблица, КартыТаблица
	// Инициализация текста описания
	ТекстОписания = "";
	// Скрыть пустые группы
	Если ЭффектыИгрока.Количество() = 0 Тогда
		Элементы.ГруппаЭффектыИгрока.Видимость = Ложь;
	КонецЕсли;
	// Аналогично для других таблиц
КонецПроцедуры

&НаКлиенте
Процедура МодификаторыТаблицаПриВыборе(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	Если ВыбраннаяСтрока = Неопределено Тогда
		ТекстОписания = "";
	Иначе
		ТекстОписания = ВыбраннаяСтрока.Модификатор.Описание;
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура КартыТаблицаПриВыборе(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	Если ВыбраннаяСтрока = Неопределено Тогда
		ТекстОписания = "";
	Иначе
		ТекстОписания = ВыбраннаяСтрока.Карта.Описание;
	КонецЕсли;
КонецПроцедуры
```

**Важно:** События `OnSelection` для таблиц (`МодификаторыТаблицаПриВыборе`, `КартыТаблицаПриВыборе`) нужно зарегистрировать в `Form.xml` в секции `<Events>` или в самой таблице:

```xml
<Table name="МодификаторыТаблица" id="N">
    ...
    <Events>
        <Event name="OnSelection">МодификаторыТаблицаПриВыборе</Event>
    </Events>
</Table>
```

## Шаг 3. Как читать связанные реквизиты справочников

При подключении таблицы к реквизиту типа `CatalogRef.Модификаторы`, поле описания читается через реквизит элемента справочника:

```bsl
// Пользовательский реквизит "Описание" (Строка, 150 символов)
ТекстОписания = ВыбраннаяСтрока.Модификатор.Описание;

// Стандартный реквизит "Наименование" (Description)
ТекстОписания = ВыбраннаяСтрока.Модификатор.Наименование;
```

Не путать: `Наименование` — стандартный реквизит (Description), `Описание` — пользовательский реквизит, добавленный в конфигурации.

## Шаг 4. Оптимизация для мобильных устройств

1. **Скрывать пустые группы** — проверять `Таблица.Количество() = 0` в `ПриСозданииНаСервере` и скрывать группу
2. **Поле описания** делать с фиксированной высотой (4-5 строк), `AutoMaxHeight = false`
3. **Использовать `UseAlternationRowColor = true`** для лучшей читаемости на маленьких экранах
4. **Цвет фона поля описания** — нейтральный оттенок (например, `web:LightYellow`)
5. Для длинных списков добавьте скроллинг — таблицы в 1С по умолчанию скроллируемые
6. **Не используйте `АвтоМаксимальнаяВысота`** на полях ввода — задайте конкретную высоту

## Шаг 5. Проверка перед завершением

- [ ] Кнопка "i" добавлена в HUD и видна только в режиме боя (восхождение)
- [ ] Команда `ИнформацияОБое` зарегистрирована в `<Commands>` с уникальным id
- [ ] Новая форма создана: 3 файла + зарегистрирована в `ТестированиеЗнаний.xml`
- [ ] UUID в метаданных формы — уникальный
- [ ] Параметры формы читаются в `ПриСозданииНаСервере`
- [ ] События `OnSelection` зарегистрированы для таблиц, где нужно показывать описание
- [ ] Пустые группы скрыты
- [ ] После закрытия формы бой продолжается с того же места (форма read-only, модальная)
- [ ] Нет изменений в бизнес-логике боя
