Маппинг в 1с что это
Иногда возникают ситуации, когда решение задачи выборки данных из реляционной БД не укладывается в возможности используемой в проекте ОРМ, например, либо из-за недостаточной скорости работы самой ОРМ, либо не совсем оптимальных SQL запросов генерируемых ею. В таком случае обычно приходится писать запросы вручную.
Проблема в том, что данные из БД (в т.ч. в ответ на JOIN запрос) возвращаются в виде “плоского” двухмерного массива никак не отражающего сложную “древовидную” структуру данных приложения. Работать с таким массивом дальше крайне неудобно, поэтому требуется более-менее универсальное решение, позволяющее привести этот массив в более подходящий вид по заданному шаблону.
Решение было найдено, удобное и достаточно быстрое.
На сколько быстрое
Для оценки скорости работы библиотеки я собрал небольшой испытательный стенд на котором скорость работы моей библиотеки сравнивается со скоростью работы Eloquent. Для замеров использовался пакет phpbench.
Для того чтобы развернуть стенд у себя:
Здесь я использовал инструмент описанный в моей предыдущей статье.
Затем в меню выбираем: 1 Develop, затем: 1 Build, затем 2 Deploy and Up;
Затем запускаем тесты 5. Run tests
В базе 3000 книг. Результаты получились следующие:
benchEloquent — вытаскивает все книги с авторами с использованием Eloquent
benchEloquentId — вытаскивает определенную книгу с авторами с использованием Eloquent (10 раз)
benchProc — вытаскивает все книги с авторами с использованием библиотеки
benchProcId — вытаскивает определенную книгу с авторами с использованием библиотеки (10 раз)
Возможно приведенные тесты недостаточно репрезентативны, но разница заметна, как по времени выполнения, так и по расходованию памяти.
Как это работает
Далее, для примера (крайне простого), представим, что у нас имеется БД книг и авторов со следующей структурой.
Задача — вытащить все книги с их авторами.
Запрос будет выглядеть как-то так:
В ответ мы получим примерно такой массив данных.
book.id | book.name | author.id | author.name |
1 | book1 | 2 | author2 |
1 | book1 | 4 | author4 |
1 | book1 | 6 | author6 |
2 | book2 | 2 | author2 |
2 | book2 | 3 | author3 |
2 | book2 | 6 | author6 |
2 | book2 | 7 | author7 |
Для этого немного изменим наш запрос:
Здесь мы в секции SELECT задали алиасы: для полей с данными о книгах алиасы с префиксом 'book_', а для полей с информацией об авторах с префиксом 'author'.
Далее преобразуем ответ БД
$rows — ответ БД в виде массива объектов /stdClass()
$config — ассоциативный массив отражающий структуру данных итогового массива
В итоге в $booksData имеем древовидный массив имеющий структуру, описанную в $config, заполненный соответствующими данными.
Большинство клиентов assino — международные компании. Более 20 лет мы помогаем бухгалтерам готовить отчетность по двум стандартам: РСБУ и МСФО. Это два больших финансовых отчета, к каждому из них принципиально разные требования: от валюты до срока подачи. Два отчета — два трудозатратных процесса, много ошибок и бюрократии. Эксперты assino более 20 лет настраивают мэппинг в международных компаниях и разработали собственное решение ATiP: IFRS & GAAP для того, чтобы готовить два отчета в один клик.
Как спастись от бюрократии и начать жить
Неконсолидированные данные — причина срыва сроков, ошибок и двойной работы по двум формам одного отчета. Проблемы с документами завершают каждый отчетный год. Бухгалтерия работает сверхурочно, так как сроки сдачи отчетности зарубежных партнеров часто выпадают на российские праздники. Человеческий фактор влияет на качество документов, — ошибки прокрадываются в отчеты и искажают данные.
Избавить бухгалтерию от двойной работы и сократить трудозатраты можно с помощью мэппинга. Одни и те же данные в информационной системе автоматически сформируются в два разных документа. Главное — создать связь между учетными данными и полями в формах отчетности.
Как настроить мэппинг
Мэппинг удобно настраивать в ERP-системе, в которой заложены базовые принципы для обмена данными. Для международных компаний подсистема МСФО в ERP — основной инструмент для отчетности перед головным офисом или инвесторами. Настройка правил обмена между РСБУ и МСФО — тонкая и сложная работа. Нужны обширная практика и экспертные знания, чтобы мэппинг, удобный инструмент, работал без ошибок.
Важно досконально знать законодательство и финансовый учет страны, в которой работает компания. assino более 20 лет специализируется на конвертации отчетности, — мэппинге. Мы разработали собственное решение — ATiP: IFRS & GAAP. Разработка позволяет индивидуально адаптировать вторичные устанавливаемые планы счетов и вести бухгалтерские записи по международным стандартам бухгалтерского учета IAS / IFRS и US GAAP.
Наш опыт показывает, что только грамотная настройка мэппинга избавляет бухгалтерию от двойной работы и помогает руководству не опаздывать с отчетностью.
Для начала представлюсь. Меня зовут Николай Шилкин, и я более 20-ти лет занимаюсь автоматизацией учета по МСФО. Прошёл путь от самой первой бухгалтерской программы под Windows, поддерживавшей МСФО, до самых последних флагманских продуктов фирмы 1С. В багаже — более 30 проектов в транснациональных корпорациях.
Ну, а теперь, собственно, по теме.
Незадолго до Нового (2020-го) года меня пригласили в одну горнорудную Группу компаний проконсультировать их по теме, как на 1С автоматизировать консолидацию по МСФО. Как оказалось, причиной озабоченности стала рекомендация одной из компаний «Большой Четверки» о том, что пора переходить с метода трансформации отчетности по российским стандартам бухгалтерского учета (РСБУ) в отчетность по международным стандартам финансовой отчетности (МСФО) на метод параллельного ведения учета РСБУ + МСФО.
Я рассказал финансистам, какие подводные камни их могут ожидать на этом, весьма непростом, пути. После того, как рассказ был оформлен в виде протокола, я понял, что он будет полезен всем тем, у кого возникают аналогичные задачи вне зависимости от того, какое именно программное обеспечение на платформе 1С они используют.
Прежде, чем выдавать какие-то рекомендации, хочу дать дефиницию термина «параллельный учет». Я впервые его услышал от аудиторов, когда «Большая Четвёрка» ещё была «Большой Шестёркой», т.е. более 20-ти лет назад. Суть метода заключается в том, что локальный страновый учет и корпоративный учет по международным стандартам ведётся «параллельно», т.е. каждая хозяйственная операция отражается в двух бухгалтерских книгах: национальной и корпоративной. Для России это будут регистры РСБУ и МСФО. Но всё дело в том, что полный параллелизм РСБУ и МСФО невозможен по той простой причине, что российские стандарты и международные далеко не всегда совпадают. И тогда весь бухгалтерский учет разбивается на 2 части: «параллельную», в которой российские и международные стандарты схожи, и «независимую», в которой стандарты различаются.
Отображение «параллельных» операций настраивается таким образом, что составляется таблица соответствий — мэппинг (от англ. mapping) — между двумя планами счетов: РСБУ и МСФО. Формируемые посредством мэппинга проводки совпадают по датам, суммам, валютам, аналитикам (полностью или частично) и пр. В структуре данных 1С это выглядит таким образом, что один документ делает записи в два регистра бухгалтерии: «Хозрасчетный» и «Международный».
Отображение «независимых» операций в 1С, как правило, происходит различными документами: один документ формирует только проводки РСБУ, а другой документ — только проводки МСФО
Только оговорюсь, что изложение ниже несколько сумбурное (за что прошу прощения у сообщества), т.к., по сути, представляет собою тезисы доклада. Возможно, из них когда-нибудь родится книга или обучающий курс. По крайней мере, запрос на такую информацию «ДСП» на рынке имеется.
Ну, а теперь, после такой вводной части, привожу табличку рекомендаций, которая родилась в результате более, чем двухчасовых переговоров.
Иногда возникают ситуации, когда решение задачи выборки данных из реляционной БД не укладывается в возможности используемой в проекте ОРМ, например, либо из-за недостаточной скорости работы самой ОРМ, либо не совсем оптимальных SQL запросов генерируемых ею. В таком случае обычно приходится писать запросы вручную.
Проблема в том, что данные из БД (в т.ч. в ответ на JOIN запрос) возвращаются в виде “плоского” двухмерного массива никак не отражающего сложную “древовидную” структуру данных приложения. Работать с таким массивом дальше крайне неудобно, поэтому требуется более-менее универсальное решение, позволяющее привести этот массив в более подходящий вид по заданному шаблону.
Решение было найдено, удобное и достаточно быстрое.
На сколько быстрое
Для оценки скорости работы библиотеки я собрал небольшой испытательный стенд на котором скорость работы моей библиотеки сравнивается со скоростью работы Eloquent. Для замеров использовался пакет phpbench.
Для того чтобы развернуть стенд у себя:
Здесь я использовал инструмент описанный в моей предыдущей статье.
Затем в меню выбираем: 1 Develop, затем: 1 Build, затем 2 Deploy and Up;
Затем запускаем тесты 5. Run tests
В базе 3000 книг. Результаты получились следующие:
benchEloquent — вытаскивает все книги с авторами с использованием Eloquent
benchEloquentId — вытаскивает определенную книгу с авторами с использованием Eloquent (10 раз)
benchProc — вытаскивает все книги с авторами с использованием библиотеки
benchProcId — вытаскивает определенную книгу с авторами с использованием библиотеки (10 раз)
Возможно приведенные тесты недостаточно репрезентативны, но разница заметна, как по времени выполнения, так и по расходованию памяти.
Как это работает
Далее, для примера (крайне простого), представим, что у нас имеется БД книг и авторов со следующей структурой.
Задача — вытащить все книги с их авторами.
Запрос будет выглядеть как-то так:
В ответ мы получим примерно такой массив данных.
book.id | book.name | author.id | author.name |
1 | book1 | 2 | author2 |
1 | book1 | 4 | author4 |
1 | book1 | 6 | author6 |
2 | book2 | 2 | author2 |
2 | book2 | 3 | author3 |
2 | book2 | 6 | author6 |
2 | book2 | 7 | author7 |
Для этого немного изменим наш запрос:
Здесь мы в секции SELECT задали алиасы: для полей с данными о книгах алиасы с префиксом 'book_', а для полей с информацией об авторах с префиксом 'author'.
Далее преобразуем ответ БД
$rows — ответ БД в виде массива объектов /stdClass()
$config — ассоциативный массив отражающий структуру данных итогового массива
В итоге в $booksData имеем древовидный массив имеющий структуру, описанную в $config, заполненный соответствующими данными.
Читайте также: