Общая логика работы всех оборотно-сальдовых ведомостей в Ax2009 выглядит примерно так
К пункту меню привязана форма RLedgerSheet
В событии init формы RLedgerSheet создается экземпляр класса наследника от RLedgerSheetEngine, который открывает диалог с пользователем для установки ряда настроек и фильтров для последующего расчета.
После установки настроек пользователем, если была нажата кнопка «Ок», то выполняется ряд расчетов в этом же классе. А, кроме того, создается и запускается экземпляр класса наследника от RLedgerSheetServer, который формирует и хранит список записей по документам-источникам и суммовые показатели по этим документам.
X++:
// init формы RLedgerSheet
// Создается класс-наследник от RLedgerSheetEngine
rLedgerSheetEngine = RLedgerSheetEngine::construct(element.args());
super();
// Диалог с пользователем
if (! rLedgerSheetEngine.prompt())
{
// Если нажади "Отмена", то закрываем форму
this.close();
return;
}
// Передаем в класс ссылку на объект ListView на форме
rLedgerSheetEngine.parmFormListControl(turnoverAmount);
// Собственно выполнение расчета
rLedgerSheetEngine.run();
Метод construct() вызывает метод new(), в котором выполняется
X++:
this.initFieldsData();
this.initValuesData();
this.initFieldsData() - это ручное наполнение filedMap – список полей для промежуточных итогов и сортировки. Это набор формируемый из левого списка в диалоге с пользователем
this.initValuesData() – это метод, в котором можно инициализировать переменные. Как правило, не используется. Предполагается, что по умолчанию все переменные пустые, а пользователь их заполняет, если необходимо
Метод run() перекрыт в классе наследнике RLedgerSheetClient. Если убрать «обвязку», то имеем следующее
X++:
this.initAccounts(); // Инициализация
this.createRLedgerSheetServer(); // Создание экземпляра класса RLedgerSheetServer для расчета
this.executeRLedgerSheetServer(); // Собственно расчет
this.getDataFromServer(); // перекачка данных из расчетного класса в текущий
this.initListView(); // Формирование столбцов объекта формы ListView
this.fetchNextRows(); // Заполнение строк объекта формы ListView
this.setItem(); // включение/выключение ряда объектов и установка фокуса
Если объединить методы this.createRLedgerSheetServer() и this.executeRLedgerSheetServer(), то получим примерно такой код
X++:
rLedgerSheetServer = RLedgerSheetServer::construct(this.parmRLedgerSheetType());
rLedgerSheetServer.initParameters(this.queryRun(), this.getParmContainer());
rLedgerSheetServer.run(this.initRunQuery());
rLedgerSheetType – это Base Enum, значение которого передается через args.parmEnum() в методе
this.queryRun() – настроенный пользователем QueryRun
this.initRunQuery() – если не перекрыт, то queryRun.query()
RLedgerSheetEngine::Construct(args). Определяет, какие именно классы-наследники от RLedgerSheetEngine и RLedgerSheetServer будут созданы.
this.getParmContainer() – контейнер, содержащий список переменных с настройками пользователя
X++:
return [ currencyType, //Тип валюты, в которой выполнять расчет (основная, вторичная, указанная)
deleteZero, //Из диапазона расчета исключить даты, не имеющие ни одной заявки на оплату
showSumAccount, //Отображать строки с итоговыми суммами
dimensionCriteria, //Финансовые аналитики
fromDate, //Начальная дата диапазона
toDate, //Конечная дата диапазона
operationsTax, //По какому уровню рассчитывать бухгалтерское сальдо (Base Enum)
currencyCode, //Код валюты, в которой выполнять расчет, если currencyType = указанная
selectedFieldsOrder //Выбранные поля сортировки (поставщик, договор, счет ГК)
];