Использование синхронных методов на клиенте запрещено 1с. Асинхронные вызовы расширений и внешних компонентов
Если вы являетесь активным пользователем программного продукта 1С, это отлично. Программа, действительно, хороша, позволяет выполнять быстро и максимально качественно множественные задачи. Всё бы ничего, если она изредка не повергала в шок устрашающими сообщениями о возникших ошибках. Хорошо, если такие ошибки встречались ранее лично вами или теми, кто рядом с вами работает и может наглядно на пальцах пояснить, как устранить проблему , а также объяснить, почему она возникла.
Исправление проблемы происходит после изменения настроек или кода 1С.
Такая информативность позволит вернуть работоспособность программе 1С , а также в дальнейшем избежать серьёзных промахов, провоцирующих возникновение проблем.
Алгоритм исправления ошибки в 1С
Возникает в 1С и такая ошибка «Использование синхронных методов на клиенте запрещено». Не следует паниковать и при её возникновении, достаточно сориентироваться в последовательности ваших действий, изучив ценные рекомендации опытных пользователей.
Внесение изменений в настройки программы
Если вы попытались в программе 1С вызвать метод контекста, но вместо ожидаемых последующих действий, к которым вы уже привыкли, внезапно выскочило сообщение о том, что использование синхронных методов на клиенте запрещено, не следует паниковать, попробуем разобраться в этом программном сбое.
Первоначально кликните по строке «Конфигуратор». После этого в открытом контекстном меню перейдите на последнюю строку «Свойства», кликните по ней. Теперь откроется окно, в котором можно самостоятельно вносить некоторые изменения в настройки, включая корректировку и в режим работы программы.
Среди предлагаемых режимов найдите строку «Режим использования синхронных вызовов расширений и внешних компонентов». Обратите внимание, какое значение установлено для этого режима. Важно, чтобы был установлен параметр «Использовать». Если вы видите нечто другое, кликните по окну выбора и выберите этот параметр.
Теперь закройте все открытые окна и попробуйте выполнить все желаемые действия заново. Вероятность того, что у вас всё получится высока.
Изменение кода
К сожалению, не всегда удаётся исправить ошибку «Использование синхронных методов на клиенте запрещено» после внесения изменений в настройки программы. Иногда приходится осуществлять более ответственные мероприятия. В частности, вносить изменения в код программы. Опытные пользователи рекомендуют воспользоваться асинхронным методом входа, если синхронный вдруг стал запрещённым.
Откройте код программы. Название процедуры (Процедура ОткрытьЛиФайл1()) и его конец (КонецПроцедуры) оставьте без изменения, а само тело процедуры измените кардинально.
Прописать придётся всего лишь три строки:
Оповещение = Новый ОписаниеОповещения («ЗаписатьЛиЕще»,ЭтотОбъект);
ТекстВопроса = «Записать?»;
ПоказатьВопрос(Оповещение, ТекстВопроса, РежимДиалогаВопрос.ДаНет);
Если вы абсолютно в этом ничего не понимаете, не беда, просто скопируйте и вставьте между названием процедуры и её завершающей строкой. Очень верим в то, что при выполнении вами таких действий, всё встанет на свои места и программа вновь заработает, позволяя вам выполнять все действия на профессионально высоком уровне.
«Использование модальных окон в данном режиме запрещено» — такая ошибка сейчас начинает беспокоить пользователей и программистов 1С с приходом нового интерфейса платформы 1С 8.3 — « «.
Разработчики технологической платформы 1С идут в ногу со временем, стандартизируя своё решение под мировые стандарты разработки программного обеспечения. Все стандарты так или иначе сводятся к единому интерфейсу, близкому к веб-страницам.
Модальные и всплывающие (pop-up) окна считаются плохим тоном и уже давно перестали быть нормальным при разработке софта. Пользователи привыкли к работе «в одном окне».
Особенно часто мы видим ошибку модальности у следующих методов 1С:
- Вопрос;
- Предупреждение;
- ОткрытьЗначение.
Разработчики платформы 1С 8 с выходом нового интерфейса «такси» приняли верное решение — попытаться переучить разработчиков прикладных решений на новый лад. Они включили в новую платформу возможность — «режим использования модальности».
Быстрое исправление проблемы
Если нет времени разбираться и нужно быстро решить задачу, предлагаем простое, но не совсем правильное решение. Для быстрого исправления ошибки достаточно сменить режим модальности в свойствах конфигурации.
Для этого зайдите в систему в режиме , откройте конфигурацию:
В открытой конфигурации вызовите контекстное меню, нажав на корень конфигурации правой кнопкой, выбрав «Свойства»:
Получите 267 видеоуроков по 1С бесплатно:
Откроются свойства конфигурации, где в подвале есть интересующее нас свойство — «Режим использования модальности», выберите режим «Использовать»:
После этого сохраните и примените изменения, нажав клавишу «F7».
Правильное решение задачи
Правильный способ решения этой проблемы — доработать конфигурацию или внешнюю обработку под новые требования.
Предупреждение, вопрос, диалоговые окна и другие модальные окна — всё это необходимо переписывать на новый лад.
Встроенные операторы, которые вызывали модальные окна, необходимо заменить на дублирующие функции.
Например:
- Предупреждение — ПоказатьПредупреждение;
- Вопрос — ПоказатьВопрос (подробно — );
- — ПоказатьВводЧисла.
При этом появился специализированный объект — ОписаниеОпевещения.
Пример замены:
Строка = "" ; ВвестиСтроку(Строка, "Введите строковое значение" ) Сообщить("Вы ввели " + Строка) ;
Необходимо заменить на:
Строка = "" ; ОписаниеОповещения = Новый ОписаниеОповещения("ТестовыйВводСтроки" , ЭтаФорма) ; ПоказатьВводСтроки(ОписаниеОповещения, Строка, "Введите строковое значение" ) ;
При этом добавить подобную процедуру на клиенте, которая отработает, когда значение будет введено пользователем:
&НаКлиенте Процедура ТестовыйВводСтроки(ПолученноеЗначение, ПереданныеПараметры) Экспорт Сообщить("Вы ввели " + Строка) ; КонецПроцедурыФормы, которые разрабатываются внутри конфигурации, открываются точно так же. Достаточно заменить метод «ОткрытьФормуМодально» на «ОткрытьФорму», прописав описание оповещения и нужную для него новую процедуру.
Чтобы открывающейся формой закрыть доступ к вызываемой форме, достаточно в свойстве формы указать в свойстве «РежимОткрытияОкна» значение «Блокировать окно владельца»:
Печать (Ctrl+P)
Работа с файлами в асинхронном режиме присутствует только на стороне клиентского приложения. В общем случае рекомендуется использовать синхронные методы для работы на стороне сервера и асинхронные – для работы на стороне клиентского приложения.
Рассмотрим пример работы с файлами в асинхронной технике: удаление всех файлов в каталоге временных файлов. Для синхронной техники такое действие будет выглядеть следующим образом:
&НаКлиенте
Процедура
Удалить(Команда)
УдалитьФайлы(КаталогВременныхФайлов(), ПолучитьМаскуВсеФайлыКлиента());
КонецПроцедуры
Асинхронная техника будет выглядеть по-другому:
&НаКлиенте
Процедура
Удалить(Команда)
ОбратныйВызов
= Новый
ОписаниеОповещения(“ПолучитьКаталогВременныхФайловЗавершение”, ЭтотОбъект, “УдалитьОшибка”, ЭтотОбъект);
НачатьПолучениеКаталогаВременныхФайлов(ОбратныйВызов);
КонецПроцедуры
&НаКлиенте
Процедура
ПолучитьКаталогВременныхФайловЗавершение(ИмяКаталогаВременныхФайлов, ДополнительныеПараметры)
Экспорт
ОбратныйВызов
= Новый
ОписаниеОповещения(“УдалитьЗавершение”, ЭтотОбъект, “ФайловаяОшибка”, ЭтотОбъект);
НачатьУдалениеФайлов(ОбратныйВызов, ИмяКаталогаВременныхФайлов, ПолучитьМаскуВсеФайлыКлиента());
КонецПроцедуры
&НаКлиенте
Процедура
УдалитьЗавершение(ДополнительныеПараметры) Экспорт
Сообщить(“Удаление успешно завершено”);
КонецПроцедуры
&НаКлиенте
Процедура
ФайловаяОшибка (ИнформацияОбОшибке, СтандартнаяОбработка, ДополнительныеПараметры)
Экспорт
Сообщить(“При выполнении файловой операции обнаружена ошибка: ” + КраткоеПредставлениеОшибки(ИнформацияОбОшибке));
КонецПроцедуры
Во-первых
, следует обратить внимание, что практически все файловые операции стали асинхронными. Даже такие простые действия, как получение каталога временных файлов. И необходимость получения такого каталога приводит к первому асинхронному вызову. Затем происходит вызов собственно удаления всех файлов. И обработка завершения удаления требует второй обработчик, в котором должны располагаться действия, которые должны происходить после удаления всех файлов в каталоге временных файлов. В данном примере это выдача сообщения о завершении операции.
Если при выполнении файловых операций произойдет ошибка – управление будет передано обработчику ФайловыеОшибка()
. В нем можно корректно обработать сложившуюся ситуацию.
Работа с файлами в веб-клиенте
Работа с файлами в веб-клиенте имеет ряд особенностей:
1. Без установки расширений, в любом веб-браузере, доступны только методы ПолучитьФайл() и НачатьПомещениеФайла(). Метод ПоместитьФайл() не поддерживается при работе с веб-браузером Google Chrome и в том случае, если для конфигурации запрещено использование модальных методов (свойство конфигурации Режим использования модальности, см. здесь).
2. При установке расширения работы с файлами во всех веб-браузерах, кроме Google Chrome, доступы как синхронные, так и асинхронные методы работы с файлами (синхронность или асинхронность зависит от свойства конфигурации Режим использования модальности),
3. Для веб-браузера Google Chrome доступно только асинхронное расширение работы с файлами. Синхронная работа не поддерживается.
4. Расширение работы с файлами не поддерживает работу по протоколу HTTPS с использованием клиентского сертификата.
Примечание 1. Для корректной работы расширения работы с файлами в веб-браузере Microsoft Internet Explorer рекомендуется использование
библиотеки Microsoft Core XML Services (MSXML) версий 4.0 или 6.0.
Примечание 2. Расширение работы с файлами для веб-браузера Microsoft Internet Explorer устанавливается в каталог %APPDATA%\1C\1СEWebExt\FileSystemExtIE
Реализовано в версии 8.3.5.1383, 8.3.6.1977.
Современные тенденции
Тенденции развития браузеров приводят к тому, что в платформе всё больше увеличивается процент «асинхронности». Первым шагом был отказ от модальности. Теперь появились асинхронные вызовы для работы с расширениями криптографии, работы с файлами и внешними компонентами.
Причиной очередного движения в сторону асинхронности явилось то, что разработчики браузера Google Chrome отказались от поддержки прежней технологии NPAPI (Netscape Plugin Application Programming Interface). Эта технология использовалась для подключения к браузеру внешних модулей - расширений.
Такие расширения как раз использует 1С:Предприятие для работы с криптографией, для работы с файлами и для подключения внешних компонентов. Это довольно важная функциональность. Криптография используется в электронном документообороте, а благодаря внешним компонентам приложения могут работать со сканерами штрих-кодов и другим торговым оборудованием.
И вот теперь, вместо прежней, синхронной технологии NPAPI, разработчики Google Chrome создали новую технологию Native Messaging. При этом они настоятельно рекомендовали всем разработчикам расширений не использовать старую технологию, потому что она поддерживаться не будет.
Если не вдаваться в подробности, то новая технология лучше и безопаснее. Это хорошо. Но одним из её значительных отличий является то, что она предусматривает исключительно асинхронное взаимодействие с расширениями браузера. А это требует кардинального изменения всех существующих в 1С:Предприятии методов работы с расширениями и внешними компонентами. Потому что все они основаны на синхронном взаимодействии.
Асинхронные методы
Мы решили эту проблему так же, как и проблему модальных вызовов. Для всех синхронных методов, использующих технологию NPAPI, мы создали их асинхронные аналоги. В основном они отличаются наличием приставки Начать и тем, что первым параметром им передаётся ОписаниеОповещения, с которого будет продолжено исполнение программного кода после завершения вызванного действия.
Например, вместо метода Зашифровать() теперь мы рекомендуем использовать метод НачатьШифрование():
МенеджерКриптографии.Зашифровать(<ИсходныеДанные>, <Получатели>) МенеджерКриптографии.НачатьШифрование(<ОписаниеОповещения>, <ИсходныеДанные>, <Получатели>)
Вместо метода ПолучитьФайлы() - НачатьПолучениеФайлов():
ПолучитьФайлы(<ПолучаемыеФайлы>, <ПолученныеФайлы>, <РасположениеФайлов>, <Интерактивно>) НачатьПолучениеФайлов((<ОписаниеОповещения>, <ПолучаемыеФайлы>, <РасположениеФайлов>, <Интерактивно>)
Вместо УстановитьВнешнююКомпоненту() - НачатьУстановкуВнешнейКомпоненты():
УстановитьВнешнююКомпоненту(<Местоположение>) НачатьУстановкуВнешнейКомпоненты(<ОписаниеОповещенияОЗавершении>, <Местоположение>)
По сути, по большому счёту, всё очень похоже на то, что мы делали раньше, когда избавлялись от модальности. Но функционирование новых асинхронных методов имеет существенную особенность, которой нет у методов, вызывающих немодальные диалоги.
При асинхронном вызове немодального диалога мы ожидаем только некоторую реакцию пользователя, и больше ничего. В том смысле, что ничего непредвиденного случиться не может.
А в процессе вызова асинхронных методов работы с расширениями и компонентами могут возникать исключительные ситуации. Расширение не установилось, компонента не загрузилась и т.д.
Обработку таких исключительных ситуаций вы обычно предусматриваете в прикладном коде. С помощью оператора Попытка... Исключение. Но теперь это становится невозможным, потому что в момент асинхронного вызова код приложения не выполняется. Соответственно не работает оператор Попытка... Исключение.
- ИмяПроцедурыОбработкиОшибки;
- МодульОбработкиОшибки.
Если в процессе асинхронного вызова «что-то пойдёт не так» и возникнет исключительная ситуация, то будет выполнена процедура, на которую указывают эти свойства. Эти два свойства имеет смысл использовать только в асинхронных методах работы с расширениями. При вызове немодальных диалогов эти свойства вам не нужны.
Свойство конфигурации
Как и в случае отказа от модальности, всё прикладное решение в целом должно знать, «какое оно». Либо оно модальное, либо немодальное. Либо оно синхронное, либо асинхронное.
Раньше, для решения вопроса с модальностью, мы добавили конфигурации специальное свойство Режим использования модальности. Теперь, для решения вопроса с синхронностью, мы добавили ей аналогичное по смыслу свойство Режим использования синхронных вызовов расширений и внешних компонент.
Суть его использования заключается в следующем:
- Не использовать - это новый, асинхронный режим работы. Для новых конфигураций это стандартный режим. Использование старых, синхронных методов запрещено. Они не проходят синтаксический контроль, их нет в контекстной подсказке. Попытка выполнить синхронный метод вызывает исключение.
- Использовать с предупреждением - этот режим предназначен для разработчика. Он не препятствует использованию старых, синхронных методов. Но каждый раз, когда на клиенте вызывается синхронный метод, выдаёт предупреждающее сообщение. Этот режим мы рекомендуем использовать в «перерабатываемых» конфигурациях. Он удобен для визуального поиска синхронных вызовов и их контроля в процессе доработки.
- Использовать - режим, обеспечивающий совместимость новой версии платформы со старыми конфигурациями, использующими синхронные методы для работы с расширениями и внешними компонентами.
Все методы и свойства, о которых мы говорили до сих пор, реализованы в версии 8.3.5.1383. Вы можете использовать их в своих прикладных решениях. А разработчики БСП , например, переведут на асинхронную работу подсистемы, использующие средства криптографии, работы с файлами и внешние компоненты.
Естественно, как и в случае с модальными вызовами, у вас наверняка возникает вопрос. А надо ли мне переделывать своё прикладное решение? И вообще, надо ли мне использовать эти асинхронные методы в моём новом прикладном решении?
Когда это нужно?
Ответ на этот вопрос, по сути, такой же, какой мы давали раньше. Когда рассказывали об отказе от модальности.
Во-первых, не любая версия технологической платформы поддерживает режим асинхронных вызовов расширений и внешних компонентов. Этот режим работы существует, начиная с версии 8.3.5.1383. Поэтому, если вы работаете на младших версиях платформы, можете пока не озадачиваться отказом от синхронных методов.
Во-вторых, не все прикладные решения в обязательном порядке должны использовать этот режим. Критичными являются приложения, работа с которыми будет вестись с помощью веб-клиента в браузере Google Chrome. Такими приложениями, в большой массе, являются приложения, работающие в модели сервиса . Если ваше прикладное решение заведомо не будет использоваться в этом режиме, вы можете пока не отказываться от синхронных методов.
Однако, несмотря на первый и второй пункты, есть глобальные тенденции, которые могут повлиять на ваши планы. Мы, фирма 1С, разрабатываем все типовые решения исходя из того, что они могут использоваться любым из доступных способов. Поэтому новые прикладные решения, а так же все библиотеки, используемые в них, мы будем реализовывать в режиме без использования синхронных вызовов.
А значит, этот режим работы вам лучше начать осваивать уже сейчас. Даже если ваше приложение пока может его не использовать, мы рекомендуем, по возможности, начать перевод уже сейчас. При этом мы рекомендуем вам подходить к этому процессу творчески. В том же русле, что и при отказе от модальности. То есть не нужно механически заменять синхронные методы асинхронными. Сначала полезно подумать о том, а можно ли изменить алгоритм, сценарий так, чтобы в этом месте вообще отказаться от использования синхронных методов?
Рефакторинг
С одной стороны, если конфигурация большая и синхронных вызовов в ней много, то «ручная» переделка такой конфигурации может оказаться очень трудоёмкой задачей.
С другой стороны, начиная с версии 8.3.5.1068, в платформе существуют инструменты , позволяющие преобразовывать синхронные вызовы в их асинхронные аналоги.
Поэтому мы взяли эти, уже имеющиеся, инструменты, расширили их, и переориентировали с «ухода от модальности» на «переход к асинхронности». По своей сути переход на асинхронные методы аналогичен тем действиям, которые выполняются при отказе от модальности. Старые, «не модные», синхронные (модальные) вызовы нужно заменить новыми, «модными», асинхронными вызовами, использующими ОбработкуОповещения.
В таком, обновлённом виде инструменты рефакторинга стали доступны вам в версии 8.3.6.1977.
Поскольку «акцент» этих инструментов сместился в сторону асинхронности, мы переименовали некоторые команды. Вместо слова «немодальные» теперь используется фраза «нерекомендуемые синхронные»:
Кроме этого в настройки конфигуратора мы добавили новую закладку Рефакторинг. Стандартно на ней включены оба преобразования. Но, если вам это нужно, с её помощью вы можете выполнять только один из видов преобразований при автоматическом рефакторинге: