(11) Могу только один раз, а то забанят :(
Функция ПолучитьТаблицуСотрудников(// Моя переделанная функция в 247 релизе
Перем ТаблицаСотрудников; // возвращаемая таблица
Для Номер = 1 по 10 Цикл
Типы[Номер] = 0;
КонецЦикла;
Для Номер = 1 по ТипыСотрудников.РазмерСписка() Цикл
Типы[ТипыСотрудников.ПолучитьЗначение(Номер)] = ТипыСотрудников.Пометка(Номер);
КонецЦикла;
Если Типы[1]+Типы[2]+Типы[3]+Типы[4]+Типы[5]+Типы[6]+Типы[7]+Типы[8]+Типы[9]+Типы[10] = 0 Тогда
ТаблицаСотрудников = СоздатьОбъект("ТаблицаЗначений");
ТаблицаСотрудников.НоваяКолонка("Сотрудник");
Возврат ТаблицаСотрудников;
КонецЕсли;
ПустаяГруппа = ПолучитьПустоеЗначение("Справочник.Сотрудники");
ПустойДокумент = ПолучитьПустоеЗначение("Документ");
ПустоеСостояниеФизлица = ПолучитьПустоеЗначение("Перечисление.СостояниеФизлица");
Группа = СписокГрупп.ПолучитьЗначение(СписокГрупп.ТекущаяСтрока());
Если Типы[1]+Типы[2]+Типы[3]+Типы[4]+Типы[5]+Типы[6]+Типы[7]+Типы[8]+Типы[9] > 0 Тогда
ТекстЗапроса =
"//{{ЗАПРОС(Сформировать)
|Период с ДатаАктуальности по ДатаАктуальности;
|Сотрудник = Справочник.Сотрудники.ТекущийЭлемент;
|СотрРодитель = Справочник.Сотрудники.Родитель;
|СотрСостояние = Справочник.Сотрудники.СостояниеФизлица;
|СотрОсновнойЭлемент = Справочник.Сотрудники.ОсновнойЭлемент;
|Группировка Сотрудник Упорядочить по Сотрудник.Наименование без групп;
|Условие(Сотрудник.ПометкаУдаления()=0);
|//}}ЗАПРОС
;
Если ПустоеЗначение(Подразделение)=0 Тогда
ТекстЗапроса = ТекстЗапроса+"СотрПодразделение = Справочник.Сотрудники.Подразделение;"
"Условие(СотрПодразделение в Подразделение);"
КонецЕсли;
Если ТипЗначения(Группа) = 11 Тогда
Если ПустоеЗначение(Группа) = 1 Тогда
ТекстЗапроса = ТекстЗапроса + "Условие(СотрРодитель=ПустаяГруппа);"
Иначе
ТекстЗапроса = ТекстЗапроса + "Условие(Сотрудник в Группа);"
КонецЕсли;
КонецЕсли;
// сформируем условие по выбранным типам сотрудников
// заполним список возможных состояний сотрудника
УсловиеПоТипам = "";
Если Типы[1]=1 Тогда // Штатные сотрудники
УсловиеПоТипам = "(СотрСостояние=Перечисление.СостояниеФизлица.СотрудникОсновной)";
КонецЕсли;
Если Типы[3]=1 Тогда // Внешние совместители
УсловиеПоТипам = УсловиеПоТипам+?(ПустоеЗначение(УсловиеПоТипам)=0,"или","")
+"(СотрСостояние=Перечисление.СостояниеФизлица.СотрудникНеосновной)";
КонецЕсли;
Если Типы[4]=1 Тогда // Военнослужащие по контракту
УсловиеПоТипам = УсловиеПоТипам+?(ПустоеЗначение(УсловиеПоТипам)=0,"или","")
+"(СотрСостояние=Перечисление.СостояниеФизлица.ВоеннослужащийПоКонтракту)"
КонецЕсли;
Если Типы[5]=1 Тогда // Военнослужащие по призыву
УсловиеПоТипам = УсловиеПоТипам+?(ПустоеЗначение(УсловиеПоТипам)=0,"или","")
+"(СотрСостояние=Перечисление.СостояниеФизлица.ВоеннослужащийПоПризыву)"
КонецЕсли;
Если Типы[6]=1 Тогда // Госслужащие
УсловиеПоТипам = УсловиеПоТипам+?(ПустоеЗначение(УсловиеПоТипам)=0,"или","")
+"(СотрСостояние=Перечисление.СостояниеФизлица.Госслужащий)"
КонецЕсли;
Если Типы[9] = 1 Тогда // "В отпусках по уходу за детьми"
УсловиеПоТипам = УсловиеПоТипам+?(ПустоеЗначение(УсловиеПоТипам)=0,"или","")
+"(СотрСостояние=Перечисление.СостояниеФизлица.ВременноНеРаботает)"
КонецЕсли;
Если (Типы[7] = 1) и (Типы[8] = 1) Тогда
УсловиеПоТипам = УсловиеПоТипам+?(ПустоеЗначение(УсловиеПоТипам)=0,"или","")
+"(СотрСостояние=ПустоеСостояниеФизлица)"
ИначеЕсли Типы[7] = 1 Тогда // Прочие, получающие доход (Договорники) (Типы[8] = 0)
УсловиеПоТипам = УсловиеПоТипам+?(ПустоеЗначение(УсловиеПоТипам)=0,"или","")
+"(глВидРасчетаДействует(Сотрудник,,ДатаАктуальности,ДатаАктуальности)=1)и(СотрСостояние=ПустоеСостояниеФизлица)"
ИначеЕсли Типы[8] = 1 Тогда // Прочие физлица
УсловиеПоТипам = УсловиеПоТипам+?(ПустоеЗначение(УсловиеПоТипам)=0,"или","")
+"(глВидРасчетаДействует(Сотрудник,,ДатаАктуальности,ДатаАктуальности)=0)и(СотрСостояние=ПустоеСостояниеФизлица)"
КонецЕсли;
Если ПустоеЗначение(УсловиеПоТипам) = 0 Тогда
УсловиеПоТипам = "("+УсловиеПоТипам+")и(СотрОсновнойЭлемент=Сотрудник)"
КонецЕсли;
Если Типы[2] = 1 Тогда // Внутренние совместители
УсловиеПоТипам = ?(ПустоеЗначение(УсловиеПоТипам)=0,"("+УсловиеПоТипам+")или","")
+"((СотрСостояние<>ПустоеСостояниеФизлица)"
+"и(СотрОсновнойЭлемент<>Сотрудник))"
КонецЕсли;
Если (ПустоеЗначение(НачалоПериода) = 1) и (ПустоеЗначение(ОкончаниеПериода) = 0) тогда
НачалоПериода = НачМесяца(ОкончаниеПериода);
ИначеЕсли (ПустоеЗначение(ОкончаниеПериода) = 1) и (ПустоеЗначение(НачалоПериода) = 0) тогда
ОкончаниеПериода = КонМесяца(НачалоПериода);
ИначеЕсли (ПустоеЗначение(ОкончаниеПериода) = 1) и (ПустоеЗначение(НачалоПериода) = 1) и (ПустоеЗначение(ДатаАктуальности) = 0) тогда
НачалоПериода = НачМесяца(ДатаАктуальности);
ОкончаниеПериода = КонМесяца(ДатаАктуальности);
КонецЕсли;
Если (ПустоеЗначение(НачалоПериода) = 0) и (ПустоеЗначение(ОкончаниеПериода) = 0) Тогда
ТекстЗапроса = ТекстЗапроса+"Условие(("+УсловиеПоТипам+")или(УдовлетворяетСостояниеСотрудникаУсловию(Сотрудник)=1));"
Иначе
ТекстЗапроса = ТекстЗапроса+"Условие("+УсловиеПоТипам+");"
КонецЕсли;
// сформируем запрос
Запрос = СоздатьОбъект("Запрос");
Если Запрос.Выполнить(ТекстЗапроса)=0 Тогда
Возврат СоздатьОбъект("ТаблицаЗначений");
КонецЕсли;
ТаблицаСотрудников = СоздатьОбъект("ТаблицаЗначений");
ТаблицаСотрудников.НоваяКолонка("Сотрудник");
// будем исключать уволенных чтобы случайно не включить их в список
Пока Запрос.Группировка(1) = 1 Цикл
ВключитьСотрудника = 1;
Если Типы[10]=0 Тогда// убираем уволенных когда они не нужны
Периодический.ИспользоватьОбъект("СостояниеФизлица",Запрос.Сотрудник);
СостояниеФЗ = Периодический.ЗначениеНаДату(ДатаАктуальности);
// при проверке на пустое состояние физлица нужно исключить уволенных, чтобы потом их включить по отдельной галочке
Если (ПустоеЗначение(СостояниеФЗ) = 1) и (Типы[8] = 1) Тогда
// проанализируем почему попал в запрос
// 1) захотели Типы[7] = 1 договорников
// 2) захотели Типы[8] = 1 прочие физлица
Договорник = глВидРасчетаДействует(Запрос.Сотрудник,,ДатаАктуальности,ДатаАктуальности);
Если (Типы[7] = 1) и (Договорник = 1) Тогда
// включать надо
Иначе
Периодический.ОбратныйПорядок();
Периодический.ВыбратьЗначения(,ДатаАктуальности-1);
Пока Периодический.ПолучитьЗначение() = 1 Цикл
Если ПустоеЗначение(Периодический.Значение) = 0 Тогда
// условие в запросе: "Физические лица", а состояние Физлица когда-то(не обязательно в этом месяце) было непустым
// значит этот сотрудник был когда-то уволен, поэтому сейчас и пустое состояние
// значит этого сотрудника нельзя включить в запрос:
ВключитьСотрудника = 0;
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЕсли;
кОНЕЦеСЛИ;
Если ВключитьСотрудника = 1 Тогда
ТаблицаСотрудников.НоваяСтрока();
ТаблицаСотрудников.УстановитьЗначение(ТаблицаСотрудников.КоличествоСтрок(),1,Запрос.Сотрудник);
КонецЕсли;
КонецЦикла;
Иначе
ТаблицаСотрудников = СоздатьОбъект("ТаблицаЗначений");
ТаблицаСотрудников.НоваяКолонка("Сотрудник");
КонецЕсли;
// добавим уволенных в этом месяце с помощью запроса по пустому значению СостояниеФизлица:
Если Типы[10] = 1 Тогда// уволенные в текущем месяце
ТекстЗапроса =
"//{{ЗАПРОС(Сформировать)
|Период с ДатаАктуальности по ДатаАктуальности;
|Сотрудник = Справочник.Сотрудники.ТекущийЭлемент;
|СотрРодитель = Справочник.Сотрудники.Родитель;
|СотрСостояние = Справочник.Сотрудники.СостояниеФизлица;
|СотрОсновнойЭлемент = Справочник.Сотрудники.ОсновнойЭлемент;
|Группировка Сотрудник Упорядочить по Сотрудник.Наименование без групп;
|Условие(Сотрудник.ПометкаУдаления()=0);
|Условие((СотрСостояние = ПустоеСостояниеФизлица) и (СотрОсновнойЭлемент = Сотрудник));
|//}}ЗАПРОС
;
Если ПустоеЗначение(Подразделение)=0 Тогда
ТекстЗапроса = ТекстЗапроса+"СотрПодразделение = Справочник.Сотрудники.Подразделение;"
"Условие(СотрПодразделение в Подразделение);"
КонецЕсли;
Если ТипЗначения(Группа) = 11 Тогда
Если ПустоеЗначение(Группа) = 1 Тогда
ТекстЗапроса = ТекстЗапроса+"Условие(СотрРодитель=ПустаяГруппа);"
Иначе
ТекстЗапроса = ТекстЗапроса+"Условие(Сотрудник в Группа);"
КонецЕсли;
КонецЕсли;
// сформируем запрос
Запрос = СоздатьОбъект("Запрос");
Если Запрос.Выполнить(ТекстЗапроса)=0 Тогда
Возврат СоздатьОбъект("ТаблицаЗначений");
КонецЕсли;
Пока Запрос.Группировка(1) = 1 Цикл
СтрокаНайденная = "";
КолонкаНайденная = "";
// если еще не успели его ранее включить в таблицу, возможно, добавим сейчас:
Если ТаблицаСотрудников.НайтиЗначение(Запрос.Сотрудник,СтрокаНайденная,КолонкаНайденная) = 0 Тогда
Периодический.ИспользоватьОбъект("СостояниеФизлица",Запрос.Сотрудник);
НачалоПериодаФЗ = ЖЗ.НачалоПериодаПоДате(ДатаАктуальности);
СостояниеФЗВНачалеМесяца = Периодический.ЗначениеНаДату(НачалоПериодаФЗ);
Если ПустоеЗначение(СостояниеФЗВНачалеМесяца) = 0 Тогда
// этот сотрудник уволен, условие в запросе: пустое состояниефизлица, а оно было не пустым в этом месяце
ТаблицаСотрудников.НоваяСтрока();
ТаблицаСотрудников.УстановитьЗначение(ТаблицаСотрудников.КоличествоСтрок(),1,Запрос.Сотрудник);
Продолжить;
КонецЕсли;
//СостояниеФЗ = Периодический.ЗначениеНаДату(ДатаАктуальности);
Периодический.ОбратныйПорядок();
Периодический.ВыбратьЗначения(НачалоПериодаФЗ,ДатаАктуальности);
Пока Периодический.ПолучитьЗначение() = 1 Цикл
Если ПустоеЗначение(Периодический.Значение) = 0 Тогда
// этот сотрудник уволен, условие в запросе: пустое состояниефизлица, а оно было не пустым в этом месяце
ТаблицаСотрудников.НоваяСтрока();
ТаблицаСотрудников.УстановитьЗначение(ТаблицаСотрудников.КоличествоСтрок(),1,Запрос.Сотрудник);
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЦикла;
КонецЕсли;
// если передали идентификаторы колонок Дата1, Дата2 или Значение добавим соответствующие колонки...
Если ПустоеЗначение(ИдентификаторДаты1)=0 Тогда
ТаблицаСотрудников.НоваяКолонка(ИдентификаторДаты1,"Дата");
КонецЕсли;
Если ПустоеЗначение(ИдентификаторДаты2)=0 Тогда
ТаблицаСотрудников.НоваяКолонка(ИдентификаторДаты2,"Дата");
КонецЕсли;
Если ПустоеЗначение(ИдентификаторЗначения)=0 Тогда
ТаблицаСотрудников.НоваяКолонка(ИдентификаторЗначения,ТипВидЗначения,ДлинаЗначения,ТочностьЗначения);
КонецЕсли;
// ... и заполним таблицу сотрудников выбранными значениями
Для Номер = 1 по ТаблицаСотрудников.КоличествоСтрок() Цикл
Если ПустоеЗначение(ИдентификаторДаты1)=0 Тогда
ТаблицаСотрудников.УстановитьЗначение(Номер,ИдентификаторДаты1,Дата1);
КонецЕсли;
Если ПустоеЗначение(ИдентификаторДаты2)=0 Тогда
ТаблицаСотрудников.УстановитьЗначение(Номер,ИдентификаторДаты2,Дата2);
КонецЕсли;
Если ПустоеЗначение(ИдентификаторЗначения)=0 Тогда
ТаблицаСотрудников.УстановитьЗначение(Номер,ИдентификаторЗначения,Значение);
КонецЕсли;
КонецЦикла;
Возврат ТаблицаСотрудников
КонецФункции // ПолучитьТаблицуСотрудников