Исправляем: “Использование синхронных методов на клиенте запрещено”
Понадобилось мне из одной базы в другую перекачать данные. Поскольку базы по структуре были идентичными, то я взял самый простой способ обмена через обработку ‘Выгрузка и загрузка данных XML’ (так же её можно скачать с официального сайта 1с).
При загрузке столкнулся со следующей ошибкой ‘Использование синхронных методов на клиенте запрещено!‘ в тонком клиенте:
Здесь важно понимать что синхронные методы – это те методы, которые блокируют выполнения кода до момента завершения вызванного действия (метода), а асинхронные наоборот – позволяют коду выполняться дальше, при этом остается контроль за выполнением вызванного действия и дальнейшие его обработкой.
К пример в данном случае выбор файла был произведен через асинхронный метод (прочитайте в справке про особенность метода ‘НачатьПомещениеФайла’):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
&НаКлиенте Процедура ЗагрузитьДанные(Команда) ОчиститьСообщения(); АдресФайлаВоВременномХранилище = ""; Если РежимРаботыНаКлиенте Тогда ОписаниеОповещения = Новый ОписаниеОповещения("ЗагрузитьДанныеЗавершение", ЭтотОбъект); НачатьПомещениеФайла(ОписаниеОповещения, АдресФайлаВоВременномХранилище, , , УникальныйИдентификатор); Иначе Если ПустаяСтрока(ИмяФайлаЗагрузки) Тогда ТекстСообщения = Нстр("ru = 'Поле ""Имя файла"" не заполнено'"); СообщитьПользователю(ТекстСообщения, "ИмяФайлаЗагрузки"); Возврат; КонецЕсли; Файл = Новый Файл(ИмяФайлаЗагрузки); Если Не Файл.Существует() Тогда ТекстСообщения = Нстр("ru = 'Файл не существует'"); СообщитьПользователю(ТекстСообщения, "ИмяФайлаЗагрузки"); Возврат; КонецЕсли; ЗагрузитьДанныеЗавершение(Истина, АдресФайлаВоВременномХранилище, ИмяФайлаЗагрузки, Неопределено); КонецЕсли; КонецПроцедуры |
А вот уже при проверке файла у нас возникает ошибка из-за синхронного метода (‘Файл.Существует()’):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
&НаКлиенте Процедура ЗагрузитьДанныеЗавершение(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт Если Результат Тогда Состояние(Нстр("ru = 'Выполняется загрузка данных. Пожалуйста, подождите...'")); Файл = Новый Файл(ВыбранноеИмяФайла); Если Не Файл.Существует() Тогда ТекстСообщения = Нстр("ru = 'Указанный файл не существует'"); ПутьКДанным = ?(РежимРаботыНаКлиенте, "", "ИмяФайлаЗагрузки"); СообщитьПользователю(ТекстСообщения, ПутьКДанным); Возврат; КонецЕсли; ЗагрузитьДанныеНаСервере(Адрес, Файл.Расширение); КонецЕсли; КонецПроцедуры |
Что бы исправить данную ошибку можно воспользоваться несколькими вариантами решения. Можем изменить свойство конфигурации ‘Режим использования синхронных вызовов расширений платформы и внешних компонент’:
Либо не меняя конфигурацию просто закомментировать проблемный код (просто останемся без ненужной нам проверки):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
&НаКлиенте Процедура ЗагрузитьДанныеЗавершение(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт Если Результат Тогда Состояние(Нстр("ru = 'Выполняется загрузка данных. Пожалуйста, подождите...'")); Файл = Новый Файл(ВыбранноеИмяФайла); //Если Не Файл.Существует() Тогда // // ТекстСообщения = Нстр("ru = 'Указанный файл не существует'"); // ПутьКДанным = ?(РежимРаботыНаКлиенте, "", "ИмяФайлаЗагрузки"); // СообщитьПользователю(ТекстСообщения, ПутьКДанным); // Возврат; // //КонецЕсли; ЗагрузитьДанныеНаСервере(Адрес, Файл.Расширение); КонецЕсли; КонецПроцедуры |
И все – загрузка будет работать как часы! Можно при желании пойти еще дальше и переписать код проверки файла на асинхронный метод ‘НачатьПроверкуСуществования’:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
&НаКлиенте Процедура ЗагрузитьДанныеЗавершение(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт Если Результат Тогда Состояние(Нстр("ru = 'Выполняется загрузка данных. Пожалуйста, подождите...'")); Файл = Новый Файл(ВыбранноеИмяФайла); //Если Не Файл.Существует() Тогда // // ТекстСообщения = Нстр("ru = 'Указанный файл не существует'"); // ПутьКДанным = ?(РежимРаботыНаКлиенте, "", "ИмяФайлаЗагрузки"); // СообщитьПользователю(ТекстСообщения, ПутьКДанным); // Возврат; // //КонецЕсли; ДопПараметры = Новый Структура; ДопПараметры.Вставить("Адрес" , Адрес); ДопПараметры.Вставить("ФайлРасширение", Файл.Расширение); фл = Новый файл(ВыбранноеИмяФайла); фл.НачатьПроверкуСуществования(Новый ОписаниеОповещения("ЗавершениеПроверкиФайла", ЭтаФорма, ДопПараметры)); //ЗагрузитьДанныеНаСервере(Адрес, Файл.Расширение); КонецЕсли; КонецПроцедуры &НаКлиенте Процедура ЗавершениеПроверкиФайла(Существует, ДопПараметры) Экспорт Если Существует Тогда ЗагрузитьДанныеНаСервере(ДопПараметры.Адрес, ДопПараметры.ФайлРасширение); Иначе ТекстСообщения = Нстр("ru = 'Указанный файл не существует'"); ПутьКДанным = ?(РежимРаботыНаКлиенте, "", "ИмяФайлаЗагрузки"); СообщитьПользователю(ТекстСообщения, ПутьКДанным); Возврат; КонецЕсли; КонецПроцедуры |
Всегда ищете несколько вариантов решений и используйте лучший! Всем удачи! Пока!
Так же прилагаю исправленную обработку, что бы в следующий раз снова не пришлось исправлять код. Качайте на здоровье!
Скачать файлыcraft1c_Vygruzka-i-zagruzka-dannyh-XML_IspravlenaOshibkaZagruzki.epf