Введение
Я думаю, что многие сталкивались с такой ситуацией, когда после создания копии рабочей базы один или несколько механизмов в новой базе продолжали оказывать внешнее воздействие. К механизмам, оказывающим внешнее воздействие, можно отнести, например, различного рода обмены между информационными системами, уведомления пользователей и клиентов с помощью SMS или email. Последствия от запуска таких механизмов не в рабочей базе могут быть разными - от легкой неловкости до сложнопоправимых ситуаций. В приниципе, для того, чтобы не возникало таких проблем, сделать нужно не так много - заблокировать регламентные задания, перенастроить механизмы или отключить их вручную. Но так называемый человеческий фактор все усложняет - люди увольняются, люди устраиваются, люди забывают.
Даже если представить, что нет человеческого фактора, то все равно все не так просто - механизмов может быть много и их перенастройка может быть утомительной.
Идея
Было бы хорошо, если бы определенным механизмам автоматически запрещался запуск в копиях рабочих баз.
А если бы надо было включить один из них, то только его и надо было перенастроить, а потом вручную разрешить ему запускаться.
Решение
В первую очередь для реализации идеи необходимо научиться различать копии одной и той же базы. Единственное, что их различает - это результат возвращаемый функцией СтрокаСоединенияИнформационнойБазы. С этой функцией есть некоторые особенности, связанные с тем, что она может возвращать немного разные строки подключения в зависимости от места ее выполнения. Поэтому я не использую напрямую возвращаемый ей результат. Функция ПолучитьКонтрольноеЗначение устраняет известные мне особенности.
Функция ПолучитьКонтрольноеЗначение() Экспорт
КонтрольноеЗначение = СтрокаСоединенияИнформационнойБазы();
КонтрольноеЗначение = НРег(КонтрольноеЗначение);
КонтрольноеЗначение = СтрЗаменить(КонтрольноеЗначение, ":1541", "");
Возврат КонтрольноеЗначение;
КонецФункции
В конфигурации явно выделяются все механизмы, оказывающие внешние воздействия. Именно такие механизмы необходимо контролировать и поэтому я называю их контролируемые механизмы. Каждому контролируемому механизму (если быть точнее, то каждой его настройке) соответствует запись в справочнике "Контролируемые механизмы". В каждой настройке контролируемого механизма помимо прочего указывается и ссылка на соответствующую запись из справочника "Контролируемые механизмы".
В справочнике "Контролируемые механизмы" есть очень важный реквизит "Контрольное значение". Сравнивая значение хранящееся в нем и контрольное значение для текущей базы, определяется возможность запуска механизма.
Для разрешения запуска механизма используется следующая функция.
Функция РазрешитьЗапуск(КонтролируемыйМеханизм) Экспорт
КонтролируемыйМеханизмОбъект = КонтролируемыйМеханизм.ПолучитьОбъект();
КонтролируемыйМеханизмОбъект.КонтрольноеЗначение = ПолучитьКонтрольноеЗначение();
КонтролируемыйМеханизмОбъект.Записать();
КонецФункции
Для запрета запуска механизма используется другая функция.
Функция ЗапретитьЗапуск(КонтролируемыйМеханизм) Экспорт
КонтролируемыйМеханизмОбъект = КонтролируемыйМеханизм.ПолучитьОбъект();
КонтролируемыйМеханизмОбъект.КонтрольноеЗначение = "";
КонтролируемыйМеханизмОбъект.Записать();
КонецФункции
Для того, чтобы определить разрешен или запрещен запуск механизма используется следующая функция.
Функция РазрешенЗапуск(КонтролируемыйМеханизм) Экспорт
Если Не ЗначениеЗаполнено(КонтролируемыйМеханизм) Тогда
ВызватьИсключение "Не указан контролируемый механизм";
КонецЕсли;
Возврат (ПолучитьКонтрольноеЗначение() = КонтролируемыйМеханизм.КонтрольноеЗначение);
КонецФункции
Есть еще одна процедура, она ничего не делает, если запуск механизма разрешен и вызывает исключение, если запрещен.
Процедура КонтрольЗапуска(КонтролируемыйМеханизм) Экспорт
Если Не РазрешенЗапуск(КонтролируемыйМеханизм) Тогда
ВызватьИсключение "Запуск контролируемого механизма не разрешен";
КонецЕсли;
КонецПроцедуры
Все эти процедуры и функции находятся в модуле менеджера справочника "Контролируемые механизмы"
Внедрение
Для того, чтобы все заработало, в код алгоритма контролируемого механизма необходимо добавить контроль запуска.
//Получим настройки
Настройки = ПолучитьНастройки();
//Контроль запуска
Если Справочники.КонтролируемыеМеханизмы.РазрешенЗапуск(Настройки.КонтролируемыйМеханизм) Тогда
//Выполнение
Иначе
//Запуск запрещен
КонецЕсли;
Или так.
//Получим настройки
Настройки = ПолучитьНастройки();
//Контроль запуска
Справочники.КонтролируемыеМеханизмы.КонтрольЗапуска(Настройки.КонтролируемыйМеханизм);
//Выполнение
Мне больше нравится второй вариант.
Демонстрационный пример
Для того, чтобы было еще понятнее, я подготовил демонстрационный пример:
0. Скачайте КонтролируемыеМеханизмы.dt
1. Создайте пустую базу и загрузите в нее КонтролируемыеМеханизмы.dt
2. Запустите новую базу в режиме предприятия и откройте справочник "Контролируемые механизмы" - пока запуск демонстрационного механизма запрещен.
3. Откройте обработку "Демонстрационный механизм" и все равно попытайтесь запустите механизм - действительно, запуск демонстрационного механизма запрещен.
4. Вернитесь в справочник "Контролируемые механизмы" и разрешите запуск демонстрационного механизма - запуск демонстрационного механизма разрешен.
5. Вернитесь к обработке "Демонстрационный механизм" и запустите его еще раз - действительно, запуск демонстрационного механизма разрешен.
6. Выгрузите данные базы в .dt
7. Создайте еще пустую базу и загрузите в нее только что полученный файл .dt
8. Запустите новую базу в режиме предприятия и откройте справочник "Контролиремые механизмы" - запуск демонстрационного механизма автоматически стал запрещен.
Заключение
Надеюсь, описанный в статье механизм пригодится вам. Спасибо за внимание.