Объединение 5 аккаунтов МойСклад в один
Перенос 87 829 документов и сущностей из 4-х МС аккаунтов в один за ночь!

Дано
У клиента 5 юр. лиц для разных направлений бизнеса. Розница, сайт, филиалы в других городах. Вели учет в разных аккаунтах МойСклад. Решили все объединить. И вести учет в одном основном МС аккаунте.
Подготовка
Заняла порядка недели. Обсуждали нюансы переноса в WhatsApp чате.
При переносе:
- часть данных объединяется: товары, контрагенты, группы товаров
- другая часть создается: заказы, приемки, отгрузки, платежи
Контрагенты объединялись по номеру телефона. Предварительно вычистили те, у которых телефон не заполнен.
Товары объединялись сначала по коду. Затем по наименованию. Оставшиеся создавали в основном аккаунте как новые.
Заказчик был предупрежден:
- Что API МоегоСклада может не работать по ночам
- Что в случае чего, все можно будет откатить назад :)
Тестовый аккаунт
Чтобы проверить как все будет выглядеть, даже создавали тестовый аккаунт. На него переносились данные с основного аккаунта и двух дополнительных. Примерка пришла успешно. Приступили к переносу.
День Х
Выбрали дату переноса — 30 ноября. Время: 22:00. Чтобы в первый день зимы сотрудники начали работать все в одном аккаунте. Можно было и раньше, но черную пятницу решили пережить как есть... Все сотрудники были заранее предупреждены и никто не работал в МС во время переноса.
Этапы переноса
Все действия осуществляли в полуавтоматическом режиме. Использовался API МоегоСклада + мои скрипты + ровные руки + МОЗГ :)
- Скачивание всех данных из МоегоСклада в базу данных MySQL
- Проверка, что в базе данных и в МойСклад одинаковое количество
- Настройка основного аккаунта
- Связывание сущностей
- Создание сущностей
- Создание документов
- Проставление связей между документами
- Проверка переноса

Подробнее опишу каждый этап...
1) Скачивание
В пяти аккаунтах было 257 632 документа и сущности. Скачивание заняло 2 часа. Каждый аккаунт выкачивался в отдельную базу данных.
Скачивание нужно не только для самого переноса, но и как резервная копия. Зафиксировали состояние каждого аккаунта до переноса.
2) Проверка
После скачивания обязательно сверяем количество каждого типа документа/сущности в БД и в МС. Чтобы ничего не упустить.
Также проверка помогает выявить факт изменения количества документов в МойСклад.
3) Настройка
Во всех типах документов, где возможно было проставил галочку

Данные из дополнительных аккаунтов грузились со своим юр. лицом. И эта галочка позволяла сохранить нумерацию документов при переносе.
Также проверил, чтобы все точки продаж были включены. Иначе смены бы не создались
4) Связывание
Пример 1.
В дополнительном аккаунте есть отдел «Основной» id: 1234.
И в основном аккаунте есть отдел «Основной» id: 5678.
Связывание, это сохранение пары id'шников 1234 и 5678.
Пара используется при переносе данных по API.
В документе, который переносится, все упоминания id=1234 заменяются на id=5678.
Пример 2.
В дополнительном аккаунте есть сотрудник «Иванов» id: 777.
И в основном аккаунте есть сотрудник «Дмитрий Иванов» id: 888.
Мы знаем, что это один и тот же человек. Поэтому сохраняем пару: 777 и 888.
В зависимости от типа сущности есть различные варианты связываний.

По имени: отделы, сотрудники, каналы продаж, юридические лица, склады, валюты, статьи расходов, проекты, ед. измерения, страны, скидки, цены продажи, пользовательские справочники
По коду: товары
По ставке: НДС
По типу документа + имя: статусы и доп. поля
По телефону: контрагенты
По справочник + имя: значения из пользовательских справочников
По пути: группы товаров
Вручную: когда оператор знает соответствие между аккаунтами
Для товаров и контрагентов логика связывание может быть более сложной.
5) Создание сущностей
Бывает, что в дополнительном аккаунте есть сущность, которой точно нет в основном аккаунте. В таком случае можно автоматически создать такие сущности в новом аккаунте и сразу же связать.

На этом этапе в основном создаются товары/модификации/услуги/комплекты и контрагенты.
6) Создание документов
После связывания/создания всех сущностей можно приступить к созданию документов.

Загрузка документов проходит по очереди....

В API МоегоСклада имеются ограничения:
- Не более 45 запросов за 3 секундный период от аккаунта
- Не более 5 параллельных запросов от одного пользователя
- Не более 20 параллельных запросов от аккаунта
- Не более 8Кб в заголовке запроса (url, User-Agent, Authorization и т.д.)
- Не более 20 Мб данных в одном запросе, отправляемом на сервер
- Не более 4 асинхронных задач в очереди на аккаунт
Реальность показывает, что с 4 токенами можно закачивать документы в МойСклад в 16 потоков одновременно.
В процессе загрузки могут произойти сбои:
- МойСклад не прислал ответ на запрос
- МойСклад не дает создать документ
Каждый такой сбой обрабатывается в ручном режиме. По итогу, все документы так или иначе «доезжают» до основного аккаунта.
7) Проставление связей
В дополнительном аккаунте есть связь заказа покупателя с отгрузкой.
Но при создании документа, мы не всегда знаем какой id у связанного документа в новом аккаунте. Поэтому документы создаются без связей.
После того, как все документы созданы запускается еще один скрипт, который проставляет связи нужным типам документов.
8) Проверка
После переноса. Можно зайти в раздел Документы и сравнить количество и сумму в основном и дополнительных аккаунтах. И убедится, что все совпадает.

Снизу есть строка, по которой можно проверить.

Нюансы
Пока что скрипты не умеют переносить картинки и файлы.
Но, потребности такой не стояло. Пока этот функционал на подъезде.
Если у документа более 1000 позиций, то переносится в индивидуальном порядке.
При переносе все действия транслировал в чат клиенту. Чтобы потом можно было обсудить тот или иной пункт.
При переносе нашел 20 лишних перемещений. Они были созданы по API в одно время и с одним именем. Такие перемещения не смогли перенестись в основной аккаунт. Уведомил заказчика об инциденте.
Пользовательские печатные формы и скидки переносил руками.
Максимум 10 скидок могут действовать одновременно. Поэтому, при переносе, временно отключал скидки основного аккаунта.
Галочку «Запретить продажу или списание товаров, которых нет на складе» также выключал.
Итоги
Перенос занял 13 часов. Успел как раз к началу рабочего дня.
Затем еще неделю куражились с ограничением прав доступа.
Но разрулили! Перенос прошел успешно!
Спасибо за внимание!
