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