Показать сообщение отдельно
Старый 05.02.2013, 13:19   #1  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,286 / 3494 (123) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Является ли текущее приложение рабочим или тестовым
Добрый день всем!
Столкнулся с небольшой, но часто возникающей задачей при работе с АХ. Наверняка многие для себя решали этот вопрос, тем не менее - хотел бы поинтересоваться - кто и как решал, т.к. с ходу на форуме не нашел обсуждения этого вопроса.
Если у кого есть какие-то решения - пишите - интересно узнать - кто и как решал поставленную задачу.

Задача: В компании имеется несколько экземпляров АХ, в которых один рабочий, а остальные - копии (тестовая, разработческая или иная какая). Хочется, чтобы на нерабочих экземплярах АХ по умолчанию не работало часть функциональности. Например,
1. Не рассылалась почта реальным пользователям
2. Папка хранения прикрепленных документов не ссылалась на рабочую папку
3. Если в системе реализована интеграция с внешними системами - то стояла бы "заглушка" на попытку "залезть" во внешнюю систему
и т.д.

Обычно, копии экземпляров АХ получаются путем копирования приложения и БД (до АХ 2012). Соответственно - все параметры, прописанные в БД по умолчанию сохраняются и не перебиваются. А после восстановления бекапа - редко кто вспоминает о необходимости выполнения изменения данных, чтобы работа на копии не приносило вред рабочим данным / пользователям.

Исходя из этого - я видел следующие решения исходной задачи:
1. Создание скрипта, который необходимо запускать при восстановлении копии. Скрипт перебивает все ссылки и связи с внешними данными.
Плюс: Отличный вариант, если иметь гарантию того, что скрипт обработает все необходимы места в системе. Не нужно модифицировать соответствующие места в системе.
Минус: За ним нужно "ухаживать", т.е. следить за актуальностью и писать. Если скрипт не содержит в себе всех мест для обработки - то его польза лишь частичная.
Реализация: X++ или T-SQL.
2. Прописывание названия рабочей БД (АОСа) в параметры (или даже программный код). В коде, где делается отправка почты / интеграция с внешними системами / прикрепление документов / и т.д. пишется сравнение текущего названия БД (АОС) с прописанным в параметрах.
Плюс: Программный код умеет сам определять - где база рабочая, а где - копия.
Минус: Переименование рабочей базы предполагает соответствующее изменение в параметрах / программном коде, о котором нужно помнить. Также нужно ссылку на этот параметр прописывать в каждом необходимом месте кода.
Реализация: Название текущей БД в Х++:
X++:
new SQLSystem().loginDatabase()
Можно также запоминать название / порт текущего АОСа. Для этого есть методы
X++:
Session::getAOSInstance()
и
X++:
Session::getAOSPort()
.
3. Начиная с АХ2009 появилась замечательная табличка SysServerConfig (\Администрирование\Настройка\Конфигурация сервера). Именно там выбирается - какой АОС будет выступать в роли пакетной обработки. Однако главный плюс этой таблички состоит в том, что новые записи в ней создаются автоматически ядром системы при старте АОСа. Причем при создании - в поле "Имя экземпляра АОS" прописывается идентификатор нового АОСа. Т.о. добавление в эту табличку нового поля-флажка IsWork может позволить отметить галочкой рабочий АОС, после чего любое восстановление копии БД - гарантированно создаст свое название АОСа и т.о. по умолчанию текущий АОС копии БД не будет ссылаться на рабочую базу (я исхожу из того, что вряд ли кто подменяет БД в настройках АОСа, а скорее создает отдельный АОС на каждую копию системы). Ну а дальше - по аналогии с галкой "Сервер обработки пакетных заданий" - при необходимости галку IsWork можно поставить у любого / нескольких АОСов.
Плюс: Программный код умеет сам определять - где база рабочая, а где - копия. Нет необходимости держать отдельный параметр в отдельной табличке (если не считать флажок IsWork за параметр).
Минус: Как и в п.2 - нужно ссылку на этот параметр прописывать в каждом необходимом месте кода.
Реализация: В табличку SysServerConfig необходимо добавить флажок (NoYes) IsWork. На классе Global создать метод isCurrentAOSIsWork, возвращающий истину в случае, если АОС является рабочим. Соответственно - вызов данного метода вставляется во все необходимые места в коде:
X++:
// VSUH, Возвращает истину, если текущий аос является рабочим 05.02.2013
static server boolean isCurrentAOSIsWork()
{
    SysClientSessions clientSessions;
    SysServerSessions serverSessions;
    SysServerConfig   serverConfig;

    int      serverId;
    ServerId serverIdConfig;
    str      serverName;
    int      pos;
    int      aosIDLen;
   ;

    select ServerId from clientSessions where clientSessions.SessionId == sessionid();
    serverId = clientSessions.ServerId;

    new SkipAOSValidationPermission().assert();
    serverSessions.skipAosValidation(true);
    select AOSId, Instance_Name, Status from serverSessions where serverSessions.ServerId == serverId;
    if (serverSessions.Status != 0)
    {
        aosIDLen = strlen(serverSessions.aosId);  // Код взят с SysServerConfig.delete()
        pos = strfind(serverSessions.aosId, '@', 1, aosIDLen );
        serverName = substr(serverSessions.aosId, 1, pos-1);
        serverIdConfig = serverSessions.Instance_Name + '@' + serverName;
        select firstonly IsWork from serverConfig
            where serverConfig.ServerId == serverIdConfig;
    }
    return serverConfig.IsWork;
}
Кто еще каким способом решал исходную поставленную задачу и как часто ее требовалось решать?
__________________
Возможно сделать все. Вопрос времени

Последний раз редактировалось sukhanchik; 05.02.2013 в 13:23.
За это сообщение автора поблагодарили: IvanS (1), kornix (5).