Undefined is not function или почему перестал работать веб-клиент 1С в Google Chrome 37
Рубрика: 1С:Предприятие -> Программирование
Метки: 1С:Предприятие | Ghrome | google | веб-клиент | программирование | советы
Просмотров: 14096
Последний релиз популярного браузера Google Chrome помимо новшеств очередных новшеств и багфиксов принес головную боль 1С-разработчикам. Проблема проявляется при использовании веб–клиента в браузере Google Chrome 37 и всех остальных бродилках на web-kit’е (например, Opera).
Проблема проявляется во всех местах конфигурации, где используются вызов модальных окон. При попытке вызвать модальное окно Google Chrome 37 выплевывает ошибку: «Underfined is not function» (1C). При нажатии единственной кнопки «ok» веб-клиент 1С сгенерирует стандартное сообщение «Открытие нового окна было заблокировано, видимо сработал блокировщик всплывающих окон» и предложит перезапустить приложение. Перезапуск вернет на окно авторизации и дальше все по кругу.
Мой проект на текущей стадии не был готов к использованию новых функций (для отказа от модальности), поэтому на этапах вызова окна загрузки файлов и вызова любого модального окна я ловил «Underfined is not function».
Способ решение #1
Самый простой способ решить программу – попросить клиентов перейти на Mozilla FireFox. Там подобная проблема не проявляется и в целом все работает хорошо. Именно так я и поступил. Однако, у некоторых клиентов начали возникать проблемы при скролинге элементов в формах списков. По непонятным причинам FireFox генерировал ошибку и браузер падал. Ошибка проявлялась не у всех, но ждать пока с проблемой столкнуться все пользователи я не мог.
Способ решения #2
Дальше я решил попробовать перевести проблемных клиентов на старые версии браузера Google Chrome. Мне удалось раздобыть в сети дистрибутив «Google Chrome 32» и он успешно был внедрен нескольким клиентам с отключенной функцией автоматического обновления. Способ опять же рабочий, но не элегантный – нельзя же всех лишить возможности обновления браузера.
Способ решения #3
Предыдущие способы имеют явные минусы, поэтому я решил отправиться и почитать информацию из ChangeLog’а к последней версии Google Chrome. Поиск по слову «modal» вывел меня на пункт, где четко говорилось, что поддержка функции showModalDialog() в новой версии Google Chrome удалена. Отлично, уже хоть что-то.
Перейдя в детальное описание этой фичи, я увидел, что при необходимости данную функцию можно активировать (!!!). Разработчики Google Chrome поступили мудро и оставили пути отступления, которыми можно пользоваться аж до мая 2015 года. Этого времени хватит, чтобы разработчики успели обновить свои решения.
Теперь собственно говоря само решение. Открываем редактор реестра Windows (regedit) и переходим в раздел «HKEY_LOCAL_MACHINESOFTWAREPolicies». Здесь вам нужно создать новые разделы: «GoogleChromeEnableDeprecatedWebPlatformFeatures» (см. рисунок ниже).
После переходите в раздел «EnableDeprecatedWebPlatformFeatures» и создайте в нем строковый ключ с именем «1С» и присвойте ему значение «ShowModalDialog_EffectiveUntil20150430». Должно получиться что-то вроде этого:
На этом шаге редактор реестра можно закрывать и открывать Google Chrome. В адресной строке бродилки вводим: «chrome://policy/» (без кавычек) и переходим по этому адресу. Должна открываться страница с политиками Chrome.
Изначально она будет пустой. Нажимаем кнопку «Повторно загрузить политики». Если вы все сделали правильно в реестре, то после нажатия кнопку вы увидите табличку c одной записью о функции «showModalDialog» (см. рисунок).
Все! Теперь никаких ошибок в веб-клиенте не будет. Ваши клиенты смогу продолжать работать, а вы получите время для адаптации конфигурации к нововведениям. Чтобы немного облегчить процесс, я сделал экспорт описанных выше ключей в файлик. Можете его загрузить и импортировать в свой реестр. Экспорт делал в Windows 7.
Исправление ошибки веб-клиента в Google Chrome 37: chrome37_fix_by_spider_net.zip
P.S. Если ваш компьютер не входит в домен, то данное решение не поможет. В таких случаях подойдет решение из второй части заметки