При работе в связке 1С:Зарплата и Управление Персоналом (ЗУП) и 1С:Бухгалтерия предприятия (БП) часто возникает необходимость сверить данные или построить консолидированный отчет. Основная сложность заключается в том, что базы физически разделены, а уникальные идентификаторы (GUID) одних и тех же объектов (например, сотрудников или подразделений) могут не совпадать. В данной статье мы разберем наиболее эффективные способы подключения к «соседней» базе и алгоритмы сопоставления данных для получения корректного результата.
Это классический способ, который проще всего реализовать программно. Мы создаем соединение с другой информационной базой прямо из кода текущей базы и работаем с ее объектами почти как со своими собственными. Рассмотрим пример подключения к файловой базе:
ПараметрыСоединения = "File=""C:\Bases\Buh""; Usr=""Администратор""; Pwd=""123"";";
COMСоединитель = Новый COMОбъект("V83.COMConnector");
Попытка
Соединение = COMСоединитель.Connect(ПараметрыСоединения);
Исключение
Сообщить("Ошибка подключения: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
Преимущества: простота реализации, возможность выполнять запросы в контексте другой базы через Соединение.NewObject("Запрос").
Важные нюансы:
Если базы находятся на сервере или работают под управлением Linux, лучшим выбором станут веб-технологии. Мы можем создать в Бухгалтерии собственный HTTP-сервис, который будет отдавать данные в формате JSON, или воспользоваться встроенным интерфейсом OData.
Проанализируем работу через HTTP-запрос. В ЗУП мы пишем код для получения данных:
Соединение = Новый HTTPСоединение("server-buh", , "Login", "Password");
Запрос = Новый HTTPЗапрос("/base-buh/hs/ReportData/GetSalaryData?Period=20230101");
Ответ = Соединение.Получить(Запрос);
Если Ответ.КодСостояния = 200 Тогда
ДанныеJSON = Ответ.ПолучитьТелоКакСтроку();
// Далее парсим JSON в ТаблицуЗначений
КонецЕсли;
Этот метод считается более «правильным» с точки зрения современной архитектуры 1С, так как он не блокирует сеансы и работает стабильно на любых платформах.
Если обе базы хранятся на одном SQL-сервере, мы можем настроить «Внешний источник данных» в конфигураторе ЗУП. Это позволит видеть таблицы Бухгалтерии прямо в дереве метаданных и использовать их в обычных запросах ВЫБРАТЬ... ИЗ....
Разберем, как это работает:
Внимание: структура таблиц в SQL не всегда очевидна (например, справочники именуются как _ReferenceXX). Вам придется сопоставлять имена полей в SQL с именами в метаданных 1С.
Главная проблема, которую отметил автор темы — несовпадение идентификаторов. Если в ЗУП у сотрудника один GUID, а в Бухгалтерии другой, мы не сможем просто «соединить» таблицы по полю Ссылка.
Рассмотрим способы решения этой задачи:
СНИЛС или ИНН. Для организаций — ИНН + КПП. Для статей затрат или подразделений — Код (если обеспечена их идентичность).Для того чтобы отчет был удобным для пользователя, лучше всего использовать Внешние наборы данных в СКД. Проанализируем пошагово процесс разработки:
ПриКомпоновкеРезультата) выполняем подключение к Бухгалтерии, получаем данные и загружаем их в ТаблицуЗначений.Пример программной передачи данных в СКД:
Процедура ПриКомпоновкеРезультата(ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
// 1. Получаем данные из Бухгалтерии в ТЗ
ТаблицаИзБух = ПолучитьДанныеИзБухгалтерии();
// 2. Инициализируем макет и компоновщик
СхемаКомпоновкиДанных = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
Настройки = КомпоновщикНастроек.ПолучитьНастройки();
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);
// 3. Передаем ТЗ во внешний набор данных
ВнешниеНаборыДанных = Новый Структура;
ВнешниеНаборыДанных.Вставить("ДанныеБухгалтерии", ТаблицаИзБух);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных, ДанныеРасшифровки);
// 4. Вывод в документ
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(Результат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
КонецПроцедуры
Выбор метода зависит от вашей инфраструктуры:
Таким образом, комбинируя современные методы обмена данными и гибкость СКД, можно создать мощный инструмент для контроля корректности учета сразу в нескольких информационных системах.