Переход на новые версии платформы 1С, начиная с 8.3.15, часто сопровождается неприятными сюрпризами для разработчиков, особенно при работе пользователей через веб-клиент. Одной из самых распространенных проблем становится сообщение: «Использование модальных окон в данном режиме запрещено». Примечательно, что ошибка может возникать даже в тех случаях, когда в коде используются современные асинхронные методы, такие как ПоказатьВопрос.
В этой статье мы подробно разберем причины такого поведения платформы, проанализируем настройки конфигурации и выясним, как правильно адаптировать код под новые требования безопасности современных браузеров и архитектуры 1С.
Начиная с версии 8.3.15, компания 1С внедрила жесткие ограничения на использование модальности и синхронных вызовов в веб-клиенте. Это связано с тем, что современные браузеры (Chrome, Firefox, Safari) планомерно отказываются от поддержки синхронных операций, которые блокируют поток выполнения и ухудшают пользовательский опыт. Платформа 1С теперь принудительно исполняет эти правила.
Даже если ваш код выглядит современным, как в примере ниже, он может вызывать ошибку:
&НаКлиенте
Процедура Заполнить(Команда)
Оповещение = Новый ОписаниеОповещения("ПослеЗакрытияВопроса", ЭтотОбъект);
ПоказатьВопрос(Оповещение, "Список товаров будет перезаписан. Продолжить?", РежимДиалогаВопрос.ОКОтмена);
КонецПроцедуры
На первый взгляд, здесь всё верно: используется ОписаниеОповещения и неблокирующий метод ПоказатьВопрос. Однако система всё равно выдает ошибку. Проанализируем, почему это происходит.
Первым делом нам необходимо проверить глобальные настройки самой конфигурации. Если платформа видит, что конфигурация «старая», она может интерпретировать любые диалоги как потенциально опасные.
Если свойства настроены верно, но ошибка сохраняется, значит, внутри цепочки вызовов спрятан «синхронный» код. Рассмотрим ситуацию автора темы: в процедуре ПослеЗакрытияВопроса вызывается метод Очистить().
&НаКлиенте
Процедура ПослеЗакрытияВопроса(Результат, Параметры) Экспорт
Если Результат = КодВозвратаДиалога.ОК Тогда
Очистить(); // Здесь может скрываться проблема
// Продолжение логики заполнения
КонецЕсли;
КонецПроцедуры
Выясним причину: если внутри процедуры Очистить() происходит изменение реквизитов формы, это может инициировать события ПриИзменении. Если в этих событиях или в процедурах, которые они вызывают, затесался старый метод типа Предупреждение() или Вопрос() (без приставки «Показать»), система моментально выбросит ошибку модальности. Платформа 8.3.15 крайне чувствительна к таким «хвостам» в коде.
Чтобы не искать ошибки вручную во всей конфигурации, воспользуемся встроенным инструментом платформы. Рассмотрим, как это сделать:
В ходе обсуждения автор столкнулся с еще одной критической проблемой: попыткой создания COMОбъект("Word.Application") в веб-клиенте. Рассмотрим ситуацию подробнее. Технология COM является проприетарной технологией Windows. Она может работать в Internet Explorer через ActiveX, но категорически не поддерживается в современных браузерах, таких как Chrome или мобильные клиенты.
Если ваша задача — формировать документы по шаблону в веб-клиенте, забудьте про COM на стороне клиента. Проанализируем правильные альтернативы:
ПолучитьФайл().Пример правильного подхода для печати документа (серверный метод):
&НаСервере
Функция СформироватьДокументНаСервере()
// Логика заполнения шаблона Word в виде двоичных данных
ДвоичныеДанныеФайла = Обработки.ПечатьДокументов.ПолучитьМакет("ШаблонWord");
// ... заполнение параметров через XML или замену текста ...
АдресФайла = ПоместитьВоВременноеХранилище(ДвоичныеДанныеФайла);
Возврат АдресФайла;
КонецФункции
&НаКлиенте
Процедура Печать(Команда)
Адрес = СформироватьДокументНаСервере();
ПолучитьФайл(Адрес, "СчетНаОплату.docx", Истина);
КонецПроцедуры
Посмотрим на жалобу автора о невозможности отладки. В 1С 8.3.15 для отладки в веб-клиенте недостаточно просто запустить сеанс. Выясним, что нужно настроить:
<debug enable="true" url="tcp://localhost" /> (для протокола TCP) или используйте протокол HTTP, который является предпочтительным для новых версий.default.vrd.Проанализировав ситуацию, можно сделать вывод: ошибка «Использование модальных окон запрещено» в версии 8.3.15 — это не баг платформы, а следствие ужесточения правил разработки. Чтобы ваша конфигурация стабильно работала в веб-клиенте, необходимо:
ОписаниеОповещения и асинхронных методов ПоказатьВопрос, ПоказатьПредупреждение, ПоказатьВводЗначения.Следуя этим правилам, вы обеспечите кроссплатформенность вашего решения и стабильную работу пользователей в любых браузерах без досадных ошибок модальности.