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

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

1С: как открыть форму существующего документа

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

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

Ключевое понятие здесь — ссылка на документ. Пока у вас есть ссылка (объект типа ДокументСсылка), платформа знает, какую именно форму и какого объекта открыть. Все программные способы сводятся к тому, чтобы получить ссылку и передать её в один из методов: ОткрытьЗначение, ОткрытьФорму или ПоказатьЗначение.

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

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

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

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

Документ, помеченный на удаление, в списке отображается с перечёркнутой пиктограммой, но открывается так же. Документ из закрытого периода (при установленной дате запрета редактирования) откроется только на просмотр — поля будут недоступны для изменения.

Порядок действий в интерфейсе
  1. 1
    Откройте раздел с нужным журналом документов
  2. 2
    При необходимости установите отбор по периоду или организации
  3. 3
    Найдите документ по номеру через поле поиска
  4. 4
    Дважды щёлкните по строке или нажмите кнопку «Изменить»
  5. 5
    Проверьте, что открылась форма именно того документа — сверьте номер и дату в заголовке

Программное открытие: метод ОткрытьЗначение

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

ДокументСсылка = Документы.РеализацияТоваровУслуг.НайтиПоНомеру("000000015", ТекущаяДатаСеанса());

Если Не ДокументСсылка.Пустая() Тогда

ОткрытьЗначение(ДокументСсылка);

Иначе

Сообщить("Документ с таким номером не найден");

КонецЕсли;

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

Важная деталь: НайтиПоНомеру ищет в пределах периодичности номера (обычно — в пределах года). Поэтому вторым параметром передаётся дата, определяющая период поиска. Если неизвестен даже примерный период, надёжнее искать запросом.

bsl
ОткрытьЗначение(ДокументСсылка); // открывает форму документа по ссылке

Открытие через ОткрытьФорму с параметром «Ключ»

Более гибкий способ — метод ОткрытьФорму. Он позволяет указать конкретную форму (если у документа их несколько), передать дополнительные параметры и задать режим открытия. Ссылка передаётся в структуре параметров под именем «Ключ».

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

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

Если имя формы не указать и вызвать ОткрытьФорму("Документ.РеализацияТоваровУслуг.ФормаОбъекта", ПараметрыФормы), платформа возьмёт форму, назначенную основной. Параметр «Ключ» — стандартный: форма объекта сама считывает его и загружает данные из базы по ссылке.

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

Поиск ссылки: как получить документ для открытия

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

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

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ ПЕРВЫЕ 1

| Реализация.Ссылка КАК Ссылка

|ИЗ

| Документ.РеализацияТоваровУслуг КАК Реализация

|ГДЕ

| Реализация.Контрагент = &Контрагент

| И Реализация.Дата МЕЖДУ &Начало И &Конец

|УПОРЯДОЧИТЬ ПО

| Реализация.Дата УБЫВ";

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

Открытие из списка, по кнопке и в управляемом приложении

Команда в форме списка

Если вы добавляете свою кнопку в форму списка документов, текущая строка списка уже содержит ссылку. В обработчике команды достаточно проверить, что строка выбрана, и открыть её:

&НаКлиенте

Процедура ОткрытьТекущийДокумент(Команда)

ТекущиеДанные = Элементы.Список.ТекущиеДанные;

Если ТекущиеДанные <> Неопределено Тогда

ОткрытьЗначение(ТекущиеДанные.Ссылка);

КонецЕсли;

КонецПроцедуры

Открытие из обычного приложения

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

Открытие в новом окне и модально

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

Сравнение способов открытия

ОткрытьЗначение

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

ОткрытьФорму с Ключом

Полный контроль: выбор формы, параметры, уникальность окна, режим открытия. Требует знать имя формы.

ПолучитьФорму (обычное приложение)

Даёт доступ к форме до показа. Работает только в обычном приложении, в управляемом недоступен.

Права, блокировки и ограничения

Открытие формы подчиняется правам доступа. Если у пользователя нет права «Просмотр» на вид документа, программный вызов ОткрытьЗначение завершится ошибкой нарушения прав доступа, а в списке такие документы просто не отображаются. Право «Интерактивное добавление» и «Редактирование» влияют на то, сможет ли пользователь что-то изменить в открытой форме.

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

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

Типичные ошибки и их устранение

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

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

Третья группа проблем — неправильный номер при поиске: без ведущих нулей или с датой вне периода нумерации. Номер документа в 1С хранится как строка фиксированной длины, поэтому «15» и «000000015» — разные значения для НайтиПоНомеру.

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

Как проверить, что открыт правильный документ

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

Дополнительный признак корректности — состояние проведения: пиктограмма проведённого документа и доступность кнопок движений. Если документ найден, но выглядит как непроведённый, хотя должен быть проведён, — возможно, вы открыли другой документ с похожим номером из другого периода.

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

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

Заголовок открывшейся формы
Норма

Номер и дата совпадают с искомым документом

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

Форма нового документа с номером «...» и текущей датой — ссылка была пустой

Статус проведения
Норма

Пиктограмма и кнопки движений соответствуют состоянию документа

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

Документ выглядит непроведённым — возможно, найден другой документ из иного периода

Доступность редактирования
Норма

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

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

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

Итог

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

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

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

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

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

Можно ли открыть форму документа на сервере?

Нет. ОткрытьЗначение, ОткрытьФорму и ПоказатьЗначение доступны только в клиентском контексте, потому что форма — это элемент пользовательского интерфейса. Серверная процедура может найти и вернуть ссылку, а открытие выполняется в клиентской процедуре после возврата.

Почему ОткрытьФорму открывает новый документ вместо существующего?

Потому что параметр «Ключ» не заполнен или содержит пустую ссылку. Форма объекта без ключа работает в режиме создания. Проверьте результат поиска ссылки условием Если Не Ссылка.Пустая() перед вызовом ОткрытьФорму.

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

Передайте в ОткрытьФорму параметр «ТолькоПросмотр» со значением Истина в структуре параметров наряду с «Ключ». Форма откроется с заблокированными полями. Дополнительно сработают штатные ограничения: права и дата запрета изменения.

Откроется ли документ, если он помечен на удаление?

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

Как не открывать второе окно, если документ уже открыт?

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