Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная работа №9 «Справочник и регистры с...doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
585.73 Кб
Скачать

9.2.5. Обработка событий от формы в целом

Напомним список основных событий, которые есть в форме:

  • Перед открытием;

  • При открытии;

  • Обновление отображения;

  • Перед закрытием;

  • При закрытии;

  • При изменении данных;

  • Перед записью;

  • При записи;

  • После записи;

Здесь мы перечислили наиболее часто встречающиеся события, которые возникают практически во всех формах. Давайте разберемся по порядку.

Перед открытием. Возникает до того, как диалог будет отображен на экране. Обычно используется для того, чтобы отказаться от открытия формы.

А раз так, то нужно до открытия формы установить отбор в поле "НаборДанныеОС":

Упражнение №9.17.

Включите для формы обработку события "Перед открытием".

//ПередОткрытием - установим отбор в наборе записей регистра Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)    НаборДанныеОС.Отбор.ОС.Установить(Ссылка); КонецПроцедуры

В нашем случае мы будем открывать форму в любом случае. Поэтому формальный параметр Отказ оставляем без изменения.

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

  • заполнение реквизитов формы начальными значениями;

  • установка свойств формы и ее элементов в начальные значения.

Когда мы можем заполнить реквизиты начальными значениями? Тогда и только тогда, когда мы открываем форму нового объекта (записи) в ИБ.

Для справочников, точнее у объекта типа "СправочникОбъект", есть метод ЭтоНовый(), который возвращает истину, если объект был только что создан, но еще не записан.

Упражнение №9.18.

Нажмите на кнопку для события "При открытии" в свойствах формы и наберите в модуле формы следующий текст:

Процедура ПриОткрытии()    Если ЭтоНовый() Тогда       // Заполним реквизиты нового объекта начальными значениями       Фирма = Константы.ОсновнаяФирма.Получить();       УстановитьКод();    КонецЕсли;    // Установим свойство видимость у элементов диалога перед его открытием    ПриИзмененииГруппыОС(Неопределено); КонецПроцедуры

Поскольку начальное значение реквизита Фирма мы будем сохранять в константе ОсновнаяФирма, то добавьте ее в конфигурацию:

Свойство

Значение

Имя:

ОсновнаяФирма

Синоним:

Основная фирма

Комментарий:

Значение по умолчанию

Тип:

СправочникСсылка.Фирмы

Откройте основную форму констант и установите ее высоту равной 200 пикселям.

Выберите пункт меню "Форма – Размещение данных…", в котором установите флажки в соответствии с рисунком 9.12. После чего разместите в форме надпись и поле ввода под уже имеющимися элементами.

Рис. 9.12. Выбор данных и элемента формы.

Если Вы все сделали правильно, то основная форма констант будет выглядеть так, как это изображено на рисунке 9.13.

Рис. 9.13. Основная форма констант после доработки

Теперь мы можем поработать с формой элемента из режима "1С:Предприятие".

Упражнение №9.19.

В режиме "1С:Предприятие", используя пункт меню "Прочие – Константы" выберите в качестве значения константы "Основная фирма" фирму "АО "Альтернатива"" и сохраните сделанные изменения в ИБ.

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

Реквизит

Значение

Фирма:

АО "Альтернатива"

Родитель:

 -

Код:

АЛ-00001

Наименование:

Головной офис

Группа ОС:

Здания

Дата ввода:

02.02.2002

Попробуйте добавить на закладке "Данные ОС" новую строку.

Нажмите на кнопку "ОК" для сохранения элемента и записи его в ИБ.

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

Если пользователь изменил объект ИБ, ему будет предложено сохранить введенные данные. В случае положительного ответа на вопрос системы, будут последовательно возникать события:

  • Перед записью;

  • При записи;

  • После записи;

При этом нужно помнить, что в модуле объекта Вы также можете обрабатывать события:

  • Перед записью;

  • При записи;

При этом обработчики событий в форме получают управление раньше одноименных обработчиков событий в модуле объекта. Задача обработчика ПередЗаписью(…) проверить возможность записи объекта в ИБ, и, если есть необходимость, отказать в этом. Поэтому мы в модуле объекта реализуем функцию ЕстьОшибка(), которая будет возвращать Имя реквизита, содержащего с точки зрения программиста неверные данные. Тогда при обработке события "Перед записью" как в форме, так и в модуле объекта ее можно вызвать, чтобы определить – есть ли ошибки в объекте или нет. На первый взгляд кажется, что оба обработчика выполняют одни и те же функции, но это не так.

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

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

Упражнение №9.20.

Наберите в модуле объекта следующий текст:

//ЕстьОшибка() - возвращает имя реквизита с ошибкой //Если ошибок нет, то: "" Функция ЕстьОшибка() Экспорт    // Группу записываем всегда!    Если ЭтоГруппа Тогда       Возврат "";    КонецЕсли;    //Ошибкой будем считать пустые реквизиты    //"Фирма" и "ГруппаОС"    Если Фирма.Ссылка.Пустая() Тогда       Возврат "Фирма";    КонецЕсли;    Если ГруппаОС.Пустая() Тогда       Возврат "ГруппаОС";    КонецЕсли;    // ошибок нет    Возврат ""; КонецФункции

Теперь в том же модуле можно и обработчик добавить.

Наберите в модуле объекта следующий текст:

// Проверяет правильность заполнения элемента справочника Процедура ПередЗаписью(Отказ)    Имя = ЕстьОшибка();    Если Имя = "" Тогда       Возврат; //ошибок нет    КонецЕсли;    Сообщить("Реквизит"+Имя+" не содержит данных!",    СтатусСообщения.Важное);    Сообщить("Запись "+ ЭтотОбъект+" справочника не записана!",    СтатусСообщения.ОченьВажное);    Отказ = Истина; КонецПроцедуры

Обработчик в форме будет получать управление до обработчика из модуля объекта, поэтому в случае отказа в этом обработчике "дело не дойдет" до модуля объекта:

Включите в модуле формы обработку события "Перед записью" и наберите следующий текст:

//ПередЗаписью - проверяет правильность заполнения элемента справочника Процедура ПередЗаписью(Отказ)    Имя = ЕстьОшибка();    Если Имя = "" Тогда       Возврат; // т.к. нет ошибок    КонецЕсли;    Предупреждение("Реквизит"+Имя+" не содержит данных!");    // установим курсор в нужное поле;    ТекущийЭлемент = ЭлементыФормы[Имя];    Отказ = Истина; КонецПроцедуры

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

Упражнение №9.21.

Включите в модуле формы обработку события "При записи" и наберите следующий текст:

//ПриЗаписи - записывает набор записей регистра сведений Процедура ПриЗаписи(Отказ)    Попытка       НаборДанныеОС.Записать();    Исключение       Предупреждение("Не удалось сохранить""Данные ОС""!");       Отказ = Истина    КонецПопытки; КонецПроцедуры

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

Упражнение №9.22.

Включите в модуле формы обработку события "После записи" и наберите следующий текст:

//ПослеЗаписи() - переустанавливает отбор после записи Процедура ПослеЗаписи()    НаборДанныеОС.Отбор.ОС.Установить(Ссылка); КонецПроцедуры