fix(bitra-patch): email через JOIN к ТЧ.КонтактнаяИнформация.АдресЭП (кастомное поле BIT.RA)

This commit is contained in:
Roman Chesnokov
2026-05-15 19:47:16 +05:00
parent 6fd8388071
commit a10cb3e32b
@@ -25,13 +25,15 @@
// GET /v1/employees // GET /v1/employees
// //
// Email получаем через стандартную БСП-функцию УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъектов(), // Email — через JOIN к табличной части КонтактнаяИнформация.
// которая делает один массовый запрос на массив ссылок (не N+1). // В BIT.RA у ТЧ есть кастомное поле АдресЭП (адрес электронной почты) —
// это специфика данной БСП, заполняется при сохранении объекта.
// //
Функция EmployeesGet(Запрос) Экспорт Функция EmployeesGet(Запрос) Экспорт
Попытка Попытка
Запрос1С = Новый Запрос; Запрос1С = Новый Запрос;
Запрос1С.УстановитьПараметр("ТипEmail", Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты);
Запрос1С.Текст = Запрос1С.Текст =
"ВЫБРАТЬ "ВЫБРАТЬ
| Пользователи.Ссылка КАК Ссылка, | Пользователи.Ссылка КАК Ссылка,
@@ -41,51 +43,42 @@
| Пользователи.Подразделение КАК Подразделение, | Пользователи.Подразделение КАК Подразделение,
| Пользователи.Ставка КАК Ставка, | Пользователи.Ставка КАК Ставка,
| Пользователи.Недействителен КАК Недействителен, | Пользователи.Недействителен КАК Недействителен,
| Пользователи.ДолженЗаполнятьОтчет КАК ДолженЗаполнятьОтчет | Пользователи.ДолженЗаполнятьОтчет КАК ДолженЗаполнятьОтчет,
| МАКСИМУМ(КИ.АдресЭП) КАК Email
|ИЗ |ИЗ
| Справочник.Пользователи КАК Пользователи | Справочник.Пользователи КАК Пользователи
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Пользователи.КонтактнаяИнформация КАК КИ
| ПО КИ.Ссылка = Пользователи.Ссылка
| И КИ.Тип = &ТипEmail
|ГДЕ |ГДЕ
| НЕ Пользователи.ПометкаУдаления | НЕ Пользователи.ПометкаУдаления
|СГРУППИРОВАТЬ ПО
| Пользователи.Ссылка,
| Пользователи.Наименование,
| Пользователи.EVA_ID,
| Пользователи.Офис,
| Пользователи.Подразделение,
| Пользователи.Ставка,
| Пользователи.Недействителен,
| Пользователи.ДолженЗаполнятьОтчет
|УПОРЯДОЧИТЬ ПО |УПОРЯДОЧИТЬ ПО
| Пользователи.Наименование"; | Пользователи.Наименование";
ТаблицаПользователей = Запрос1С.Выполнить().Выгрузить(); Выборка = Запрос1С.Выполнить().Выбрать();
// Массовый запрос email через БСП.
МассивСсылок = ТаблицаПользователей.ВыгрузитьКолонку("Ссылка");
ТипEmail = Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты;
EmailПоПользователю = Новый Соответствие;
Попытка
ТЗКИ = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъектов(МассивСсылок, ТипEmail);
Для Каждого СтрКИ Из ТЗКИ Цикл
// у разных версий БСП колонка может называться 'Объект' / 'СсылкаНаОбъект' / 'Объект'.
// Достаём через структурный доступ безопасно:
Объект = ?(СтрКИ.Колонки.Найти("Объект") <> Неопределено, СтрКИ.Объект, Неопределено);
Если Объект = Неопределено И СтрКИ.Колонки.Найти("СсылкаНаОбъект") <> Неопределено Тогда
Объект = СтрКИ.СсылкаНаОбъект;
КонецЕсли;
Представление = ?(СтрКИ.Колонки.Найти("Представление") <> Неопределено, СтрКИ.Представление, "");
Если Объект <> Неопределено И НЕ ПустаяСтрока(Представление) И EmailПоПользователю.Получить(Объект) = Неопределено Тогда
EmailПоПользователю.Вставить(Объект, Представление);
КонецЕсли;
КонецЦикла;
Исключение
// Если у БСП другая сигнатура — оставляем email пустыми (не критично для MVP).
КонецПопытки;
Результат = Новый Массив; Результат = Новый Массив;
Для Каждого СтрПольз Из ТаблицаПользователей Цикл
Email = EmailПоПользователю.Получить(СтрПольз.Ссылка); Пока Выборка.Следующий() Цикл
Email = ?(Выборка.Email = Null, "", Строка(Выборка.Email));
Запись = Новый Структура; Запись = Новый Структура;
Запись.Вставить("id", bfd_IntegrationAPIHelpers.UUID(СтрПольз.Ссылка)); Запись.Вставить("id", bfd_IntegrationAPIHelpers.UUID(Выборка.Ссылка));
Запись.Вставить("full_name", СтрПольз.ФИО); Запись.Вставить("full_name", Выборка.ФИО);
Запись.Вставить("email", ?(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", Выборка.ДолженЗаполнятьОтчет);
Результат.Добавить(Запись); Результат.Добавить(Запись);
КонецЦикла; КонецЦикла;