Проблема
Допустим, сделали интеграцию системы А с системой Б. Всё хорошо, системы работют, данные ходят:
Вдруг случается «неожиданность». Систему Б скопировали. Образовалась система Б`, в которой пользователи тестируют новую функциональность, обучаются и т.п. Когда наступает час «икс», система Б` вступает в информационный обмен с системой А:
Возникают «маленькие неудобства»:
- Система А думает, что она успешно передала в систему Б данные, но в системе Б данные не появились потому что были перехвачены системой Б`.
- Система А получает странного вида мусор («игрушечные» данные), которые пользователь ввёл в Б`.
Основная идея «Антиклона»
Для того, чтобы решить проблему клонов, нужно сделать так, чтобы система (например, система Б`) при необходимости могла сама определить, является она оригиналом или его клоном. Основной вопрос: «Чем клон отличается от оригинала?» Ответ: расположением.
Расположение информационной базы легко определяется функцией СтрокаСоединенияИнформационнойБазы()
Решение №1, самое простое
Добавляем константу строкового типа, в которую администратор вводит строку соединения с информационной базой. В примере ниже эта константа названа Антиклон_СтрокаСоединенияИнформационнойБазы.
При начале '''каждой''' попытки вступить в информационный обмен делаем такую простую проверку:
Если ВРег(СокрЛП(Константы.Антиклон_СтрокаСоединенияИнформационнойБазы.Получить()))
<> ВРег(СтрокаСоединенияИнформационнойБазы()) Тогда
ВызватьИсключение "Запуск обмена из клона информационной базы";
КонецЕсли;
Примечание: вызов исключения вписан для примера. В реальных системах обычно идёт запись сообщения в протокол обмена и возврат со статусом «Обмен не выполнен».
Недостатки решения №1
Что будет, если нужно создать тестовую площадку (клон системы А, общающийся с клоном системы Б)? Но при этом не общающийся с системой В?
Скорее всего, часть информационных обменов администратор, разворачивающий тестовую площадку, отключит, часть - перенаправит, но про что-то он вполне может забыть:
Проблему с клонами уже не ждали, но она вернулась.
Решение №2
- Допустим, у нас есть некий справочник, в котором параметризуется обмен (указывается каталог обмена или адрес FTP, настраивается расписание и т.п.). Строку соединения с инф. базой делаем реквизитом этого справочника.
- Этот реквизит автоматически инициализируем при создании нового элемента.
- На формах показываем, но менять не даём. Если нужно, пусть администратор создаёт новую настройку.
- Контроль в коде – аналогично решению №1 (всё равно обмен всегда параметризуется настройкой).
Обмены бывают разные, параметризуются они разными способами. Может возникнуть неоднозначность - куда пристроить сохраняемый параметр СтрокаСоединенияСБазой? Правило простое: туда же, где задаются параметры канала связи. Если обмен файловый и путь сохранения («почтовый ящик») устанавливается в константе, то и антиклон задаётся в константе. Если обмен через веб-сервис, параметры (URL, имя сервиса и др.) которого задаются в реквизитах узла плана обмена, то и СтрокаСоединенияСБазой становится реквизитом узла плана обмена. И так далее.
Недостатки решения №2
- Дополнительное действие по перенастройке при переносе рабочей базы (скопировать используемые настройки, перевыбрать их в качестве основных используемых, заново настроить расписания).
- Ситуация: базу перенесли на новое место, а старое забыли заблокировать (уничтожить). Обе базы – «ну как живые». Проблема с клонами в полном объёме.
Решение №3, параноидальное
Защищаемся с двух сторон: не только Б` отказывается вступать в обмен со старыми настройками, но и А опознаёт, что пакет пришёл от клона.
В дополнение к решению №2:
- В настройки обмена (или в узел плана обмена) добавляется реквизит СтрокаСоединенияУзла, куда в базе А вписывается идентификация Б, а в базе Б вписывается идентификация А.
- В пакет обмена добавляется передача строки соединения передающей стороны.
- При приёме пакета: если СтрокаСоединенияУзла пустая, она заполняется тем, что указано в пакете обмена, если не пустая – контролируется совпадение.
Важно: реквизит СтрокаСоединенияУзла нужно сделать доступным для редактирования администратором.
Недостаток решения №3
При переносе рабочей базы нужно поменять не только её настройки, но и настройки во всех базах, которые с ней общаются.
Маленькое, но важное дополнение
Проблема клонов возникает не только если есть общающиеся между собой системы. Даже если система одна, в ней внутри может возникнуть проблема клонов.
История такая. В одной из наших систем нужно было сделать возможность прикрепления файлов к объектам системы. Сканы договоров и актов, счетов-фактур и т.п. Поскольку система большая и документов много, хранить это всё внутри базы посчитали не целесообразным (в том числе потому, что не хочется ездить за копией базы с терабайтным хардом). Сделали так, чтобы прикреплённые файлы хранились отдельно от базы - в специальном каталоге. А в базе хранится ссылка на файл.
По сути, массив данных системы перестал представлять собой единое целое, и появилась возможность отклонировать одну его часть так, что вторая часть при этом стала в общем пользовании и у оригинала, и у копии. Конечно же, оно случилось.
В какой-то момент на том же сервере, где жила рабочая база, завелась ещё и тестовая база. В тестовой базе пользователи тоже вовсю поигрались с прикреплением файликов к документам системы. Результат: человек открывает скан договора, а ему вместо нужного скана - что-то совсем левое. Просто потому, что файл, прикреплённые пользователем тестовой базы, тоже сел на этот же номерок.
Нам повезло, что проблема обнаружилась почти сразу и объём потерянных данных оказался небольшим. Быстренько прикрутили внутрисистемный антиклон, и тестовая база (а также автоматически все остальные тестовые базы, которые потом неоднократно появлялись) была отлучена от файлового хранилища рабочей базы. Если бы проблема была обнаружена через полгода, нас, наверно, убили бы.
Когда антиклон не нужен?
Если система А общается с системой Б, подключаясь к ней напрямую (например, через COM-соединение или через веб-сервис), в системе Б антиклон не нужен.
Но в системе А нужен!!!
Мораль
Прикрутил обмен - НЕ ЗАБУДЬ ПРИКРУТИТЬ АНТИКЛОН. Хотябы какой-нибудь, но лучше параноидальный.