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