1c використання синхронних методів на клієнті заборонено. Чому виникає помилка "Використання синхронних методів на клієнті заборонено"? Робота з файлами у веб-клієнті

Чому виникає помилка "Використання синхронних методів на клієнті заборонено"?

Якщо в процесі виконання уроків у вас виникла така помилка - виправити її дуже просто.

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

У вікні, натисніть правою кнопкою на пункті "Конфігурація" і виберіть з меню "Властивості":

Відкриється вікно з властивостями конфігурації (праворуч):

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

Встановіть його значення в "Використовувати":

Увага!Зверніть увагу, що якщо ви використовуєте платформу 1С, відмінну від тієї, що ми завантажували в першому уроці (пізнішої версії), то у вас також буде присутній поле "Режим використання синхронних викликів...". Його також потрібно встановити у "Використовувати".

Нарешті виберіть пункт меню "Конфігурація" -> "Зберегти конфігурацію":

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

Пояснення нижче – для тих, кому цікаво, що ми зробили.

Ми включили режим використання модальності у нашій конфігурації. За замовчуванням цей режим вимкнено і це не дозволяє нам використовувати такі команди як ВвестиКількість, ВвестиРядок, ВвестиДату, ВідкритиЗначення.

Справа в тому, що ці команди належать до модальних. Їх виклик призводить до того, що перед користувачем з'являється вікно (наприклад, для введення інформації), яке блокує можливість роботи з програмою, доки вікно не закриється.

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

"Використання модальних вікон в даному режимі заборонено" - така помилка зараз починає турбувати користувачів і програмістів 1С з приходом нового інтерфейсу платформи 1С 8.3 - "".

Розробники технологічної платформи 1С йдуть у ногу з часом, стандартизуючи своє рішення під світові стандарти розробки програмного забезпечення. Всі стандарти так чи інакше зводяться до єдиного інтерфейсу, близького до веб-сторінок.

Модальні та спливаючі (pop-up) вікна вважаються поганим тоном і вже давно перестали бути нормальним при розробці софту. Користувачі звикли до роботи "в одному вікні".

Особливо часто ми бачимо помилку модальності у наступних методів 1С:

  • питання;
  • Попередження;
  • ВідкритиЗначення.

Розробники платформи 1С 8 з виходом нового інтерфейсу «таксі» прийняли правильне рішення - спробувати перевчити розробників прикладних рішень на новий лад. Вони включили у нову платформу можливість – «режим використання модальності».

Швидке виправлення проблеми

Якщо немає часу розбиратися і потрібно швидко розв'язати задачу, пропонуємо просте, але не зовсім правильне рішення. Для швидкого виправлення помилки достатньо змінити режим модальності властивостей конфігурації.

Для цього зайдіть у систему в режимі , відкрийте конфігурацію:

У відкритій конфігурації викличте контекстне меню, натиснувши на корінь конфігурації правою кнопкою, вибравши «Властивості»:

Отримайте 267 відеоуроків з 1С безкоштовно:

Відкриються властивості конфігурації, де в підвалі є цікава для нас властивість — «Режим використання модальності», виберіть режим «Використовувати»:

Після цього збережіть та застосовуйте зміни, натиснувши клавішу F7.

Правильне вирішення задачі

Правильний спосіб вирішення цієї проблеми – доопрацювати конфігурацію чи зовнішню обробку під нові вимоги.

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

Вбудовані оператори, які викликали модальні вікна, слід замінити на дублюючі функції.

Наприклад:

  • Попередження — ПоказатиПопередження;
  • Питання - ПоказатиПитання (докладно - );
  • - ПоказатиВведенняЧисла.

При цьому з'явився спеціалізований об'єкт - Опис Сповіщення.

Приклад заміни:

Рядок = ""; Строк (Рядок, "Введіть строкове значення") Повідомити("Ви ввели" + Рядок) ;

Необхідно замінити на:

Рядок = ""; Опис Оповіщення = Новий ОписОповіді( "ТестовийВведенняРядки", Ця форма) ; ПоказатиВведенняРядки(ОписОповідання, Рядок, "Введіть строкове значення") ;

При цьому додати подібну процедуру на клієнта, яка відпрацює, коли значення буде введено користувачем:

&НаКлієнті Процедура ТестовийВведенняРядки(ОтриманеЗначення, ПереданіПараметри) Експорт Повідомити("Ви ввели " + Рядок) ; КінецьПроцедури

Форми, які розробляються всередині конфігурації, відкриваються так само. Достатньо замінити метод «ВідкритиФормуМодально» на «ВідкритиФорму», прописавши опис оповіщення та потрібну для нього нову процедуру.

Щоб формою, що відкривається, закрити доступ до форми, що викликається, достатньо у властивості форми вказати у властивості «РежимВідкриттяВікна» значення «Блокувати вікно власника»:

Реалізовано у версії 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С. Ми, за традицією, рекомендуємо звернути вашу увагу на наші курси з програмування