Имя: Пароль:
1C
1С v8
Вопрос о завершение работы системы (без использования режима модальности)
0 bahtik
 
12.12.13
11:49
Здравствуйте! В связи с отказом от режима модальности процедура завершения работы с системой приняла такой вид:

В модуле управляемого приложения:

Процедура ПередЗавершениемРаботыСистемы(Отказ)
    
    СтандартныеПодсистемыКлиент.ДействияПередЗавершениемРаботыСистемы(Отказ);
    
КонецПроцедуры


В модуле СтандартныеПодсистемыКлиент:


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


Процедура ДействияПередЗавершениемРаботыСистемы_Завершение(Результат, Параметры) Экспорт
    
    Если Результат = КодВозвратаДиалога.Да Тогда
        ПрекратитьРаботуСистемы();
    КонецЕсли;
    
КонецПроцедуры // ДействияПередЗавершениемРаботыСистемы_Завершение()


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

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

Может кто уже сталкивался с этой проблемой, как сделать так, чтобы задавался вопрос о сохранении данных? Есть, конечно, вариант с использованием обработчика ожидания, но это совсем как-то некрасиво.
1 banco
 
12.12.13
12:11
(0) предлагаю смотреть как в БСП сделано
2 bahtik
 
12.12.13
12:30
(1) Там это не реализовано
3 banco
 
12.12.13
12:37
(2) реализовано в редакции 2.2
4 bahtik
 
12.12.13
12:39
(3) Понял, спасибо. Сейчас скачаю и буду смотреть...
5 bahtik
 
12.12.13
13:37
Короче, пока качается БСП и новый релиз платформы (8.3.4), сделал все-таки через обработчик ожидания. В итоге модуль управляемого приложения выглядит так:

Перем глЗавершитьРаботуСистемы Экспорт;


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

Процедура ПриНачалеРаботыСистемы()
    
    ПроверитьПрефиксИБ();
    
КонецПроцедуры

Процедура ПередЗавершениемРаботыСистемы(Отказ)
    
    СтандартныеПодсистемыКлиент.ДействияПередЗавершениемРаботыСистемы(Отказ);
    
КонецПроцедуры

глЗавершитьРаботуСистемы = Ложь;


Модуль СтандартныеПодсистемыКлиент:

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


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

Ну и добавил еще один модуль ГлобальныйКлиент (глобальный с одним включенным флагом Клиент):

Процедура ЗавершениеРаботыСистемы() Экспорт
    
    ЗавершитьРаботуСистемы();
    
КонецПроцедуры // ЗавершениеРаботыСистемы()
6 bahtik
 
12.12.13
13:39
Все работает, как надо. Но то, что для этой простой задачи (вопрос о подтверждении завершения работы с системой) теперь нужно столько всего, это просто... :)))
7 Hmster
 
12.12.13
13:51
то ли еще будет
8 bahtik
 
12.12.13
19:54
(3) Поставил новую редакцию, попробовал разобраться... Это просто пипец! Это же просто нереально! Задействовано около сотни процедур, тысячи строк кода, чтобы вывести один несчастный вопрос... Я просто в шоке ))
9 banco
 
12.12.13
20:16
(8)  ну вообще то там не один простой вопрос, а много всего. при закрытии обращается по подсистемам и узнает у кого есть вопрос, например вопрос про открытие, редактируемые файлы
10 bahtik
 
12.12.13
20:27
(9) Ну это да, но все равно там хрен что разберешь... И самое страшное это что, блин, все работает! ))
11 banco
 
12.12.13
20:31
(10) в принципе и разобраться не надо, просто знать что есть такое и внедрить в свою конфигурацию
12 bahtik
 
12.12.13
20:47
(11) Я попробовал сначала в чистую новую конфигу внедрить. Выбрал минимальный набор: базовый функционал. И при этом столько всего появилось, все эти общие модули, вот эти вот обработчики... Можно, конечно, считать, что раз все работает, то не надо в это и лезть. Но как-то стремно мне. Хочется, чтоб понятно было что и где делается. А то закрываешь программу, а там столько всего начинает выполняться... Короче, отказался от идеи встраивания.