Имя: Пароль:
1C
1С v8
Зуп 3.1. Работающие сотрудники
,
0 JuliaT99
 
07.11.17
11:51
Уважаемые специалисты! Подскажите пожалуйста, как выбрать работающих сотрудников на конкретную дату. Желательно какой запрос. Или хотя бы какой регистр?
1 Amra
 
07.11.17
11:51
РС КадроваяИсторияСотрудников
2 SleepyHead
 
гуру
07.11.17
12:04
Пользуйся общим модулем "КадровыйУчет", функцией "КадровыеДанныеСотрудников", почитай в общем модуле, как ею пользоваться.

С ее помощью получай дату приема и дату увольнения, и смотри, как они соотносятся с твоей датой.
3 SleepyHead
 
гуру
07.11.17
12:07
Вот примерно так:

// предварительно сформировать список сотрудников
ТЗ = КадровыйУчет.КадровыеДанныеСотрудников(Истина, СписокСотрудников, "ДатаПриема,ДатаУвольнения", ТвояДата);

Для Каждого Стр из ТЗ Цикл
   Если ЗначениеЗаполнено(Стр.ДатаПриема) И Стр.ДатаПриема>ТвояДата Тогда
      // еще не принят
   ИначеЕсли ЗначениеЗаполнено(Стр.ДатаУвольнения) И Стр.ДатаУвольнения<ТвояДата Тогда
      // уже уволен
   Иначе
      // этот нам нужен
      А = Стр.Сотрудник;
   КонецЕсли;
КонецЦикла;
4 kumena
 
07.11.17
12:11
> Вот примерно так:

во времена 8.0 за выгрузку в ТЗ и перебор циклом сразу линейкой по рукам давали.
5 SleepyHead
 
гуру
07.11.17
12:13
(4) Вам с шашечками или ехать? Ну наверните крутой запрос, только вангую, по времени исполнения будет так же, а на разработку времени затратите больше.

Можно по регистру ТекущиеКадровыеДанные сделать, но тогда на заданную дату не получится.
6 SleepyHead
 
гуру
07.11.17
12:13
(4) И кроме того, функции этого модуля используются в стандартных кадровых отчетах. Идите дайте линейкой нынешней команде разработчиков ЗУП 3.
7 kumena
 
07.11.17
12:20
> Вам с шашечками или ехать?

я грамотные запросы уже много лет пишу

>  наверните крутой запрос, только вангую, по времени исполнения будет так же, а на разработку времени затратите больше.

грамотный запрос один раз написать надо и потом везде можно использовать.

> И кроме того, функции этого модуля используются в стандартных кадровых отчетах.

понятна причина тормозов третьего зупа.


> Идите дайте линейкой нынешней команде разработчиков ЗУП 3.

подозреваю, что даже если будет такая возможность, то это вряд ли им поможет правильно программы делать.
8 SleepyHead
 
гуру
07.11.17
12:23
(7) Человеку похоже надо разово решить проблему. Что-нибудь слышали о соотношении затраченных усилий к полученному результату?
9 dnab
 
07.11.17
12:23
Тебе для СКД или для обработок?
Вот запрос для СКД из типового отчета КадроваяИсторияСотрудников:

ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ
    Сотрудники.Ссылка КАК Сотрудник,
    &НачалоПериода КАК НачалоПериода,
    &ОкончаниеПериода КАК ОкончаниеПериода
ПОМЕСТИТЬ ВТСотрудники
ИЗ
    Справочник.Сотрудники КАК Сотрудники
{ГДЕ
    Сотрудники.Ссылка.* КАК Сотрудник,
    Сотрудники.Код КАК ТабельныйНомер,
    Сотрудники.ФизическоеЛицо.*,
    Сотрудники.ГоловнаяОрганизация.*,
    Сотрудники.ТекущийПроцентСевернойНадбавки КАК ПроцентСевернойНадбавки,
    Сотрудники.ФизическоеЛицо.Пол КАК Пол,
    Сотрудники.ФизическоеЛицо.ДатаРождения КАК ДатаРождения,
    Сотрудники.ФизическоеЛицо.ИНН КАК ИНН,
    Сотрудники.ФизическоеЛицо.СтраховойНомерПФР КАК СтраховойНомерПФР,
    Сотрудники.ФизическоеЛицо.МестоРождения КАК МестоРождения}
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
    Сотрудники.Сотрудник КАК Сотрудник,
    Сотрудники.НачалоПериода КАК Период
ПОМЕСТИТЬ ВТИзмеренияДатыДляСрезаПоследних
ИЗ
    ВТСотрудники КАК Сотрудники
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
    ДАТАВРЕМЯ(1, 1, 1) КАК Период,
    ДАТАВРЕМЯ(1, 1, 1) КАК ПериодЗаписи,
    ЗНАЧЕНИЕ(Справочник.Сотрудники.ПустаяСсылка) КАК Сотрудник,
    ЗНАЧЕНИЕ(Документ.ПриемНаРаботу.ПустаяСсылка) КАК Регистратор,
    ЗНАЧЕНИЕ(Справочник.Организации.ПустаяСсылка) КАК ГоловнаяОрганизация,
    ЗНАЧЕНИЕ(Справочник.ФизическиеЛица.ПустаяСсылка) КАК ФизическоеЛицо,
    ЗНАЧЕНИЕ(Справочник.Организации.ПустаяСсылка) КАК Организация,
    ЗНАЧЕНИЕ(Справочник.ПодразделенияОрганизаций.ПустаяСсылка) КАК Подразделение,
    ЗНАЧЕНИЕ(Перечисление.ВидыКадровыхСобытий.ПустаяСсылка) КАК ВидСобытия,
    ЗНАЧЕНИЕ(Справочник.ШтатноеРасписание.ПустаяСсылка) КАК ДолжностьПоШтатномуРасписанию,
    0 КАК КоличествоСтавок,
    ЗНАЧЕНИЕ(Справочник.Должности.ПустаяСсылка) КАК Должность,
    ЗНАЧЕНИЕ(Перечисление.ВидыЗанятости.ПустаяСсылка) КАК ВидЗанятости
ПОМЕСТИТЬ Представления_СрезПоследних_КадроваяИсторияСотрудников
ИЗ
    ВТИзмеренияДатыДляСрезаПоследних КАК ИзмеренияДатыДляСрезаПоследних
ГДЕ
    "ТолькоРазрешенные" = ИСТИНА
Только не забудь в модуле отчета добавить:

Процедура ИнициализироватьОтчет() Экспорт    
    ЗарплатаКадрыОбщиеНаборыДанных.ЗаполнитьОбщиеИсточникиДанныхОтчета(ЭтотОбъект);
    
КонецПроцедуры

Если для обработок, то как в (3), хотя есть и другие методы.
Но просто и по одной таблице сейчас не получится. Документации нет, только смотреть примеры в типовой конфе.
10 SleepyHead
 
гуру
07.11.17
12:24
(7)"грамотный запрос один раз написать надо и потом везде можно использовать. "


Какая наивность.. Смена структуры данных в очередном релизе и он уже не работает.
11 dnab
 
07.11.17
12:25
(9)+ посмотрел в отладчике, что получилось из запроса в (9) после замены по шаблону и опупел .
12 SleepyHead
 
гуру
07.11.17
12:26
(11) А представь, как девочка автор опупеет.
13 dnab
 
07.11.17
12:27
еще забыл, в (9) в модуле отчета конечно же самое главное:

Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    
    ИнициализироватьОтчет();
    
КонецПроцедуры
14 dnab
 
07.11.17
12:30
(12) плохо, что ничего не документировано, на партнерском молчат. Причем разработчики молчат, потому что у них нет времени, они не успевают, 200 ошибок зарегистрировано и еще больше вопросов у пользователей. Но и партнеры там молчат, похоже мало кто еще в этом разбирался.
15 Akela has missed
 
07.11.17
12:32
(5) Почему нельзя сделать так?

    Запрос = Новый Запрос();
    Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
    Запрос.УстановитьПараметр("Период", КонецДня(ДатаСреза));
    
    Запрос.Текст =
        "ВЫБРАТЬ РАЗРЕШЕННЫЕ
        |    Сотрудники.Ссылка КАК Сотрудник,
        |    &Период КАК Период
        |ПОМЕСТИТЬ ВТСотрудникиПериоды
        |ИЗ
        |    Справочник.Сотрудники КАК Сотрудники
        |ГДЕ
        |    Сотрудники.Ссылка = Сотрудники.ГоловнойСотрудник";
    Запрос.Выполнить();
    
    ОписательВременныхТаблиц = КадровыйУчет.ОписательВременныхТаблицДляСоздатьВТКадровыеДанныеСотрудников(
        Запрос.МенеджерВременныхТаблиц,
        "ВТСотрудникиПериоды");
    КадровыеДанные = "ДатаУвольнения";
    КадровыйУчет.СоздатьВТКадровыеДанныеСотрудников(ОписательВременныхТаблиц, Истина, КадровыеДанные);
    
    Запрос.Текст =
        "ВЫБРАТЬ
        |    КадровыеДанныеСотрудников.Сотрудник КАК Сотрудник
        |ПОМЕСТИТЬ ВТРаботающиеСотрудники
        |ИЗ
        |    ВТКадровыеДанныеСотрудников КАК КадровыеДанныеСотрудников
        |ГДЕ
        |    КадровыеДанныеСотрудников.ДатаУвольнения = ДАТАВРЕМЯ(1, 1, 1)
        |;
        |
        |////////////////////////////////////////////////////////////////////////////////
        |УНИЧТОЖИТЬ ВТКадровыеДанныеСотрудников
        |;
16 Amra
 
07.11.17
12:40
(14) Партнеры с опытом работают, а не на партнерках отвечают - для этого там фирма 1С есть. А какую документацию то надо? "Список работающих сотрудников можно получить так"?. Да и куча ньюансов все равно, некоторые конторы договорников считают сотрудниками, некоторые внутренних совместителей не учитывают и т.д...
17 dnab
 
07.11.17
12:47
(16) выпустить методичку или на ИТС статью.
Для регистров, у которых естьпарный регистр Интервальный, есть такие то методы, имя метода так-то составляется. Для учета рабочего времени есть такие программные интерфейсы, для планового такие. итд. Но структурированно конечно надо все прописать.
Очень много времени уходит на просмотр общих модулей и примеров кода в типовой. Еще и не все методы имеют подробный комментарий.
18 Amra
 
07.11.17
13:13
(17) А когда такое вообще было? Ни разу не видел методичек по коду
19 kumena
 
07.11.17
13:14
> Что-нибудь слышали о соотношении затраченных усилий к полученному результату?

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


> Какая наивность.. Смена структуры данных в очередном релизе и он уже не работает.

это отмазка твоя. я не верю, что разработчики из 1с настолько без головы, чтобы структуру от релиза к релизу менять.
20 kumena
 
07.11.17
13:15
+19 причем структуру основных регистров программы, которой уже не первый год.
21 Джо-джо
 
07.11.17
13:16
(6) Да им давно пора доской по морде
22 supersonic
 
07.11.17
13:22
Можно поинтересоваться у сообщества, чем плох такой простенький запрос.

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

p.s как это оформить как код на форуме?
Спасибо.
23 dnab
 
07.11.17
13:24
(20) поменяли же, причем с год назад всего, при выпуске 3.1.1 или 3.1.2. Это когда интервальные регистры появились.
Поэтому разработчики и не рекомендуют напрямую с регистрами работать.
Логику работы того, что реализовно в типовой иной раз сложно понять. А пояснений очень мало.
Например я недавно узнал что, что в регистр ГрафикиРаботыПоВидамВремени записи по сотрудникам пишутся при расчете документа Начисление зарплаты. Не при записи, не при проведении, а при расчете.
24 KnightAlone
 
07.11.17
13:24
(22) по интервальному регистру лучше собирай. в обычном данных может не быть
25 dnab
 
07.11.17
13:24
(22) а как же события ДО?
26 KnightAlone
 
07.11.17
13:28
ВЫБРАТЬ РАЗРЕШЕННЫЕ
    Сотрудники.Ссылка КАК Ссылка,
    ГрафикРаботыСотрудниковИнтервальный.ГрафикРаботы КАК ГрафикРаботы,
    КадроваяИсторияСотрудниковИнтервальный.Подразделение КАК Подразделение
ИЗ
    Справочник.Сотрудники КАК Сотрудники
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ГрафикРаботыСотрудниковИнтервальный КАК ГрафикРаботыСотрудниковИнтервальный
        ПО Сотрудники.Ссылка = ГрафикРаботыСотрудниковИнтервальный.Сотрудник
            И (ГрафикРаботыСотрудниковИнтервальный.ДатаНачала <= ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&ДатаСреза, ДЕНЬ), МИНУТА, 10))
            И (ГрафикРаботыСотрудниковИнтервальный.ДатаОкончания >= НАЧАЛОПЕРИОДА(&ДатаСреза, ДЕНЬ))
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КадроваяИсторияСотрудниковИнтервальный КАК КадроваяИсторияСотрудниковИнтервальный
        ПО Сотрудники.Ссылка = КадроваяИсторияСотрудниковИнтервальный.Сотрудник
            И (КадроваяИсторияСотрудниковИнтервальный.ДатаНачала <= ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&ДатаСреза, ДЕНЬ), МИНУТА, 10))
            И (КадроваяИсторияСотрудниковИнтервальный.ДатаОкончания >= НАЧАЛОПЕРИОДА(&ДатаСреза, ДЕНЬ))
ГДЕ
    Сотрудники.Ссылка = &Сотрудник
27 JuliaT99
 
07.11.17
13:28
Очень приглянулся 22. Там и основных можно отобрать.
25- что может быть не так?
28 KnightAlone
 
07.11.17
13:29
я как-то так делал. если есть что поправить - пишите. 10 минут прибавлял, так как там не на начало дня запись в интервальном, а с секундами
29 KnightAlone
 
07.11.17
13:31
ну и ГДЕ заменить на
30 KnightAlone
 
07.11.17
13:31
ГДЕ
    КадроваяИсторияСотрудниковИнтервальный.ВидСобытия <> ЗНАЧЕНИЕ(Перечисление.ВидыКадровыхСобытий.Увольнение)
31 dnab
 
07.11.17
13:38
вот пример из интервального по одному сотруднику, для которого сделали временный перевод с 01.06 по 25.06
http://fastpic.ru/view/94/2017/0622/0324390b67534b16311b7bb7896a10d1.png.html
Секунды и минуты в периодах доставляют.
32 KnightAlone
 
07.11.17
13:47
как я понял, там у приема + 20 сек, у перевода + 60 сек, потому накидывал 10 минут на всякий пожарный. но да, Л - логика

на мой взгляд надо руки пооткрывать тому, кто придумал так код в типовых писать. 10 переходов между функциями, чтобы 1-2 строки кода получить в итоге. в результате отладка чего-то сколько-нибудь сложного превращается в аттракцион -я путешествую по всем модулям конфы, в процессе уже и забыл зачем путешествую.
если делается это для 1 раз сделал и больше никогда не возвращаться - читайте советы выше и делайте, как в типовой. иначе смена релиза - и новые ингральные и синусоидальные регистры и все переделывать
33 KnightAlone
 
07.11.17
13:54
в реалиях, когда звонят и просят сделать отчет еще вчера, набросать запрос в консоли и выложить его внешние отчеты гораздо быстрее, чем понять логику простынок из (9). если есть время, то лучше опираться на типовое, прикрутив к нему свои доработки
34 Akela has missed
 
07.11.17
14:16
(32) что если количество событий на дату превысит ваши 10 минут?
Поэтому при получении "среза" в этих регистрах дата актуального события всегда равна концу дня.
35 KnightAlone
 
07.11.17
14:25
(34) можно уточнить, что там за события такие? кроме приема, перемещения и увольнения? Причем в день одно событие только может быть по большому счету.
если боитесь наплыва событий, делайте вызовом типовых функций.
у меня только сейчас появилась возможность рефакторингом кода заниматься, а в начале года, когда 3.1 внедрялся, время было набросать запрос, проверить, что данные нормально возвращает, и в работу его
36 Akela has missed
 
07.11.17
14:55
(35) на одну дату можно оформить более одного документа того же самого перемещения. Актуальным будет самый поздний. В регистр они попадут одной датой, и различаются только секундами.

Так что я не боюсь, а предостерегаю остальных от возможных ошибок: при получении среза, подставляйте в параметр конец дня, а не взятые с потолка +10 минут.
37 kumena
 
07.11.17
14:59
> на одну дату можно оформить более одного документа того же самого перемещения.

а можно узнать, какой практический смысл в этом?
38 KnightAlone
 
07.11.17
15:15
вот пример с реальной рабочей базы:
перемещение с 01.07 в регистре делает запись с датой начала 01.07.2016 0:01:00, дата окончания 3999 год. потом проводят еще одно кадровое перемещение, эта запись с 3999 годом заменяется на дату окончания 03.10.2016 0:00:59, следующая запись начинается с 03.10.2016 0:01:00 и это уже новое кадровое перемещение. что тут за логика - вопрос к 1С. получается если смотреть на 03.10.2016 0:00:20 он вроде как в старом подразделении все еще числится, хотя по факту он уже в новом. возможно лучше делать срез на конец дня, я не проверял, будут ли там какие-то еще нюансы
39 Akela has missed
 
07.11.17
15:16
(37) Например одним кадровым приказом изменили оклад. Вторым перевели в другое место, где полагается еще какое нибудь плановое начисление, а наравне с ним в таблице снова фигурирует оклад.

Получается на одну дату ты проводишь изменение оклада два раза.
40 KnightAlone
 
07.11.17
15:28
(39) посмотрел, похоже так правильней будет, исправлю, спасибо.

ВЫБРАТЬ РАЗРЕШЕННЫЕ
    Сотрудники.Ссылка КАК Ссылка,
    ГрафикРаботыСотрудниковИнтервальный.ГрафикРаботы КАК ГрафикРаботы,
    КадроваяИсторияСотрудниковИнтервальный.Подразделение КАК Подразделение
ИЗ
    Справочник.Сотрудники КАК Сотрудники
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ГрафикРаботыСотрудниковИнтервальный КАК ГрафикРаботыСотрудниковИнтервальный
        ПО Сотрудники.Ссылка = ГрафикРаботыСотрудниковИнтервальный.Сотрудник
            И (ГрафикРаботыСотрудниковИнтервальный.ДатаНачала <= КОНЕЦПЕРИОДА(&ДатаСреза, ДЕНЬ))
            И (ГрафикРаботыСотрудниковИнтервальный.ДатаОкончания >= КОНЕЦПЕРИОДА(&ДатаСреза, ДЕНЬ))
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КадроваяИсторияСотрудниковИнтервальный КАК КадроваяИсторияСотрудниковИнтервальный
        ПО Сотрудники.Ссылка = КадроваяИсторияСотрудниковИнтервальный.Сотрудник
            И (КадроваяИсторияСотрудниковИнтервальный.ДатаНачала <= КОНЕЦПЕРИОДА(&ДатаСреза, ДЕНЬ))
            И (КадроваяИсторияСотрудниковИнтервальный.ДатаОкончания >= КОНЕЦПЕРИОДА(&ДатаСреза, ДЕНЬ))
ГДЕ
    КадроваяИсторияСотрудниковИнтервальный.ВидСобытия <> ЗНАЧЕНИЕ(Перечисление.ВидыКадровыхСобытий.Увольнение)

как-то так должно быть
41 KnightAlone
 
07.11.17
15:32
но тут мы все равно придем к тому, что 2 кадровых перемещения в один день в итоге приведет к тому, что запрос по сотруднику станет 2 строки возвращать. у нас такое не практикуют, если надо второй раз переместить - правится первое кадровое перемещение
42 Akela has missed
 
07.11.17
15:37
Если ваш запрос возвращает две строки - это неправильный запрос.
43 KnightAlone
 
07.11.17
15:43
(42) проверил, да, нормально так. первое кадровое перемещение просто утрачивает всякий смысл так как по нему запись с даты начала 07.11.2017  0:01:00 по дату окончания 07.11.2017  0:01:00, в результате в запросе будет одна строка - по последнему кадровому перемещению
44 Akela has missed
 
07.11.17
15:43
(42) Но в данном случае должно быть все ОК ))
45 KnightAlone
 
07.11.17
15:46
(44) спасибо, разобрался. так правильней, пусть и старый метод работал, но переделаю все в рамках рефакторинга того, что делалось на скорую руку
46 SleepyHead
 
гуру
08.11.17
07:20
(19) > это отмазка твоя. я не верю, что разработчики из 1с настолько без головы, чтобы структуру от релиза к релизу менять.


Сразу два оценочных суждения в одной фразе, вместо аргументов. Дальше обсуждение можно не продолжать.
47 SleepyHead
 
гуру
08.11.17
07:30
(15) Да все можно, только кто это оценит из пользователей? Я уже понял, что некоторым объяснять бесполезно, но вам попробую.

Что важно для пользователя? Чтобы ему решили проблему, и это решение работало всегда.

Да, мое решение далеко неидеально с точки зрения производительности, зато оно опирается на использование общих модулей, работоспособоность которых гарантирует разработчик.

При смене релиза результат работы не изменится, отчет будет работать в точности так же, как ранее.

Если меняется структура регистров (а она меняется постоянно), то может наступить момент, когда ваш запрос перестанет работать. И все, переписывайте заново.

И я на сто процентов уверен, что крутые запросы тов. Kumena никто из пользователей оценить не сможет, да и не собирается. Никто не будет делать замеры производительности и аплодировать тому факту, что запрос этого программиста работает на полсекунды больше, чем процедура из общего модуля.
48 kumena
 
08.11.17
08:01
> Получается на одну дату ты проводишь изменение оклада два раза.

еще раз, какой в этом смысл?
в Т-2 одно изменение на дату, в начислении зарплаты тоже.

> работоспособоность которых гарантирует разработчик.

им давно уже верить нельзя, придет другая команда и все переделает, и клали они на обещания предыдущей.
49 Akela has missed
 
08.11.17
09:54
(48) Смысл в том, что это разные приказы. А разные приказы это разные документы, с разными номерами, за которые отвечают разные люди.

Вот принимают человека на работу, который находится в отпуске по уходу за ребенком, на неполный рабочий день.
По договору у него оклад по дням и график обычной пятидневки - эти данные должны быть отражены в приеме.
Но т.к. он работает в отпуске, то ему ставят оклад по часам, график неполного времени, и сразу в день приема переводят.

В итоге основное начисление в один день меняется два раза. А если еще в этот день его вдруг временно переведут в другое подразделение - то вероятно и все три раза...
50 kumena
 
08.11.17
11:10
(49) судя по описанию это фиктивные махинации. принимают на один оклад в левое подразделение, а работать начинает по другому в другом.

я за 11 лет зупа ни разу не встречал таких нужд пользователей.