Работа со справочниками

В системе используются 3 базы данных.

  1. Основание системы - SQL база, которая хранит в себе значения ячеек и их историю. Работа с базой данных происходит через интерфейс хранимых процедур, а не на прямую.

  2. Mongo - хранит в себе описание всех моделей и их взаимосвязей. На Mongo реализованы механизмы работы в режиме SandBox - когда пользовательские изменения изолируются друг от друга. В Mongo нет информации о данных из таблицы [Core].[Cells]

  3. Redis - способ кэширования данных - используется для оптимизации

Для калькулятора реализовано несколько вспомогательных классов, для получения информации из справочников. Все эти классы понаследованы от базового Base.js и расположены в папке ./classes/calculator/helpers. Классы работают с Mongo базой и кэшируют результаты своей деятельности в Redis

Функционал базового класса - получение из кэша и сохранение в кэш плюс своя функция запросов к Mongo - query, которая является оберткой над обычным запросом find, но в зависимости от контекста документа подключает или нет режим работы в песочнице.

module.exports = function(Context){

    var self = this;

    self.Context = _.clone(Context);

    self.query = function(modelName,query,fields){}

    self.cacheKey = function(){}

    self.loadFromCache = function(done){}

    self.saveToCache = function(Result,done){}
}

Документ (Doc.js)

Класс предназначен для получения следующей информации:

  1. Основные поля документа

  2. Если документ рассчитан на работу с дочерними объектами учета - мы получим информацию о возможных объектах учета для данного документа

  3. Информация о том кто этот документ подписывает

Подробнее о некоторых полях:

  • IsShowRoots - Отображать прикрепленные строки полностью или только их дочерние строки

  • IsActiveCondition - Доступна или нет панель настроек в режиме ввода

  • IsOlap IsChart IsPresent IsInput - Доступны или нет режимы OLAP, График, Презентация, Форма ввода

  • Для режима HasChildObjs = true - (документ работает на дочерних объектах учета) доступны дополнительные настройки:

  • Link_docobjtype - фильтрация дочерних объектов учета для документа

  • IsDivObj - отображать дочерние объекты отдельным выбором или склеить ряды для всех объектов учета

  • IsObjToRow - режим похожий на OLAP отчет - когда вместо рядов отображаются дочерние объекты учета

  • IsShowParentObj - дополнительная настройка для IsObjToRow - когда дочерние объекты отображаются вместе с родительскими в структуре "дерево"

Ряд (Row.js)

Получение рядов, отображаемых в таблицах. Для получения структуры берется информация из ссылок RowDoc (привязанные к документу корневые узлы) с учетом IsExpandTree (показывать только 1 строку или все дочерние узлы) При работе с OLAP документом IsExpandTree не учитывается и всегда считается false; В зависимости от параметра документа IsShowRoots корневые узлы будут отображаться или будут отображаться только их дочерние ряды

В зависимости от года передаваемого в запрос могут произойти следующие изменения: Ряд может быть исключен на основании значений полей FromObsolete и FromYear Ряд может изменить свой флажок IsFormula в зависимости от полей FormulaFromObsolete и FormulaFromYear

При тонкой фильтрации рядов используются следующие параметры: NoFiltered - строка (включая всю цепочку родительских узлов) всегда показывается HasFilteredChild - для всех дочерних строк применяется фильтрация на основании модели ObjGrp - в которой может быть установлена связь между рядом и объектом учета (или группой объектов или типом объектов)

Конструкции, когда по дереву происходит установка флага фильтрации HasFilteredChild->NoFiltered->HasFilteredChild приводят к ошибке.

Кроме этого для каждого ряда заполняется информация о его суммовых группах (если установленн флаг UseProdSumGrps, то суммовые метки применяются к списку продукции), тэгах и информация о форматировании значений.

Для рядов подключен механизм работы с деревьями Nested Sets подробнее можно почитатьздесь

Корневые узлы (DocRow.js)

Этот класс используется только для того, чтобы по любому коду ряда можно было получить название его основного документа. Так как один и тот же ряд может быть подключен в качестве корневого ряда к нескольким документам, при этом, на данный момент, он не имеет явного признака - какой из документов главный - то решение задачи становится не очевидным.

Сейчас используется следующий алгоритм поиска документа:

  1. Предпочтение отдается документам без IsOlap IsChart IsPresent

  2. IsExpandTree у ссылки true - предпочтительней

  3. Для документов не на корневых объектах учета core.Docs.HasChildObjs=0

    1. Количество корневых узлов - выбирается документ с наименьшим числом корневых узлов в таблице link.DocRows

    2. Длина кода документа - выбирается документ с наименьшей длиной кода в поле core.Docs.CodeDoc

  4. Для документов на дочерних объектах учета core.Docs.HasChildObjs=1

    1. Определяется тип или класс объекта учета из контекста

    2. В таблице link.DocObjs фильтруется перечень документов, из которых нужный определяется по типу или классу.

    3. Если все параметры сошлись, но осталось несколько документов, то выбирается документ с более коротким кодом core.Docs.CodeDoc

При обращении к классу вы получите хэш таблицу, для вычисления кодов документов

Объект учета (Div.js)

Получение информации по объектам учета. Полная информация распределена по следующим таблицам:

Модель

Поля

obj

CodeObjType, CodeOrg, CodeParentObj

org

CodeDiv, CodeOtrasl, CodeCity

city

CodeRegion

objtype

CodeObjClass

objtag

информация о Тэгах

Обращаясь к этому классу вы получаете собранную полную информацию обо всех объектах учета плюс информацию по иерархии RootObj, CodeParentObj, Children, AllChildren :

Период (Period.js)

В системе есть следующие типы периодов

  1. Обычные (расчетные) все остальные типы так или иначе приводятся к ним

  1. Формульные периоды (начинаются со знака "-"). Содержат хэш таблицу преобразования периода из контекста в расчетный период. Если в качестве значения используются массивы, то расчетчик суммирует входящие в массив периоды.

Кроме информации о периодах класс отдает информацию о том, какое название периода использовать после формульных преобразований (позднее эта информация используется в получении колонок документа). Эта информация хранится в хэш таблице DisplayNames.

Last updated

Was this helpful?