Как программно перенести элемент справочника в другую базу 1С

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В практике разработчика 1С часто возникает задача оперативного переноса данных между базами без настройки полноценного обмена. Например, пользователю необходимо по нажатию кнопки «Копировать в другую базу» мгновенно создать дубликат текущего элемента справочника. При этом важно, чтобы решение было надежным, не занимало лишних лицензий и соответствовало стандартам современной платформы 1С:Предприятие 8.3.

Рассмотрим основные способы реализации этой задачи, проанализируем их плюсы и минусы, а также разберем по шагам, как сделать «красивое» и расширяемое решение на базе БСП (Библиотеки стандартных подсистем).

Способ 1. Использование HTTP-сервисов (рекомендуемый вариант)

На сегодняшний день использование HTTP-сервисов является «золотым стандартом» интеграции. Рассмотрим подробнее, почему это лучшее решение для задачи переноса 10–20 элементов в день. HTTP-запрос выполняется очень быстро, не требует длительной инициализации сеанса (в отличие от COM) и корректно работает в веб-клиенте и на серверах под управлением Linux.

Для реализации этого метода нам потребуется выполнить следующие действия:

  1. В базе-приемнике: Создать HTTP-сервис с шаблоном ресурса, принимающим POST-запрос. Внутри метода мы будем десериализовать полученные данные и записывать элемент.
  2. В базе-источнике: Сформировать данные элемента (лучше всего в формате JSON) и отправить их с помощью объекта HTTPСоединение.

Проанализируем пример кода для отправки данных. Чтобы передать элемент справочника, мы можем упаковать его реквизиты в структуру:


// Пример формирования данных на стороне источника
ДанныеЭлемента = Новый Структура;
ДанныеЭлемента.Вставить("Наименование", Объект.Наименование);
ДанныеЭлемента.Вставить("Код", Объект.Код);
ДанныеЭлемента.Вставить("ИНН", Объект.ИНН);
ДанныеЭлемента.Вставить("УникальныйИдентификатор", Строка(Объект.Ссылка.УникальныйИдентификатор()));

ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ДанныеЭлемента);
СтрокаJSON = ЗаписьJSON.Закрыть();

Использование JSON предпочтительнее XML, так как этот формат легче, быстрее обрабатывается и встроен в платформу на уровне объектов ЧтениеJSON и ЗаписьJSON.

Способ 2. Стандартный интерфейс OData (самый быстрый запуск)

Если вы хотите реализовать задачу максимально быстро и без написания кода в базе-приемнике, выясним возможности технологии OData. Это стандартный REST-интерфейс, который 1С предоставляет «из коробки».

Для включения OData достаточно в базе-приемнике разрешить доступ к конкретным объектам справочника через УстановитьСоставСтандартногоИнтерфейсаOData() или в свойствах конфигурации. После этого база-источник может отправлять простые HTTP-запросы напрямую к таблицам базы-приемника.

Преимущества OData:

Способ 3. COM-соединение (устаревший подход)

Многие разработчики по привычке выбирают 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. Это решение масштабируемо, современно и надежно. Оберните вызов сервиса в фоновое задание и используйте БСП для хранения настроек подключения. Такой подход гарантирует, что ваше решение не придется переделывать при первом же обновлении платформы или смене операционной системы сервера.

← На главную