Регламентные задания: при поднятии BackUp в тестовую базу начинают выполняться, хотя это не нужно и бывает недопустимо

Опубликовал Сергей Золотухин (RTFM) в раздел Программирование

Часто бывает при поднятии BackUp в тестовую базу регламентные задания, которые должны выполнятся только в "боевой" базе начинают выполнятся в тестовой, хотя это совсем не нужно или вообще недопустимо. Чтобы быть полностью уверенным что задание не отработает в тестовой базе, я решил добавить небольшой код в начало метода регламентного задания.

Часто бывает при поднятии BackUp в тестовую базу регламентные задания, которые должны выполнятся только в "боевой" базе начинают выполнятся в тестовой, хотя это совсем не нужно или вообще недопустимо. Чтобы быть полностью уверенным что задание не отработает в тестовой базе, я решил добавить небольшой код в начало метода регламентного задания.


В этом коде просто выполняется проверка в какой базе выполняется это регламентное задание, если это не нужная мне база я прерываю выполнение. Собственно сам код для клиент-серверной архитектуры:


    СтрокаСоединения = СтрокаСоединенияИнформационнойБазы();

   
ПолучитьИмяСервера = Сред(СтрокаСоединения, Найти(СтрокаСоединения, "Srvr")+6);

   
ПолучитьИмяСервера = Сред(ПолучитьИмяСервера, 1, Найти(ПолучитьИмяСервера, ";")-2);

   
ПолучитьИмяБазы = Сред(СтрокаСоединения, Найти(СтрокаСоединения, "Ref")+5);

   
ПолучитьИмяБазы = Сред(ПолучитьИмяБазы, 1, Найти(ПолучитьИмяБазы, ";")-2);



    Если
ВРег(ПолучитьИмяСервера) <> "SERVER" Или ВРег(ПолучитьИмяБазы) <> "BASE" Тогда

        Возврат;

    КонецЕсли;

 

где "SERVER" и "BASE" - это имя сервера 1с Предприятия и имя базы соответственно, должны указываться в верхнем регистре.

Код для файловой базы:


    СтрокаСоединения = СтрокаСоединенияИнформационнойБазы();

   
ПолучитьПутьКБазе = Сред(СтрокаСоединения, Найти(СтрокаСоединения, "File")+6);

   
ПолучитьПутьКБазе = Сред(ПолучитьПутьКБазе, 1, Найти(ПолучитьИмяБазы, ";")-2);



    Если
ВРег(ПолучитьПутьКБазе) <> "C:\1CV8\BASE" Тогда

        Возврат;

    КонецЕсли;

 

Где "C:\1CV8\BASE" - путь к катологу файловой базы, необходимо указать в верхнем регистре.

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

См. также

Добавить вознаграждение
Комментарии
1. Жека Moscow (SpartakM) 32 29.01.13 00:35 Сейчас в теме
для серверной этот вариант не подойдет?
Прикрепленные файлы:
2. Доржи Балбаров (Angeros) 29.01.13 07:03 Сейчас в теме
Вообще с точки зрения надежности и администрирования регламентные задания 1с лучше вообще не использовать. бывало что одно из заданий по разным причинам валило весь кластер либо все предприятие все вылетали. прервать штатными средствами невозможно, можно только перезапустить службу 1с. Для себя выбрал назначенные задачи windows.
3. Сергей Золотухин (RTFM) 79 29.01.13 10:15 Сейчас в теме
(1) SpartakM, Ну конечно подойдет. Ну, а когда создали новую базу и туда подняли бэкап и забыли поставить, либо не знающий админ без программиста забыл поставить. А в коде если прописать то решается проблема забыть поставить флаг, либо если поднимет кто нибудь другой.

На личном опыте знаю)) У меня фин. дир. периодически на выходных поднимает себе бэкап для своих целей, и соответственно никто флаг не ставит.
4. Сергей Золотухин (RTFM) 79 29.01.13 10:19 Сейчас в теме
(2) Angeros, Хм интересно, учту. У меня пока такого не случалось.. И сеанс фонового задания даже не завершался? А через задачи Windows запускаешь 1ску и в ней написанную отдельно обработку?
5. Доржи Балбаров (Angeros) 29.01.13 10:26 Сейчас в теме
(4) RTFM, запускается батник, в нем прописана 1с и через /С прописано уид команды. 1с запускается и все понимает что был передан уид команды и там все далее прописано что делать. т.к. это на серваке никого не парят открытые окна, в случае коллапса видно что где как выполняется(оконный интерфейс, прогресс бары). можно тутже все срубить если что не так... Работает стабильно без нареканий...
6. Тимофей Шантин (ShantinTD) 85 29.01.13 18:19 Сейчас в теме
Вот тут ms200999 разместил по этому поводу вот такую картинку
Прикрепленные файлы:
7. Hany (Hany) 29.01.13 18:21 Сейчас в теме
(2) Angeros, странно, до сих пор все регламентные работали как надо и когда надо. Неужели у всех такой негатив? Я наборот считаю их удобными.
8. Сергей Золотухин (RTFM) 79 29.01.13 20:11 Сейчас в теме
(6) ShantinTD, я то поэтому и написал для двух различных вариантов работы разный код.
9. Сергей Золотухин (RTFM) 79 29.01.13 20:13 Сейчас в теме
(7) Hany, У меня тоже всегда все отрабатывает на ура, не разу не замечал описанное в (2). тьфу тьфу тьфу, чтоб не сглазить))
10. Валерий Максимов (theshadowco) 18 30.01.13 05:22 Сейчас в теме
(1)у меня реализована подобная вещь, только через константу :), т.к. иногда в тестовых версия регламентные нужны, просто с другими настройками + хардкодить не люблю
(2)активно пользуюсь именно регламентными 1С, да, описанная вами проблема в 8.1 существует, но в сети есть варианты решений, а вот запускать клиентские сессии для выполнения некоторых регламентных процедур считаю не верным, по многим причинам.
11. Борис Скворцов (gaglo) 30.01.13 07:46 Сейчас в теме
(2) И не согласен, что
прервать штатными средствами невозможно

В консоли заданий кнопка "Отменить выполнение" - сколько ни пробовал, всегда срабатывает.
12. Андрей Пшинка (AndrewKiev) 30.01.13 08:30 Сейчас в теме
(11) gaglo,
у меня бывало такое. Сейчас Роботы (рег.задания) каждый день обрабатывают по несколько файлов (1-20 шт) от 70 подразделений каждый день и на многие сами пишут ответы (после загрузки или не загрузки в базу). Все работает корректно, но пока система ставилась - бывали проблемы и помогала только перезагрузка сервера. Для себя понял, что если при отработке задания возникло модальное окно - то "В консоли заданий кнопка "Отменить выполнение"" не помогает
13. Антон Стеклов (asved.ru) 31 30.01.13 12:00 Сейчас в теме
Минус в том, что проверка жестко закреплена программным кодом. А идея хороша для забывчивых.

Лучше при запуске РЗ проверять, совпадает ли строка подключения с сохраненной в константе, и если не совпадает - программно отключать все разрешенные к выполнению РЗ.
lsp71; RTFM; +2 Ответить
14. Борис Скворцов (gaglo) 30.01.13 16:01 Сейчас в теме
(12) - Откуда возьмется модальное окно в фоновом задании?
15. Андрей Пшинка (AndrewKiev) 30.01.13 22:20 Сейчас в теме
(14) gaglo,

1С взаимодействует с другим приложением - приложение выдавало свое окно (в этом окне на сервере некому нажать на какую либо кнопку). Может я неверно выразился, написав "модальное окно".
16. Art Sviat (ArtemiFD) 39 03.02.13 01:01 Сейчас в теме
Так же пользуюсь блокировкой регламентных заданий, очень нужная в отладке вещь.
Использую справочник с предопределенными данными (регламентными заданиями). В справочник можно запихнуть куча параметров, такие как: использовать или не использовать рег задание в тестовой базе, оповещать о завершении,...
Все базы серверные и имена у них уникальны, поэтому проверяем только на имя БД.

//+++Блокировка/проверка на ИБ+++
//САА
Функция БлокироватьРегламентноеЗадание(ИмяРегламентногоЗадания)Экспорт
	
	Блокировать = Ложь;
	Если Найти(НРег(СокрЛП(СтрокаСоединенияИнформационнойБазы())), (НРег(СокрЛП("Ref=""ГЛАВНАЯ_БАЗА"";")))) = 0 Тогда 
		Блокировать = НЕ Справочники.РегламентныеЗаданияВыполняемыеНаСервере[ИмяРегламентногоЗадания].ВыполнятьВТестовойБазе;
	КонецЕсли;
	Возврат Блокировать;
	
КонецФункции
//---Блокировка/проверка на ИБ---
...Показать Скрыть


Так же блокировку можно использовать при отправке сообщений из базы.
//Блокировка отправки сообщений из тестовых баз,
//все такие сообщения должны отправляться на "ГруппаТехПоддержки1С@домен.ru"
//
//САА
Процедура ПроверкаНаТестовуюБазу(Получатели, Отказ = Ложь)
	
	Если Найти(НРег(СокрЛП(СтрокаСоединенияИнформационнойБазы())), (НРег(СокрЛП("Ref=""ГЛАВНАЯ_БАЗА"";")))) <> 0 Тогда 
		Возврат;
	КонецЕсли;
	
	ИсключительныеПолучатели = Новый Массив();
	ИсключительныеПолучатели.Добавить(НРег(ГруппаТехПоддержки1С()));
	ИсключительныеПолучатели.Добавить(НРег("почта1@домен.ru"));	
	ИсключительныеПолучатели.Добавить(НРег("почта2@домен.ru"));	
   ИсключительныеПолучатели.Добавить(НРег("почта2@домен.ru"));	
	
	ДобавитьОбщуюРассылку = Ложь;
	Сч = Получатели.Количество()-1;
	Пока Сч >=0 Цикл 
		Если ИсключительныеПолучатели.Найти(НРег(Получатели[Сч])) = Неопределено Тогда 
			ОбщегоНазначения.СообщитьИнформацию("Получатель " + СокрЛП(Получатели[Сч]) 
                  + " не входит в доверительный круг тестовой базы, удаляем его.");
			Получатели.Удалить(Сч);	
			ДобавитьОбщуюРассылку = Истина;
		КонецЕсли;
		Сч = Сч - 1;
			
		Если Получатели.Количество() = 0 Тогда 
			Прервать;
		КонецЕсли;
	КонецЦикла;
	
	Если ДобавитьОбщуюРассылку И Получатели.Найти(ГруппаТехПоддержки1С()) = Неопределено Тогда 
		Получатели.Добавить(ГруппаТехПоддержки1С());
	КонецЕсли;
	
Конецпроцедуры

Функция ГруппаТехПоддержки1С() Экспорт 
	
	Возврат "ГруппаТехПоддержки1С@домен.ru";
	
КонецФункции
...Показать Скрыть


Но лучше вынести проверку в отдельную экспортную функцию.
Прикрепленные файлы:
N_aix; kastortroy2006; +2 Ответить