При автоматизации бизнеса часто возникает ситуация, когда типовая конфигурация, например, 1С:Бухгалтерия 3.0, должна оставаться полностью типовой («на замке») для обеспечения беспроблемного обновления. При этом требуется настроить обмен данными с другой, часто нетиповой или самописной конфигурацией. Разберем подробно, как реализовать программную синхронизацию, используя современные инструменты платформы 1С:Предприятие 8.3.
Это наиболее предпочтительный и современный метод. Начиная с версии платформы 8.3.15, функционал расширений позволяет добавлять практически любые объекты метаданных, не затрагивая основную конфигурацию. Проанализируем, как это применить для обмена.
Добавление планов обмена в расширение
Ранее планы обмена нельзя было добавлять в расширения, но теперь это возможно. Мы можем создать собственный план обмена в расширении для 1С:Бухгалтерии. Это позволит нам регистрировать изменения объектов (документов, справочников), которые нужно передать во внешнюю базу (например, в конфигурацию «Аренда»).
HTTP-сервисы и Web-сервисы в расширении
Мы можем создать Web-сервис или HTTP-сервис прямо внутри расширения. Это ключевой момент решения: внешняя система будет обращаться к 1С:Бухгалтерии через этот сервис. Поскольку сервис находится в расширении, основная конфигурация остается нетронутой.
Разберем пример передачи данных через структуру, которую можно сериализовать в строку для передачи через сервис:
// Пример упаковки данных для передачи через сервис
ДанныеДляПередачи = Новый Структура;
ДанныеДляПередачи.Вставить("Номер", Объект.Номер);
ДанныеДляПередачи.Вставить("Дата", Объект.Дата);
ДанныеДляПередачи.Вставить("КонтрагентИНН", Объект.Контрагент.ИНН);
// Сериализация в строку
СтрокаДанных = ЗначениеВСтрокуВнутр(ДанныеДляПередачи);
// Далее отправляем СтрокаДанных через HTTP-запрос или Web-сервис
Рассмотрим вариант, когда мы вообще не хотим вносить изменения даже в расширения 1С:Бухгалтерии. В платформе 1С реализован автоматический REST API через интерфейс OData.
Для реализации этого метода выполним следующие шаги:
Проанализируем преимущество этого способа: он позволяет работать с данными напрямую. Например, чтобы получить список документов из закрытой базы, нам достаточно отправить регламентированный URL-запрос, и 1С вернет данные в формате JSON или XML.
Поскольку 1С:Бухгалтерия 3.0 построена на базе БСП (Библиотеки стандартных подсистем), в ней уже заложен механизм универсального обмена данными в формате EnterpriseData. Рассмотрим, как это использовать:
Выясним причину, по которой этот метод удобен: в Бухгалтерии уже есть готовые обработчики для загрузки/выгрузки данных большинства типовых объектов. Нам достаточно в нетиповой конфигурации («Аренда») реализовать логику формирования XML-пакета по правилам EnterpriseData. При этом на стороне Бухгалтерии мы просто создаем настройку синхронизации через «Другую информационную систему».
Для настройки потребуется:
Если заказчик категорически против любых изменений, включая расширения, мы можем воспользоваться механизмом Дополнительных отчетов и обработок.
Разберем по шагам алгоритм реализации:
1С:Бухгалтерии.Пример кода для подключения через COM-соединение, который можно использовать внутри такой обработки:
ПараметрыПодключения = "Srvr=""ServerName"";Ref=""BaseName"";Usr=""Admin"";Pwd=""123"";";
V83COMConnector = Новый COMОбъект("V83.COMConnector");
Попытка
Соединение = V83COMConnector.Connect(ПараметрыПодключения);
// Теперь мы можем обращаться к объектам другой базы напрямую
НовыйДок = Соединение.Документы.ПоступлениеТоваровУслуг.СоздатьДокумент();
// ... заполнение реквизитов ...
НовыйДок.Записать();
Исключение
Сообщить("Ошибка подключения: " + ОписаниеОшибки());
КонецПопытки;
Если нам нужно передать сложную коллекцию данных (например, таблицу значений с результатами расчета аренды), проанализируем использование объекта ХранилищеЗначения. Это удобно при передаче данных через Web-сервисы.
Посмотрим на пример упаковки данных:
// На стороне отправителя (база Аренда)
ТаблицаДанных = ПолучитьТаблицуАренды(); // Ваша функция получения данных
Хранилище = Новый ХранилищеЗначения(ТаблицаДанных);
ДанныеДляСервиса = Base64Строка(Хранилище.Получить());
// На стороне получателя (база Бухгалтерия в расширении)
ДвоичныеДанные = Base64Значение(ПринятаяСтрока);
Хранилище = Новый ХранилищеЗначения(ДвоичныеДанные);
ТаблицаРезультат = Хранилище.Получить();
Подводя итог, можно уверенно сказать: реализовать синхронизацию с 1С:Бухгалтерией 3.0 без изменения её конфигурации (без снятия с замка) возможно. Выбор метода зависит от ваших сроков и компетенций:
HTTP-сервиса.При использовании расширений помните, что вы всегда можете добавить в них Регистры Сведений для хранения связок уникальных идентификаторов (UID) между двумя базами, что значительно упростит сопоставление объектов при повторных обменах.