SAP R/3 и 1С 8.2: строим интеграцию через Web Services для производственного клиента
Интегрируем SAP R/3 и 1С 8.2 для производственника: Web Services, маппинг справочников НСИ, почасовая синхронизация с логированием расхождений вместо ручной сверки.
SAP и 1С-коннекторы через Web Services и COM-объекты - распространённый паттерн интеграции в российских производственных компаниях в 2011 году
Производственный клиент - средний завод, несколько сотен сотрудников. Управленческий учёт и финансы идут в SAP R/3, оперативный склад и закупки - в 1С 8.2. Исторически так сложилось: SAP внедряли давно под давлением немецкого акционера, 1С прилипла потому что дёшево, быстро и бухгалтеры умели. Задача пришла простая по формулировке и не очень простая по исполнению: данные должны ходить между системами автоматически, а не через экселевские выгрузки раз в неделю.
Что именно нужно синхронизировать
Прежде чем вообще думать про технику, потратили время на разбор потоков данных вместе с клиентом. Оказалось, что «данные должны ходить» означает конкретно:
- Номенклатура. Справочник товаров ведётся в SAP как master-система. В 1С должна отражаться актуальная карточка: код, наименование, единица измерения, группа.
- Заказы на производство. Создаются в SAP, статус и факт выполнения обновляются из 1С.
- Остатки на складах. Фактические остатки из 1С нужны SAP для планирования.
Направление данных разное: номенклатура идёт SAP -> 1С, статусы заказов - 1С -> SAP, остатки - тоже 1С -> SAP. Это не симметричный обмен, и это важно для выбора транспорта.
Почему Web Services, а не COM-объекты напрямую
COM-объекты 1С - классический способ обращаться к 1С из внешнего кода. Поднимаешь COM-сервер, вызываешь методы конфигурации, читаешь и пишешь данные. Работает, но есть условие: вызывающая сторона тоже должна быть Windows-процессом. SAP R/3 в нашем случае стоит на AIX. Вариант с COM отпадает физически.
Остаются два реальных пути. Первый - промежуточная база: 1С и SAP пишут в общую таблицу, читают из неё же. Работает, но создаёт третью систему, которую нужно поддерживать, мониторить и которая становится единой точкой отказа. Второй - Web Services с обеих сторон. 1С 8.2 умеет публиковать веб-сервисы через IIS начиная с платформы 8.2, SAP умеет вызывать SOAP-сервисы и публиковать свои через SAP NetWeaver PI или напрямую через RFC-адаптер.
Выбрали Web Services. У клиента NetWeaver PI уже был в инфраструктуре - использовался для другой интеграции. Дополнительного сервера не нужно.
Маппинг справочников: самая болезненная часть
Технический транспорт - это решаемо. Маппинг справочников - это боль.
В SAP материал идентифицируется восемнадцатизначным кодом. В 1С номенклатура имеет свой внутренний GUID и произвольный пользовательский код. Эти коды не совпадают. Исторически в 1С часть позиций создавалась руками, часть переносилась из старой системы учёта с другими кодами. Смысловое соответствие есть, формальное - нет.
Пришлось создавать таблицу соответствий. Вариантов было два:
Первый - автоматическое сопоставление по наименованию. Запускаешь сравнение строк, получаешь кандидатов. Соблазнительно, но опасно: «Болт М8х20» в SAP и «Болт М8 L20 оц.» в 1С - одно и то же, но алгоритм не угадает без человека.
Второй - ручная разметка с инструментом. Выгружаем номенклатуру из обеих систем, строим интерфейс сравнения, ответственный со стороны клиента проставляет соответствия. Долго, но надёжно.
Выбрали второй путь с элементами первого: алгоритм предлагает кандидатов с рейтингом схожести, человек подтверждает или исправляет. Заняло около двух недель на стороне клиента. Пять процентов позиций остались несопоставленными - либо были только в одной системе, либо настолько по-разному названы, что алгоритм уже не помогал. Их вынесли в отдельный список для разбора с технологами.
Расписание и логирование
Синхронизация раз в час. Логика такая: в начале каждого часа на стороне 1С запускается регламентное задание, которое:
- Забирает из SAP изменения по номенклатуре за последний час через SOAP-вызов.
- Применяет изменения в 1С с использованием таблицы соответствий.
- Формирует пакет исходящих данных - статусы заказов и остатки.
- Отправляет пакет в SAP.
- Записывает в журнал: сколько записей получено, сколько применено, что не смогло примениться и почему.
Последний пункт критичен. Без него первые две недели будут потрачены на попытки понять, почему данные не совпадают. Расхождения гарантированно будут - хотя бы потому что единицы измерения в SAP и 1С кодируются по-разному: в SAP «ST» (штука по немецкому стандарту), в 1С «шт.». Это нужно конвертировать, и конвертер нужно проверять на реальных данных.
В журнале пишем по каждой записи: код в SAP, код в 1С, статус (применено / пропущено / ошибка), описание ошибки если есть. Раз в день автоматически формируем отчёт по расхождениям и отправляем ответственным с обеих сторон.
Где сейчас
Интеграция работает вторую неделю в режиме опытной эксплуатации. Параллельно продолжают идти ручные выгрузки - пока не убедимся, что автоматический обмен не пропускает ничего критичного. Расхождения пока есть: около трёх процентов записей в каждом цикле падают с ошибкой из-за проблем с маппингом, которые ещё не устранены. Это нормально для первых двух недель - журнал показывает конкретно что и где, и клиент разбирает список.
Параллельный режим планируем держать минимум месяц. После этого - решение о переводе в промышленную эксплуатацию и отключении ручного процесса.
Интеграция корпоративных систем - это в значительной части про то, чтобы превратить «данные должны ходить» в конкретный список потоков, транспорт, маппинг и журнал расхождений. Каждый из этих пунктов занимает в несколько раз больше времени, чем кажется на этапе оценки.
- 1С:Предприятие 8.2: тонкий клиент работает, веб-клиент - не совсем · 19 июня 2008
- DTS в SSIS: переезжаем вместе с клиентом с SQL Server 2000 на 2005 · 6 декабря 2006