Публикация

Ошибка открытия конфигурации. Требуется объект… (Error opening configuration. Object required...)

Иногда во время открытия конфигурации появляется сообщение:

Причина появления данного сообщения связана с часовыми поясами системы.Проблема может возникнут из-за обновления часовых поясов системы или у контакта в приложении Terrasoft установлен часовой пояс, который отсутствует в реестре Windows.

Проблема может возникнуть в двух функциях конфигурации:

  • CheckTimeZone (сервис scr_Main)
  • GetTimeZoneCaption (сервис scr_DateUtils)

Для устранения проблемы необходимо заменить функцию CheckTimeZone находящуюся в сервисе scr_Main на новую:

function CheckTimeZone() {
    var UserTimeZone = Connector.CurrentUser.TimeZone;
    var SystemTimeZone = System.GetSystemTimeZone();
     
    var TimeZoneEnum = GetSingleItemByCode('enm_TimeZone');
    var EnmUserTimeZone = TimeZoneEnum.ItemsByCode(UserTimeZone);          
    if (IsEmptyValue(EnmUserTimeZone)) {
        UserTimeZone = '';
    }
     
    if (!UserTimeZone) {
        UserTimeZone = SystemTimeZone;
        Connector.CurrentUser.TimeZone = UserTimeZone;
    }
    if (UserTimeZone == SystemTimeZone) {
        return;
    }
    var Message = FormatStr(
        "Часовой пояс системы: %1\rЧасовой пояс текущего контакта: %2\rИспользовать часовой пояс системы?",
        GetTimeZoneFullCaption(SystemTimeZone), GetTimeZoneFullCaption(UserTimeZone));                          
    if (ShowConfirmationDialog(Message) != wmrYes) {
        return;
    }      
    Connector.CurrentUser.TimeZone = SystemTimeZone;
    var UpdateQuery = GetSingleItemByCode('uq_ContactTimeZone');
    UpdateRecordField(UpdateQuery, Connector.CurrentUser.ContactID,
        Array('TimeZone'), Array(SystemTimeZone));              
}

 

А также необходимо заменить функцию GetTimeZoneCaption находящуюся в сервисе scr_DateUtils на новую:

function GetTimeZoneCaption(TimeZone, ForScheduler) {
    var TimeZoneEnum = GetSingleItemByCode('enm_TimeZone');
    var TimeZoneCaption = '';
    if (!IsEmptyValue(TimeZone)) {
        var TimeZoneValue = TimeZoneEnum.ItemsByCode(TimeZone);
        if (!IsEmptyValue(TimeZoneValue)) {
            TimeZoneCaption = TimeZoneEnum.ItemsByCode(TimeZone).Caption;
        } else {
            TimeZoneCaption = TimeZone;
        }
    }
    var Result = 'GMT';  
    Result += (ForScheduler ? '\r' : '') +
        (TimeZoneCaption.substring(4, 5) == ')' ? '' : TimeZoneCaption.substring(4, 10));
    return Result;
}

 

Как еще одним решением может быть - поудалять дубли часовых поясов в ветке [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones]. Оставив те часовые пояса, которые содержат ключ Display:

Иногда помогает внесение изменений в реестр Windows, обновив значение ветки [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones\Kamchatka Standard Time]. Необходимые значение находятся в файле Kamchatka Standard Time.reg

Также можно просто импортировать ветку [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones\Kamchatka Standard Time] из другого реестра системы, где пользователь работает без сбоев.

Нравится

Поделиться

11 комментариев

Коммент по исследованию этой проблемы с версией TSXRM 3.3.1

(Похоже. что в версии TS 3.4 под Win10 этого не наблюдается)

Последнее время на Win10 обновления от MS дописывают ключи для часовых поясов в реестр, но не обновляют библиотеку - tzres.dll.mui 

  1. Программа (например TSClient.exe) запрашивает локальное имя часового пояса Судана. (о-в Св.Антония, Фиджи и т.д.)
  2. Операционка считывает значение ключа из реестра - (UTC+02:00) Хартоум - @tzres.dll,-2890
  3. Вызывает библиотеку tzres.dll
  4. Библиотека чтобы дать имя на установленном в ОС языке вызывает местную - tzres.dll.mui  и запрашивает строку за нумером -2890 Смотрим самый последний номер строки в библиотеке, например, это: STRINGTABLE LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT {2810, "(UTC+03:00) Стамбул"}
  5. Система возвращает ПУСТО (NULL)

TSClient видит пусто в энумераторе enm_TimeZone, которое при проверке на уникальность срабатывает как дублирование названия.

Возникает ошибка в бинарнике, вызванная библиотекой TSObjectLibrary.dll - там лежит вызов

GetSingleItemByCode('enm_TimeZone') -> Services.GetNewItemByUSI(Code)

Когда TSObjectLibrary видит слово enm_TimeZone, она хватается за пистолет и, очистив энумератор, заполняет его снова из реестра ОС и падает из-за  NULL.

Варианты Решения:

1. Обновить библиотеку местного диалекта для часовых поясов tzres.dll.mui. Не факт, что следующее обновление её не затрёт.

2. Создать новый энумератор (имя + ID), заполнять его кодом JScript ручками из ОС при запуске и заменить вызовы на него. Не забываем таблицы и датасеты типа ds_Contact, tbl_City etc.. 

3. Заполнять энумератор самим, а хексредактором "исправить" :)  злосчастное имя enm_TimeZone в библиотеке TSObjectLibrary

 

 

 

 

Спасибо за анализ.

Для Судана и прочего сообщение «Дублируется значение свойства 'Caption'. Значение 'Sudan Standard Time' уже существует» встречалось и в 3.4.0, и даже в 3.4.1. Помогает удаление пояса в Regedit.

Это так, но следующее обновление Вин10, скорее всего, снова его внесёт в реестр. И добавит острова Святого Антония)). Поскольку мой парк машин - велик и разбросан по стране - решение через общую конфигурацию TS представляется более оптимальным. Можно чистить реестр средствами групповой политики, можно отменить всем ВинАвтоАпдейт навсегда (не 35 дней), можно найти самый последний вариант MUI и каждому его подсунуть, но не факт, что следующее обновление не заменит и его. Можно забить корректными данными enm_TimeZone и запретить ему автообновление; обновлять централизованно разработчику по фиксации новых часовых поясов в MS-KB файлах. Можно ещё исключить все упоминания enm_TimeZone из конфигурации: часовой пояс клиента/контакта/города не всем необходим. )

До этого общим решением наших админов было: чистка реестра, откат последнего обновления Win10 или, вообще, откат на Win7. :) Развелось самостоятельных любителей десятки... И это - не первая проблема работы TS3.x под Win10, и что ещё нам принесут очередные обновления от MS. :)

Сбои с новыми поясами бывают нерегулярно и не на всех компьютерах. То есть, если удалили Sudan, не факт, что сразу на тот же компьютер придёт Sao Tome.

C Windows 10 есть и более серьёзные и трудноустранимые препятствия в обновлениях. Помогает от них только переход с более старых версий на 3.4.1.

Да, так. Но я предлагаю универсальный способ избавления от часового пояса. Навсегда. Из конфигурации. С другой стороны - острова Св.Антония выбивают пользака прямо при входе. Это - свежее.

Более серьёзные трудности - копятся. Пока что мы все их обходим..))

Да, у меня под руками TS3.4.1 так что я  - не голословен.))

Надеюсь, что вмешательство в бинарный код фирма не почтёт за нарушение её прав? Мне уже приходилось менять код екзешника TSClient - ничего, притерпелись...)

 

Прежде, чем править бинарный файл, есть смысл скачать последнюю сборку в пределах версии.

Выбивало при входе ещё при Marquesas Standard Time в 2016 году. Думал, что там просто две записи в реестре об одном поясе, но, как Вы расследовали, всё оказалось интересней.

Опять же, с часовым поясом — не самое страшное, что может случиться при обновлении Windows 10.

Помню эту историю)) 

Самое страшное мы - уже победили.. Но, чем чорт не шутит...

Кстати, TSAdmin.exe тоже "кашляет" на эту историю.. Обходим, гладим, усмиряем..) Там то мы не можем конфигурацией помочь. Только вмешательство в тело бинарника. А это мы умеем)

 

Последний реально существующий релиз - TS3.3.1.184 Скачан два года назад с официального сайта.

 

https://c2n.me/3TZJXIb

вот такая переферналия, но это вполне победимо)

Показать все комментарии