1. Notella 08.09.19 09:38 Сейчас в теме

Передача управления с сервера на клиент

Уважаемые коллеги помогите с решением задачи.
Исходные данные:
Конвертация данных. Необходимо прочитать внешний xml-файл.
Клиент-серверный вариант.
В правилах выгрузки данных в обработчике перед обработкой пытаюсь передать управление с сервера на клиент
Парсер = Новый ЧтениеXML;
ПолноеИмяФайла = Сд_Конвертация.ПолучитьИмяФайлаКлиент();
где Сд_Конвертация - это свой общий модуль из расширения.

&НаКлиентеНаСервереБезКонтекста
Функция ПолучитьИмяФайлаКлиент() Экспорт
	
	ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
	ДиалогВыбораФайла.Фильтр = "Файл данных (*.xml)|*.xml";
	ДиалогВыбораФайла.Расширение = "xml";
	ДиалогВыбораФайла.Заголовок = НСтр("ru = 'Выберите файл'");
	ДиалогВыбораФайла.ПредварительныйПросмотр = Ложь;
	ДиалогВыбораФайла.ИндексФильтра = 0;
	ДиалогВыбораФайла.МножественныйВыбор = Ложь;
	ДиалогВыбораФайла.ПроверятьСуществованиеФайла = Истина;
	
	Если НЕ ДиалогВыбораФайла.Выбрать() Тогда
		Отказ = Истина;
	КонецЕсли;
	
    Возврат ДиалогВыбораФайла.ПолноеИмяФайла;

КонецФункции // ПолучитьИмяФайла()
Показать


При выгрузке сплошной мат: Метод объекта не обнаружен (ПолучитьИмяФайлаКлиент)
Ответы
Избранное Подписка Сортировка: Древо
2. Notella 32 08.09.19 09:39 Сейчас в теме
Причем в файловом варианте работает Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
3. nomad_irk 8 08.09.19 10:44 Сейчас в теме
В файловом варианте ВЕСЬ код выполняется на клиентской машине.
С сервера невозможно передать выполнение на клиент, только с клиента на сервер.
4. 2tvad 54 08.09.19 13:54 Сейчас в теме
(3) передать можно. Но в особо извращенной форме. Например, пускать обработчик на клиенте и мониторить регистр где писать задания для клиентов уже сервером. Далее отправлять оповещения и отлавливать их формами например. Очень давно, я так реализовывал форму - задолбай пользователя, но сделай заявку.

Но если возникает такая ситуация, то скорее всего, архитектуру нужно продумывать.
5. Notella 32 09.09.19 07:54 Сейчас в теме
7. 2tvad 54 09.09.19 11:31 Сейчас в теме
(5) У меня готового решения нет. Могу подсказать куда копать:

1 Делаете регистр, Куда на сервере пишите название пользователя, его сессию, guid формы, что вы хотите вызвать и т.д.
2. Вешаете на ПриНачалеРаботыСистемы \ ПодключитьОбработчикОжидания обработку регистра.
3. На клиенте проверяете на соответствии пользователя и отправляете оповещение (если нужно в форме что то сделать).
4. В форме получаете оповещение и делаете что вам нужно.

Есть еще способ - https://wonderland.v8.1c.ru/blog/peredacha-informatsii-s-servera/
6. nikita0832 188 09.09.19 09:29 Сейчас в теме
Убедитесь что общий модуль клиентский.
&НаКлиентеНаСервереБезКонтекста
- вот этого не надо, только клиент. Там нет ничего серверного по смыслу.
То есть если Вы хотите использовать выбранный файл в серверной процедуре, начните с выбора файла, поместите его во временное хранилище (лучше всего через НачатьПомещениеФайла) и потом работайте с ним на сервере. Ничего страшного если будет висеть в памяти всю процедуру, а воспользуетесь Вы им только в конце.
8. Notella 32 10.09.19 07:18 Сейчас в теме
(6) НачатьПомещениеФайлов
Использование в версии:
Доступен, начиная с версии 8.3.6.
Не рекомендуется использовать, начиная с версии 8.3.15.
У нас как раз эта самая 8.3.15
9. nikita0832 188 10.09.19 09:00 Сейчас в теме
(8) Ну тогда ПоместитьФайл (то же самое, но модально) или вручную
ДвоичныеДанные = Новый ДвоичныеДанные(ВыбранныйФайл);
Адрес = ПоместитьВоВременноеХранилище(ДвоичныеДанные);
СервернаяПроцедура(Адрес);

Главное интерактивные действия выполнить на клиенте, потом вызывать сервер.
10. Notella 32 10.09.19 09:09 Сейчас в теме
(9) В обработке Универсальный обмен данными в формате XML после нажатия клавиши выгрузить когда уже загружены правила обмена
необходимо дать пользователю указать файл с данными внешнего источника. Файл произвольного имени и местоположения
в файловой системе. К моменту, когда происходит обработка события "Перед обработкой" правила выгрузки данных
управление происходит на сервере. Надо как-то вмешаться в этот процесс и перенаправить действия на клиент, чтобы
была возможность интерактивно выбрать нужный файл.
В файловом варианте было так:

ВыборкаДанных = Новый ТаблицаЗначений;
ВыборкаДанных.Очистить();
ВыборкаДанных.Колонки.Очистить();

НаборЗаписей = РегистрыСведений.ДанныеБилинговойСистемы.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Период.Установить(Параметры.ПериодДокументов);
НаборЗаписей.Прочитать();
ТаблицаЗаписей = НаборЗаписей.ВыгрузитьКолонки();
Для каждого Колонка Из ТаблицаЗаписей.Колонки Цикл
ВыборкаДанных.Колонки.Добавить(Колонка.Имя, Колонка.ТипЗначения);
КонецЦикла;

ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
ДиалогВыбораФайла.Фильтр = "Файл данных (*.xml)|*.xml";
ДиалогВыбораФайла.Расширение = "xml";
ДиалогВыбораФайла.Заголовок = НСтр("ru = 'Выберите файл'");
ДиалогВыбораФайла.ПредварительныйПросмотр = Ложь;
ДиалогВыбораФайла.ИндексФильтра = 0;
ДиалогВыбораФайла.МножественныйВыбор = Ложь;
ДиалогВыбораФайла.ПроверятьСуществованиеФайла = Истина;

Если НЕ ДиалогВыбораФайла.Выбрать() Тогда
Отказ = Истина;
КонецЕсли;
11. nikita0832 188 10.09.19 09:43 Сейчас в теме
(10)Вот это на клиенте
ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
ДиалогВыбораФайла.Фильтр = "Файл данных (*.xml)|*.xml";
ДиалогВыбораФайла.Расширение = "xml";
ДиалогВыбораФайла.Заголовок = НСтр("ru = 'Выберите файл'");
ДиалогВыбораФайла.ПредварительныйПросмотр = Ложь;
ДиалогВыбораФайла.ИндексФильтра = 0;
ДиалогВыбораФайла.МножественныйВыбор = Ложь;
ДиалогВыбораФайла.ПроверятьСуществованиеФайла = Истина;

Если НЕ ДиалогВыбораФайла.Выбрать() Тогда
Отказ = Истина;
КонецЕсли;
Показать

Остальное потом на сервере. Выбранный файл сохраните в реквизите объекта (если нужен адрес файл и его надо видеть в модуле объекта) или во временное хранилище как я писал выше если с ним надо дальше работать на сервере.
12. Notella 32 10.09.19 10:04 Сейчас в теме
(11) Передача с сервера на клиент не происходит.
Если в свойствах модуля указать только Клиент Функция не видна. Метод не обнаружен.
13. Notella 32 10.09.19 10:06 Сейчас в теме
(11) Здесь и происходит затык. Процедуры выполняется на сервере "ПередОбработкой...." и при передаче из нее на клиентский модуль платформа говорит, что метод не обнаружен
14. nikita0832 188 10.09.19 10:17 Сейчас в теме
(13) Да там и не будет передачи, перепишите функцию так чтобы сначала отрабатывала клиентская часть, потом серверная.
Оставьте свое сообщение
Новые вопросы с вознаграждением
Автор темы объявил вознаграждение за найденный ответ, его получит тот, кто первый поможет автору.

Вакансии

Программист 1С
Санкт-Петербург
зарплата от 130 000 руб.
Полный день


Программисты 1С УТ / БУЗ/ЗУП / БИТ ФИНАНС
Москва
зарплата от 100 000 руб. до 180 000 руб.
Полный день

Программист 1С
Москва
зарплата от 150 000 руб. до 150 000 руб.
Полный день

Программист, аналитик, эксперт 1С
Санкт-Петербург
По совместительству