В типовых решениях, а следом и в отраслевых решениях, используется следующая модель
СотрудникиОрганизаций
+ Организация
+ ТекущееПодразделениеОрганизации
+ ФизЛицо
+ ВидДоговора
+ ВидЗанятости
+ Актуальность
При такой модели Для одного ФизЛица в программе может быть неограниченное количество сотрудников.
Появилась задача - найти основных сотрудников всех физ лиц для некоторой выгрузки данных. Алгоритм выбора основного сотрудника физ лица подсмотрел в функции
СотрудникиОрганизаций
+ Организация
+ ТекущееПодразделениеОрганизации
+ ФизЛицо
+ ВидДоговора
+ ВидЗанятости
+ Актуальность
При такой модели Для одного ФизЛица в программе может быть неограниченное количество сотрудников.
Появилась задача - найти основных сотрудников всех физ лиц для некоторой выгрузки данных. Алгоритм выбора основного сотрудника физ лица подсмотрел в функции
ПроцедурыУправленияПерсоналом.ОсновнойСотрудникФизлица(Физлицо, ГоловнаяОрганизация)
// Функция выполняет поиск сотрудников физического лица и, ранжируя их, // выбирает "основного" сотрудника организации // Используется для отображения сотрудника в формах документов, не имеющих реквизита Сотрудник // // Параметры: // - Физлицо // - ГоловнаяОрганизация // // Возвращаемое значение // - Сотрудник, Неопределено (если сотрудник не найден) // Функция ОсновнойСотрудникФизлица(Физлицо, ГоловнаяОрганизация) Экспорт Запрос = Новый Запрос; Запрос.УстановитьПараметр("Физлицо", Физлицо); Запрос.УстановитьПараметр("ГоловнаяОрганизация", ГоловнаяОрганизация); Запрос.Текст = "ВЫБРАТЬ | СотрудникиОрганизаций.Ссылка, | ВЫБОР | КОГДА (НЕ СотрудникиОрганизаций.Актуальность) | ТОГДА 3 | КОГДА СотрудникиОрганизаций.ВидДоговора = ЗНАЧЕНИЕ(Перечисление.ВидыДоговоровСФизЛицами.ТрудовойДоговор) | ТОГДА 1 | ИНАЧЕ 2 | КОНЕЦ КАК Порядок |ИЗ | Справочник.СотрудникиОрганизаций КАК СотрудникиОрганизаций |ГДЕ | (СотрудникиОрганизаций.ВидДоговора <> ЗНАЧЕНИЕ(Перечисление.ВидыДоговоровСФизЛицами.ТрудовойДоговор) | ИЛИ СотрудникиОрганизаций.ВидЗанятости <> ЗНАЧЕНИЕ(Перечисление.ВидыЗанятостиВОрганизации.ВнутреннееСовместительство)) | И СотрудникиОрганизаций.Физлицо = &Физлицо | И (СотрудникиОрганизаций.Организация = &ГоловнаяОрганизация | ИЛИ &ГоловнаяОрганизация В (НЕОПРЕДЕЛЕНО, ЗНАЧЕНИЕ(Справочник.Организации.ПустаяСсылка))) | |УПОРЯДОЧИТЬ ПО | Порядок"; Выборка = Запрос.Выполнить().Выбрать(); Если Выборка.Следующий() Тогда Возврат Выборка.Ссылка; КонецЕсли; Возврат Неопределено; КонецФункции // ОсновнойСотрудникФизлица
Переработанный запрос для всех записей справочника СотрудникиОрганизаций.
втРанжированныеСотрудникиВсе - Сотрудники
втОсновныеСотрудникиФизЛиц - Основной сотрудник по каждой из организаций для ФизЛица
втОсновныеОрганизацияСотрудникФизЛиц - Основной сотрудник для ФизЛица для всех организаций.
Приоритет сотрудников и организаций определяется через МИНИМУМ(Ссылка) - более ранняя (старая) ссылка в приоритете.
ВЫБРАТЬ СотрудникиОрганизаций.Организация КАК ОРГАНИЗАЦИЯ, СотрудникиОрганизаций.Ссылка КАК СОТРУДНИК, СотрудникиОрганизаций.Физлицо КАК ФИЗЛИЦО, ВЫБОР КОГДА НЕ СотрудникиОрганизаций.Актуальность ТОГДА 3 КОГДА СотрудникиОрганизаций.ВидДоговора = ЗНАЧЕНИЕ(Перечисление.ВидыДоговоровСФизЛицами.ТрудовойДоговор) ТОГДА 1 ИНАЧЕ 2 КОНЕЦ КАК Порядок, СотрудникиОрганизаций.Код КАК ТабНомер ПОМЕСТИТЬ втРанжированныеСотрудникиВсе ИЗ Справочник.СотрудникиОрганизаций КАК СотрудникиОрганизаций ГДЕ (СотрудникиОрганизаций.ВидДоговора <> ЗНАЧЕНИЕ(Перечисление.ВидыДоговоровСФизЛицами.ТрудовойДоговор) ИЛИ СотрудникиОрганизаций.ВидЗанятости <> ЗНАЧЕНИЕ(Перечисление.ВидыЗанятостиВОрганизации.ВнутреннееСовместительство)) И СотрудникиОрганизаций.Физлицо <> ЗНАЧЕНИЕ(Справочник.ФизическиеЛица.ПустаяСсылка) И СотрудникиОрганизаций.Организация <> ЗНАЧЕНИЕ(Справочник.Организации.ПустаяСсылка) И ВЫБОР &ОтборПоОрганизации КОГДА ИСТИНА ТОГДА СотрудникиОрганизаций.Организация В (&СписокОрганизаций) ИНАЧЕ ИСТИНА КОНЕЦ ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ втРанжированныеСотрудникиВсе.ОРГАНИЗАЦИЯ, втРанжированныеСотрудникиВсе.ФИЗЛИЦО, МИНИМУМ(втРанжированныеСотрудникиВсе.СОТРУДНИК) КАК СОТРУДНИК ПОМЕСТИТЬ втОсновныеСотрудникиФизЛиц ИЗ (ВЫБРАТЬ втРанжированныеСотрудникиВсе.ОРГАНИЗАЦИЯ КАК ОРГАНИЗАЦИЯ, втРанжированныеСотрудникиВсе.ФИЗЛИЦО КАК ФИЗЛИЦО, МИНИМУМ(втРанжированныеСотрудникиВсе.Порядок) КАК Порядок ИЗ втРанжированныеСотрудникиВсе КАК втРанжированныеСотрудникиВсе СГРУППИРОВАТЬ ПО втРанжированныеСотрудникиВсе.ОРГАНИЗАЦИЯ, втРанжированныеСотрудникиВсе.ФИЗЛИЦО) КАК РанжирФизЛицаОрганизции ВНУТРЕННЕЕ СОЕДИНЕНИЕ втРанжированныеСотрудникиВсе КАК втРанжированныеСотрудникиВсе ПО РанжирФизЛицаОрганизции.ОРГАНИЗАЦИЯ = втРанжированныеСотрудникиВсе.ОРГАНИЗАЦИЯ И РанжирФизЛицаОрганизции.ФИЗЛИЦО = втРанжированныеСотрудникиВсе.ФИЗЛИЦО И РанжирФизЛицаОрганизции.Порядок = втРанжированныеСотрудникиВсе.Порядок СГРУППИРОВАТЬ ПО втРанжированныеСотрудникиВсе.ОРГАНИЗАЦИЯ, втРанжированныеСотрудникиВсе.ФИЗЛИЦО ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ РанжирФизЛицОрганизаций.ОРГАНИЗАЦИЯ, РанжирФизЛицОрганизаций.ФИЗЛИЦО, МИНИМУМ(втРанжированныеСотрудникиВсе.СОТРУДНИК) КАК СОТРУДНИК ПОМЕСТИТЬ втОсновныеОрганизацияСотрудникФизЛиц ИЗ (ВЫБРАТЬ РанжирФизЛиц.ФИЗЛИЦО КАК ФИЗЛИЦО, МИНИМУМ(втРанжированныеСотрудникиВсе.ОРГАНИЗАЦИЯ) КАК ОРГАНИЗАЦИЯ, РанжирФизЛиц.Порядок КАК Порядок ИЗ (ВЫБРАТЬ втРанжированныеСотрудникиВсе.ФИЗЛИЦО КАК ФИЗЛИЦО, МИНИМУМ(втРанжированныеСотрудникиВсе.Порядок) КАК Порядок ИЗ втРанжированныеСотрудникиВсе КАК втРанжированныеСотрудникиВсе СГРУППИРОВАТЬ ПО втРанжированныеСотрудникиВсе.ФИЗЛИЦО) КАК РанжирФизЛиц ВНУТРЕННЕЕ СОЕДИНЕНИЕ втРанжированныеСотрудникиВсе КАК втРанжированныеСотрудникиВсе ПО РанжирФизЛиц.ФИЗЛИЦО = втРанжированныеСотрудникиВсе.ФИЗЛИЦО И РанжирФизЛиц.Порядок = втРанжированныеСотрудникиВсе.Порядок СГРУППИРОВАТЬ ПО РанжирФизЛиц.ФИЗЛИЦО, РанжирФизЛиц.Порядок) КАК РанжирФизЛицОрганизаций ВНУТРЕННЕЕ СОЕДИНЕНИЕ втРанжированныеСотрудникиВсе КАК втРанжированныеСотрудникиВсе ПО РанжирФизЛицОрганизаций.ОРГАНИЗАЦИЯ = втРанжированныеСотрудникиВсе.ОРГАНИЗАЦИЯ И РанжирФизЛицОрганизаций.ФИЗЛИЦО = втРанжированныеСотрудникиВсе.ФИЗЛИЦО И РанжирФизЛицОрганизаций.Порядок = втРанжированныеСотрудникиВсе.Порядок СГРУППИРОВАТЬ ПО РанжирФизЛицОрганизаций.ОРГАНИЗАЦИЯ, РанжирФизЛицОрганизаций.ФИЗЛИЦО ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ втОсновныеОрганизацияСотрудникФизЛиц.ОРГАНИЗАЦИЯ, втОсновныеОрганизацияСотрудникФизЛиц.ФИЗЛИЦО, втОсновныеОрганизацияСотрудникФизЛиц.СОТРУДНИК, втРанжированныеСотрудникиВсе.ТабНомер ИЗ втОсновныеОрганизацияСотрудникФизЛиц КАК втОсновныеОрганизацияСотрудникФизЛиц ВНУТРЕННЕЕ СОЕДИНЕНИЕ втРанжированныеСотрудникиВсе КАК втРанжированныеСотрудникиВсе ПО втОсновныеОрганизацияСотрудникФизЛиц.ОРГАНИЗАЦИЯ = втРанжированныеСотрудникиВсе.ОРГАНИЗАЦИЯ И втОсновныеОрганизацияСотрудникФизЛиц.ФИЗЛИЦО = втРанжированныеСотрудникиВсе.ФИЗЛИЦО И втОсновныеОрганизацияСотрудникФизЛиц.СОТРУДНИК = втРанжированныеСотрудникиВсе.СОТРУДНИК
Комментарии
Отправить комментарий