Какие элементы отобразятся в форме при ее обновлении в конфигурации, если она уже изменена в расширении?

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

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

Механизм трехстороннего объединения управляемых форм

Платформа 1С:Предприятие 8.3 не заменяет форму целиком и не берет слепо только один из вариантов. Для управляемых форм используется алгоритм трехстороннего объединения (3-way merge). В процессе построения интерфейса участвуют три состояния формы:

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

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

Как платформа определяет итоговый состав элементов

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

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

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

Особенности отображения формы в конфигураторе и актуализация

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

Чтобы синхронизировать визуальную структуру и увидеть новые элементы внутри расширения, выполним следующие действия:

  1. Откроем нужную форму в расширении конфигурации.
  2. В главном меню редактора формы выберем команду Расширения — Обновить расширение формы. Платформа выполнит сверку с текущей конфигурацией и обновит дерево элементов.
  3. Если требуется оценить исходную точку объединения, воспользуемся пунктом Расширения — Показать сохраненную форму. Это позволит увидеть сохраненный снимок и понять, с чем сравниваются текущие изменения.

Возможные риски и ошибки при обновлении

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

  1. Удаление или переименование целевого элемента: если поставщик переименует или удалит элемент, к которому привязан обработчик в расширении, при открытии формы возникнет критическая ошибка или предупреждение о нарушении применимости.
  2. Нарушение иерархии групп: если в расширении элемент был перенесен внутрь определенной группы или страницы, а поставщик при обновлении удалил эту группу-родитель, элемент может сместиться в корень формы либо нарушить верстку диалога.
  3. Интерактивное перемещение элементов: если разработчик менял порядок элементов в редакторе расширения, платформа запоминает эту структуру, что может привести к нарушению логического порядка новых полей, добавленных поставщиком.

Программная модификация формы как надежная альтернатива

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

Вместо добавления всей визуальной формы в расширение заимствуем исключительно модуль формы и перехватим событие инициализации:


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

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

← На главную