Как добавить реквизит на форму в расширении 1С и избежать вылета конфигуратора?

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

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

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

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

В результате такого действия:

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

Выясним причину падения Конфигуратора

Вылет Конфигуратора при перетаскивании реквизита на форму — это известная коллизия. Она часто связана с тем, что динамическая отрисовка формы в редакторе не может корректно сопоставить идентификаторы элементов основной конфигурации и расширения. Рассмотрим основные шаги для устранения этой нестабильности:

  1. Проверка режима совместимости: Убедимся, что режим совместимости расширения в точности соответствует режиму совместимости основной конфигурации. Различие в версиях часто приводит к ошибкам при работе визуального конструктора.
  2. Очистка основного стиля: Попробуем в свойствах самого расширения (корень дерева объектов расширения) очистить поле Основной стиль. Иногда специфические стили основной конфигурации конфликтуют с редактором форм расширения.
  3. Обновление расширения формы: Вместо пересоздания объекта воспользуемся штатной функцией. В редакторе формы выберем пункт меню «Текст» — «Форма» — «Обновить расширение формы» (или через контекстное меню расширений). Платформа попытается синхронизировать структуру, не удаляя ваш код.

Программное добавление элементов — самый надежный способ

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

Предположим, нам нужно добавить реквизит ДополнительнаяИнформация и отобразить его на форме. Сначала добавим сам реквизит в объект (например, в справочник) внутри расширения. После этого перейдем к программной части.

Добавление реквизита формы

Если нам нужен не реквизит объекта, а именно новый реквизит самой формы, воспользуемся методом ИзменитьРеквизиты(). Рассмотрим пример кода, который необходимо разместить в процедуре ПриСозданииНаСервере, используя аннотацию &После:


&После("ПриСозданииНаСервере")
Процедура ИТ_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
    
    // Опишем новый реквизит формы
    ДобавляемыеРеквизиты = Новый Массив;
    ТипСтрока = Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(150));
    НовыйРеквизит = Новый РеквизитФормы("ИТ_ДопИнфо", ТипСтрока, "", "Доп. информация");
    ДобавляемыеРеквизиты.Добавить(НовыйРеквизит);
    
    // Добавим реквизит на форму
    ЭтаФорма.ИзменитьРеквизиты(ДобавляемыеРеквизиты);
    
    // Теперь создадим визуальный элемент для этого реквизита
    РазберемПрограммноеСозданиеЭлемента();
    
КонецПроцедуры

Разместим элемент управления на форме

После того как реквизит программно создан (или если мы используем уже существующий реквизит объекта), нам нужно вывести его в интерфейс. Проанализируем, как добавить поле ввода в конкретную группу элементов:


Процедура РазберемПрограммноеСозданиеЭлемента()
    
    // Укажем родительскую группу, в которую хотим поместить поле.
    // Если группа также создана в расширении, обращаемся к ней по имени.
    Родитель = Элементы.ГруппаШапка; 
    
    // Добавляем элемент управления типа ПолеФормы
    НовоеПоле = Элементы.Добавить("ИТ_ПолеДопИнфо", Тип("ПолеФормы"), Родитель);
    НовоеПоле.Вид = ВидПоляФормы.ПолеВвода;
    НовоеПоле.ПутьКДанным = "Объект.ДополнительнаяИнформация"; // Или "ИТ_ДопИнфо", если создали реквизит формы
    НовоеПоле.Заголовок = "Дополнительные сведения";
    
    // Установим дополнительные свойства, если нужно
    НовоеПоле.РастягиватьПоГоризонтали = Истина;
    
КонецПроцедуры

Важный момент: Программное создание элементов может показаться трудоемким, если элементов десятки. Однако это гарантирует, что при следующем обновлении типовой конфигурации ваша форма не «рассыплется» и вам не придется тратить часы на восстановление визуальных привязок.

Что делать, если программный метод слишком сложен?

Если проект требует исключительно визуальной правки, а Конфигуратор продолжает вылетать, воспользуемся методом «буферной формы». Посмотрим на этот алгоритм:

  1. Создадим в расширении новую временную форму (просто пустую форму).
  2. Откроем проблемную форму, выделим все доработанные элементы и группы, скопируем их (Ctrl+C) и вставим во временную форму (Ctrl+V).
  3. Текст модуля также скопируем в отдельный текстовый файл.
  4. Теперь мы можем безопасно удалить проблемную форму из расширения и заимствовать её заново.
  5. Вернем доработки из временной формы в обновленную заимствованную форму.

Этот метод позволяет «обнулить» возможные внутренние ошибки идентификаторов, которые накопились в расширении в процессе разработки, и начать работу с «чистого листа», сохранив при этом плоды своего труда.

Итоги и рекомендации

Подводя итог, отметим: стабильная работа с формами в расширениях требует дисциплины. Никогда не используйте команду «Добавить» для уже существующих объектов расширения. Если визуальный редактор работает нестабильно, это верный признак того, что пора переходить на программное управление элементами. Это повышает квалификацию разработчика и делает программный код более предсказуемым и надежным.

← На главную