Почему возникает аварийное завершение и запись дампа при программном создании страниц на управляемой форме?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При динамическом формировании интерфейса управляемой формы разработчики иногда сталкиваются с критической ошибкой: серверный код успешно отрабатывает, но в момент выхода из процедуры или передачи управления на клиент платформа 1С:Предприятие аварийно завершает работу с сообщением «Запись дампа» (crash dump). Разберем причины такого сбоя, выясним особенности построения дерева элементов и рассмотрим правильный способ создания страниц.

Причина критического сбоя платформы

Проанализируем структуру элементов управляемой формы. В платформе 1С действует строгое правило иерархии для панелей вкладок:

  1. Элемент ГруппаФормы с видом ВидГруппыФормы.Страница не может существовать самостоятельно в корне формы или внутри группы вида ВидГруппыФормы.ОбычнаяГруппа.
  2. Родителем для элемента ВидГруппыФормы.Страница обязательно должен выступать контейнер ГруппаФормы с видом ВидГруппыФормы.Страницы (панель страниц).

Когда в коде методом Элементы.Добавить() создается страница, а в качестве родителя передается обычная группа, синтаксической ошибки на сервере не возникает. Однако при завершении серверного вызова и попытке сериализовать некорректно сформированное дерево элементов в разметку для клиентского интерфейса графический движок сталкивается с нарушением топологии контролов. Это приводит к необработанному системному исключению в нативном коде платформы и падению процесса с записью дампа памяти.

Примечательно, что если страница остается абсолютно пустой, платформа может проигнорировать её рендеринг, но как только внутрь ошибочно размещенной страницы добавляется любой визуальный контрол (декорация, поле ввода, кнопка), аварийное завершение становится неизбежным.

Разбор ошибочного и исправленного кода

Посмотрим на пример кода, вызывающий падение платформы:


// ОШИБКА: Элементы.Группа1 имеет вид "ОбычнаяГруппа"
Страница = Элементы.Добавить("СтраницаГруппыАвтомобили" + Имя, Тип("ГруппаФормы"), Элементы.Группа1);
Страница.Вид = ВидГруппыФормы.Страница;
Страница.Заголовок = Строка.Наименование;

ДекорацияИмя = "ДекорацияГруппыАвтомобили" + Имя;
Надпись = Элементы.Добавить(ДекорацияИмя, Тип("ДекорацияФормы"), Страница);
Надпись.Заголовок = "Тест";

Разберем по шагам, как исправить эту логику и правильно выстроить дерево элементов управления:

  1. Убедимся, что родительский элемент является панелью страниц. Если он уже создан в конфигураторе, проверим, чтобы свойство Вид у него было установлено в значение Страницы.
  2. Если родительская панель создается программно, сначала добавляем группу с видом ВидГруппыФормы.Страницы.
  3. Создаем дочерние страницы, передавая в третий параметр метода Элементы.Добавить() именно созданную панель страниц.
  4. Размещаем элементы содержимого (декорации, поля, таблицы) непосредственно внутри конкретной страницы.

Посмотрим на корректный шаблон создания панели со страницами и элементами:


// 1. Создание родительской панели страниц
ПанельСтраниц = Элементы.Добавить("ПанельАвтомобили", Тип("ГруппаФормы"), ЭтаФорма);
ПанельСтраниц.Вид = ВидГруппыФормы.Страницы;

// 2. Добавление страниц в цикле
ИмяИндекс = 1;
Для Каждого Строка Из РезультатЗапросаТаблица Цикл
    
    // Создаем отдельную страницу внутри панели
    ИмяСтраницы = "СтраницаАвтомобили" + Формат(ИмяИндекс, "ЧГ=0");
    НоваяСтраница = Элементы.Добавить(ИмяСтраницы, Тип("ГруппаФормы"), ПанельСтраниц);
    НоваяСтраница.Вид = ВидГруппыФормы.Страница;
    НоваяСтраница.Заголовок = Строка.Наименование;
    
    // Создаем декорацию внутри страницы
    ИмяДекорации = "ДекорацияАвтомобили" + Формат(ИмяИндекс, "ЧГ=0");
    Надпись = Элементы.Добавить(ИмяДекорации, Тип("ДекорацияФормы"), НоваяСтраница);
    Надпись.Вид = ВидДекорацииФормы.Надпись;
    Надпись.Заголовок = "Информация об автомобиле: " + Строка.Наименование;
    Надпись.РастягиватьПоГоризонтали = Истина;
    Надпись.РастягиватьПоВертикали = Истина;
    
    ИмяИндекс = ИмяИндекс + 1;
КонецЦикла;

Правила динамического изменения формы

Рассмотрим важные ограничения платформы 1С при работе с динамическими элементами:

  1. Событие формы: Добавление и удаление элементов интерфейса через методы Элементы.Добавить(), Элементы.Удалить(), а также реквизитов через ИзменитьРеквизиты() необходимо выполнять строго в процедуре ПриСозданииНаСервере. Вызов этих методов в других серверных обработчиках после передачи формы клиенту вызовет ошибку времени выполнения.
  2. Именование элементов: При формировании уникальных имен через сложение строк и чисел рекомендуется использовать явное форматирование без разделителя групп (параметр "ЧГ=0" функции Формат()), чтобы избежать случайного появления неразрывных пробелов в идентификаторах элементов.
  3. Создание связанных данных: Если на страницу добавляются не декорации, а поля ввода данных, сначала создаются реквизиты через НовыйРеквизитФормы и ИзменитьРеквизиты(), и только затем создаются сами элементы формы с заполнением свойства ПутьКДанным.
← На главную