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