Имя: Пароль:
1C
1С v8
ЗУП3: получить всех сотрудников, относящихся к определенным подразделениям
0 Айвонттубифри
 
20.08.19
14:17
ЗУП3
Есть перечень подразделений. Как программно получить всех сотрудников этих подразделений, чтобы в дальнейшем с полученным списком сотрудников можно было работать типовой функцией
КадровыйУчет.КадровыеДанныеСотрудников(Истина, СписокСотрудников, ИменаКадровыхДанных, ДатаОтчета);
1 Натуральный Йог
 
20.08.19
14:20
(0) Никак, нужен перечень сотрудников
2 Said_We
 
20.08.19
14:54
РС.КадроваяИсторияСотрудников реквизитом идет Подразделение.
Срез на дату и фильтр по подразделению.
3 Айвонттубифри
 
20.08.19
15:02
(2) Использовать в ЗУП3 РС.КадроваяИсторияСотрудников - уже не в тренде) Поскольку появился уже РС.КадроваяИсторияСотрудниковИнтервальный.

Может есть какая-то типовая функция?
4 Айвонттубифри
 
20.08.19
15:03
(1) Так мне как раз сотрудников и надо получить из определенных подразделений.
5 Натуральный Йог
 
20.08.19
15:09
(4)КадровыйУчет.КадровыеДанныеСотрудников()
оно?
6 sqr4
 
20.08.19
15:14
(0) очевидно что туда нужно загнать весь список сотрудников и отобрать только тех, у которых нужные подразделения. В плане производительности, конечно лучше запрос к интервальному, в плане долговечности неуверен)
7 unenu
 
20.08.19
15:39
(0)


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

Функция Расш1_ФизЛицоРазрешенное(ФизЛицо) Экспорт
    Если НЕ ЗначениеЗаполнено(ФизЛицо) Тогда
        Возврат Истина;
    КонецЕсли;
    Запрос = Новый Запрос;
    Запрос.Текст = Расш1_Получить_ТекстСекции_ВтФизЛицаРазрешенныхПодразделений(Ложь, Истина);
    Запрос.УстановитьПараметр("Расш1__ФизЛицо", ФизЛицо);
    Запрос.УстановитьПараметр("Расш1__мРазрешенныеПодразделения", Расш1_ПраваДоступаСервер.ПолучитьРазрешенныеПодразделения());
    Возврат НЕ Запрос.Выполнить().Пустой();
КонецФункции
8 sqr4
 
20.08.19
15:43
(7) все сломается, когда нужно будет прошлую дату ввести
9 unenu
 
20.08.19
15:47
(8) работает четко, диспут вести лень - 100 пользовтелей ЗУПа не заметили, что-то сломалось в ограничениях списков.
т
10 unenu
 
20.08.19
15:49
да и при чем тут дата? если посмотреть этот "типовой" запрос, то поля с датой там константы и ничего вводить не надо
11 Grekos2
 
20.08.19
15:54
а почему неправильно воспользоваться регистром сведений  - КадроваяИсторияСотрудников ?
12 unenu
 
20.08.19
15:55
(11) он устарел и выполняет декоративные функции пока не выпилили совсем
13 sqr4
 
20.08.19
15:56
(9) в том что мне надо показать кадрвые данные за 2018 год, ваш запрос выдаст только текущие данные, так что в качестве  универсального, ваш метод - пшик
14 sqr4
 
20.08.19
15:59
Для динамического списка, да отлично, поэтому и сделано так в типовой, но для какого либо отчета, данный метод не подходит.
15 unenu
 
20.08.19
16:01
(13) а вы попробуйте подумать над текстом запроса, испытать, посмотреть на результат и потом уже
аргументированно делать категоричные заявления.

повторяю
- запрос не мой, а чуток урезанный из типового
- результат испытан в реале.

усехов
16 unenu
 
20.08.19
16:03
(14) если дружить с головой, то можно и в отчет.

а так, да - универсальных решений не существует, но это не повод их не искать.
17 sqr4
 
20.08.19
16:12
(15) я вижу текст запроса, я вижу регистр из которого вы тяните данные. И если не быть тупым и посмотреть структуру регистра, а также его периодичность - "Непериодический". То сразу станет ясно, что получить историю за прошлый период из него физически невозможно. А то что он испытан в реале, это проблема испытателей, принимающих и оплачивающих данную работу.
(16) А вот 1с заявляет, что в ЗУПе как раз такая универсальная вещь есть и если посмотреть любой типовой запрос, то она становится очевидной, по наличию виртуальных таблиц "пустышек/шаблонов".

И если вы, мягко говоря не компетентны, и не совсем разбираетесь в вопросе, то зачем вы спорите, да еще и переходя на оскорбления.
18 sqr4
 
20.08.19
16:12
*типовой отчет
19 d4rkmesa
 
20.08.19
16:20
(0) КадровыйУчет.СотрудникиОрганизации(Истина, ПараметрыПолучения)
20 Айвонттубифри
 
20.08.19
16:24
(19) Похоже на то, что мне нужно, спасибо! А как в ПараметрыПолучения добавить список подразделений? Есть ли у кого-то что-то готовое?
21 sqr4
 
20.08.19
16:26
(20) а там есть описание этой функции
22 sqr4
 
20.08.19
16:27
(20) думаю глобальный поиск по конфе этой функции много примеров выдаст
23 d4rkmesa
 
20.08.19
16:29
(20)
ПараметрыПолученияСотрудников = КадровыйУчет.ПараметрыПолученияСотрудниковОрганизацийПоСпискуФизическихЛиц();
ПараметрыПолученияСотрудников.Организация      = Объект.Организация;
ПараметрыПолученияСотрудников.Подразделение    = Объект.Подразделение;
ПараметрыПолученияСотрудников.НачалоПериода    = Объект.ПериодРегистрации;
ПараметрыПолученияСотрудников.ОкончаниеПериода = КонецМесяца(Объект.ПериодРегистрации);    КадровыйУчетРасширенный.ПрименитьОтборПоФункциональнойОпцииВыполнятьРасчетЗарплатыПоПодразделениям(ПараметрыПолученияСотрудников);
Объект.Сотрудники.Загрузить(КадровыйУчет.СотрудникиОрганизации(Истина, ПараметрыПолученияСотрудников));
24 d4rkmesa
 
20.08.19
16:31
(23) Первый попавшийся кусок кода. В подразделения массив можно класть.
25 Айвонттубифри
 
20.08.19
16:31
ПараметрыПолученияСотрудников                  = КадровыйУчет.ПараметрыПолученияСотрудниковОрганизацийПоСпискуФизическихЛиц();
ПараметрыПолученияСотрудников.Организация      = Организация;
ПараметрыПолученияСотрудников.Подразделение    = Подразделение;
ПараметрыПолученияСотрудников.ОкончаниеПериода = Период;
ТаблицаСотрудников = КадровыйУчет.СотрудникиОрганизации(Истина, ПараметрыПолученияСотрудников);

Как сюда передать подразделения в виде массива или ТЗ?
26 d4rkmesa
 
20.08.19
16:32
(25) Создать массив и присвоить.
27 Айвонттубифри
 
20.08.19
16:34
(26) Не посмотрела ваш ответ в (24), что в качестве параметра можно подразделения в массив занести. Буду пробовать, спасибо!
28 Said_We
 
20.08.19
16:59
(3) Ну это смотря какой релиз. Я открыл тот что был под рукой. Так там нет РС.КадроваяИсторияСотрудниковИнтервальный.
Не суть важно. Важно что надо сначала из РС получить этот список. В любом случае это дата среза с фильтром по подразделению. + не знаю есть там дата окончания действия и значения окончания в этом новом РС или нет.
29 Айвонттубифри
 
20.08.19
17:02
(28) Вы ошибаетесь: в ЗУП3 в корне поменялась логика программирования. Все данные для самописных отчетов крайне   желательно получать типовыми функциями, а не тянуть из регистров.
30 unenu
 
20.08.19
17:04
(17) в моих сообщениях не было эмоций и оценок вашей личности - только часть моей картины мира в проекции на ЗУП.
ваш переход на личности выглядит нелепо)
31 unenu
 
20.08.19
17:27
+ (28). Более того динамических списки стали декларативными, т.е. если мы откроем форму, то увидим там некие поля и настройки. При создания формы запрос списка модифицируется программно в зависимости от отборов и прав посредством методов общих модулей. Отяеты также декларативные с механизмом представлений.

Что касается регистра который я показал в запросе и невольно спровоцировал истерики, то там есть поля датаначала и датаокончания. Наличие этих полей - это признак интервальной философии учета, который разработчики ЗУПА используют
вместо периодических регистров. Простая модификация условий ведет нас к "истории".
Я понимаю, что кому-то ближе патефон и теплый ламповый свет периодических регистров как было в ЗИК, но в ЗУП все
меньше "старой" логики.
32 Grekos2
 
20.08.19
18:03
Сделал как в (25)
Выдало в том числе и уволенных.
33 Айвонттубифри
 
20.08.19
18:15
(32) Я думаю, уволенных затем можно отсечь типовой функцией КадровыйУчет.КадровыеДанныеСотрудников(Истина, СписокСотрудников, ИменаКадровыхДанных, ДатаОтчета),
где проверять на заполненность ДатаУвольнения путем ИменаКадровыхДанных = "ДатаУвольнения".

P.S. Возможно есть более элегантное решение...
34 unenu
 
20.08.19
18:16
(32) в методах общих модулей есть параметр ВключаяРанееУволенных. где-то вы его забыли установить.
проще прочесть описания методов и использовать их параметры, сложнее рассказать как это работает.
35 mmmarat
 
20.08.19
18:19
(32) замените функцию на СоздатьВт СотрудникиОрганизации,  добавьте ДатаУвольнения в кадровые данные,  выберите данные запросом из полученной Вт с отбором на пустую дату увольнения. Отборы по подразделениям при желании можно задать в запросе.
36 Grekos2
 
20.08.19
18:40
ПараметрыПолученияСотрудников                  =
        КадровыйУчет.ПараметрыПолученияСотрудниковОрганизацийПоСпискуФизическихЛиц();
    ПараметрыПолученияСотрудников.Организация      = Организация;
    ПараметрыПолученияСотрудников.Подразделение    = Подразделение;
    ПараметрыПолученияСотрудников.ОкончаниеПериода = ДатаАкт;
    ПараметрыПолученияСотрудников.НачалоПериода = ДатаАкт;
    ПараметрыПолученияСотрудников.ВключаяУволенныхНаНачалоПериода = Ложь;

       ТаблицаСотрудников = КадровыйУчет.СотрудникиОрганизации(Истина, ПараметрыПолученияСотрудников);

       Вот как надо :)) !!!
37 Айвонттубифри
 
22.08.19
18:21
+(25) Посмотрела, если использовать КадровыйУчет.СотрудникиОрганизации(Истина, ПараметрыПолученияСотрудников), то в параметрах Подразделения в виде массива передавать нельзя, т.к. в описании написано:

/ Возвращает структуру параметров для СоздатьВТСотрудникиОрганизаций.
//
// Возвращаемое значение:
//   Структура - Содержит ключи:
//                Организация         - СправочникСсылка.Организации, если параметр опустить в таблицу войдут все сотрудник
//                                        независимо от организации.
//                ОтбиратьПоГоловнойОрганизации - если Истина, то отбор по головной организации, иначе по текущей организации.
//                                                По умолчанию - ЛОЖЬ
//                Подразделение         - СправочникСсылка.ПодразделенияОрганизаций, в таблицу войдут сотрудники указанного подразделения
//                                        и всех подразделений, подчиненных указанному, если параметр опустить в таблицу войдут все сотрудники.
//                СписокФизическихЛиц - Массив ссылок на элементы справочника ФизическиеЛица, если параметр опустить,
//                                        в таблицу войдут сотрудники всех физических лиц когда либо работавших в Организации.
//                НачалоПериода         - Дата, значение по умолчанию '00010101'. Если параметр устанавливается, параметр ОкончаниеПериода
//                                        обязателен к заполнению.
//                ОкончаниеПериода    - Дата, значение по умолчанию '00010101'. При установке должно выполняться условие
//                                        ОкончаниеПериода >= НачалоПериода. Используется для выборки кадровых данных сотрудников, если
//                                        параметр не указан, выборка будет производиться на текущую дату сеанса.
//                КадровыеДанные        - Строка, содержит список полей кадровых данных, см. описание к функции КадровыеДанныеСотрудников.
//                Отборы                - Массив, структур описывающих отборы сотрудников
//                                        см. ЗарплатаКадрыОбщиеНаборыДанных.ДобавитьВКоллекциюОтбор,
//                                        допустимые отборы описаны см. КритерииПоискаСотрудниковПоКоллекцииОтборов.
//
Функция ПараметрыПолученияСотрудниковОрганизацийПоСпискуФизическихЛиц() Экспорт
    
    Возврат КадровыйУчетВнутренний.ПараметрыПолученияСотрудниковОрганизацийПоСпискуФизическихЛиц();
    
КонецФункции



Как тогда отобрать сотрудников определенных подразделений (подразделения уже в массиве есть)? Ниже код не срабатывает:

ПараметрыПолученияСотрудников = КадровыйУчет.ПараметрыПолученияСотрудниковОрганизацийПоСпискуФизическихЛиц();
ПараметрыПолученияСотрудников.Подразделение    = мПодразделений;   //вот здесь массив подразделений
ПараметрыПолученияСотрудников.ОкончаниеПериода = НаДату;
ПараметрыПолученияСотрудников.ВключаяУволенныхНаНачалоПериода = Ложь;
ПараметрыПолученияСотрудников.РаботникиПоДоговорамГПХ = Ложь;

ТаблицаСотрудников = КадровыйУчет.СотрудникиОрганизации(Истина, ПараметрыПолученияСотрудников);
38 Grekos2
 
22.08.19
18:32
(37)  у меня (36) срабатывает.
      Проверял для одного подразделения и для более чем одного.
      ПараметрыПолученияСотрудников.Подразделение    = Подразделение; //тут у меня массив
39 Айвонттубифри
 
22.08.19
18:36
Попробовала запихнуть массив подразделений (мПодразделений) в Отбор, тоже ошибку выдает:


ПараметрыПолученияСотрудников = КадровыйУчет.ПараметрыПолученияСотрудниковОрганизацийПоСпискуФизическихЛиц();
//ПараметрыПолученияСотрудников.Подразделение    = мПодразделений;  //вот здесь массив подразделений
ПараметрыПолученияСотрудников.ОкончаниеПериода = НаДату;
ПараметрыПолученияСотрудников.ВключаяУволенныхНаНачалоПериода = Ложь;
ПараметрыПолученияСотрудников.РаботникиПоДоговорамГПХ = Ложь;

//дописала(+
Отборы = Новый Массив;
ЗарплатаКадрыОбщиеНаборыДанных.ДобавитьВКоллекциюОтбор(Отборы, "Подразделение", "В", мПодразделений);
ПараметрыПолученияСотрудников.Отборы = Отборы;
//+)

ТаблицаСотрудников = КадровыйУчет.СотрудникиОрганизации(Истина, ПараметрыПолученияСотрудников);
40 Айвонттубифри
 
22.08.19
18:44
+(39) Выдает ошибку:

{ОбщийМодуль.КадровыйУчет.Модуль(2785)}: Ошибка при вызове метода контекста (Выполнить)
        Запрос.Выполнить();
по причине:
{(76, 37)}: Неверные параметры
И (РегистрСведений.Подразделение В(<<?>>&ВТСотрудникиПоУсловиямПоиска_Параметр1))
41 Grekos2
 
22.08.19
18:47
Версия 3.1.10.78
42 Айвонттубифри
 
22.08.19
18:49
(41) Нет, версия ЗУП 3.1.9.187 у меня.
43 Grekos2
 
22.08.19
18:52
Возможно дело в этом.
У меня определенно срабатывает код в (36)
44 Айвонттубифри
 
22.08.19
18:56
(43) Странно... Но мне как-то надо решить эту проблему ((
45 d4rkmesa
 
22.08.19
21:34
(43) Вряд ли, я тестил на 3.1.8, все получилось.
(44) Скорее всего дело в типе. Там нужен массив, скорее всего, ну или список значений, как в обычных запросах. Отборы, как вы создаете, нужны для других процедур, когда нужно заполнить ВТ менеджера запросов. Как и в (36), код работает:

ПараметрыПолученияСотрудников = КадровыйУчет.ПараметрыПолученияСотрудниковОрганизацийПоСпискуФизическихЛиц();
ПараметрыПолученияСотрудников.Организация      = Справочники.Организации.ОрганизацияПоУмолчанию();
ПараметрыПолученияСотрудников.Подразделение    = Объект.Подразделения;  //реквизит типа СписокЗначений
ПараметрыПолученияСотрудников.НачалоПериода = ТекущаяДатаСеанса();
ПараметрыПолученияСотрудников.ОкончаниеПериода = ТекущаяДатаСеанса();  
ПараметрыПолученияСотрудников.ВключаяУволенныхНаНачалоПериода = Ложь;
ТаблицаСотрудников = КадровыйУчет.СотрудникиОрганизации(Истина, ПараметрыПолученияСотрудников);
Сообщить(ТаблицаСотрудников.Количество());
46 Айвонттубифри
 
23.08.19
12:04
(45) Разобралась, все заработало! Массив подразделений в качестве параметра в функции КадровыйУчет.СотрудникиОрганизации(Истина, ПараметрыПолученияСотрудников) передавать можно! У меня была ошибка при создании массива в другом коде.

Всем СПАСИБО!!!
2 + 2 = 3.9999999999999999999999999999999...