Как обновить формы в расширении 1С при переходе на новый релиз и настроить командный интерфейс

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

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

1. Как платформа 1С объединяет изменения в формах: Теория трех форм

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

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

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

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

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

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

2. Пошаговая инструкция по ручному обновлению форм в расширении

Если автоматического объединения недостаточно или вы хотите принудительно обновить структуру заимствованной формы, выполните следующие шаги в конфигураторе:

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

Этот простой способ позволяет быстро актуализировать заимствованные формы без необходимости удалять их и настраивать заново.

3. Почему не переносится командный интерфейс формы и как это исправить

Часто разработчики сталкиваются с тем, что при заимствовании управляемой формы вкладка «Командный интерфейс» (в левом верхнем углу редактора формы) оказывается пустой или в ней отсутствуют стандартные команды переходов, параметризованные команды ввода на основании и т.д.

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

Рассмотрим два способа решения этой проблемы:

Способ А. Ручное заимствование связанных объектов

Чтобы в командном интерфейсе расширения появились стандартные команды переходов или создания на основании, вам необходимо вручную заимствовать в это же расширение те объекты метаданных, которые участвуют в формировании этих команд. Например, если форма документа должна отображать команду перехода к движениям по регистру накопления Продажи, заимствуйте этот регистр накопления в расширение.

Способ Б. Программное управление элементами интерфейса (Рекомендуемый)

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

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


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

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

4. Современный стандарт разработки: Программное изменение форм

Визуальное заимствование форм целиком (когда форма перетаскивается в дерево расширения и редактируется в визуальном редакторе) постепенно уходит в прошлое. Современный стандарт разработки в 1С предписывает программное изменение форм.

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

Проанализируем преимущества программного подхода:

Посмотрим на практический пример программного создания кнопки и нового реквизита на заимствованной форме документа:


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

КонецПроцедуры

Использование программного метода изменения управляемых форм в сочетании с пониманием механизмов трехстороннего объединения платформы 1С позволяет создавать стабильные, легко обновляемые расширения конфигурации, минимизируя ручную работу программиста при переходе на новые релизы программных продуктов.

← На главную