Маппинг в 1с что это

Обновлено: 06.07.2024

Иногда возникают ситуации, когда решение задачи выборки данных из реляционной БД не укладывается в возможности используемой в проекте ОРМ, например, либо из-за недостаточной скорости работы самой ОРМ, либо не совсем оптимальных SQL запросов генерируемых ею. В таком случае обычно приходится писать запросы вручную.

Проблема в том, что данные из БД (в т.ч. в ответ на JOIN запрос) возвращаются в виде “плоского” двухмерного массива никак не отражающего сложную “древовидную” структуру данных приложения. Работать с таким массивом дальше крайне неудобно, поэтому требуется более-менее универсальное решение, позволяющее привести этот массив в более подходящий вид по заданному шаблону.

Решение было найдено, удобное и достаточно быстрое.

На сколько быстрое

Для оценки скорости работы библиотеки я собрал небольшой испытательный стенд на котором скорость работы моей библиотеки сравнивается со скоростью работы Eloquent. Для замеров использовался пакет phpbench.

Для того чтобы развернуть стенд у себя:


Здесь я использовал инструмент описанный в моей предыдущей статье.

Затем в меню выбираем: 1 Develop, затем: 1 Build, затем 2 Deploy and Up;
Затем запускаем тесты 5. Run tests

В базе 3000 книг. Результаты получились следующие:


benchEloquent — вытаскивает все книги с авторами с использованием Eloquent
benchEloquentId — вытаскивает определенную книгу с авторами с использованием Eloquent (10 раз)

benchProc — вытаскивает все книги с авторами с использованием библиотеки
benchProcId — вытаскивает определенную книгу с авторами с использованием библиотеки (10 раз)

Возможно приведенные тесты недостаточно репрезентативны, но разница заметна, как по времени выполнения, так и по расходованию памяти.

Как это работает


Далее, для примера (крайне простого), представим, что у нас имеется БД книг и авторов со следующей структурой.

image

Задача — вытащить все книги с их авторами.

Запрос будет выглядеть как-то так:


В ответ мы получим примерно такой массив данных.

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 раз)

Возможно приведенные тесты недостаточно репрезентативны, но разница заметна, как по времени выполнения, так и по расходованию памяти.

Как это работает


Далее, для примера (крайне простого), представим, что у нас имеется БД книг и авторов со следующей структурой.

image

Задача — вытащить все книги с их авторами.

Запрос будет выглядеть как-то так:


В ответ мы получим примерно такой массив данных.

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, заполненный соответствующими данными.

Читайте также: