Как запретить закрытие формы, если не завершено создание задачи через механизм «Быстрого ввода»?

Программист 1С v8.3 (Управляемые формы) Управленческий учет IT и автоматизация бизнеса
← На главную

В типовых и кастомизированных конфигурациях 1С (таких как CRM, ERP или УТ 11) часто используется механизм «Быстрого ввода». Он позволяет пользователю, не покидая карточку клиента или партнера, оперативно создать задачу, запланировать звонок или встречу. Однако возникает проблема: если пользователь переключился на создание задачи, заполнил текст, но забыл нажать кнопку «Создать» и просто закрыл форму, данные будут потеряны без предупреждения. Рассмотрим, как программно отследить это состояние и предотвратить потерю данных.

Анализ механизма работы «Быстрого ввода»

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

Как правило, в модуле формы за это отвечает переменная БыстрыйВвод_ТекущийТипОбъекта. Проанализируем стандартный код переключения страниц:


&НаКлиенте
Процедура БыстрыйВвод_СменитьСтраницу(Команда)
    ИмяКомандыМассив = СтрРазделить(Команда.Имя, "_");
    // ИмяКомандыМассив[1] будет содержать тип: "Задача", "Звонок" и т.д.
    ПереключитьСтраницуБыстрогоВвода(ИмяКомандыМассив[1]);
КонецПроцедуры

Процедура ПереключитьСтраницуБыстрогоВвода управляет видимостью элементов Элементы.БыстрыйВвод_СтраницаЗадача.Видимость и шрифтами кнопок. Важно понимать, что данные, которые вводит пользователь (исполнитель, текст задачи, дата), хранятся в реквизитах формы, а не в самом объекте «Партнер». Поэтому стандартная проверка на модифицированность объекта здесь не сработает.

Шаг 1. Перехват события «ПередЗакрытием»

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

Разберем логику проверки: если переменная БыстрыйВвод_ТекущийТипОбъекта имеет значение "Задача" и при этом текстовое поле задачи не пустое, мы должны остановить закрытие формы и выдать предупреждение.


&НаКлиенте
Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка)
    
    // Проверяем, активирован ли режим быстрого ввода задачи
    Если БыстрыйВвод_ТекущийТипОбъекта = "Задача" Тогда
        
        // Проверяем, заполнены ли данные задачи в реквизитах формы
        // В типовых решениях это могут быть реквизиты типа БыстрыйВвод_ЗадачаТема
        Если Не ПустаяСтрока(БыстрыйВвод_ЗадачаТема) Тогда
            
            Отказ = Истина; // Блокируем закрытие формы
            
            Сообщение = Новый СообщениеПользователю;
            Сообщение.Текст = "Вы начали оформление задачи, но не нажали кнопку 'Создать'. 
                              |Пожалуйста, завершите создание задачи или очистите поля, чтобы закрыть форму.";
            Сообщение.УстановитьДанные(Объект);
            Сообщение.Сообщить();
            
        КонецЕсли;
        
    КонецЕсли;
    
КонецПроцедуры

Шаг 2. Анализ состояния через проверку реквизитов формы

Выясним причину, по которой обычная ссылка на «Команду» не эффективна. Команда — это лишь триггер действия. Нам же нужно проверять состояние данных. В механизме быстрого ввода после нажатия кнопки «Создать» происходит программное создание документа (например, «Взаимодействие») или задачи, после чего переменная БыстрыйВвод_ТекущийТипОбъекта обычно обнуляется, а поля очищаются.

Следовательно, если мы зашли в ПередЗакрытием и увидели, что БыстрыйВвод_ТекущийТипОбъекта = "Задача", это однозначный сигнал о том, что процесс создания не завершен. Рассмотрим более гибкий вариант проверки с использованием интерактивного вопроса пользователю:


&НаКлиенте
Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка)
    
    Если БыстрыйВвод_ТекущийТипОбъекта = "Задача" И Не ПустаяСтрока(БыстрыйВвод_ЗадачаТема) Тогда
        
        // Если форма закрывается не программно, зададим вопрос
        Отказ = Истина;
        
        Оповещение = Новый ОписаниеОповещения("ПослеОтветаНаВопросОЗакрытии", ЭтотОбъект);
        ПоказатьВопрос(Оповещение, "Задача не создана. Закрыть форму без сохранения задачи?", РежимДиалогаВопрос.ДаНет);
        
    КонецЕсли;
    
КонецПроцедуры

&НаКлиенте
Процедура ПослеОтветаНаВопросОЗакрытии(Результат, ДополнительныеПараметры) Экспорт
    
    Если Результат = КодВозвратаДиалога.Да Тогда
        // Сбрасываем флаг, чтобы при повторном закрытии проверка не сработала
        БыстрыйВвод_ТекущийТипОбъекта = ""; 
        Закрыть();
    КонецЕсли;
    
КонецПроцедуры

Шаг 3. Интеграция с процедурой «ПередЗаписью»

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

Важные моменты при реализации:

  1. Имена реквизитов: Всегда проверяйте точные имена реквизитов формы в конфигураторе. Они могут называться БыстрыйВвод_ЗадачаСодержание, ТекстЗадачи или Тема.
  2. Очистка состояния: В процедуре, которая вызывается по кнопке «Создать» (самой задачи), обязательно проверьте, что в конце кода БыстрыйВвод_ТекущийТипОбъекта устанавливается в пустое значение. Если этого не происходит, ваша проверка в ПередЗакрытием будет срабатывать ложно даже после успешного создания задачи.
  3. Видимость страниц: Если в вашей конфигурации не используется переменная состояния, проанализируйте видимость группы. Например: Элементы.ГруппаБыстрыйВводЗадача.Видимость.

Резюме

Для решения проблемы «забытых задач» в механизме быстрого ввода не нужно пытаться «сослаться на команду». Необходимо анализировать состояние формы через переменную БыстрыйВвод_ТекущийТипОбъекта и проверять заполненность временных реквизитов формы в событии ПередЗакрытием. Использование метода ПоказатьВопрос позволит сделать интерфейс более дружелюбным, давая пользователю выбор: вернуться и доделать задачу или закрыть форму, потеряв введенные данные.

← На главную