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

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

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

Как закрыть форму документа в 1С: кнопки интерфейса, команда Закрыть(), параметры закрытия, запрет закрытия с несохранёнными данными и решение типичных проблем.

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

Управляемые формы в современных конфигурациях (1С:Предприятие 8.3) ведут себя иначе, чем обычные формы старых версий: платформа сама контролирует модифицированность и задаёт вопрос о сохранении. Понимание этих механизмов избавляет от типичных ошибок — потери введённых данных, зависших окон и конфликтов при проведении документа.

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

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

Самый простой способ — нажать крестик в правом верхнем углу окна формы. Если документ был изменён и не записан, платформа покажет диалог с вариантами «Записать и закрыть», «Не записывать» и «Отмена». Это стандартная защита от случайной потери данных, встроенная в платформу.

Во многих типовых формах документов есть отдельная кнопка «Закрыть» в командной панели, а также команда «Провести и закрыть». Последняя последовательно выполняет проведение документа и закрытие формы — удобно при массовом вводе первички, когда после записи документ больше не нужен.

Клавиатурные сочетания тоже работают: Esc в ряде случаев закрывает форму (если не открыто выпадающее меню или поле ввода), а Ctrl+F4 закрывает текущее окно в режиме закладок. Если форма открыта как отдельное окно, сработает и стандартное Alt+F4.

Порядок действий в интерфейсе
  1. 1
    Завершите ввод данных в активном поле — нажмите Enter или Tab
  2. 2
    Нажмите «Провести и закрыть», если документ нужно провести
  3. 3
    Или нажмите крестик окна / кнопку «Закрыть»
  4. 4
    При вопросе о сохранении выберите «Записать и закрыть»
  5. 5
    Убедитесь, что документ появился в списке с проведённым статусом

Программное закрытие формы методом Закрыть()

В модуле формы доступен метод Закрыть(), который инициирует закрытие формы программно. Вызов без параметров просто закрывает форму; при этом срабатывают все штатные проверки модифицированности, если не переопределено поведение.

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

&НаКлиенте

Процедура ЗаписатьИЗакрыть(Команда)

Если Записать() Тогда

Закрыть(Объект.Ссылка);

КонецЕсли;

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

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

Обработчики ПередЗакрытием и ПриЗакрытии

Событие ПередЗакрытием возникает до закрытия формы и позволяет его отменить. У обработчика есть параметры Отказ и ЗавершениеРаботы. Установка Отказ = Истина оставляет форму открытой — так реализуют проверки обязательных полей или подтверждение потери несохранённых данных.

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

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

&НаКлиенте

Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)

Если ЗавершениеРаботы Тогда

Если Модифицированность Тогда

Отказ = Истина;

ТекстПредупреждения = "Документ не записан";

КонецЕсли;

Возврат;

КонецЕсли;

Если Модифицированность Тогда

Отказ = Истина;

ПоказатьВопрос(Новый ОписаниеОповещения("ПередЗакрытиемЗавершение", ЭтотОбъект),

"Данные изменены. Сохранить?", РежимДиалогаВопрос.ДаНетОтмена);

КонецЕсли;

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

Как запретить закрытие формы с несохранёнными данными

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

Типовой приём — проверка заполненности через ПроверитьЗаполнение() на сервере с последующим отказом от закрытия на клиенте. Учтите, что серверный вызов из ПередЗакрытием допустим, но увеличивает задержку; при завершении работы программы такие вызовы лучше не делать.

Другой сценарий — длительная операция (например, отправка документа по ЭДО). Пока операция активна, выставляют признак в реквизите формы и в ПередЗакрытием блокируют закрытие с пояснением пользователю. После завершения операции признак снимается через оповещение.

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

Закрытие формы извне: оповещения и программный поиск

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

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

&НаКлиенте

Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)

Если ИмяСобытия = "ЗакрытьФормуДокумента"

И Параметр = Объект.Ссылка Тогда

Модифицированность = Ложь;

Закрыть();

КонецЕсли;

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

Принудительная установка Модифицированность = Ложь перед закрытием подавляет вопрос о сохранении. Применяйте это осознанно: несохранённые изменения будут потеряны без предупреждения.

Маршрут решения

Как выбрать действие

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

Почему форма не закрывается: диагностика

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

Проверьте панель задач и список окон: диалог «Сохранить изменения?» мог открыться под основным окном. В режиме такси дочерние окна иногда визуально теряются — помогает переключение через Alt+Tab или сворачивание основного окна.

Если форма закрывается, но документ не появляется в списке, проблема не в закрытии, а в записи: проверьте сообщения об ошибках проведения, права на документ и установленные даты запрета изменения данных.

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

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

Форма закрылась после Записать()
Норма

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

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

Форма закрылась, но документа в списке нет — запись не выполнилась

Вопрос о сохранении при изменениях
Норма

Появляется диалог с вариантами записи

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

Форма закрывается молча — где-то принудительно сброшена Модифицированность

Завершение работы программы
Норма

Приложение закрывается без зависаний

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

Программа «замирает» — в ПередЗакрытием есть модальный вызов

Обычные формы и внешние обработки: отличия

В конфигурациях на обычных формах (режим совместимости 8.2 и старше) применяется тот же метод Закрыть(), но обработчики называются иначе: ПередЗакрытием имеет параметры Отказ и СтандартнаяОбработка, без ЗавершениеРаботы. Логика контроля модифицированности аналогична.

У внешних обработок и отчётов форма закрывается теми же средствами, но есть нюанс: если обработка открыта через «Файл → Открыть», после закрытия формы сама обработка выгружается из памяти не сразу. При отладке перезапускайте обработку полностью, чтобы подхватились изменения модуля.

Итог

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

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

Часто задаваемые вопросы

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

Установите Модифицированность = Ложь перед вызовом Закрыть(). Платформа посчитает, что изменений нет, и не покажет диалог. Учтите: все несохранённые правки будут безвозвратно потеряны, поэтому приём оправдан только при откате изменений или программном перезаполнении объекта.

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

Напрямую нет: метод Закрыть() существует только в клиентском контексте. Схема обхода — серверная процедура возвращает признак (например, успешность записи), а клиентский код по этому признаку вызывает Закрыть().

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

При открытии через ОткрытьФорму() передайте описание оповещения о закрытии — оно сработает после закрытия формы и получит параметр, переданный в Закрыть(Параметр). Альтернатива — обработчик ОбработкаЗаписиНового или оповещение о записи объекта.

Почему после Закрыть() выполняется следующий код процедуры?

Метод Закрыть() не прерывает выполнение текущей процедуры — он лишь инициирует процесс закрытия, который завершится после обработчиков. Если дальнейший код выполнять нельзя, добавьте Возврат; сразу после вызова.

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

Штатной команды «закрыть всё» для произвольных форм нет. Практические варианты: рассылка оповещения, на которое формы подписаны и реагируют закрытием, либо завершение сеанса работы пользователя. Панель открытых окон позволяет закрывать окна по одному вручную.

Форма не закрывается и не выдаёт ошибок — с чего начать?

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