fix(bitra-patch): employees email через УправлениеКонтактнойИнформацией БСП; Null→Неопределено в нормализаторе

This commit is contained in:
Roman Chesnokov
2026-05-15 19:36:53 +05:00
parent f74cc2ebff
commit 6fd8388071
2 changed files with 44 additions and 31 deletions
@@ -25,14 +25,13 @@
// GET /v1/employees
//
// Email берётся одним запросом через РегистрСведений.КонтактнаяИнформация БСП
// (подзапрос с ПЕРВЫЕ 1 — если у пользователя несколько email-адресов, берём первый).
// Email получаем через стандартную БСП-функцию УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъектов(),
// которая делает один массовый запрос на массив ссылок (не N+1).
//
Функция EmployeesGet(Запрос) Экспорт
Попытка
Запрос1С = Новый Запрос;
Запрос1С.УстановитьПараметр("ТипEmail", Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты);
Запрос1С.Текст =
"ВЫБРАТЬ
| Пользователи.Ссылка КАК Ссылка,
@@ -42,41 +41,51 @@
| Пользователи.Подразделение КАК Подразделение,
| Пользователи.Ставка КАК Ставка,
| Пользователи.Недействителен КАК Недействителен,
| Пользователи.ДолженЗаполнятьОтчет КАК ДолженЗаполнятьОтчет,
| МАКСИМУМ(КИ.Представление) КАК Email
| Пользователи.ДолженЗаполнятьОтчет КАК ДолженЗаполнятьОтчет
|ИЗ
| Справочник.Пользователи КАК Пользователи
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КонтактнаяИнформация КАК КИ
| ПО КИ.Объект = Пользователи.Ссылка
| И КИ.Тип = &ТипEmail
|ГДЕ
| НЕ Пользователи.ПометкаУдаления
|СГРУППИРОВАТЬ ПО
| Пользователи.Ссылка,
| Пользователи.Наименование,
| Пользователи.EVA_ID,
| Пользователи.Офис,
| Пользователи.Подразделение,
| Пользователи.Ставка,
| Пользователи.Недействителен,
| Пользователи.ДолженЗаполнятьОтчет
|УПОРЯДОЧИТЬ ПО
| Пользователи.Наименование";
Выборка = Запрос1С.Выполнить().Выбрать();
Результат = Новый Массив;
ТаблицаПользователей = Запрос1С.Выполнить().Выгрузить();
Пока Выборка.Следующий() Цикл
// Массовый запрос email через БСП.
МассивСсылок = ТаблицаПользователей.ВыгрузитьКолонку("Ссылка");
ТипEmail = Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты;
EmailПоПользователю = Новый Соответствие;
Попытка
ТЗКИ = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъектов(МассивСсылок, ТипEmail);
Для Каждого СтрКИ Из ТЗКИ Цикл
// у разных версий БСП колонка может называться 'Объект' / 'СсылкаНаОбъект' / 'Объект'.
// Достаём через структурный доступ безопасно:
Объект = ?(СтрКИ.Колонки.Найти("Объект") <> Неопределено, СтрКИ.Объект, Неопределено);
Если Объект = Неопределено И СтрКИ.Колонки.Найти("СсылкаНаОбъект") <> Неопределено Тогда
Объект = СтрКИ.СсылкаНаОбъект;
КонецЕсли;
Представление = ?(СтрКИ.Колонки.Найти("Представление") <> Неопределено, СтрКИ.Представление, "");
Если Объект <> Неопределено И НЕ ПустаяСтрока(Представление) И EmailПоПользователю.Получить(Объект) = Неопределено Тогда
EmailПоПользователю.Вставить(Объект, Представление);
КонецЕсли;
КонецЦикла;
Исключение
// Если у БСП другая сигнатура — оставляем email пустыми (не критично для MVP).
КонецПопытки;
Результат = Новый Массив;
Для Каждого СтрПольз Из ТаблицаПользователей Цикл
Email = EmailПоПользователю.Получить(СтрПольз.Ссылка);
Запись = Новый Структура;
Запись.Вставить("id", bfd_IntegrationAPIHelpers.UUID(Выборка.Ссылка));
Запись.Вставить("full_name", Выборка.ФИО);
Запись.Вставить("email", НРег(?(Выборка.Email = Null, "", Строка(Выборка.Email))));
Запись.Вставить("eva_id", Выборка.EvaID);
Запись.Вставить("office", Строка(Выборка.Офис));
Запись.Вставить("department", Строка(Выборка.Подразделение));
Запись.Вставить("rate", Выборка.Ставка);
Запись.Вставить("is_active", НЕ Выборка.Недействителен);
Запись.Вставить("should_fill_report", Выборка.ДолженЗаполнятьОтчет);
Запись.Вставить("id", bfd_IntegrationAPIHelpers.UUID(СтрПольз.Ссылка));
Запись.Вставить("full_name", СтрПольз.ФИО);
Запись.Вставить("email", ?(Email = Неопределено, "", НРег(Строка(Email))));
Запись.Вставить("eva_id", СтрПольз.EvaID);
Запись.Вставить("office", Строка(СтрПольз.Офис));
Запись.Вставить("department", Строка(СтрПольз.Подразделение));
Запись.Вставить("rate", СтрПольз.Ставка);
Запись.Вставить("is_active", НЕ СтрПольз.Недействителен);
Запись.Вставить("should_fill_report", СтрПольз.ДолженЗаполнятьОтчет);
Результат.Добавить(Запись);
КонецЦикла;