К статье
Практический материал

Разработка и Конфигурация · 12 мин

Как использовать форму из расширения в 1С

Как подключить и использовать форму из расширения 1С: заимствование, создание собственной формы, изменение кода, контроль обновлений и типичные ошибки.

Расширение конфигурации в 1С позволяет изменять поведение типовой формы без снятия конфигурации с поддержки. Это основной способ доработки интерфейса в типовых решениях: вы добавляете реквизиты, команды, обработчики событий, а при обновлении конфигурации поставщиком ваши изменения сохраняются. Форма из расширения подключается к объекту конфигурации и работает поверх типовой формы или вместо неё.

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

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

Зачем дорабатывать формы через расширение

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

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

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

Как заимствовать типовую форму в расширение

Заимствование — основной способ доработать окно документа, справочника или отчёта. Последовательность действий в конфигураторе:

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

После добавления формы в расширение её свойство «Изменение» определяет поведение. Вариант «Изменяется в расширении» означает, что вы редактируете форму: добавляете элементы, меняете свойства, пишете код модуля. Платформа при наложении объединит типовую форму с вашей версией.

В модуле заимствованной формы доступны аннотации управления обработчиками. Директива &После("ИмяПроцедуры") выполняет ваш код после типового обработчика, &Перед("ИмяПроцедуры") — до него, а &ИзменениеИКонтроль("ИмяПроцедуры") полностью замещает типовой обработчик с возможностью вызвать оригинал внутри. Для большинства задач достаточно «После» и «Перед» — они устойчивее к обновлениям, так как не разрывают логику поставщика.

bsl
&После("ПриСозданииНаСервере")
Процедура Расш1_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	// добавляемое поле видно только менеджерам
	Элементы.ДобавленноеПоле.Видимость = Пользователи.ЭтоПолноправныйПользователь();
КонецПроцедуры

Как изменить элементы и код заимствованной формы

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

Изменение свойств типовых элементов тоже возможно: заголовок, видимость, доступность, подсказка. Будьте аккуратны с изменением обязательных свойств вроде «ПутьКДанным» — если переопределить связь элемента с данными, типовая логика заполнения может перестать работать. Безопаснее менять только визуальные свойства, а данные выводить в отдельных добавленных элементах.

В модуле формы помимо обработчиков событий можно добавлять собственные процедуры и команды. Команда создаётся на закладке «Команды», затем перетаскивается в командную панель формы. Обработчик команды размещается в модуле с директивой &НаКлиенте или &НаСервере — по тем же правилам, что и в обычной форме.

Как создать собственную форму в расширении и вызвать её

Собственная форма нужна, когда типовой формы-основы нет: например, панель массовой обработки документов, форма настроек обмена, диалог ввода дополнительных параметров. В дереве расширения добавьте новый объект (например, обработку) или форму к заимствованному объекту: правой кнопкой по ветке «Формы» — «Добавить». Такая форма полностью ваша: платформа не накладывает её на типовую, поэтому обновления поставщика её не ломают.

Вызов собственной формы выполняется из кода функцией ОткрытьФорму(). Имя формы строится по шаблону: для формы обработки из расширения — Обработка.ИмяОбработки.Форма.ИмяФормы, для формы объекта — Документ.ИмяДокумента.Форма.ИмяФормы. Чтобы кнопка вызова появилась в типовой форме, заимствуйте её, добавьте команду и в обработчике команды вызовите свою форму.

bsl
&НаКлиенте
Процедура Расш1_ОткрытьПанельНастроек(Команда)
	ПараметрыФормы = Новый Структура("Организация", Объект.Организация);
	ОткрытьФорму("Обработка.МояОбработка.Форма.ПанельНастроек", ПараметрыФормы, ЭтотОбъект);
КонецПроцедуры

Помимо программного вызова, форму обработки из расширения можно подключить к интерфейсу через механизм дополнительных отчетов и обработок (в типовых конфигурациях на БСП) — тогда она появится в разделе «Дополнительные обработки» без изменения командного интерфейса. Это удобно для сервисных инструментов, которые запускают вручную.

Что проверить после обновления конфигурации

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

Контрольные точки

Как проверить результат

Применимость расширения
Норма

В списке расширений статус «Применяется», ошибок нет

Тревожный признак

Статус с предупреждением, в журнале ошибки применения

Открытие формы
Норма

Форма открывается, добавленные элементы на месте

Тревожный признак

Ошибка «Поле не найдено» или пустое окно

Обработчики
Норма

Кнопки и события выполняют ваш код

Тревожный признак

Типовая логика работает, а доработка молча не вызывается

Сохранение данных
Норма

Документ записывается и проводится без ошибок

Тревожный признак

Ошибки при записи после изменений в форме

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

Типичные ошибки при работе с формами расширений

Типичные ошибки
01
Замещение типового обработчика через «ИзменениеИКонтроль» без вызова оригинала — после обновления теряется часть логики поставщика. Используйте «Перед» и «После», где возможно.
02
Ссылка на реквизит формы, который поставщик может переименовать — форма падает после обновления. Проверяйте существование реквизита через свойства объекта перед обращением.
03
Добавление формы в расширение без изменения её свойств — доработки не применяются, потому что форма осталась в режиме «не изменяется».
04
Тестирование только в конфигураторе без обновления конфигурации базы данных — в режиме предприятия изменений не видно, и кажется, что расширение не работает.
05
Добавление в один объект нескольких расширений с конфликтующими изменениями одной формы — итоговое поведение зависит от порядка применения и становится непредсказуемым.

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

Когда расширение не подходит и что делать вместо

Маршрут решения

Как выбрать действие

Нужно добавить поле, кнопку или обработчик в типовую формуЗаимствуйте форму в расширение и доработайте через &Перед/&После
Нужен отдельный инструмент без привязки к типовой формеСоздайте собственную форму обработки в расширении и вызывайте через ОткрытьФорму()
Нужно изменить состав объектов метаданных (новый документ, регистр)Добавьте объект в расширение — формы для него создаются там же
Расширение конфликтует с другим расширением над той же формойОбъедините доработки в одно расширение или согласуйте порядок применения
Требуется глубокая переделка логики формы поставщикаОцените внешнюю обработку или осознанное снятие объекта с поддержки — расширение даст хрупкое решение

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

Итог

Что важно запомнить

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

Частые вопросы

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

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

Можно ли в расширении удалить элемент с типовой формы?

Физически удалить элемент нельзя — расширение только добавляет и переопределяет. Стандартный приём — установить элементу свойство «Видимость» в «Ложь» либо программно скрывать его в обработчике «ПриСозданииНаСервере» с директивой &После.

Чем &ИзменениеИКонтроль отличается от &После?

&После добавляет ваш код к типовому обработчику, не нарушая его работу. &ИзменениеИКонтроль полностью замещает типовой обработчик вашей процедурой; оригинал можно вызвать внутри, но ответственность за сохранение логики поставщика переходит к вам. После обновления конфигурации замещённый обработчик требует ручной сверки с новой версией.

Как открыть форму расширения из другой формы?

Используйте ОткрытьФорму() с полным именем формы, например «Обработка.Имя.Форма.ИмяФормы», и передайте параметры структурой. Если нужно получить результат, открывайте форму с описанием оповещения о закрытии — значение вернётся в процедуру-обработчик вызывающей формы.

Что делать, если два расширения изменяют одну форму?

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

Нужно ли снимать конфигурацию с поддержки для работы расширений?

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