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

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

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

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

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

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

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

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

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

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

        Возврат;

    КонецЕсли;

 

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

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

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

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

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

    Если ВРег(ПолучитьПутьКБазе) <> «C:1CV8BASE» Тогда

        Возврат;

    КонецЕсли;

 

Где «C:1CV8BASE» — путь к катологу файловой базы, необходимо указать в верхнем регистре.

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

16 Comments

  1. SpartakM

    для серверной этот вариант не подойдет?

    Reply
  2. Angeros

    Вообще с точки зрения надежности и администрирования регламентные задания 1с лучше вообще не использовать. бывало что одно из заданий по разным причинам валило весь кластер либо все предприятие все вылетали. прервать штатными средствами невозможно, можно только перезапустить службу 1с. Для себя выбрал назначенные задачи windows.

    Reply
  3. RTFM

    (1) SpartakM, Ну конечно подойдет. Ну, а когда создали новую базу и туда подняли бэкап и забыли поставить, либо не знающий админ без программиста забыл поставить. А в коде если прописать то решается проблема забыть поставить флаг, либо если поднимет кто нибудь другой.

    На личном опыте знаю)) У меня фин. дир. периодически на выходных поднимает себе бэкап для своих целей, и соответственно никто флаг не ставит.

    Reply
  4. RTFM

    (2) Angeros, Хм интересно, учту. У меня пока такого не случалось.. И сеанс фонового задания даже не завершался? А через задачи Windows запускаешь 1ску и в ней написанную отдельно обработку?

    Reply
  5. Angeros

    (4) запускается батник, в нем прописана 1с и через /С прописано уид команды. 1с запускается и все понимает что был передан уид команды и там все далее прописано что делать. т.к. это на серваке никого не парят открытые окна, в случае коллапса видно что где как выполняется(оконный интерфейс, прогресс бары). можно тутже все срубить если что не так… Работает стабильно без нареканий…

    Reply
  6. ShantinTD

    Вот тут ms200999 разместил по этому поводу вот такую картинку

    Reply
  7. Hany

    (2) Angeros, странно, до сих пор все регламентные работали как надо и когда надо. Неужели у всех такой негатив? Я наборот считаю их удобными.

    Reply
  8. RTFM

    (6) ShantinTD, я то поэтому и написал для двух различных вариантов работы разный код.

    Reply
  9. RTFM

    (7) Hany, У меня тоже всегда все отрабатывает на ура, не разу не замечал описанное в (2). тьфу тьфу тьфу, чтоб не сглазить))

    Reply
  10. theshadowco

    (1)у меня реализована подобная вещь, только через константу :), т.к. иногда в тестовых версия регламентные нужны, просто с другими настройками + хардкодить не люблю

    (2)активно пользуюсь именно регламентными 1С, да, описанная вами проблема в 8.1 существует, но в сети есть варианты решений, а вот запускать клиентские сессии для выполнения некоторых регламентных процедур считаю не верным, по многим причинам.

    Reply
  11. gaglo

    (2) И не согласен, что

    прервать штатными средствами невозможно

    В консоли заданий кнопка «Отменить выполнение» — сколько ни пробовал, всегда срабатывает.

    Reply
  12. AndrewKiev

    (11) gaglo,

    у меня бывало такое. Сейчас Роботы (рег.задания) каждый день обрабатывают по несколько файлов (1-20 шт) от 70 подразделений каждый день и на многие сами пишут ответы (после загрузки или не загрузки в базу). Все работает корректно, но пока система ставилась — бывали проблемы и помогала только перезагрузка сервера. Для себя понял, что если при отработке задания возникло модальное окно — то «В консоли заданий кнопка «Отменить выполнение»» не помогает

    Reply
  13. asved.ru

    Минус в том, что проверка жестко закреплена программным кодом. А идея хороша для забывчивых.

    Лучше при запуске РЗ проверять, совпадает ли строка подключения с сохраненной в константе, и если не совпадает — программно отключать все разрешенные к выполнению РЗ.

    Reply
  14. gaglo

    (12) — Откуда возьмется модальное окно в фоновом задании?

    Reply
  15. AndrewKiev

    (14) gaglo,

    1С взаимодействует с другим приложением — приложение выдавало свое окно (в этом окне на сервере некому нажать на какую либо кнопку). Может я неверно выразился, написав «модальное окно».

    Reply
  16. ArtemiFD

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

    Использую справочник с предопределенными данными (регламентными заданиями). В справочник можно запихнуть куча параметров, такие как: использовать или не использовать рег задание в тестовой базе, оповещать о завершении,…

    Все базы серверные и имена у них уникальны, поэтому проверяем только на имя БД.

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

    Показать

    Так же блокировку можно использовать при отправке сообщений из базы.

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

    Показать

    Но лучше вынести проверку в отдельную экспортную функцию.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *