Разработка и Конфигурация · 10 мин
Общие формы 1С: что это и как с ними работать
Общие формы 1С — что это такое, чем отличаются от форм объектов, как создать и подключить общую форму в конфигураторе, типичные ошибки разработчиков.
Общие формы в 1С — это формы, которые не привязаны к конкретному объекту конфигурации (справочнику, документу, регистру) и хранятся в отдельной ветке дерева конфигурации «Общие» → «Общие формы». Они используются тогда, когда одна и та же форма нужна в нескольких местах системы или когда форма вообще не относится ни к одному объекту метаданных.
Классический пример — форма настроек программы, диалог выбора периода, форма ожидания длительной операции или универсальная форма выбора значения. Вместо того чтобы создавать однотипные формы у десяти разных объектов, разработчик создаёт одну общую форму и вызывает её из любого места кода.
Механизм существует и в обычном, и в управляемом приложении, но в управляемых формах (режим «Такси») общие формы используются особенно активно, потому что именно они позволяют реализовывать сервисные диалоги, не зависящие от данных конкретного объекта.
Что такое общая форма и чем она отличается от формы объекта
У каждого объекта конфигурации (справочника, документа, отчёта) есть собственные формы: форма списка, форма элемента, форма выбора. Эти формы жёстко связаны с данными объекта — их основной реквизит обычно имеет тип «ДанныеФормыСтруктура» на основе объекта, и платформа автоматически управляет чтением и записью данных.
Общая форма такой связи не имеет. Она существует сама по себе, её реквизиты разработчик определяет вручную, а данные в неё передаются через параметры при открытии. Платформа не знает заранее, кто и зачем откроет эту форму.
Ещё одно отличие — способ вызова. Формы объектов платформа открывает сама при интерактивных действиях пользователя (двойной щелчок по элементу списка, создание документа). Общую форму всегда открывает код: интерактивно пользователь до неё «добраться» не может, если разработчик не предусмотрел команду.
Когда стоит создавать общую форму
Признак того, что нужна именно общая форма, — повторяемость или отсутствие привязки к данным. Если один и тот же диалог нужен в нескольких объектах, дублировать формы у каждого объекта — плохое решение: любое изменение придётся вносить в несколько мест, и рано или поздно копии разойдутся.
Типичные сценарии использования общих форм:
- форма настроек программы или отдельного подсистемного блока;
- диалог выбора периода, организации, списка значений;
- форма ожидания с индикатором длительной операции;
- универсальные формы вопросов и подтверждений с расширенной логикой;
- рабочие столы и стартовые страницы подсистем;
- формы ввода произвольных данных, не сохраняемых в объекте (например, комментарий к операции).
Общая форма или форма объекта
Как создать общую форму в конфигураторе
Создание общей формы занимает пару минут. Порядок действий стандартный для любой конфигурации, работающей в режиме управляемого приложения.
- 1Откройте конфигуратор и разверните ветку «Общие» в дереве конфигурации
- 2Найдите узел «Общие формы» и через контекстное меню выберите «Добавить»
- 3Задайте имя формы, например «ФормаВыбораПериода», и синоним — он виден пользователю в заголовке
- 4В редакторе формы добавьте нужные реквизиты (например, ДатаНачала и ДатаОкончания типа «Дата»)
- 5Перетащите реквизиты в дерево элементов формы, разместите команду «ОК» или «Выбрать»
- 6В модуле формы опишите обработчики ПриСозданииНаСервере и команду закрытия с возвратом значения
- 7Сохраните конфигурацию и протестируйте открытие формы из кода
Ключевой момент — продумать, какие данные форма принимает на вход и что возвращает. Входные данные передаются через параметры формы: их нужно объявить на закладке «Параметры» в редакторе формы. Результат возвращается либо через Закрыть(Значение), либо через оповещение о выборе.
Не перегружайте общую форму логикой конкретного объекта. Если внутри «универсальной» формы появляются проверки вида «если вызвали из документа Реализация, то...», это признак того, что форма перестала быть общей и её стоит разделить.
Как открыть общую форму из кода
Общая форма открывается программно. В управляемом приложении используются два основных подхода: блокирующий вызов через ОткрытьФормуМодально() (устаревший и не работающий в веб-клиенте без режима модальности) и современный асинхронный через ОткрытьФорму() с описанием оповещения.
&НаКлиенте
Процедура ВыбратьПериод(Команда)
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("ДатаНачала", НачалоМесяца(ТекущаяДата()));
Оповещение = Новый ОписаниеОповещения("ПослеВыбораПериода", ЭтотОбъект);
ОткрытьФорму("ОбщаяФорма.ФормаВыбораПериода", ПараметрыФормы, ЭтотОбъект, , , , Оповещение);
КонецПроцедуры
&НаКлиенте
Процедура ПослеВыбораПериода(Результат, ДопПараметры) Экспорт
Если Результат <> Неопределено Тогда
СформироватьОтчет(Результат);
КонецЕсли;
КонецПроцедурыОбратите внимание на имя формы: оно строится как ОбщаяФорма.ИмяФормы. Ошибка в имени — самая частая причина сообщения «Форма не найдена». Имя проверяется при обращении, а не при компиляции, поэтому переименование формы требует поиска всех строк вызова по конфигурации.
Передача параметров и возврат результата
Параметры объявляются в редакторе формы на закладке «Параметры». Если параметр помечен как «Ключевой», форма с таким набором значений параметров будет уникальной — повторный вызов ОткрытьФорму() с теми же значениями активирует уже открытое окно вместо создания нового. Это удобно для форм настроек, которые не должны плодиться в десятках экземпляров.
Принять параметры в форме можно в обработчике ПриСозданииНаСервере через коллекцию Параметры. Возврат значения выполняется вызовом Закрыть(Результат) — значение придёт в обработчик оповещения вызывающей стороны. Если пользователь просто закрыл форму крестиком, в оповещение придёт Неопределено, и этот случай обязательно нужно обрабатывать.
Как проверить корректность работы формы
Форма открывается, параметры заполняют поля
Ошибка «Форма не найдена» или пустые поля
После нажатия «ОК» вызывающий код получает результат
В оповещение приходит Неопределено даже при выборе
Отмена корректно обрабатывается, ошибок нет
При закрытии крестиком возникает ошибка в коде
Ключевые параметры не плодят дубликаты окон
Открывается множество одинаковых окон
Типичные ошибки при работе с общими формами
Отдельно стоит упомянуть попытки получить форму через ПолучитьФорму() и обратиться к её элементам напрямую из вызывающего кода. Такой подход нарушает инкапсуляцию: вызывающая сторона начинает зависеть от внутреннего устройства формы. Правильный путь — обмен через параметры и возвращаемое значение.
Общие формы и расширения конфигурации
Если типовая общая форма не устраивает, её можно доработать через расширение: заимствовать форму, добавить элементы, переопределить обработчики с помощью аннотаций &Перед, &После и &ИзменениеИКонтроль. Это безопасный путь — при обновлении конфигурации доработки в расширении сохранятся.
Также в расширении можно создать собственную общую форму и вызывать её из заимствованного кода. Ограничение: программный вызов формы из расширения выполняется по полному имени, которое включает имя расширения, поэтому при переносе расширения между базами проверяйте, что имена совпадают.
Что важно запомнить
Общая форма — независимый от объектов диалог в ветке «Общие». Создавайте её для повторно используемых и сервисных окон, передавайте данные через параметры, открывайте через ОткрытьФорму() с оповещением и всегда обрабатывайте отмену выбора. Для доработки типовых форм используйте расширения.
Частые вопросы об общих формах 1С
Можно ли открыть общую форму без кода, например из меню?
Да, если создать общую команду (ветка «Общие» → «Общие команды») и в её обработчике вызвать ОткрытьФорму(). Команду можно добавить в командный интерфейс подсистемы, и пользователь увидит пункт меню. Полностью без кода обойтись нельзя — нужен хотя бы однострочный обработчик.
Чем общая форма отличается от формы обработки?
Форма обработки привязана к объекту «Обработка», у которого могут быть свои реквизиты, табличные части и макеты — это полноценный контейнер логики. Общая форма — только диалог без собственного хранилища данных. Для сложных сервисных инструментов обычно создают обработку, для простых диалогов — общую форму.
Почему при вызове возникает ошибка «Форма не найдена»?
Чаще всего — опечатка в строковом имени формы или форма была переименована, а вызовы не исправлены. Проверьте точное имя в ветке «Общие формы» и формат строки: «ОбщаяФорма.ИмяФормы». Также убедитесь, что вызов идёт на клиенте — получить форму на сервере нельзя.
Как сделать, чтобы форма настроек открывалась только в одном экземпляре?
Объявите в форме ключевой параметр (например, «КлючНазначения») и передавайте в нём постоянное значение при открытии. Платформа будет активировать уже открытое окно вместо создания нового. Альтернатива — использовать уникальность в параметрах ОткрытьФорму().
Можно ли использовать общие формы в обычном приложении?
Да, механизм существует и для обычных форм, но там вызов выполняется через ПолучитьОбщуюФорму() и метод ОткрытьМодально(). Для новых разработок и конфигураций в режиме «Такси» применяйте управляемые формы и асинхронные вызовы.
Безопасно ли менять общую форму типовой конфигурации?
Прямое изменение снимает объект с полной поддержки и усложняет обновления. Рекомендуемый способ — расширение конфигурации с заимствованием формы. Если расширение по какой-то причине не подходит, включайте режим «Изменения через поставщика» минимально необходимого объёма и документируйте каждую правку.