Разработка и Конфигурация · 11 мин
Как закрыть форму документа в 1С
Как закрыть форму документа в 1С: кнопки интерфейса, команда Закрыть(), параметры закрытия, запрет закрытия с несохранёнными данными и решение типичных проблем.
Форма документа в 1С закрывается несколькими способами: интерактивно — крестиком в заголовке окна или кнопкой «Закрыть», программно — методом Закрыть() из встроенного языка. Выбор способа зависит от задачи: обычному пользователю достаточно интерфейсных средств, а разработчику часто нужно управлять закрытием из кода — например, закрывать форму после записи или блокировать закрытие при несохранённых изменениях.
Управляемые формы в современных конфигурациях (1С:Предприятие 8.3) ведут себя иначе, чем обычные формы старых версий: платформа сама контролирует модифицированность и задаёт вопрос о сохранении. Понимание этих механизмов избавляет от типичных ошибок — потери введённых данных, зависших окон и конфликтов при проведении документа.
Ниже разобраны все практические сценарии: закрытие из интерфейса, программное закрытие с параметрами, обработчики событий, запрет закрытия и диагностика ситуаций, когда форма «не хочет» закрываться.
Как закрыть форму документа через интерфейс
Самый простой способ — нажать крестик в правом верхнем углу окна формы. Если документ был изменён и не записан, платформа покажет диалог с вариантами «Записать и закрыть», «Не записывать» и «Отмена». Это стандартная защита от случайной потери данных, встроенная в платформу.
Во многих типовых формах документов есть отдельная кнопка «Закрыть» в командной панели, а также команда «Провести и закрыть». Последняя последовательно выполняет проведение документа и закрытие формы — удобно при массовом вводе первички, когда после записи документ больше не нужен.
Клавиатурные сочетания тоже работают: Esc в ряде случаев закрывает форму (если не открыто выпадающее меню или поле ввода), а Ctrl+F4 закрывает текущее окно в режиме закладок. Если форма открыта как отдельное окно, сработает и стандартное Alt+F4.
- 1Завершите ввод данных в активном поле — нажмите Enter или Tab
- 2Нажмите «Провести и закрыть», если документ нужно провести
- 3Или нажмите крестик окна / кнопку «Закрыть»
- 4При вопросе о сохранении выберите «Записать и закрыть»
- 5Убедитесь, что документ появился в списке с проведённым статусом
Программное закрытие формы методом Закрыть()
В модуле формы доступен метод Закрыть(), который инициирует закрытие формы программно. Вызов без параметров просто закрывает форму; при этом срабатывают все штатные проверки модифицированности, если не переопределено поведение.
Методу можно передать параметр закрытия — произвольное значение, которое получит форма-владелец через обработчик ОбработкаВыбора или оповещение о закрытии. Это основной механизм возврата результата из модальной и вспомогательной формы.
&НаКлиенте
Процедура ЗаписатьИЗакрыть(Команда)
Если Записать() Тогда
Закрыть(Объект.Ссылка);
КонецЕсли;
КонецПроцедуры
Обратите внимание: Закрыть() не гарантирует мгновенного уничтожения формы — сначала выполняется цепочка обработчиков ПередЗакрытием и ПриЗакрытии, и любой из них может отменить закрытие. Поэтому код, следующий за вызовом Закрыть() в той же процедуре, всё равно выполнится.
Обработчики ПередЗакрытием и ПриЗакрытии
Событие ПередЗакрытием возникает до закрытия формы и позволяет его отменить. У обработчика есть параметры Отказ и ЗавершениеРаботы. Установка Отказ = Истина оставляет форму открытой — так реализуют проверки обязательных полей или подтверждение потери несохранённых данных.
Параметр ЗавершениеРаботы сигнализирует, что закрытие происходит из-за выхода из программы. В этом случае нельзя задавать пользователю вопросы и показывать диалоги — платформа требует завершать работу без интерактива, иначе приложение «зависнет» при закрытии.
Событие ПриЗакрытии наступает, когда форма уже закрывается безвозвратно. Здесь освобождают ресурсы: отключают обработчики ожидания, отписываются от оповещений, сохраняют настройки формы. Отменить закрытие на этом этапе уже нельзя.
&НаКлиенте
Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
Если ЗавершениеРаботы Тогда
Если Модифицированность Тогда
Отказ = Истина;
ТекстПредупреждения = "Документ не записан";
КонецЕсли;
Возврат;
КонецЕсли;
Если Модифицированность Тогда
Отказ = Истина;
ПоказатьВопрос(Новый ОписаниеОповещения("ПередЗакрытиемЗавершение", ЭтотОбъект),
"Данные изменены. Сохранить?", РежимДиалогаВопрос.ДаНетОтмена);
КонецЕсли;
КонецПроцедуры
Как запретить закрытие формы с несохранёнными данными
Стандартный механизм модифицированности уже задаёт вопрос при закрытии, но часто требуется жёстче: запретить закрытие, пока не заполнены обязательные поля, или пока идёт фоновая операция. Для этого в ПередЗакрытием выполняется проверка условий и при необходимости устанавливается Отказ = Истина.
Типовой приём — проверка заполненности через ПроверитьЗаполнение() на сервере с последующим отказом от закрытия на клиенте. Учтите, что серверный вызов из ПередЗакрытием допустим, но увеличивает задержку; при завершении работы программы такие вызовы лучше не делать.
Другой сценарий — длительная операция (например, отправка документа по ЭДО). Пока операция активна, выставляют признак в реквизите формы и в ПередЗакрытием блокируют закрытие с пояснением пользователю. После завершения операции признак снимается через оповещение.
Закрытие формы извне: оповещения и программный поиск
Иногда форму документа нужно закрыть из другой формы — например, при удалении документа или при общем сбросе рабочего места. Прямого метода «закрыть чужую форму» нет; используются оповещения: форма документа подписывается на оповещение через ОбработкаОповещения, а внешний код вызывает Оповестить("ЗакрытьФормуДокумента", Параметры).
Получить открытую форму конкретного объекта можно через ОткрытьФорму() с параметром ключа: если форма такого объекта уже открыта, платформа вернёт существующий экземпляр вместо создания нового. Дальше у этой формы можно вызвать публичный метод (экспортную процедуру модуля формы), который выполнит Закрыть().
&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
Если ИмяСобытия = "ЗакрытьФормуДокумента"
И Параметр = Объект.Ссылка Тогда
Модифицированность = Ложь;
Закрыть();
КонецЕсли;
КонецПроцедуры
Принудительная установка Модифицированность = Ложь перед закрытием подавляет вопрос о сохранении. Применяйте это осознанно: несохранённые изменения будут потеряны без предупреждения.
Как выбрать действие
Почему форма не закрывается: диагностика
Если форма документа не реагирует на закрытие, причина почти всегда в одном из четырёх мест: обработчик ПередЗакрытием устанавливает отказ, идёт фоновая операция, открыто модальное дочернее окно, либо платформа ждёт ответа на вопрос о сохранении, скрытый за другими окнами.
Проверьте панель задач и список окон: диалог «Сохранить изменения?» мог открыться под основным окном. В режиме такси дочерние окна иногда визуально теряются — помогает переключение через Alt+Tab или сворачивание основного окна.
Если форма закрывается, но документ не появляется в списке, проблема не в закрытии, а в записи: проверьте сообщения об ошибках проведения, права на документ и установленные даты запрета изменения данных.
Как проверить результат
Документ виден в списке и открывается
Форма закрылась, но документа в списке нет — запись не выполнилась
Появляется диалог с вариантами записи
Форма закрывается молча — где-то принудительно сброшена Модифицированность
Приложение закрывается без зависаний
Программа «замирает» — в ПередЗакрытием есть модальный вызов
Обычные формы и внешние обработки: отличия
В конфигурациях на обычных формах (режим совместимости 8.2 и старше) применяется тот же метод Закрыть(), но обработчики называются иначе: ПередЗакрытием имеет параметры Отказ и СтандартнаяОбработка, без ЗавершениеРаботы. Логика контроля модифицированности аналогична.
У внешних обработок и отчётов форма закрывается теми же средствами, но есть нюанс: если обработка открыта через «Файл → Открыть», после закрытия формы сама обработка выгружается из памяти не сразу. При отладке перезапускайте обработку полностью, чтобы подхватились изменения модуля.
Что важно запомнить
Интерактивно форму закрывают крестиком или «Провести и закрыть», программно — методом Закрыть() на клиенте. Контроль несохранённых данных ведётся в ПередЗакрытием с учётом флага ЗавершениеРаботы, а внешнее закрытие реализуется через оповещения.
Часто задаваемые вопросы
Как закрыть форму документа без вопроса о сохранении?
Установите Модифицированность = Ложь перед вызовом Закрыть(). Платформа посчитает, что изменений нет, и не покажет диалог. Учтите: все несохранённые правки будут безвозвратно потеряны, поэтому приём оправдан только при откате изменений или программном перезаполнении объекта.
Можно ли закрыть форму документа из серверной процедуры?
Напрямую нет: метод Закрыть() существует только в клиентском контексте. Схема обхода — серверная процедура возвращает признак (например, успешность записи), а клиентский код по этому признаку вызывает Закрыть().
Как узнать в открывшей форме, что форма документа закрылась?
При открытии через ОткрытьФорму() передайте описание оповещения о закрытии — оно сработает после закрытия формы и получит параметр, переданный в Закрыть(Параметр). Альтернатива — обработчик ОбработкаЗаписиНового или оповещение о записи объекта.
Почему после Закрыть() выполняется следующий код процедуры?
Метод Закрыть() не прерывает выполнение текущей процедуры — он лишь инициирует процесс закрытия, который завершится после обработчиков. Если дальнейший код выполнять нельзя, добавьте Возврат; сразу после вызова.
Как закрыть все открытые формы документов разом?
Штатной команды «закрыть всё» для произвольных форм нет. Практические варианты: рассылка оповещения, на которое формы подписаны и реагируют закрытием, либо завершение сеанса работы пользователя. Панель открытых окон позволяет закрывать окна по одному вручную.
Форма не закрывается и не выдаёт ошибок — с чего начать?
Откройте конфигуратор и поставьте точку останова в ПередЗакрытием формы: посмотрите, не устанавливается ли Отказ = Истина. Затем проверьте, нет ли открытого модального дочернего окна и не запущена ли длительная операция, блокирующая интерфейс.