Использование синхронных методов на клиенте запрещено 1с. Почему возникает ошибка "Использование синхронных методов на клиенте запрещено"

Печать (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 .

Поскольку «акцент» этих инструментов сместился в сторону асинхронности, мы переименовали некоторые команды. Вместо слова «немодальные» теперь используется фраза «нерекомендуемые синхронные»:

Кроме этого в настройки конфигуратора мы добавили новую закладку Рефакторинг . Стандартно на ней включены оба преобразования. Но, если вам это нужно, с её помощью вы можете выполнять только один из видов преобразований при автоматическом рефакторинге.

В статье будут рассмотрены основные причины отказа от модальности в платформе «1С:Предприятие» и основные методы преобразования участков кода на новую асинхронную модель.

Применимость

В статье рассматриваются асинхронная модель построения бизнес-логики, добавленная платформу «1С:Предприятие» редакции 8.3. Представленная информация актуальна для текущих релизов платформы.

Отказ от использования модальных окон в платформе 1С:Предприятие 8.3

При разработке конфигурации на платформе 1С:Предприятие 8 периодически возникает потребность приостановить работу программы до того момента, когда пользователь примет какое-либо решение или выполнит какие-либо действия.

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

Такое поведение может обеспечить, например, следующий код:

&НаКлиенте
Процедура ЗаполнитьТовары (Команда )
Ответ = Вопрос (“Табличная часть будет очищена. Продолжить?” , РежимДиалогаВопрос.ДаНет );
Если Ответ = КодВозвратаДиалога.Да Тогда
//алгоритм заполнения
КонецЕсли ;
КонецПроцедуры

В результате работы этого фрагмента кода произойдет приостановка выполнения программного кода, на экране отображается вопрос, интерфейс приложения кроме диалога с вопросом становится недоступным, система ожидает принятия решения пользователем, выполнение кода продолжится только после ответа на вопрос.

Также к приостановке выполнения кода и блокировке интерфейса приводит открытие модальных окон при помощи вызова метода ОткрытьМодально().

При работе с конфигурацией в режиме веб-клиента через браузер в этом случае будет открыто новое окно – всплывающее окно, которое заблокирует не только текущую вкладку, но и весь интерфейс браузера, включая остальные открытые окна и вкладки.

Всплывающие окна в Интернете зачастую используются для злоумышленного распространения нежелательной рекламы, поэтому браузеры содержат функции блокировки всплывающих окон.

В таком случае для работы с конфигурациями 1С:Предприятие 8 через браузер необходимо запретить блокирование всплывающих окон.

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

Для решения указанных проблем следует использовать блокирующие окна вместо модальных. Для пользователя визуально все выглядит так же: окно блокирует интерфейс веб-клиента.

Однако блокирующее окно как бы “рисуется” поверх главного окна, и блокируется только текущая вкладка браузера, в которой открыта конфигурация, позволяя переключаться на другие вкладки, поскольку модальные окна браузера при этом не используются.

Таким образом, всплывающие окна в браузере не открываются и обеспечивается работа через веб-клиент на мобильных устройствах.

У корневого элемента конфигурации существует свойство “Режим использования модальности”, которое определяет, можно ли в конфигурации открывать модальные окна.

Если выбран вариант “Использовать”, то модальные окна можно открывать. Если выбран вариант “Не использовать”, то модальные окна недопустимы. При попытке вызвать метод, открывающий модальное окно, система выводит сообщение об ошибке:

При таком значении свойства “Режим использования модальности” допустимы только блокирующие окна.

Если выбран вариант “Использовать с предупреждениями”, то при открытии модальных окон в окно сообщений выводится текст:

Такой вариант работы может использоваться как промежуточный при переработке конфигурации с целью отказа от использования модальных окон.

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

Поэтому разработчикам придется переписать программный код, использующий модальные окна, с учетом этой особенности.

Код нужно разделить на две части:

  • открытие блокирующего окна;
  • обработка выбора пользователя.

Фрагмент кода, приведенный в начале статьи, нужно переписать следующим образом:

&НаКлиенте
Процедура ЗаполнитьТовары (Команда )
Оповещение = Новый ОписаниеОповещения (, ЭтотОбъект );

РежимДиалогаВопрос.ДаНет );
КонецПроцедуры
&НаКлиенте
Процедура (Результат , ДополнительныеПараметры ) Экспорт
Если Результат = КодВозвратаДиалога.Да Тогда
//алгоритм заполнения
КонецЕсли ;
КонецПроцедуры

После выполнения процедуры ПоказатьВопрос() система не останавливается, ожидая ответ пользователя, исполнение кода продолжается.

Пользователь сможет сделать выбор только после завершения работы всей процедуры. При этом будет вызвана экспортная процедура ЗаполнитьТоварыВопросЗавершение(). Ее название мы передали в конструктор объекта ОписаниеОповещения.

Процедура, которая будет вызвана после осуществления выбора, может быть расположена в модуле формы, модуле команды, общем не глобальном модуле.

В рассмотренном примере вызываемая процедура расположена в модуле управляемой формы, поэтому мы передали в параметр ЭтотОбъект.

Рассмотрим вызов процедуры, расположенной в общем модуле. Для этого добавим новый общий модуль ОбработкаОповещений, установим для него флаг “Клиент (управляемое приложение)”, а признак “Глобальный” не устанавливаем. Расположим в этом модуле процедуру ЗаполнитьТоварыВопросЗавершение().

Тогда обработчик команды заполнения будет выглядеть так:

&НаКлиенте
Процедура ЗаполнитьТовары (Команда )
Оповещение = Новый ОписаниеОповещения (“ЗаполнитьТоварыВопросЗавершение” ,
ОбработкаОповещений );
ТекстВопроса = “Табличная часть будет очищена. Продолжить?” ;
ПоказатьВопрос (Оповещение , ТекстВопроса , РежимДиалогаВопрос.ДаНет );
КонецПроцедуры

После вызова любого метода, открывающего блокирующее окно, процедура должна завершаться, а выполняемый далее код следует располагать в процедуре, которая будет вызвана после закрытия окна.

Для передачи контекста (вспомогательных данных, неких параметров, значений переменных) из процедуры, открывающей модальное окно, в процедуру, вызывающуюся при его закрытии, предусмотрен третий необязательный параметр конструктора объекта ОписаниеОповещения – ДополнительныеПараметры.

Этот объект (любого типа) будет передан в процедуру, описанную в ОписаниеОповещения, последним параметром.

На примере рассмотренного выше участка кода это можно сделать так:

&НаКлиенте
Процедура ЗаполнитьТовары (Команда )
Параметр1 = 0 ;
Параметр2 = 0 ;
СписокПараметров = Новый Структура (“Параметр1 , Параметр2″ , Параметр1 , Параметр2 );
Оповещение = Новый ОписаниеОповещения (“ЗаполнитьТоварыВопросЗавершение” , ЭтотОбъект ,
СписокПараметров );
ПоказатьВопрос (Оповещение , “Табличная часть будет очищена. Продолжить?” ,
РежимДиалогаВопрос.ДаНет );
КонецПроцедуры
&НаКлиенте
Процедура ЗаполнитьТоварыВопросЗавершение (Результат , ДополнительныеПараметры ) Экспорт
Если Результат = КодВозвратаДиалога.Да Тогда
//анализируем ДополнительныеПараметры.Параметр1
//анализируем ДополнительныеПараметры.Параметр2
КонецЕсли ;
КонецПроцедуры

Если нужно передать только одно значение, то структуру можно не использовать, а присвоить это значение параметру ДополнительныеПараметры конструктора объекта ОписаниеОповещения.

Рассмотрим несколько примеров работы с блокирующими окнами.

Задача 1. Открытие другой формы

Из формы документа по нажатию на кнопку “Открыть параметры” нужно открыть форму, на которой расположены два флажка Параметр1 и Параметр2, которые должен установить пользователь. После закрытия формы вывести в строку сообщений значения параметров.

Создаем общую форму “ФормаПараметров”, на которой размещаем реквизиты Параметр1 и Параметр2, а также команду ЗакрытьФорму:

Обработчик команды выглядит следующим образом:

Обработчик команды выглядит следующим образом: &НаКлиенте
Процедура ЗакрытьФорму (Команда )
СписокПараметров = Новый Структура (“Параметр1, Параметр2” , Параметр1 , Параметр2 );
Закрыть (СписокПараметров ); КонецПроцедуры

Для формы свойство РежимОткрытияОкна устанавливаем в “Блокировать весь интерфейс”:

На форме документа располагаем команду ОткрытьПараметры, обработчик которой описываем следующим образом:

&НаКлиенте
Процедура ОткрытьПараметры (Команда )
Оповещение = Новый ОписаниеОповещения (“ОткрытьПараметрыЗавершение” , ЭтотОбъект );
ОткрытьФорму (“ОбщаяФорма.ФормаПараметров” , , , , , , Оповещение );
КонецПроцедуры
&НаКлиенте
Процедура ОткрытьПараметрыЗавершение (Результат , ДополнительныеПараметры ) Экспорт
Если ТипЗнч (Результат ) = Тип (“Структура” ) Тогда
Для каждого КлючЗначение Из Результат Цикл
Сообщение = Новый СообщениеПользователю ;
Сообщение.Текст = “Ключ: “” ” + КлючЗначение.Ключ + “”” , значение = ”
+ КлючЗначение.Значение ;
Сообщение.Сообщить ();
КонецЦикла ;
КонецЕсли ;
КонецПроцедуры

В пользовательском режиме, запуская конфигурацию под веб-клиентом, получаем такие результаты работы:

Для увеличения нажмите на изображение.

Режим открытия окна можно также указывать в последнем параметре процедуры ОткрытьФорму.

&НаКлиенте
Процедура ОткрытьПараметры (Команда )
Оповещение = Новый ОписаниеОповещения (“ОткрытьПараметрыЗавершение” , ЭтотОбъект );
ОткрытьФорму (“ОбщаяФорма.ФормаПараметров” , , , , , , Оповещение ,
РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс
);
КонецПроцедуры

Задача 2. Вопрос при закрытии формы

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

Эту задачу можно решить при помощи следующего кода, расположенного в модуле формы обработки:

&НаКлиенте
Перем НужноЗакрыватьФорму ;
&НаКлиенте
Процедура ПередЗакрытием (Отказ , СтандартнаяОбработка )
Если НЕ НужноЗакрыватьФорму = Истина Тогда
Отказ = Истина ;
Оповещение = Новый ОписаниеОповещения (“ПередЗакрытиемЗавершение” , ЭтотОбъект );
ПоказатьВопрос (Оповещение , “Вы действительно хотите закрыть окно?” ,
РежимДиалогаВопрос.ДаНет
);
КонецЕсли ;
КонецПроцедуры
&НаКлиенте
Процедура ПередЗакрытиемЗавершение (Результат , ДополнительныеПараметры ) Экспорт
Если Результат = КодВозвратаДиалога.Да Тогда
НужноЗакрыватьФорму = Истина ;
Закрыть ();
Иначе
НужноЗакрыватьФорму = Неопределено ;
КонецЕсли ;
КонецПроцедуры

В процедуре ПередЗакрытием формы пользователю задается вопрос, флаг Отказ выставляется в Истина, закрытие формы отменяется.

После утвердительного ответа на вопрос переменная НужноЗакрыватьФорму устанавливается в Истина, форма закрывается повторно.

Задача 3. Ввод числового значения

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

Для этого необходимо воспользоваться методом ПоказатьВводЧисла() вместо ВвестиЧисло(), который открывает блокирующее окно вместо модального.

&НаКлиенте
Процедура ВводЧисла (Команда )
Оповещение = Новый ОписаниеОповещения (“ВводЧислаЗавершение” , ЭтотОбъект );
ПоказатьВводЧисла (Оповещение , 0 , “Введите количество” , 15 , 3 );
КонецПроцедуры
&НаКлиенте
Процедура ВводЧислаЗавершение (Результат , ДополнительныеПараметры ) Экспорт

Сообщение = Новый СообщениеПользователю ;
Сообщение.Текст = “Вы ввели количество ” + Результат ;
Сообщение.Сообщить ();
КонецЕсли ;
КонецПроцедуры

После закрытия окна ввода числа будет вызвана процедура, в первый параметр которой будет передано введенное число или значение Неопределено, если пользователь отказался от ввода.

Задача 4. Выбор цвета

При нажатии на кнопку на форме обработки при помощи стандартного диалога выбора цвета пользователь указывает необходимый цвет. Этот цвет установить для фона нажимаемой кнопки.

Добавим на форму команду ВыборЦвета со следующим обработчиком:

&НаКлиенте
Процедура ВыборЦвета (Команда )
ДиалогВыбораЦвета = Новый ДиалогВыбораЦвета ;
Оповещение = Новый ОписаниеОповещения (“ВыборЦветаЗавершение” , ЭтотОбъект );
ДиалогВыбораЦвета. Пока зать (Оповещение );
КонецПроцедуры
&НаКлиенте
Процедура ВыборЦветаЗавершение (Результат , ДополнительныеПараметры ) Экспорт
Если НЕ Результат = Неопределено Тогда
Элементы.ВыборЦвета.ЦветФона = Результат ;
КонецЕсли ;
КонецПроцедуры

Для объектов ДиалогВыбораЦвета (а также ДиалогРедактированияСтандартногоПериода, КонструкторФорматнойСтроки, ДиалогРасписанияРегламентногоЗадания, ДиалогВыбораШрифта) метод Показать() открывает блокирующее окно.

После закрытия окна будет вызвана процедура, в первый параметр которой будет передано выбранное значение (цвет, шрифт и т.д.) или значение Неопределено, если пользователь отказался от выбора.

Следует обратить внимание, что объект ДиалогВыбораФайла не имеет метода Показать() в отличие от диалогов выбора цвета или шрифта, поскольку реализация этих диалогов существенно разная.

Для использования диалога выбора файла на веб-клиенте необходимо предварительно подключить расширение работы с файлами.

Диалоги, реализуемые через расширение работы с файлами, не создают таких проблем в работе, как модальные окна браузеров, поэтому не было реализовано открытие блокирующих окон для объекта ДиалогВыбораФайла.

В заключение отметим, что начиная с релиза 8.3.10 в веб-клиенте прекращена поддержка модальных окон. В этом случае, если в конфигурации происходит вызов модального метода, то происходит генерация исключения. Также в в веб-клиенте прекращена поддержка режима интерфейса В отдельных окнах . Кроме того, и в тонком, и в веб-клиенте теперь нельзя открывать форму в отдельном окне (при работе в режиме интерфейса В Закладках). Такие кардинальные шаги позволили отказаться от режима интерфейса, который уже не поддерживается всеми современными браузерами.

Какой практический вывод можно сделать из этой информации? А вывод довольно простой – если по какой-то причине в вашей конфигурации до сих пор существуют модальные вызовы, то в этих местах в в веб-клиенте будет выдаваться окно с сообщением об ошибке. Хочется предостеречь от попыток “нагуглить” какое-то быстрое решение данной проблемы, т.к. основная масса советов сводится к такому рецепту: в конфигураторе на уровне конфигурации в свойстве «Режим использования модальности» поставить значение «Использовать». Естественно, в данный момент, это работать не будет только из-за того, что сами современные браузеры уже не поддерживают модальные вызовы.

И у вас есть всего два пути, каким образом решить описанную выше проблему:

  1. Обновить платформу до релиза 8.3.10+ (8.3.11), установить свойство конфигурации «Режим совместимости» в «Не использовать» и переписать фрагменты кода, использующие модальные методы на асинхронную модель построения бизнес-логики
  2. Рекомендовать вашим клиентам пользоваться устаревшими браузерами, где модальные вызовы еще поддерживались (Mozilla Firefox версии 37 и ниже, Chrоme ниже 37 версии и т.д.).

Кстати, начиная с релиза 8.3.11, больше не поддерживаются веб-браузеры Microsoft Internet Explorer версий 8 и 9.

С веб-браузерами в свете модальности мы разобрались, теперь настала пора прояснить ситуацию и с остальными клиентами.

Начиная с версии 8.3.5 свойство «Режим использования модальности» в тонком и толстом клиентах учитывается, только если указан параметр командной строки /EnableCheckModal. Этот параметр автоматически подставляется в командную строку только при запуске приложения из конфигуратора. Если же этот параметр не указан, то генерация исключений не происходит и соответствующие предупреждения не показываются. Т.е. на практике в случае использования толстого и тонкого клиента никакого кардинального изменения в работе при использовании режима модальности не наблюдается – модальные вызовы будут работать так же, как и работали ранее, при этом не выдавая никаких предупреждений, как в веб-клиенте.

Чтобы расставить все точки над “i”, заметим, что начиная с редакции 8.3.9 в толстом клиенте игнорируется свойство конфигурации «Режим использования синхронных вызовов расширений платформы и внешних компонент», при этом соответствующие синхронные методы работают без генерации исключений и вывода предупреждений. Указанное игнорируемое свойство было добавлено в редакции 8.3.5 с целью поддержки асинхронной работы с внешними компонентами, криптографией и расширениями для работы с файлами в веб-браузере Google Chrome. Понятно, что к толстому клиенту это никакого отношения не имеет, и поэтому “тихое” игнорирование данного свойства просто исключило лишние проверки использования синхронных методов при использовании конфигурации.

Кстати! Из-за того, что платформа уверенно движется в сторону веба, с версии 8.3.8 разработчики ввели определенные ограничения на программный код, который связан с логикой закрытия формы или приложения, исполняемый в толстом и тонком клиентах. Обязательно прочтите нашу статью, подробно освещающую этот нюанс. Кроме того, в курсе «Профессиональная разработка интерфейсов и форм в 1С:Предприятие 8.3 », есть глава, посвященная отказу от модальности, и вы можете почерпнуть массу полезной и актуальной информации по этой теме.

Коллеги, существуют две вещи которые можно читать бесконечно: ленту вконтакте и список изменений в очередном релизе платформе, поэтому, давайте подводить окончательные итоги;)

В процессе рассмотрения примеров, позволяющих перейти от элементов синхронной модели к асинхронной, вы, наверное, уже заметили, что в общем случае программного кода стало больше. Чем больше кода, тем больше повышается сложность его дальнейшего сопровождения и отладки.

Кроме того, количество кода еще более увеличится, если мы в процессе разработки будем использовать большее количество диалогов. Поэтому в процессе разработки прикладных решений, ориентированных на работу в веб-клиенте, нужно помнить о той парадигме работы, которая используется в данный момент в современных веб-приложениях. Поэтому если в вашей конфигурации много интерактивных диалогов с пользователем, выдаваемых предупреждений, то есть смысл пересмотреть данную функциональность в пользу каких-то других подходов в организации взаимодействия с пользователем.

Вместо заключения

Вот и подошел к концу наш цикл «Первые шаги в разработке на 1С». Если вы прочли его целиком, то скорее всего, уже заметили, какими семимильными шагами развивается платформа в последнее время. Материал данного цикла был написан относительно недавно, однако мы были вынуждены его серьезно актуализировать, т.к. даже за такой короткий срок появилась масса новых важных функциональных возможностей и изменений. Такие крупные изменения могут несколько озадачить программиста 1С, если он не рос и не развивался в профессиональном плане с платформой все это время.

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

Почему возникает ошибка "Использование синхронных методов на клиенте запрещено"?

Если в процессе выполнения уроков у вас появилась такая ошибка - исправить её очень легко.

Вернитесь в конфигуратор и выберите пункт меню "Конфигурация" -> "Открыть конфигурацию":

В открывшемся окне нажмите правой кнопкой на пункте "Конфигурация" и выберите из раскрывшегося меню пункт "Свойства":

Откроется окно со свойствами конфигурации (справа):

Пролистайте его в самый низ и найдите там пункт "Режим использования модальности":

Установите его значение в "Использовать" :

Внимание! Обратите внимание, что если вы используете платформу 1С, отличную от той, что мы скачивали в первом уроке (более поздней версии), то у вас также будет присутствовать поле "Режим использования синхронных вызовов...". Его также нужно установить в "Использовать".

Наконец, выберите пункт меню "Конфигурация" -> "Сохранить конфигурацию":

Готово! Теперь ошибки больше не возникнет.

Пояснения ниже - для тех кому интересно, что мы сделали.

Мы включили режим использования модальности в нашей конфигурации. По умолчанию этот режим выключен и это не позволяет нам использовать такие команды как ВвестиЧисло, ВвестиСтроку, ВвестиДату, ОткрытьЗначение.

Дело в том, что эти команды относятся к модальным. Их вызов приводит к тому, что перед пользователем появляется окно (например, для ввода информации), которое блокирует возможность работы с программой, пока окно не закроется.

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

Если вы являетесь активным пользователем программного продукта 1С, это отлично. Программа, действительно, хороша, позволяет выполнять быстро и максимально качественно множественные задачи. Всё бы ничего, если она изредка не повергала в шок устрашающими сообщениями о возникших ошибках. Хорошо, если такие ошибки встречались ранее лично вами или теми, кто рядом с вами работает и может наглядно на пальцах пояснить, как устранить проблему , а также объяснить, почему она возникла.

Исправление проблемы происходит после изменения настроек или кода 1С.

Такая информативность позволит вернуть работоспособность программе 1С , а также в дальнейшем избежать серьёзных промахов, провоцирующих возникновение проблем.

Алгоритм исправления ошибки в 1С

Возникает в 1С и такая ошибка «Использование синхронных методов на клиенте запрещено». Не следует паниковать и при её возникновении, достаточно сориентироваться в последовательности ваших действий, изучив ценные рекомендации опытных пользователей.

Внесение изменений в настройки программы

Если вы попытались в программе 1С вызвать метод контекста, но вместо ожидаемых последующих действий, к которым вы уже привыкли, внезапно выскочило сообщение о том, что использование синхронных методов на клиенте запрещено, не следует паниковать, попробуем разобраться в этом программном сбое.

Первоначально кликните по строке «Конфигуратор». После этого в открытом контекстном меню перейдите на последнюю строку «Свойства», кликните по ней. Теперь откроется окно, в котором можно самостоятельно вносить некоторые изменения в настройки, включая корректировку и в режим работы программы.

Среди предлагаемых режимов найдите строку «Режим использования синхронных вызовов расширений и внешних компонентов». Обратите внимание, какое значение установлено для этого режима. Важно, чтобы был установлен параметр «Использовать». Если вы видите нечто другое, кликните по окну выбора и выберите этот параметр.

Теперь закройте все открытые окна и попробуйте выполнить все желаемые действия заново. Вероятность того, что у вас всё получится высока.

Изменение кода

К сожалению, не всегда удаётся исправить ошибку «Использование синхронных методов на клиенте запрещено» после внесения изменений в настройки программы. Иногда приходится осуществлять более ответственные мероприятия. В частности, вносить изменения в код программы. Опытные пользователи рекомендуют воспользоваться асинхронным методом входа, если синхронный вдруг стал запрещённым.

Откройте код программы. Название процедуры (Процедура ОткрытьЛиФайл1()) и его конец (КонецПроцедуры) оставьте без изменения, а само тело процедуры измените кардинально.

Прописать придётся всего лишь три строки:

Оповещение = Новый ОписаниеОповещения («ЗаписатьЛиЕще»,ЭтотОбъект);
ТекстВопроса = «Записать?»;
ПоказатьВопрос(Оповещение, ТекстВопроса, РежимДиалогаВопрос.ДаНет);

Если вы абсолютно в этом ничего не понимаете, не беда, просто скопируйте и вставьте между названием процедуры и её завершающей строкой. Очень верим в то, что при выполнении вами таких действий, всё встанет на свои места и программа вновь заработает, позволяя вам выполнять все действия на профессионально высоком уровне.