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
@@ -48,8 +48,12 @@
// //
Функция НормализоватьДляJSON(Знач Значение) Экспорт Функция НормализоватьДляJSON(Знач Значение) Экспорт
Если Значение = Неопределено ИЛИ Значение = Null Тогда // Null → Неопределено: ЗаписатьJSON в 8.3.14 не принимает Null без специальных параметров.
Возврат Значение; Если Значение = Null Тогда
Возврат Неопределено;
КонецЕсли;
Если Значение = Неопределено Тогда
Возврат Неопределено;
КонецЕсли; КонецЕсли;
Тип = ТипЗнч(Значение); Тип = ТипЗнч(Значение);
@@ -25,14 +25,13 @@
// GET /v1/employees // GET /v1/employees
// //
// Email берётся одним запросом через РегистрСведений.КонтактнаяИнформация БСП // Email получаем через стандартную БСП-функцию УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъектов(),
// (подзапрос с ПЕРВЫЕ 1 — если у пользователя несколько email-адресов, берём первый). // которая делает один массовый запрос на массив ссылок (не N+1).
// //
Функция EmployeesGet(Запрос) Экспорт Функция EmployeesGet(Запрос) Экспорт
Попытка Попытка
Запрос1С = Новый Запрос; Запрос1С = Новый Запрос;
Запрос1С.УстановитьПараметр("ТипEmail", Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты);
Запрос1С.Текст = Запрос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(Выборка.Ссылка)); Запись.Вставить("id", bfd_IntegrationAPIHelpers.UUID(СтрПольз.Ссылка));
Запись.Вставить("full_name", Выборка.ФИО); Запись.Вставить("full_name", СтрПольз.ФИО);
Запись.Вставить("email", НРег(?(Выборка.Email = Null, "", Строка(Выборка.Email)))); Запись.Вставить("email", ?(Email = Неопределено, "", НРег(Строка(Email))));
Запись.Вставить("eva_id", Выборка.EvaID); Запись.Вставить("eva_id", СтрПольз.EvaID);
Запись.Вставить("office", Строка(Выборка.Офис)); Запись.Вставить("office", Строка(СтрПольз.Офис));
Запись.Вставить("department", Строка(Выборка.Подразделение)); Запись.Вставить("department", Строка(СтрПольз.Подразделение));
Запись.Вставить("rate", Выборка.Ставка); Запись.Вставить("rate", СтрПольз.Ставка);
Запись.Вставить("is_active", НЕ Выборка.Недействителен); Запись.Вставить("is_active", НЕ СтрПольз.Недействителен);
Запись.Вставить("should_fill_report", Выборка.ДолженЗаполнятьОтчет); Запись.Вставить("should_fill_report", СтрПольз.ДолженЗаполнятьОтчет);
Результат.Добавить(Запись); Результат.Добавить(Запись);
КонецЦикла; КонецЦикла;