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

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

Как создать общую форму в 1С

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

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

В отличие от основной формы объекта, общая форма существует сама по себе: у неё нет владельца в метаданных, а открывается она программно — через метод ОткрытьФорму("ОбщаяФорма.ИмяФормы") или из командного интерфейса. Это снижает дублирование: один раз созданный диалог настройки не нужно копировать в каждый документ.

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

Когда общая форма нужна, а когда лучше обойтись без неё

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

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

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

Сравнение вариантов

Общая форма

Один диалог для нескольких объектов, сложная логика, свои реквизиты и команды. Требует ручного открытия из кода.

Основная форма объекта

Диалог привязан к данным справочника или документа, платформа сама управляет записью. Не подходит для переиспользования.

ПоказатьВопрос / ПоказатьВводЗначения

Простые вопросы и ввод одного значения без создания формы. Не подходит для сложных диалогов.

Добавление общей формы в дереве конфигурации

Откройте конфигуратор и в дереве конфигурации разверните ветку Общие → Общие формы. Через контекстное меню выберите «Добавить». В палитре свойств задайте имя формы латиницей без пробелов, например НастройкиОбмена или ВыборПериода, — именно это имя будет использоваться при открытии формы из кода. Синоним заполните понятным пользователю названием, если форма будет видна в интерфейсе.

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

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

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

Программное открытие общей формы и передача параметров

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

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

bsl
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("РежимВыбора", Истина);
ПараметрыФормы.Вставить("Организация", ТекущаяОрганизация);
ОткрытьФорму("ОбщаяФорма.НастройкиОбмена", ПараметрыФормы, ЭтотОбъект);

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

Возврат результата из общей формы

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

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

bsl
// В форме-владельце
Оповещение = Новый ОписаниеОповещения("ПослеЗакрытияНастроек", ЭтотОбъект);
ОткрытьФорму("ОбщаяФорма.НастройкиОбмена", , ЭтотОбъект, , , , Оповещение);

&НаКлиенте
Процедура ПослеЗакрытияНастроек(Результат, ДопПараметры) Экспорт
    Если Результат = Неопределено Тогда Возврат; КонецЕсли;
    // обработка Результат
КонецПроцедуры

Альтернатива — метод ОповеститьОВыборе, если форма открыта в режиме выбора. Этот подход ближе к стандартному поведению платформы и корректно работает с подбором в полях ввода.

Размещение общей формы в командном интерфейсе

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

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

Проверка результата и типичные ошибки

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

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

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

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

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

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

Ошибка «Объект не найден» — проверьте имя формы и обновление конфигурации

Передача параметров
Норма

В ПриСозданииНаСервере Параметры содержат переданные значения

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

Параметры пусты — не совпадают имена ключей структуры

Возврат результата
Норма

Обработчик оповещения получает структуру при «ОК» и Неопределено при отмене

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

Обработчик не вызывается — не передано описание оповещения

Доступность пользователю
Норма

Форма открывается под рабочей ролью

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

Нарушение прав доступа — нет права «Просмотр» на форму

Типичные ошибки
01
Опечатка в имени формы при вызове ОткрытьФорму — ошибка «Объект не найден» при открытии
02
Забыто обновление конфигурации базы данных (F7) — форма есть в конфигураторе, но не видна в режиме предприятия
03
Не проверяется результат на Неопределено — при отмене пользователем код падает с ошибкой обращения к полям
04
Серверные вызовы в клиентском обработчике без директив &НаСервере — ошибка компиляции модуля формы
05
Отсутствие прав на общую форму у роли — у пользователей форма не открывается, хотя у администратора всё работает

Ограничения и границы самостоятельной работы

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

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

Итог

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

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

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

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

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

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

Передайте ссылку в структуре параметров, а в обработчике ПриСозданииНаСервере прочитайте нужные реквизиты объекта запросом или через обращение к свойствам ссылки и заполните реквизиты формы. Хранить саму ссылку тоже удобно в реквизите формы — тогда при нажатии «ОК» можно вернуть её вместе с введёнными данными.

Почему форма открывается у администратора, но не у пользователя?

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

Можно ли использовать одну общую форму как форму выбора для справочника?

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

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

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

Как отладить модуль общей формы?

Поставьте точку останова в обработчике ПриСозданииНаСервере или в обработчике команды, запустите отладку в конфигураторе и откройте форму в режиме предприятия тем способом, которым её вызывает рабочий код. Убедитесь, что отлаживается нужный клиентский сеанс, если база серверная.