--- code: DOC-221277 title: "\"Шахматка\"" --- # "Шахматка" Шахматка - визуальный инструмент выявления расхождений во взаимных расчетах между компаниями периметра по данным ОСВ. Работает только с оборотно-сальдовыми ведомостями (ОСВ). Сама шахматка ничего не исключает и не меняет данные; правки и исключение выполняются дальше - в таблице корректировок. Пример шахматки: | ДБ / КТ | Русский Бисквит | Пекарня | Организация 3 | Организация 4 | Организация N | Итого | | --- | --- | --- | --- | --- | --- | --- | | Русский Бисквит | | 5000,00 6000,00 (1000) | | | | | | Пекарня | | | | | | | | Организация 3 | | | | | | | | Организация 4 | | | 20000 21000 (1000) | | | | | Организация N | | | | | | | | Итого | | | | | | | Оси матрицы: * Строка - компания A, **osv\_entry.legal\_entity\_id**. * Столбец - компания B, встречный контрагент **osv\_entry.counterparty\_id**. * Строки и столбцы формируются из одного набора **consolidation\_member** выбранной **consolidation\_version**. * Комбинации, где **company\_a\_id** = **company\_b\_id**, в расчет не включаются и отображаются пустыми. * Для стороны A используется **sum(osv\_entry.closing\_debit)** по выбранным дебетовым счетам. * Для стороны B используется **sum(osv\_entry.closing\_credit)** по выбранным кредитовым счетам. Настройки шахматки по-умолчанию: * Расчет выполняется для выбранного **consolidation\_version\_id**. * В матрицу включаются только компании из **consolidation\_member** выбранной версии. * В расчет включаются только строки, где **osv\_entry.counterparty\_id** заполнен и контрагент входит в тот же периметр ГСК. * Используются только строки актуального распознавания файла ОСВ. * Используются файлы ОСВ за год и квартал выбранной консолидации. * Пользователь может выбрать один или несколько дебетовых счетов и один или несколько кредитовых счетов из **chart\_of\_account**. * В расчет шахматки включаются только расчетные строки ОСВ, относящиеся к контрагентам. Итоговые строки счетов, подразделений, договоров и других уровней детализации ОСВ в расчет не включаются. Чтение шахматки: * **amount\_a = sum(closing\_debit)** компании A по выбранным дебетовым счетам, где **counterparty\_id = company\_b\***. * **amount\_b = sum(closing\_credit)** компании B по выбранным кредитовым счетам, где **counterparty\_id = company\_a\***. * **variance\_amount** - разница между дебетовыми счетами компании А и кредитовыми счетами компании Б. * **variance\_percent** - процентное соотношение разницы между счетами компании А и компании Б. * Ячейки с **variance\_percent > 5** визуально выделяются. Источник данных: | **Таблица** | **Поле таблицы** | **Описание поля** | **SQL-запрос** | | --- | --- | --- | --- | | consolidation | year | Отчетный год | SELECT c.year, c.quarter FROM consolidation\_version cv JOIN consolidation c ON c.id = cv.consolidation\_id WHERE cv.id = consolidation\_version\_id\*; | | consolidation | quarter | Отчетный квартал | | consolidation\_member | legal\_entity\_id | Организация, включенная в периметр выбранной версии консолидации | SELECT cm.legal\_entity\_id, le.name, FROM consolidation\_member cm JOIN legal\_entity le ON le.id = cm.legal\_entity\_id WHERE cm.consolidation\_version\_id = consolidation\_version\_id\*; | | legal\_entity | name | Наименование организации | | stored\_file | id | Идентификатор файла ОСВ | SELECT id, legal\_entity\_id, period\_year, period\_quarter FROM stored\_file WHERE legal\_entity\_id = legal\_entity\_id\* AND document\_type = 'ОСВ' AND period\_year = period\_year\* AND period\_quarter = period\_quarter\*; | | stored\_file | legal\_entity\_id | Организация, которой принадлежит загруженный файл ОСВ | | stored\_file | period\_year | Год, за который загружена ОСВ | | stored\_file | period\_quarter | Квартал, за который загружена ОСВ | | osv\_entry | id | Идентификатор строки ОСВ | SELECT id, stored\_file\_id, recognition\_job\_id, legal\_entity\_id, counterparty\_id, group\_schema\_id, account\_id, account\_code, data\_type, closing\_debit, closing\_credit FROM osv\_entry WHERE legal\_entity\_id = legal\_entity\_id\* AND counterparty\_id = legal\_entity\_id\*; | | osv\_entry | stored\_file\_id | Идентификатор исходного файла ОСВ, из которого получена строка | | osv\_entry | recognition\_job\_id | Идентификатор распознавания, в рамках которого сформирована строка ОСВ | | osv\_entry | legal\_entity\_id | Организация-владелец ОСВ. Определяет компанию, данные которой используются при расчете | | osv\_entry | counterparty\_id | Сопоставленный контрагент строки ОСВ. Учитываются только контрагенты, входящие в текущий периметр консолидации | | osv\_entry | group\_schema\_id | Тип строки ОСВ. Для расчета шахматки используются только строки **COUNTERPARTY** | | osv\_entry | account\_id | Идентификатор счета строки ОСВ | | osv\_entry | account\_code | Код счета в исходной строке ОСВ | | osv\_entry | data\_type | Тип данных строки ОСВ. Для шахматки используются BU и SUM. CURRENCY и QUANTITY в денежный расчет не включаются. | | osv\_entry | closing\_debit | Конечное дебетовое сальдо строки ОСВ. Используется для дебетовой стороны шахматки | | osv\_entry | closing\_credit | Конечное кредитовое сальдо строки ОСВ | | chart\_of\_account | id | Идентификатор счета плана счетов | SELECT id, code, name, kind FROM chart\_of\_account WHERE id = account\_id\* AND row\_type IN ('row', 'subaccount'); | | chart\_of\_account | code | Нормализованный код счета или субсчета. Используется для определения счетов, участвующих в расчете шахматки и результирующей таблицы | | chart\_of\_account | name | Наименование счета или субсчета | | chart\_of\_account | kind | Тип счета. A и AP используются для дебетовой стороны, P и AP для кредитовой стороны | Алгоритм расчета: 1. Выбор счетов для формирования Для построения матрицы используется заданный набор дебетовых и кредитовых счетов из **chart\_of\_account**. В расчетный запрос передаются идентификаторы счетов двумя параметрами: **chart\_of\_account.kind in (A, AP)** для расчета **closing\_debit** стороны А и **chart\_of\_account.kind in (P, AP)** для расчета **closing\_credit** стороны Б. ``` SELECT id, code FROM chart_of_account WHERE kind in (A, AP) or kind in (P, AP) -- зависит от выбранной стороны, дебетовой и кредитовой ; ``` 2. Версия и периметр Расчет шахматки выполняется для выбранной **consolidation\_version**. Из **consolidation\_member** выбираются все юридические лица, входящие в данную версию консолидации. Полученный список используется одновременно для формирования строк и столбцов матрицы. Для расчета создаются все возможные пары компаний внутри периметра, кроме пар, где компания совпадает сама с собой. 3. Отбор строк ОСВ 1. Для расчета шахматки необходимо сформировать набор строк ОСВ для организаций, входящих в выбранную версию консолидации. 2. По **consolidation\_version\_id** определяется связанная запись **consolidation** и отчетный период **year** и **quarter**. 3. Из **stored\_file** выбираются файлы с **document\_type = 'ОСВ'**, у которых **period\_year** и **period\_quarter** соответствуют периоду текущей консолидации. 4. Для каждого выбранного файла используются только строки **osv\_entry**, относящиеся к актуальному прогону распознавания. Актуальным считается прогон, идентификатор которого указан в **stored\_file.current\_recognition\_job\_id**. Строки предыдущих прогонов распознавания в расчет не включаются. 5. Компания, которой принадлежит строка ОСВ, определяется по **osv\_entry.legal\_entity\_id**. В расчет включаются только строки компаний, присутствующих в **consolidation\_member** выбранной **consolidation\_version**. 6. Контрагент строки определяется по **osv\_entry.counterparty\_id**. Строка участвует в шахматке только если **counterparty\_id** заполнен и организация также входит в **consolidation\_member** текущей версии консолидации. 7. Строки, в которых **legal\_entity\_id = counterparty\_id**, исключаются из расчета, поскольку взаимные расчеты компании с самой собой в шахматке не отображаются. 8. Для каждой строки должен быть определен **osv\_entry.account\_id**. По нему выполняется соединение с **chart\_of\_account**. Строки без определенного **account\_id** в расчет шахматки не включаются. 9. Для каждой строки по **osv\_entry.group\_schema\_id** определяется связанная запись **osv\_group\_schema**. В расчет шахматки включаются только строки, для которых **osv\_group\_schema.group\_type = 'COUNTERPARTY'**. 10. Для денежных расчетов учитывается тип данных строки **osv\_entry.data\_type**. В расчет включаются строки со значениями **BU** и **SUM.** 4. Расчет стороны А Сторона А показывает, какую сумму компания А отражает по выбранным дебетовым счетам в отношении компании Б. Если по одной и той же паре компаний и одному счету в ОСВ присутствует несколько строк, их значения необходимо сложить. Если подходящих строк нет, значение стороны А принимается равным 0. * Для каждой пары компаний система берет строки **osv\_entry**, где **legal\_entity\_id** соответствует компании А, а **counterparty\_id** соответствует компании Б. * Из отобранных строк учитываются только счета, входящие в выбранный набор дебетовых счетов (A, AP) для текущего представления шахматки. * По всем подходящим строкам суммируется значение **closing\_debit**. ``` SELECT SUM(oe.closing_debit) FROM osv_entry oe JOIN chart_of_account coa ON coa.id = oe.account_id JOIN osv_group_schema ogs ON ogs.id = oe.group_schema_id WHERE oe.legal_entity_id = company_a* AND oe.counterparty_id = company_b* AND coa.kind in ('A', 'AP') AND ogs.group_type = 'COUNTERPARTY' AND oe.data_type IN ('BU', 'SUM'); ``` 5. Расчет стороны Б Сторона Б показывает, какую сумму компания Б отражает по выбранным кредитовым счетам в отношении компании А. Если по одной и той же паре компаний и одному счету в ОСВ присутствует несколько строк, их значения необходимо сложить. Если подходящих строк нет, значение стороны Б принимается равным 0. + Для каждой пары компаний система берет строки **osv\_entry**, где **legal\_entity\_id** соответствует компании Б, а **counterparty\_id** соответствует компании А. + Из отобранных строк учитываются только счета, входящие в выбранный набор кредитовых счетов (P, AP) для текущего представления шахматки. + По всем подходящим строкам суммируется значение **closing\_credit**. ``` SELECT SUM(oe.closing_credit) FROM osv_entry oe JOIN chart_of_account coa ON coa.id = oe.account_id JOIN osv_grouping_schema ogs ON ogs.id = oe.grouping_schema_id WHERE oe.legal_entity_id = company_b* AND oe.counterparty_id = company_a* AND coa.kind in ('P', 'AP') AND ogs.group_type = 'COUNTERPARTY' AND oe.data_type IN ('BU', 'SUM'); ``` 6. Расчет расхождений После того как для каждой пары компаний рассчитаны значения стороны А и стороны Б, система сравнивает эти суммы между собой. Рассчитывается абсолютное расхождение между двумя суммами. Для этого из суммы стороны А вычитается сумма стороны Б, после чего берется абсолютное значение результата. Таким образом, расхождение всегда отображается положительным числом независимо от того, у какой компании сумма больше. Процент определяется по меньшей из двух сравниваемых сумм. Для расчета абсолютное расхождение делится на меньшее из значений **amount\_a** и **amount\_b**, после чего результат умножается на 100. ``` amount_a = 5000 amount_b = 6000 variance_amount = 1000 variance_percent = variance_amount / min(amount_a, amount_b) * 100 ``` # Результирующая таблица Результирующая таблица - сводка внутригрупповых оборотов (ВГО) по группе, разложенная на балансовые статьи. Показывает, сколько каждая компания периметра держит в ВГО по каждой статье и сколько это суммарно по группе. В отличие от шахматки , результирующая таблица показывает компанию против группы - суммарную позицию компании по всем внутригрупповым контрагентам. Пример: | Статья | Русский Бисквит | Пекарня | Организация 3 | Организация 4 | Итого по группе | | --- | --- | --- | --- | --- | --- | | Дебиторская задолженность | 695 980 | 101 043 | 15 822 | 38 365 | 851 210 | | Кредиторская задолженность | 35 066 | 239 861 | 19 231 | 207 040 | 501 198 | | Фин вложения | - | - | 226 218 | 9 000 | 235 218 | | Долгосрочные кредиты и займы | | | | | - | | Краткосрочные кредиты и займы | - | 125 739 | 159 018 | 97 403 | 382 160 | Оси результирующей таблицы: * Строка - статья ВГО (дебиторская задолженность, кредиторская задолженность, финансовые вложения, долгосрочные кредиты и займы, краткосрочные кредиты и займы); * Столбец - компания периметра; * Ячейка - сумма ВГО у компании по счетам статьи в разрезе всех остальных компаний периметра. Счета компании: | Статья | Сторона | Расчетное поле | Счета компании | | --- | --- | --- | --- | | Дебиторская задолженность | A, AP | closing\_debit | Д60.02, 60.22, 60.32, 62.01, 62.03, 62.21, 62.31, 76 (кроме 76.7.5, 76.7.9), Д76 | | Кредиторская задолженность | P, AP | closing\_credit | К60.01, 60.03, 60.21, 60.31, 62.02, 62.22, 62.32, 76 (кроме 76.7.1) | | Фин вложения | A, AP | closing\_debit | Д58.01, Д58.03 | | Долгосрочные кредиты и займы | P, AP | closing\_credit | К67, К67.03 | | Краткосрочные кредиты и займы | P, AP | closing\_credit | К66, К66.03, К66.04 | Алгоритм расчета: 1. Отбор строк компании за квартал Для каждой компании, входящей в **consolidation\_member** выбранной **consolidation\_version**, отбираются строки **osv\_entry**, в которых учитываются следующие правила: * **osv\_entry.legal\_entity\_id** соответствует рассчитываемой компании; * **osv\_entry.counterparty\_id** заполнен; * **osv\_entry.counterparty\_id** входит в **consolidation\_member** той же версии консолидации; * **osv\_entry.legal\_entity\_id** != **osv\_entry.counterparty\_id**; * **osv\_entry.account\_id** заполнен. * **osv\_entry.group\_schema\_id** должен ссылаться на **osv\_group\_schema** с **group\_type = 'COUNTERPARTY'.** * **osv\_entry.data\_type** IN ('BU', 'SUM'). 2. Присоединение плана счетов Для каждой отобранной строки по **osv\_entry.account\_id** определяется соответствующая запись **chart\_of\_account**. Из **chart\_of\_account** используется **code** (для определения счета или субсчета). 3. Выборка стороны и суммирование Для каждой статьи заранее определяется сторона расчета. Для статей со стороной A, AP используется **osv\_entry.closing\_debit**. Для статей со стороной P, AP используется **osv\_entry.closing\_credit**. После определения статьи и стороны все подходящие строки одной компании суммируются. В результате для каждой компании и каждой статьи должно быть получено одно итоговое значение. ``` SELECT SUM( CASE WHEN coa.kind IN ('A', 'AP') THEN oe.closing_debit WHEN coa.kind IN ('P', 'AP') THEN oe.closing_credit END) FROM osv_entry oe JOIN chart_of_account coa ON coa.id = oe.account_id ``` 4. Расчет итога по группе Для каждой статьи дополнительно может рассчитываться колонка "Итого по группе". Значение определяется как: **SUM(article\_amount)** по всем компаниям, входящим в текущий **consolidation\_member**.