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

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

Общие формы 1С: что это и как с ними работать

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

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

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

Механизм существует и в обычном, и в управляемом приложении, но в управляемых формах (режим «Такси») общие формы используются особенно активно, потому что именно они позволяют реализовывать сервисные диалоги, не зависящие от данных конкретного объекта.

Что такое общая форма и чем она отличается от формы объекта

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

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

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

Когда стоит создавать общую форму

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

Типичные сценарии использования общих форм:

  • форма настроек программы или отдельного подсистемного блока;
  • диалог выбора периода, организации, списка значений;
  • форма ожидания с индикатором длительной операции;
  • универсальные формы вопросов и подтверждений с расширенной логикой;
  • рабочие столы и стартовые страницы подсистем;
  • формы ввода произвольных данных, не сохраняемых в объекте (например, комментарий к операции).
Маршрут решения

Общая форма или форма объекта

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

Как создать общую форму в конфигураторе

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

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

Ключевой момент — продумать, какие данные форма принимает на вход и что возвращает. Входные данные передаются через параметры формы: их нужно объявить на закладке «Параметры» в редакторе формы. Результат возвращается либо через Закрыть(Значение), либо через оповещение о выборе.

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

Как открыть общую форму из кода

Общая форма открывается программно. В управляемом приложении используются два основных подхода: блокирующий вызов через ОткрытьФормуМодально() (устаревший и не работающий в веб-клиенте без режима модальности) и современный асинхронный через ОткрытьФорму() с описанием оповещения.

bsl
&НаКлиенте
Процедура ВыбратьПериод(Команда)
    ПараметрыФормы = Новый Структура;
    ПараметрыФормы.Вставить("ДатаНачала", НачалоМесяца(ТекущаяДата()));
    Оповещение = Новый ОписаниеОповещения("ПослеВыбораПериода", ЭтотОбъект);
    ОткрытьФорму("ОбщаяФорма.ФормаВыбораПериода", ПараметрыФормы, ЭтотОбъект, , , , Оповещение);
КонецПроцедуры

&НаКлиенте
Процедура ПослеВыбораПериода(Результат, ДопПараметры) Экспорт
    Если Результат <> Неопределено Тогда
        СформироватьОтчет(Результат);
    КонецЕсли;
КонецПроцедуры

Обратите внимание на имя формы: оно строится как ОбщаяФорма.ИмяФормы. Ошибка в имени — самая частая причина сообщения «Форма не найдена». Имя проверяется при обращении, а не при компиляции, поэтому переименование формы требует поиска всех строк вызова по конфигурации.

Передача параметров и возврат результата

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

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

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

Как проверить корректность работы формы

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

Форма открывается, параметры заполняют поля

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

Ошибка «Форма не найдена» или пустые поля

Возврат значения
Норма

После нажатия «ОК» вызывающий код получает результат

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

В оповещение приходит Неопределено даже при выборе

Закрытие без выбора
Норма

Отмена корректно обрабатывается, ошибок нет

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

При закрытии крестиком возникает ошибка в коде

Повторное открытие
Норма

Ключевые параметры не плодят дубликаты окон

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

Открывается множество одинаковых окон

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

Типичные ошибки
01
Использование ОткрытьФормуМодально() — код перестаёт работать в веб-клиенте и при отключённой модальности; замените на ОткрытьФорму() с оповещением
02
Отсутствие обработки Неопределено в оповещении — при отмене выбора программа падает или выполняет операцию с пустыми данными
03
Хранение состояния в переменных модуля формы между вызовами — при повторном открытии форма ведёт себя непредсказуемо; передавайте всё через параметры
04
Дублирование логики объекта внутри общей формы — форма теряет универсальность, изменения приходится вносить в несколько мест
05
Опечатка в строковом имени формы — платформа не проверяет его при компиляции, ошибка всплывёт только в момент вызова

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

Общие формы и расширения конфигурации

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

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

Итог

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

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

Частые вопросы об общих формах 1С

Можно ли открыть общую форму без кода, например из меню?

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

Чем общая форма отличается от формы обработки?

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

Почему при вызове возникает ошибка «Форма не найдена»?

Чаще всего — опечатка в строковом имени формы или форма была переименована, а вызовы не исправлены. Проверьте точное имя в ветке «Общие формы» и формат строки: «ОбщаяФорма.ИмяФормы». Также убедитесь, что вызов идёт на клиенте — получить форму на сервере нельзя.

Как сделать, чтобы форма настроек открывалась только в одном экземпляре?

Объявите в форме ключевой параметр (например, «КлючНазначения») и передавайте в нём постоянное значение при открытии. Платформа будет активировать уже открытое окно вместо создания нового. Альтернатива — использовать уникальность в параметрах ОткрытьФорму().

Можно ли использовать общие формы в обычном приложении?

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

Безопасно ли менять общую форму типовой конфигурации?

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