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