Как лучше организовать получение данных из другой базы 1С для отображения детализации?

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

В практике интеграции систем на платформе 1С часто возникает задача «облегчения» целевой базы. Типичный пример: передача данных из 1С:УПП или 1С:ERP в 1С:Бухгалтерию, где для целей регламентированного учета не требуется детальная номенклатура, а достаточно сводных сумм по объектам «Товары в ассортименте». Однако пользователям периодически необходимо видеть исходную детализацию документа. Разберем, как реализовать получение этих данных по кнопке, выбрав оптимальный транспорт и метод отображения.

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

На сегодняшний день HTTP-сервисы являются стандартом де-факто для межсистемного взаимодействия. В отличие от тяжелых Web-сервисов, работающих по протоколу SOAP, HTTP-сервисы (REST) передают данные в легком формате (JSON или просто текст), что значительно ускоряет работу.

Рассмотрим преимущества:

  1. Скорость соединения: HTTP-сервисы используют пул соединений. Это значит, что сеанс в базе-источнике не создается каждый раз заново «с нуля», что экономит от 5 до 10 секунд при каждом нажатии кнопки.
  2. Кроссплатформенность: В отличие от COM-соединения, HTTP-сервисы корректно работают на серверах под управлением Linux.
  3. Масштабируемость: Данные можно запрашивать даже из баз, находящихся в разных сетях через проброс портов или прокси-серверы.

Для реализации этого метода нам потребуется на стороне УПП (база-источник) создать HTTP-сервис с шаблоном ресурса, который принимает GUID документа. Посмотрим на пример того, как может выглядеть запрос из Бухгалтерии:


// Код в БП (база-приемник)
Соединение = Новый HTTPСоединение("192.168.1.10", "8080", "Admin", "Password");
Запрос = Новый HTTPЗапрос("/upp_integration/v1/get_print_form?id=" + Строка(ДокументСсылка.УникальныйИдентификатор()));
Ответ = Соединение.Получить(Запрос);

Если Ответ.КодСостояния = 200 Тогда
    ДанныеКартинки = Ответ.ПолучитьТелоКакБинарныеДанные();
    // Обработка полученных данных
КонецЕсли;

Вариант 2. COM-соединение: классика и ее проблемы

Многие разработчики по привычке выбирают COM-соединение (COMConnector). Это позволяет работать с объектами другой базы так, будто они находятся в текущей. Однако проанализируем ситуацию глубже: COM-технология постепенно устаревает.

Основные недостатки COM:

  1. Зависимость от разрядности: Если ваш сервер 1С 64-битный, а компоненты COM настроены неверно (или используются старые библиотеки), вы столкнетесь с ошибками инициализации.
  2. Лицензирование: Каждое COM-подключение поглощает одну сессию (лицензию), что может быть критично при большом количестве одновременных пользователей.
  3. Тормоза: При каждом вызове происходит полная инициализация окружения пользователя в УПП, выполнение процедур ПриНачалеРаботыСистемы, что делает интерфейс «дерганым» для конечного пользователя.

Вариант 3. Передача сериализованной печатной формы

Чтобы не просто получить таблицу данных, а показать пользователю красивый документ, выясним причину, по которой стоит передавать именно объект ТабличныйДокумент. На стороне УПП уже есть все макеты и логика формирования ПФ. Нам достаточно сформировать ее там и передать в БП как строку.

Разберем по шагам процесс сериализации:

  1. В базе УПП вызываем стандартную функцию формирования печатной формы.
  2. Преобразуем полученный ТабличныйДокумент в XML-строку через СериализаторXDTO.
  3. Передаем эту строку через HTTP-ответ.
  4. В базе БП выполняем десериализацию.

Пример кода сериализации на стороне источника:


// Формируем печатную форму в УПП
ТабДок = СформироватьПечатнуюФорму(СсылкаНаДокумент);

// Сериализуем в XML
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку();
СериализаторXDTO.ЗаписатьXML(ЗаписьXML, ТабДок);
РезультатXML = ЗаписьXML.Закрыть();
Возврат РезультатXML;

В базе БП мы просто восстанавливаем объект и выводим его в форму:


// Чтение из XML в БП
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(ПолученнаяСтрокаXML);
ТабДок = СериализаторXDTO.ПрочитатьXML(ЧтениеXML, Тип("ТабличныйДокумент"));
ТабДок.Показать("Детализация из УПП");

Вариант 4. Хранение данных в JSON (автономный режим)

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

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

Архитектурные риски «схлопывания» номенклатуры

Проанализируем риски, о которых часто забывают при настройке такой синхронизации. Бухгалтерская база — это не только цифры, но и отчетность перед государством. Использование позиции «Товары в ассортименте» может создать проблемы в следующих случаях:

  1. Прослеживаемость товаров: Если вы торгуете импортными товарами, подлежащими прослеживаемости, в БП обязательно должны быть указаны конкретные РНПТ. Схлопывание в одну строку сделает сдачу декларации по НДС невозможной.
  2. Маркировка (Честный Знак): Аналогично прослеживаемости, коды маркировки привязаны к конкретным единицам продукции.
  3. Печатные формы из БП: Если бухгалтер решит перепечатать УПД из базы БП, клиент увидит в документе «Товары в ассортименте», что является нарушением требований к оформлению первичных документов (наименование должно соответствовать факту отгрузки).

Рекомендация: Если данные риски актуальны, лучше передавать в БП всю номенклатуру, но использовать механизм поиска по артикулу или коду, чтобы не плодить дубли, либо передавать детализацию в скрытую табличную часть документа.

Итоги

Для реализации «кнопки детализации» наиболее современным и надежным методом является HTTP-сервис с передачей сериализованного ТабличногоДокумента. Это обеспечивает отличную скорость работы и сохраняет интерфейс привычным для пользователя. Если же требуется максимальная автономность — используйте хранение данных в формате JSON непосредственно внутри документа в базе-приемнике.

← На главную