Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
28 сен 2024, 01:22

Получение периода из РС

Автор Алексей_1985_06, 31 мар 2024, 17:35

0 Пользователей и 1 гость просматривают эту тему.

Алексей_1985_06

Ребят, все привет! Прошу помощи в таком вопросе:
1. Необходимо получить период нахождения сотрудника в должности в виде: например с 23.04.2018 по 10.02.2024 - начальник лаборатории.

Есть зависимый РС "Кадровые перемещения", куда документом "Назначения на должность" заносятся данные, в поле "Период" - дата приказа о назначении.

Подскажите каким образом получить записи в виде описанном выше?

Алгоритм пока такой:
// 1. Создать набор записей:
НаборЗаписей = РегистрыСведений.КадровыеПеремещения.СоздатьНаборЗаписей();

// 2. Наложить требуемые отборы:
НаборЗаписей.Отбор.Сотрудник.Установить(СсылкаНаСотрудника); // здесь ошибка возникает: Поле объекта не обнаружено (Сотрудник)


// 3. Прочитаем набор записей РС:
НаборЗаписей.Прочитать();

// В цикле переберем все записи с отбором по сотруднику:
   Для Каждого Строка Из НаборЗаписей  Цикл
    ........
 КонецЦикла;
 

Максим75

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

Алексей_1985_06

Максим75, Да.точно РС у меня подчинен регистратору (документ "Назначение на должность"), а как в таком случае получить данные кадровых перемещений на конкретного сотрудника, ведь регистратор для каждой записи разный, и как произвести отбор в таком случае?  :dfbsdfbsdf:  :dfbsdfbsdf:  :dfbsdfbsdf:

Максим75

Алексей_1985_06, запросом.
выборка по регистру сведений с отбором по нужному сотру и вывод регистратора и должности.

JeremyClarksson

Я запросом получал из РС "Кадровая история сотрудников".

Алексей_1985_06

Максим75, Ребят а кто-то может подсказать как получить (сделать) из РС данные поля Период вида:
например:
с 20.05.2020 по 22.01.2024 - начальник лаборатории.
с 22.01.2024 по настоящее время - инженер.

Т.е 20.05.2020 - был назначен начальником лаборатории; 22.01.2024 - был назначен инженером.

Запрос сделал такой:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| КадровыеПеремещения.Период КАК ДатаНазначения,
| КадровыеПеремещения.Сотрудник КАК Сотрудник,
| КадровыеПеремещения.ЗанимаемаяДолжность КАК ЗанимаемаяДолжность
|ИЗ
| РегистрСведений.КадровыеПеремещения КАК КадровыеПеремещения
|ГДЕ
| КадровыеПеремещения.Сотрудник = &Сотрудник";

Запрос.УстановитьПараметр("Сотрудник", СсылкаНаСотрудника);

РезультатЗапроса = Запрос.Выполнить();

Выборка = РезультатЗапроса.Выбрать();

Пока Выборка.Следующий() Цикл
// ...........................

КонецЦикла;

alexandr_ll

Выгрузить результат запроса в таблицу значений и из нее циклом считать нужные значения

Алексей_1985_06

alexandr_ll, Уважаемые программисты, подскажите пжл с кодом, как правильно сделать? Даны даты назначения сотрудника на должность (см. рисунок 2). Сейчас в массиве получаю из РС периоды нахождения сотрудника в должности (см. рисунок 1), а вот как к этим периодам теперь "притянуть" должности не могу додумать, помогите кто знает как!!!!  :trhregerhg:  :trhregerhg:  :trhregerhg:
Должно быть так:
с 07.02.1996 по 14.06.2019 - начальник отделения
с 14.06.2019 по 01.04.2024 - инженер
с 01.04.2024 по настоящее время - старший инженер

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

    Если НЕ Результат.Пустой() Тогда    // Если полученны данные из запроса
       
        Выборка = Результат.Выбрать();
               
// Создадим новый массив и заполним его значениями датами назначения на должности   
        Массив = Новый Массив;   
        Пока Выборка.Следующий() Цикл
            Массив.Добавить(Строка(Формат(Выборка.ДатаНазначения, "ДФ=dd.MM.yyyy")));         
        КонецЦикла;
       
// Далее создадим еще один массив в который теперь запишем даты вида например: с 01.01.2001 по 01.02.2002   
       
    МассивДоп = Новый Массив; // В этот массив добавим значения с ...по ...
    Индекс = 0;
   
    Для Каждого Элемент Из Массив Цикл
        ПерваяДата = Массив[Индекс];  // Определим первую дату в массиве 
               
        Если Индекс = Массив.ВГраница() Тогда // Если индекс массива равен последнему индексу, тогда значит это последняя дата назначения
            МассивДоп.Добавить("с " + ПерваяДата + " по настоящее время - ");
            Прервать;  // Прервем выполнение цикла, так как получена последняя дата. Код ниже выполняться не будет.
        КонецЕсли;
       
        СледующаяДата = Массив[Индекс + 1];  // Определим следующую дату
        МассивДоп.Добавить("с " + ПерваяДата + " по " + СледующаяДата);       
        Индекс = Индекс + 1;       
       
    КонецЦикла;
       
    Возврат МассивДоп
       
    Иначе Возврат Неопределено
   
    КонецЕсли;


КонецФункции

&НаКлиенте
Процедура ПрочитатьЗаписи(Команда)
   
    Массив = ПрочитатьЗаписиНаСервере();
   
    Если Массив = Неопределено Тогда
        Возврат
    КонецЕсли;


    Инд = 0;
    Для Каждого Элемент из Массив цикл
        Сообщить(Массив[Инд]);
        Инд = Инд + 1;
    КонецЦикла;

КонецПроцедуры

Максим75

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

Алексей_1985_06

Максим75, Ага, спасибо! Можете немного помочь, сейчас выходит сообщение: "Индекс находится за границами массива" и не выходит сообщение с последней должностью, т.е сейчас так:

с 07.02.1996 по 15.06.2019 - Начальник отделения
с 15.06.2019 по 01.04.2024 - Инженер

// а вот с 01.04.2024 по настоящее время - старший инженер

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| КадровыеПеремещения.Период КАК ДатаНазначения,
| КадровыеПеремещения.Сотрудник КАК Сотрудник,
| КадровыеПеремещения.ЗанимаемаяДолжность КАК ЗанимаемаяДолжность
|ИЗ
| РегистрСведений.КадровыеПеремещения КАК КадровыеПеремещения
|ГДЕ
| КадровыеПеремещения.Сотрудник = &Сотрудник
|
|УПОРЯДОЧИТЬ ПО
| ДатаНазначения";

Запрос.УстановитьПараметр("Сотрудник", Сотрудник);

Результат = Запрос.Выполнить().Выгрузить(); 

Для Каждого Строка Из Результат Цикл

Индекс = Результат.Индекс(Строка); // Индекс текущей строки

Сообщить(Формат(Результат[Индекс].ДатаНазначения, "ДФ=dd.MM.yyyy") + " по " +
Формат(Результат[Индекс + 1].ДатаНазначения, "ДФ=dd.MM.yyyy") + " - " +
Результат[Индекс].ЗанимаемаяДолжность)
КонецЦикла;

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск