Цитата:
Сообщение от
mazzy
Предположим у нас есть RunBaseBatch.
Он делает что-то тяжелое. Мы конечно же хотим сделать так, чтобы он мог работать на пакетном сервере. Но этот класс забирает данные из какого-нибудь файла, который находится на клиенте. Как и куда правильно вставить действия, которые должны выполняться на клиенте?
Я лично в свое время для AX2009 делал условно базовый класс импорта из Excel, который при правильном использовании:
- запускался на сервере (main)
- переключался на клиента для отображения диалога (prompt) при этом позволял не только выбрать файл Excel, но и нужный лист в нем
- потом переключался обратно на сервер (run)
- в определенный момент создавал свою копию на клиенте по аналогии с тем, как это делает RunBase в prompt()
- на клиенте начитывал данные из файла и сохранял их в контейнер
- возвращался на сервер, получал контейнер с данными и начинал собственно их обработку, валидацию, вставку, обновление, вот это вот всё
При этом в классах-наследниках требовалось реализовать логику подбора листа по умолчанию, уточнения, откуда на листе считывать данные, и обработки считанных данных уже на сервере. Таким образом, клиент-серверное взаимодействие сводилось к минимуму. У коллег видел реализации импортов, которые просто через специально обученный клиентский класс в один присест получали на сервере данные из клиентского файла в виде опять же контейнера и дальше уже парсили их на сервере, но без интерактива в диалоге выбора файла.
Разумеется, в AX2012 появляются свои заморочки с вызовом клиентского кода, инициированным с сервера, но вроде все решается при желании. А предложенный подход с кастомизированной формочкой - это вроде как раз то, что приходится делать в D365O для импортов из Excel: брать клиентский файл, передавать его во временный каталог на АОСе и там уже с ним работать.