diff --git a/bitra-patch/CommonModules/bfd_IntegrationAPIHelpers/Module.bsl b/bitra-patch/CommonModules/bfd_IntegrationAPIHelpers/Module.bsl index 9489c78..7970626 100644 --- a/bitra-patch/CommonModules/bfd_IntegrationAPIHelpers/Module.bsl +++ b/bitra-patch/CommonModules/bfd_IntegrationAPIHelpers/Module.bsl @@ -48,8 +48,12 @@ // Функция НормализоватьДляJSON(Знач Значение) Экспорт - Если Значение = Неопределено ИЛИ Значение = Null Тогда - Возврат Значение; + // Null → Неопределено: ЗаписатьJSON в 8.3.14 не принимает Null без специальных параметров. + Если Значение = Null Тогда + Возврат Неопределено; + КонецЕсли; + Если Значение = Неопределено Тогда + Возврат Неопределено; КонецЕсли; Тип = ТипЗнч(Значение); diff --git a/bitra-patch/HTTPServices/bfd_IntegrationAPI/Module.bsl b/bitra-patch/HTTPServices/bfd_IntegrationAPI/Module.bsl index 83d044d..e898ec7 100644 --- a/bitra-patch/HTTPServices/bfd_IntegrationAPI/Module.bsl +++ b/bitra-patch/HTTPServices/bfd_IntegrationAPI/Module.bsl @@ -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", СтрПольз.ДолженЗаполнятьОтчет); Результат.Добавить(Запись); КонецЦикла;