Резервное копирование при завершении

2021-05-25

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

Большинство из них работает с Розницей, поэтому напишу как настроить резервное копирование в ней.
Настраивается все очень просто - открываем подсистему "Администрирование" - обслуживание

Администрирование 1с

Далее выбираем "Резервное копирование и восстановление", указываем способ хранения копий - "На локальном компьютере".

Обслуживание 1с

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

Настройка резервного копирования 1с

Казалось бы, после всех настроек при завершении работы будет появляться окно с предложением выполнить резервное копирование и завершить работу. Но при завршении работы появляется только окно "Завершить работу" или "Продолжить работу".

Закрытие программы 1с

Если нажать "Завершить работу" то программа просто закроется и никакого копирования не произойдет. Зато если нажать "Продолжить работу" появится уведомление которое через 10 секунд исчезает, и если на него нажать то уже появится окно с предложением сделать копию и завершить работу.

Уведомление перед закрытием 1с Завершение работы в 1с

Непонято зачем 1С так любит усложнять жизнь пользователям? Почему нельзя сразу при завершении показывать это самое окно с предложением копирования и завершения работы? В общем остались вопросы к разработчикам.
Было решено разобраться с механизмом появления этого окна и попытаться сделать так чтобы окно резервного копирования появлялось сразу после нажатия на крестик.

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

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

Максимум которого удалось добиться это отключение уведомления, и когда пользователь нажмет "Продолжить работу" - будет сразу выведено окно диалога о завершении работы с резервным копированием. Таким образом пользователю не придется "ловить" окно уведомлений.

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

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

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

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