Как построить отчет в 1С, получающий данные из двух разных баз одновременно

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

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

Метод 1. Подключение через COM-соединение

Это классический способ, который проще всего реализовать программно. Мы создаем соединение с другой информационной базой прямо из кода текущей базы и работаем с ее объектами почти как со своими собственными. Рассмотрим пример подключения к файловой базе:


ПараметрыСоединения = "File=""C:\Bases\Buh""; Usr=""Администратор""; Pwd=""123"";";
COMСоединитель = Новый COMОбъект("V83.COMConnector");
Попытка
    Соединение = COMСоединитель.Connect(ПараметрыСоединения);
Исключение
    Сообщить("Ошибка подключения: " + ОписаниеОшибки());
    Возврат;
КонецПопытки;

Преимущества: простота реализации, возможность выполнять запросы в контексте другой базы через Соединение.NewObject("Запрос").

Важные нюансы:

  1. ОС Linux: если сервер 1С работает на Linux, COM-технология недоступна.
  2. Разрядность: разрядность клиента или сервера (32/64 бит) должна совпадать с установленным COM-коннектором.
  3. Производительность: это достаточно медленный способ при передаче больших объемов данных.

Метод 2. Использование HTTP-сервисов и OData

Если базы находятся на сервере или работают под управлением Linux, лучшим выбором станут веб-технологии. Мы можем создать в Бухгалтерии собственный HTTP-сервис, который будет отдавать данные в формате JSON, или воспользоваться встроенным интерфейсом OData.

Проанализируем работу через HTTP-запрос. В ЗУП мы пишем код для получения данных:


Соединение = Новый HTTPСоединение("server-buh", , "Login", "Password");
Запрос = Новый HTTPЗапрос("/base-buh/hs/ReportData/GetSalaryData?Period=20230101");
Ответ = Соединение.Получить(Запрос);
Если Ответ.КодСостояния = 200 Тогда
    ДанныеJSON = Ответ.ПолучитьТелоКакСтроку();
    // Далее парсим JSON в ТаблицуЗначений
КонецЕсли;

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

Метод 3. Внешние источники данных (прямое обращение к SQL)

Если обе базы хранятся на одном SQL-сервере, мы можем настроить «Внешний источник данных» в конфигураторе ЗУП. Это позволит видеть таблицы Бухгалтерии прямо в дереве метаданных и использовать их в обычных запросах ВЫБРАТЬ... ИЗ....

Разберем, как это работает:

  1. В конфигураторе добавляем новый Внешний источник данных.
  2. Настраиваем строку соединения с БД Бухгалтерии.
  3. Выбираем нужные таблицы (например, таблицы регистров бухгалтерии).

Внимание: структура таблиц в SQL не всегда очевидна (например, справочники именуются как _ReferenceXX). Вам придется сопоставлять имена полей в SQL с именами в метаданных 1С.

Проблема сопоставления объектов (GUID)

Главная проблема, которую отметил автор темы — несовпадение идентификаторов. Если в ЗУП у сотрудника один GUID, а в Бухгалтерии другой, мы не сможем просто «соединить» таблицы по полю Ссылка.

Рассмотрим способы решения этой задачи:

  1. Использование регистра «Соответствия объектов информационных баз»: если между базами настроен типовой обмен, 1С автоматически заполняет этот регистр. В нем хранится связка «УникальныйИдентификаторИсточника — УникальныйИдентификаторПриемника». Мы можем выгрузить этот регистр и использовать его как таблицу перекодировки.
  2. Бизнес-ключи: это наиболее надежный способ. Для физических лиц используйте СНИЛС или ИНН. Для организаций — ИНН + КПП. Для статей затрат или подразделений — Код (если обеспечена их идентичность).

Алгоритм построения отчета в СКД (Схема компоновки данных)

Для того чтобы отчет был удобным для пользователя, лучше всего использовать Внешние наборы данных в СКД. Проанализируем пошагово процесс разработки:

  1. Создаем в СКД набор данных — запрос (для данных из текущей базы ЗУП).
  2. Создаем второй набор данных — объект (для данных из Бухгалтерии).
  3. В модуле объекта отчета (в событии ПриКомпоновкеРезультата) выполняем подключение к Бухгалтерии, получаем данные и загружаем их в ТаблицуЗначений.
  4. Передаем эту таблицу в СКД.

Пример программной передачи данных в СКД:


Процедура ПриКомпоновкеРезультата(ДанныеРасшифровки, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    
    // 1. Получаем данные из Бухгалтерии в ТЗ
    ТаблицаИзБух = ПолучитьДанныеИзБухгалтерии(); 
    
    // 2. Инициализируем макет и компоновщик
    СхемаКомпоновкиДанных = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
    Настройки = КомпоновщикНастроек.ПолучитьНастройки();
    
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);
    
    // 3. Передаем ТЗ во внешний набор данных
    ВнешниеНаборыДанных = Новый Структура;
    ВнешниеНаборыДанных.Вставить("ДанныеБухгалтерии", ТаблицаИзБух);
    
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных, ДанныеРасшифровки);
    
    // 4. Вывод в документ
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(Результат);
    ПроцессорВывода.Вывести(ПроцессорКомпоновки);
КонецПроцедуры

Выводы и рекомендации

Выбор метода зависит от вашей инфраструктуры:

Таким образом, комбинируя современные методы обмена данными и гибкость СКД, можно создать мощный инструмент для контроля корректности учета сразу в нескольких информационных системах.

← На главную