При разработке отчетов в системе 1С часто возникает ситуация, когда основные данные находятся в одной базе (например, Управление торговлей), а параметры для фильтрации — в другой (например, Управление автотранспортом). Основная сложность заключается не только в техническом подключении, но и в сопоставлении объектов, если их наименования не совпадают или отсутствуют общие уникальные идентификаторы. Разберем подробно, как решить эту задачу, используя возможности Системы компоновки данных (СКД) и механизмы интеграции платформы 1С.
Если нам нужно передать готовую таблицу значений, полученную из базы УАТ, непосредственно в отчет, лучшим решением будет использование типа «Набор данных - объект». Рассмотрим этот процесс пошагово.
Во-первых, в схеме компоновки данных (СКД) вместо стандартного запроса мы создаем НаборДанныхОбъект. В поле «Имя объекта содержащего данные» указываем, например, ТаблицаВодителейУАТ. Далее вручную описываем поля этой таблицы (например, Наименование, ТабельныйНомер).
Во-вторых, в программном коде перед формированием отчета мы выполняем запрос к внешней базе и передаем результат в СКД. Проанализируем пример кода для передачи таблицы:
// Создаем структуру для передачи внешних наборов данных
ВнешниеНаборыДанных = Новый Структура;
ВнешниеНаборыДанных.Вставить("ТаблицаВодителейУАТ", ПолученнаяТаблицаИзУАТ);
// Инициализируем компоновщик макета
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, НастройкиОтчета, ДанныеРасшифровки);
// Выполняем компоновку
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных, ДанныеРасшифровки);
Если отчет в УТ строится по внутренним данным, но пользователь хочет выбрать водителей из списка, существующего только в УАТ, можно воспользоваться параметрами. Рассмотрим ситуацию: мы подключаемся к базе УАТ, выбираем нужных водителей и выгружаем их наименования в СписокЗначений.
В тексте запроса СКД мы добавляем условие:
ГДЕ
ФизическиеЛица.Наименование В (&СписокВодителейИзУАТ)
Этот метод прост, но имеет существенный недостаток: если «Иванов Иван Иванович» в одной базе записан как «Иванов И.И.», прямой отбор не сработает. Поэтому крайне важно проанализировать качество данных перед использованием этого подхода.
Когда данные «испорчены» пользователями или просто заносились по разным стандартам, нам придется использовать механизмы нормализации. Проанализируем ситуацию, когда нам нужно найти соответствие. Мы можем использовать оператор ПОДОБНО или алгоритмы сравнения строк.
Один из вариантов — перед сравнением привести все строки к «чистому» виду: удалить лишние пробелы, точки, преобразовать в нижний регистр. В запросе 1С это сделать сложно, поэтому нормализацию лучше проводить на стороне кода при подготовке таблицы соответствий.
Посмотрим, как можно реализовать простейший поиск по подстроке в запросе, если мы ищем соответствие короткого имени полному:
ВЫБРАТЬ
Ссылка
ИЗ
Справочник.ФизическиеЛица
ГДЕ
Наименование ПОДОБНО "%" + &ФамилияИнициалы + "%"
Чтобы не зависеть от человеческого фактора и не пересчитывать сложные алгоритмы поиска при каждом запуске отчета, рекомендуется создать в базе УТ РегистрСведений.СоответствиеОбъектовВнешнихБаз. Рассмотрим структуру такого регистра:
При таком подходе отчет будет работать мгновенно. Мы просто соединяем наши данные с этим регистром и фильтруем по полю ИдентификаторУАТ. Если соответствие не найдено, пользователь один раз вручную указывает связь, и система «запоминает» её навсегда.
Выясним, каким именно способом лучше «достучаться» до базы УАТ для получения списка водителей. Выделим три основных варианта:
JSON. База УТ делает HTTPЗапрос, парсит ответ и использует его для отбора. Это работает быстро и стабильно.Подведем итог: если ваша задача — разовый отчет, используйте COM-соединение и передачу СпискаЗначений в параметр СКД. Если же отчет будет использоваться постоянно, а данные в базах часто расходятся, обязательно внедрите Регистр соответствий и настройте обмен через HTTP-сервисы. Это избавит вас от проблем с «Ивановым И.И.» и обеспечит высокую скорость работы системы.