Ошибка открытия конфигурации. Требуется объект… (Error opening configuration. Object required...)
Иногда во время открытия конфигурации появляется сообщение:
Причина появления данного сообщения связана с часовыми поясами системы.Проблема может возникнут из-за обновления часовых поясов системы или у контакта в приложении Terrasoft установлен часовой пояс, который отсутствует в реестре Windows.
Проблема может возникнуть в двух функциях конфигурации:
- CheckTimeZone (сервис scr_Main)
- GetTimeZoneCaption (сервис scr_DateUtils)
Для устранения проблемы необходимо заменить функцию CheckTimeZone находящуюся в сервисе scr_Main на новую:
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 на новую:
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]. Необходимые значение находятся в файле
Также можно просто импортировать ветку [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones\Kamchatka Standard Time] из другого реестра системы, где пользователь работает без сбоев.
Коммент по исследованию этой проблемы с версией TSXRM 3.3.1
(Похоже. что в версии TS 3.4 под Win10 этого не наблюдается)
Последнее время на Win10 обновления от MS дописывают ключи для часовых поясов в реестр, но не обновляют библиотеку - tzres.dll.mui
- Программа (например TSClient.exe) запрашивает локальное имя часового пояса Судана. (о-в Св.Антония, Фиджи и т.д.)
- Операционка считывает значение ключа из реестра - (UTC+02:00) Хартоум - @tzres.dll,-2890
- Вызывает библиотеку tzres.dll
- Библиотека чтобы дать имя на установленном в ОС языке вызывает местную - tzres.dll.mui и запрашивает строку за нумером -2890 Смотрим самый последний номер строки в библиотеке, например, это: STRINGTABLE LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT {2810, "(UTC+03:00) Стамбул"}
- Система возвращает ПУСТО (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 Скачан два года назад с официального сайта.
вот такая переферналия, но это вполне победимо)