К основному контенту

Основной сотрудник ФизЛица?

В типовых решениях, а следом и в отраслевых решениях, используется следующая модель

СотрудникиОрганизаций
+ Организация
+ ТекущееПодразделениеОрганизации
+ ФизЛицо
+ ВидДоговора
+ ВидЗанятости
+ Актуальность

При такой модели Для одного ФизЛица в программе может быть неограниченное количество сотрудников.

Появилась задача - найти основных сотрудников всех физ лиц для некоторой выгрузки данных. Алгоритм выбора основного сотрудника физ лица подсмотрел в функции
ПроцедурыУправленияПерсоналом.ОсновнойСотрудникФизлица(Физлицо, ГоловнаяОрганизация)



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

Переработанный запрос для всех записей справочника СотрудникиОрганизаций.
втРанжированныеСотрудникиВсе - Сотрудники
втОсновныеСотрудникиФизЛиц - Основной сотрудник по каждой из организаций для ФизЛица
втОсновныеОрганизацияСотрудникФизЛиц - Основной сотрудник для ФизЛица для всех организаций.

Приоритет сотрудников и организаций определяется через МИНИМУМ(Ссылка) - более ранняя (старая) ссылка в приоритете. 

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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
 втРанжированныеСотрудникиВсе.ОРГАНИЗАЦИЯ,
 втРанжированныеСотрудникиВсе.ФИЗЛИЦО,
 МИНИМУМ(втРанжированныеСотрудникиВсе.СОТРУДНИК) КАК СОТРУДНИК
ПОМЕСТИТЬ втОсновныеСотрудникиФизЛиц
ИЗ
 (ВЫБРАТЬ
  втРанжированныеСотрудникиВсе.ОРГАНИЗАЦИЯ КАК ОРГАНИЗАЦИЯ,
  втРанжированныеСотрудникиВсе.ФИЗЛИЦО КАК ФИЗЛИЦО,
  МИНИМУМ(втРанжированныеСотрудникиВсе.Порядок) КАК Порядок
 ИЗ
  втРанжированныеСотрудникиВсе КАК втРанжированныеСотрудникиВсе
 
 СГРУППИРОВАТЬ ПО
  втРанжированныеСотрудникиВсе.ОРГАНИЗАЦИЯ,
  втРанжированныеСотрудникиВсе.ФИЗЛИЦО) КАК РанжирФизЛицаОрганизции
  ВНУТРЕННЕЕ СОЕДИНЕНИЕ втРанжированныеСотрудникиВсе КАК втРанжированныеСотрудникиВсе
  ПО РанжирФизЛицаОрганизции.ОРГАНИЗАЦИЯ = втРанжированныеСотрудникиВсе.ОРГАНИЗАЦИЯ
   И РанжирФизЛицаОрганизции.ФИЗЛИЦО = втРанжированныеСотрудникиВсе.ФИЗЛИЦО
   И РанжирФизЛицаОрганизции.Порядок = втРанжированныеСотрудникиВсе.Порядок

СГРУППИРОВАТЬ ПО
 втРанжированныеСотрудникиВсе.ОРГАНИЗАЦИЯ,
 втРанжированныеСотрудникиВсе.ФИЗЛИЦО
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
 РанжирФизЛицОрганизаций.ОРГАНИЗАЦИЯ,
 РанжирФизЛицОрганизаций.ФИЗЛИЦО,
 МИНИМУМ(втРанжированныеСотрудникиВсе.СОТРУДНИК) КАК СОТРУДНИК
ПОМЕСТИТЬ втОсновныеОрганизацияСотрудникФизЛиц
ИЗ
 (ВЫБРАТЬ
  РанжирФизЛиц.ФИЗЛИЦО КАК ФИЗЛИЦО,
  МИНИМУМ(втРанжированныеСотрудникиВсе.ОРГАНИЗАЦИЯ) КАК ОРГАНИЗАЦИЯ,
  РанжирФизЛиц.Порядок КАК Порядок
 ИЗ
  (ВЫБРАТЬ
   втРанжированныеСотрудникиВсе.ФИЗЛИЦО КАК ФИЗЛИЦО,
   МИНИМУМ(втРанжированныеСотрудникиВсе.Порядок) КАК Порядок
  ИЗ
   втРанжированныеСотрудникиВсе КАК втРанжированныеСотрудникиВсе
  
  СГРУППИРОВАТЬ ПО
   втРанжированныеСотрудникиВсе.ФИЗЛИЦО) КАК РанжирФизЛиц
   ВНУТРЕННЕЕ СОЕДИНЕНИЕ втРанжированныеСотрудникиВсе КАК втРанжированныеСотрудникиВсе
   ПО РанжирФизЛиц.ФИЗЛИЦО = втРанжированныеСотрудникиВсе.ФИЗЛИЦО
    И РанжирФизЛиц.Порядок = втРанжированныеСотрудникиВсе.Порядок
 
 СГРУППИРОВАТЬ ПО
  РанжирФизЛиц.ФИЗЛИЦО,
  РанжирФизЛиц.Порядок) КАК РанжирФизЛицОрганизаций
  ВНУТРЕННЕЕ СОЕДИНЕНИЕ втРанжированныеСотрудникиВсе КАК втРанжированныеСотрудникиВсе
  ПО РанжирФизЛицОрганизаций.ОРГАНИЗАЦИЯ = втРанжированныеСотрудникиВсе.ОРГАНИЗАЦИЯ
   И РанжирФизЛицОрганизаций.ФИЗЛИЦО = втРанжированныеСотрудникиВсе.ФИЗЛИЦО
   И РанжирФизЛицОрганизаций.Порядок = втРанжированныеСотрудникиВсе.Порядок

СГРУППИРОВАТЬ ПО
 РанжирФизЛицОрганизаций.ОРГАНИЗАЦИЯ,
 РанжирФизЛицОрганизаций.ФИЗЛИЦО
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
 втОсновныеОрганизацияСотрудникФизЛиц.ОРГАНИЗАЦИЯ,
 втОсновныеОрганизацияСотрудникФизЛиц.ФИЗЛИЦО,
 втОсновныеОрганизацияСотрудникФизЛиц.СОТРУДНИК,
 втРанжированныеСотрудникиВсе.ТабНомер
ИЗ
 втОсновныеОрганизацияСотрудникФизЛиц КАК втОсновныеОрганизацияСотрудникФизЛиц
  ВНУТРЕННЕЕ СОЕДИНЕНИЕ втРанжированныеСотрудникиВсе КАК втРанжированныеСотрудникиВсе
  ПО втОсновныеОрганизацияСотрудникФизЛиц.ОРГАНИЗАЦИЯ = втРанжированныеСотрудникиВсе.ОРГАНИЗАЦИЯ
   И втОсновныеОрганизацияСотрудникФизЛиц.ФИЗЛИЦО = втРанжированныеСотрудникиВсе.ФИЗЛИЦО
   И втОсновныеОрганизацияСотрудникФизЛиц.СОТРУДНИК = втРанжированныеСотрудникиВсе.СОТРУДНИК

Комментарии

Популярные сообщения из этого блога

СписокВыбора. Показать Представление вместо Значения

Вводная Если на форме есть элемент управления со списком выбора, в моем конкретном примере это Колонка Значение (Число (3,0)) с настроенным списком выбора. По умолчанию платформа отображает именно строковое значения, а не текст представления  из списка выбора (когда как при выборе значения из списка показываются именно представления). Решение Для Управляемых форм необходимо настроить правила условного оформления, для обычных форм - оформление ячеек при выводе данных.

Табличный Документ. Разная ширина колонки в строках

Когда нужно в макете (табличном документе) изменить ширину колонки  для конкретных строк: 1. Выделить всю строку (строки). Именно всю, фокус для выделенной области не работает. 2. Нажимаем и не отпускает Ctrl 3. С помощью мыши изменяют ширину любой из колонок - будет задан вопрос об создании нового формата строк - соглашаемся. Как же прекрасен мир, где для модификаций не достаточно просто использовать контекстное меню и диалог редактора свойств, где нужно знать заветные слова и таинства танца. 90ые, моё почтение. UPD Программно, тоже самое, можно сделать через ТабДок = Новый ТабличныйДокумент(); ТабДок.Область(1,,1,).СоздатьФорматСтрок(); ТабДок.Область(1,1).ШиринаКолонок = 70; ТабДок.Область(1,2).ШиринаКолонок = 30; ТабДок.Область(2,,2,).СоздатьФорматСтрок(); ТабДок.Область(2,1).ШиринаКолонок = 30; ТабДок.Область(2,2).ШиринаКолонок = 70; ТабДок.Показать();

Расширение конфигурации + Связанные документы (Режим совместимости 8.3.12)

Вводная: реализовать ввод Заказа поставщику на основании Заказа на Ремонт. решить через расширения конфигурации. Хочу обратить ваше внимание, не нужно добавлять в расширение критерий отбора, для 8.3.12 нам не доступно добавление\изменение состава критерия. Более того может зависать конфигуратор (столкнулся с последней версией 8.3.14 + ERP) Разработку рекомендую вести с применением хранилища и для расширения. Иначе устанете потом выгребать чего лишнего включили в расширение при добавлении таких или схожих обектов с составными типами и подобное. Все текущие типовые решения сейчас идут в режиме совместимости 8.3.12, в прочем и для 8.3.14 (и даже 8.3.15 ничего не поменялось). Что нам нужно было бы сделать при отказе от поддержки: 1) добавить наш документ в Критерий отбора (состав, реквизиты); 2) в раздел Ввод на основании целевого документа. И что с целью сохранения поддержки. Как сделать это же для расширения: 1) Добавить реквизит расширения Документы.ЗаказПоставщику._За