Работа со справочниками
В системе используются 3 базы данных.
Основание системы - SQL база, которая хранит в себе значения ячеек и их историю. Работа с базой данных происходит через интерфейс хранимых процедур, а не на прямую.
Mongo - хранит в себе описание всех моделей и их взаимосвязей. На Mongo реализованы механизмы работы в режиме SandBox - когда пользовательские изменения изолируются друг от друга. В Mongo нет информации о данных из таблицы [Core].[Cells]
Redis - способ кэширования данных - используется для оптимизации
Для калькулятора реализовано несколько вспомогательных классов, для получения информации из справочников. Все эти классы понаследованы от базового Base.js и расположены в папке ./classes/calculator/helpers. Классы работают с Mongo базой и кэшируют результаты своей деятельности в Redis
Функционал базового класса - получение из кэша и сохранение в кэш плюс своя функция запросов к Mongo - query, которая является оберткой над обычным запросом find, но в зависимости от контекста документа подключает или нет режим работы в песочнице.
Документ (Doc.js)
Класс предназначен для получения следующей информации:
Основные поля документа
Если документ рассчитан на работу с дочерними объектами учета - мы получим информацию о возможных объектах учета для данного документа
Информация о том кто этот документ подписывает
Подробнее о некоторых полях:
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, то суммовые метки применяются к списку продукции), тэгах и информация о форматировании значений.
Корневые узлы (DocRow.js)
Этот класс используется только для того, чтобы по любому коду ряда можно было получить название его основного документа. Так как один и тот же ряд может быть подключен в качестве корневого ряда к нескольким документам, при этом, на данный момент, он не имеет явного признака - какой из документов главный - то решение задачи становится не очевидным.
Сейчас используется следующий алгоритм поиска документа:
Предпочтение отдается документам без IsOlap IsChart IsPresent
IsExpandTree у ссылки true - предпочтительней
Для документов не на корневых объектах учета core.Docs.HasChildObjs=0
Количество корневых узлов - выбирается документ с наименьшим числом корневых узлов в таблице link.DocRows
Длина кода документа - выбирается документ с наименьшей длиной кода в поле core.Docs.CodeDoc
Для документов на дочерних объектах учета core.Docs.HasChildObjs=1
Определяется тип или класс объекта учета из контекста
В таблице link.DocObjs фильтруется перечень документов, из которых нужный определяется по типу или классу.
Если все параметры сошлись, но осталось несколько документов, то выбирается документ с более коротким кодом core.Docs.CodeDoc
При обращении к классу вы получите хэш таблицу, для вычисления кодов документов
Объект учета (Div.js)
Получение информации по объектам учета. Полная информация распределена по следующим таблицам:
Модель
Поля
obj
CodeObjType, CodeOrg, CodeParentObj
org
CodeDiv, CodeOtrasl, CodeCity
city
CodeRegion
objtype
CodeObjClass
objtag
информация о Тэгах
Обращаясь к этому классу вы получаете собранную полную информацию обо всех объектах учета плюс информацию по иерархии RootObj, CodeParentObj, Children, AllChildren :
Период (Period.js)
В системе есть следующие типы периодов
Обычные (расчетные) все остальные типы так или иначе приводятся к ним
Формульные периоды (начинаются со знака "-"). Содержат хэш таблицу преобразования периода из контекста в расчетный период. Если в качестве значения используются массивы, то расчетчик суммирует входящие в массив периоды.
Кроме информации о периодах класс отдает информацию о том, какое название периода использовать после формульных преобразований (позднее эта информация используется в получении колонок документа). Эта информация хранится в хэш таблице DisplayNames.
Last updated
Was this helpful?