В практике разработчика 1С часто возникает задача оперативного переноса данных между базами без настройки полноценного обмена. Например, пользователю необходимо по нажатию кнопки «Копировать в другую базу» мгновенно создать дубликат текущего элемента справочника. При этом важно, чтобы решение было надежным, не занимало лишних лицензий и соответствовало стандартам современной платформы 1С:Предприятие 8.3.
Рассмотрим основные способы реализации этой задачи, проанализируем их плюсы и минусы, а также разберем по шагам, как сделать «красивое» и расширяемое решение на базе БСП (Библиотеки стандартных подсистем).
На сегодняшний день использование HTTP-сервисов является «золотым стандартом» интеграции. Рассмотрим подробнее, почему это лучшее решение для задачи переноса 10–20 элементов в день. HTTP-запрос выполняется очень быстро, не требует длительной инициализации сеанса (в отличие от COM) и корректно работает в веб-клиенте и на серверах под управлением Linux.
Для реализации этого метода нам потребуется выполнить следующие действия:
POST-запрос. Внутри метода мы будем десериализовать полученные данные и записывать элемент.HTTPСоединение.Проанализируем пример кода для отправки данных. Чтобы передать элемент справочника, мы можем упаковать его реквизиты в структуру:
// Пример формирования данных на стороне источника
ДанныеЭлемента = Новый Структура;
ДанныеЭлемента.Вставить("Наименование", Объект.Наименование);
ДанныеЭлемента.Вставить("Код", Объект.Код);
ДанныеЭлемента.Вставить("ИНН", Объект.ИНН);
ДанныеЭлемента.Вставить("УникальныйИдентификатор", Строка(Объект.Ссылка.УникальныйИдентификатор()));
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ДанныеЭлемента);
СтрокаJSON = ЗаписьJSON.Закрыть();
Использование JSON предпочтительнее XML, так как этот формат легче, быстрее обрабатывается и встроен в платформу на уровне объектов ЧтениеJSON и ЗаписьJSON.
Если вы хотите реализовать задачу максимально быстро и без написания кода в базе-приемнике, выясним возможности технологии OData. Это стандартный REST-интерфейс, который 1С предоставляет «из коробки».
Для включения OData достаточно в базе-приемнике разрешить доступ к конкретным объектам справочника через УстановитьСоставСтандартногоИнтерфейсаOData() или в свойствах конфигурации. После этого база-источник может отправлять простые HTTP-запросы напрямую к таблицам базы-приемника.
Преимущества OData:
Многие разработчики по привычке выбирают COM-соединение. Суть метода заключается в создании прямого подключения к базе-приемнику:
// Пример инициализации COM-соединения
Connector = Новый COMОбъект("V83.COMConnector");
Connection = Connector.Connect("Srvr=""ServerName"";Ref=""BaseName"";Usr=""Admin"";Pwd=""123"";");
НовыйОбъект = Connection.Справочники.Контрагенты.СоздатьЭлемент();
НовыйОбъект.Наименование = "Перенесенный контрагент";
НовыйОбъект.Записать();
Однако мы рекомендуем избегать этого метода по нескольким причинам. Во-первых, COM-соединение потребляет полноценную сеансовую лицензию на все время работы. Во-вторых, оно требует установки 32/64-битных компонент на сервере, что часто приводит к ошибкам при обновлении платформы. В-третьих, если ваш сервер 1С работает на Linux, COM-соединение просто не будет функционировать.
Чтобы сделать решение по-настоящему качественным, рассмотрим дополнительные аспекты, которые сделают работу пользователя комфортной.
1. Асинхронность и фоновые задания.
При нажатии кнопки «Перенести» не стоит заставлять пользователя ждать ответа от другой базы. Если связь нестабильна, интерфейс может «зависнуть» на 20-30 секунд. Правильнее запустить фоновое задание, которое выполнит отправку данных в фоновом режиме. Для этого в БСП используется метод ДлительныеОперации.ВыполнитьВФоне().
2. Хранение паролей. Никогда не храните логин и пароль от второй базы в коде или в обычных константах. Посмотрим на возможности БСП: используйте подсистему «Безопасное хранилище данных». Это позволит зашифровать учетные данные и обращаться к ним только в момент установки соединения.
3. Синхронизация по GUID.
Это критически важный момент. Вместо поиска по наименованию (которое может измениться), всегда передавайте УникальныйИдентификатор (GUID) элемента. При создании объекта в базе-приемнике используйте метод УстановитьСсылкуНового(). Это позволит избежать дублей при повторном нажатии кнопки — система просто обновит существующий элемент, сопоставив его по идентификатору.
// В базе-приемнике при получении GUID
Идентификатор = Новый УникальныйИдентификатор(ПереданнаяСтрокаGUID);
Ссылка = Справочники.Контрагенты.ПолучитьСсылку(Идентификатор);
Объект = Ссылка.ПолучитьОбъект();
Если Объект = Неопределено Тогда
Объект = Справочники.Контрагенты.СоздатьЭлемент();
Объект.УстановитьСсылкуНового(Ссылка);
КонецЕсли;
// Далее заполнение реквизитов и запись
Подводя итог, можно сказать: если вы хотите сделать задачу «не стыдно», остановитесь на HTTP-сервисе с передачей данных в JSON. Это решение масштабируемо, современно и надежно. Оберните вызов сервиса в фоновое задание и используйте БСП для хранения настроек подключения. Такой подход гарантирует, что ваше решение не придется переделывать при первом же обновлении платформы или смене операционной системы сервера.