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