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

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

Как открыть форму нового документа в 1С

Как открыть форму нового документа в 1С: через интерфейс, команду Создать и программно методом ОткрытьФорму. Примеры кода, параметры, ошибки и FAQ.

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

Главная тонкость программного способа — различие между управляемым и обычным приложением. В управляемых формах (режим «Такси», большинство современных конфигураций: Бухгалтерия 3.0, УТ 11, ERP, ЗУП 3.1) используется глобальный метод ОткрытьФорму(), а запись объекта происходит только после того, как пользователь нажмёт «Записать» или «Провести». В обычном приложении логика похожа, но методы и контекст вызова отличаются.

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

Как пользователю создать новый документ через интерфейс

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

Быстрые альтернативы кнопке: клавиша Insert в списке документов, пункт «Создать» контекстного меню по правой кнопке мыши, а также ввод на основании — кнопка «Создать на основании» в уже открытом связанном документе. Последний способ удобен тем, что реквизиты и табличные части заполняются автоматически из документа-основания.

Если кнопки «Создать» нет или она неактивна, причина почти всегда в правах: у пользователя нет права «Добавление» на этот вид документов. Проверить это может администратор через настройку профилей групп доступа (в типовых — «Администрирование → Настройки пользователей и прав»).

Создание документа через интерфейс
  1. 1
    Откройте раздел, к которому относится документ (например, «Продажи»)
  2. 2
    Перейдите в журнал нужного вида документов
  3. 3
    Нажмите «Создать» или клавишу Insert
  4. 4
    Заполните обязательные реквизиты и табличные части
  5. 5
    Нажмите «Провести» или «Записать» и проверьте, что документ появился в списке

Что происходит при открытии формы нового документа

При открытии формы нового документа платформа создаёт объект в памяти, но не записывает его в базу данных. У документа ещё нет номера (или номер зарезервирован, но не зафиксирован), ссылка ДокументСсылка пустая, а признак ЭтоНовый() возвращает истину. Это важно понимать: если пользователь закроет форму без записи, в базе не останется никаких следов.

На этапе создания срабатывают события модуля объекта и модуля формы: ОбработкаЗаполнения (если переданы данные заполнения), ПриСозданииНаСервере и ПриОткрытии формы, ПриУстановкеНовогоНомера. Именно в ОбработкаЗаполнения типовые конфигурации подставляют организацию по умолчанию, ответственного и значения из основания.

Как открыть форму нового документа программно

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

ОткрытьФорму("Документ.РеализацияТоваровУслуг.ФормаОбъекта");

Имя формы строится по шаблону Документ.<ИмяВида>.ФормаОбъекта. Если у документа несколько форм и нужна конкретная, указывают её имя: Документ.РеализацияТоваровУслуг.Форма.ФормаДокументаОпт. Если форма объекта у документа одна (основная), достаточно стандартного имени ФормаОбъекта.

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

bsl
&НаКлиенте
Процедура СоздатьРеализацию(Команда)
	ОткрытьФорму("Документ.РеализацияТоваровУслуг.ФормаОбъекта");
КонецПроцедуры

Открытие нового документа с заполнением реквизитов

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

ЗначенияЗаполнения = Новый Структура;

ЗначенияЗаполнения.Вставить("Организация", ОрганизацияПоУмолчанию);

ЗначенияЗаполнения.Вставить("Контрагент", ВыбранныйКонтрагент);

ПараметрыФормы = Новый Структура("ЗначенияЗаполнения", ЗначенияЗаполнения);

ОткрытьФорму("Документ.РеализацияТоваровУслуг.ФормаОбъекта", ПараметрыФормы);

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

Открытие нового документа на основании и копированием

Ввод на основании

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

ПараметрыФормы = Новый Структура("Основание", СсылкаНаЗаказ);

ОткрытьФорму("Документ.РеализацияТоваровУслуг.ФормаОбъекта", ПараметрыФормы);

Копирование существующего документа

Для создания нового документа копией существующего передаётся параметр ЗначениеКопирования:

ПараметрыФормы = Новый Структура("ЗначениеКопирования", СсылкаНаДокумент);

ОткрытьФорму("Документ.РеализацияТоваровУслуг.ФормаОбъекта", ПараметрыФормы);

Копия получит новый номер и текущую дату (или дату исходника — зависит от настроек нумерации и обработчиков), но останется незаписанной до действий пользователя.

Способы открыть форму нового документа

Пустая форма

ОткрытьФорму без параметров. Подходит, когда пользователь заполнит всё вручную

ЗначенияЗаполнения

Подстановка отдельных реквизитов. Работает только для полей, обработанных в ОбработкаЗаполнения

Основание

Ввод на основании другого документа. Требует настроенного заполнения по основанию в модуле объекта

ЗначениеКопирования

Полная копия существующего документа. Удобно для повторяющихся операций

Как получить результат после закрытия формы

Так как ОткрытьФорму() выполняется асинхронно, код сразу после вызова не знает, записал ли пользователь документ. Для получения результата используется описание оповещения:

Оповещение = Новый ОписаниеОповещения("ПослеЗакрытияНовогоДокумента", ЭтотОбъект);

ОткрытьФорму("Документ.РеализацияТоваровУслуг.ФормаОбъекта", , ЭтотОбъект, , , , Оповещение);

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

Обычное приложение и внешние обработки

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

ФормаДокумента = Документы.РеализацияТоваровУслуг.ПолучитьФормуНовогоДокумента();

ФормаДокумента.Открыть();

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

Типичные ошибки и ограничения

Первая распространённая ошибка — неверное имя формы. Строка вида Документ.Реализация.Форма без уточнения вызовет ошибку «Форма не найдена», если у документа нет формы с таким именем. Всегда проверяйте точное имя в конфигураторе: ветка «Документы → вид документа → Формы».

Вторая ошибка — ожидание, что ЗначенияЗаполнения заполнит любой реквизит. Заполнятся только те поля, которые предусмотрены обработчиком ОбработкаЗаполнения. Третья — попытка получить ссылку на новый документ сразу после ОткрытьФорму(): ссылка появится только после записи, которую выполняет пользователь или код формы.

Отдельный класс проблем — права и интерфейсные ограничения. Если у пользователя нет права интерактивного добавления, программно открытая форма откроется, но запись будет недоступна. В веб-клиенте дополнительно могут блокироваться всплывающие окна, если форма открывается не из обработчика команды пользователя.

Типичные ошибки
01
Неверное имя формы — ошибка «Форма не найдена»; сверяйте имя в конфигураторе
02
Ожидание ссылки на документ сразу после ОткрытьФорму — ссылка появится только после записи
03
Передача в ЗначенияЗаполнения реквизитов, не обработанных в ОбработкаЗаполнения — поля останутся пустыми
04
Использование ПолучитьФормуНовогоДокумента в управляемом приложении — метод недоступен, используйте ОткрытьФорму
05
Открытие формы вместо программного создания, когда документ нужен без участия пользователя
Контрольные точки

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

Форма открылась
Норма

Отображается форма нового документа без сообщений об ошибках

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

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

Заполнение реквизитов
Норма

Поля, переданные в ЗначенияЗаполнения или из основания, заполнены

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

Поля пустые — реквизит не обработан в ОбработкаЗаполнения

Запись документа
Норма

После «Провести» документ появляется в журнале с номером и датой

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

Документ не записывается — проверьте права и обязательные реквизиты

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

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

Открытие формы не подходит для этой задачи. Создайте документ программно: НовыйДокумент = Документы.ИмяВида.СоздатьДокумент(), заполните реквизиты и выполните НовыйДокумент.Записать(РежимЗаписиДокумента.Проведение). Форму при этом открывать не нужно.

Почему ОткрытьФорму не срабатывает на сервере?

Открытие формы — клиентская операция, метод доступен только в клиентском контексте (директивы &НаКлиенте). Серверные процедуры не могут открывать формы: сформируйте на сервере данные, верните их в клиентский контекст и вызовите ОткрытьФорму там.

Как открыть новый документ, чтобы его нельзя было закрыть без записи?

Стандартного способа запретить закрытие нет, но в обработчике формы ПередЗакрытием можно отменить закрытие, если документ не записан (Отказ = Истина). В типовых конфигурациях при закрытии незаписанного документа платформа сама задаёт вопрос о сохранении.

Можно ли открыть форму нового документа из внешней обработки?

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

Чем отличается ОткрытьФорму от ОткрытьЗначение?

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

Как открыть форму нового документа в веб-клиенте?

Синтаксис тот же — ОткрытьФорму. Учитывайте, что вызов должен происходить из обработчика действия пользователя (нажатия кнопки), иначе браузер может заблокировать открытие окна как всплывающее. Модальные методы в веб-клиенте недоступны — используйте описания оповещений.

Итог

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

Пользователь создаёт документ кнопкой «Создать» или Insert в журнале. Разработчик — методом ОткрытьФорму("Документ.Вид.ФормаОбъекта", Параметры) с параметрами ЗначенияЗаполнения, Основание или ЗначениеКопирования. Документ записывается в базу только по команде пользователя; для автоматического создания без формы используйте СоздатьДокумент() и Записать().