Версия для печати темы (https://pro1c.org.ua/index.php?s=cd7a85a02ea777fd1ecb4fbc15326d1e&showtopic=67681)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование в 1С Предприятие 8.3 _ Як в запросі деталізувати період по рокам

Автор: mvo2008 27.11.24, 10:31

Доброго дня... Шановні знатоки 1С кода, допоможіть вирішити наступну проблему...
Ситуація наступна
Є запрос, який формує таблицю по працівникам, і їхнім датам прийому та звільнення.

ПРАЦІВНИК | Дата прийому | Дата звільнення
Іванов.О.О. | 01.02.2020 | 15.10.2024..............................................
Як зробити так щоб цей запрос виводив інформацію в розрізі років? По типу,
ПРАЦІВНИК | Рік | Дата початок | Дата кінець
Іванов.О.О. | 2020 | 01.02.2020 | 31.12.2020
Іванов.О.О. | 2021 | 01.01.2021 | 31.12.2021
Іванов.О.О. | 2022 | 01.01.2022 | 31.12.2022
Іванов.О.О. | 2023 | 01.01.2023 | 31.12.2023
Іванов.О.О. | 2024 | 01.01.2024 | 15.10.2023
аж до дати звільнення......

Автор: Vofka 27.11.24, 11:25

Додайте в запит РікПрийому = Год(ДатаПрийому) і зробіть підсумки по Рік

Мабуть, шось типу такого:

ИТОГИ ПО
   Рік,
   ОБЩИЕ

Автор: mvo2008 27.11.24, 13:04

Vofka @ Сегодня, 11:25 * ,
Дякую, але не зовсім підходить.По факту потрібно 1 рядок (з періодом) розбити на 5 (по рокам цього періоду)

Автор: Vofka 27.11.24, 13:22

Якщо у вас в БД зберігається умовно 2 строки виду:
Іванов, 01.01.2020, Прийнятий
Іванов, 15.11.2024, Звільнений

То на швидкоруч я не знаю, чи взагалі це можна зробити запитом. Я би робив це кодом.

Автор: andrew76 27.11.24, 16:01

Vofka @ Сегодня, 16:22 * ,

Извините,что вмешиваюсь,а может результат запроса выгрузить в Таблицу Значений ?
Таблицу Значений отсортировать в нужном порядке по датам.И далее- вывод данных из ТЗ.

Автор: alex1c 27.11.24, 16:48

Доброго дня! Є такий варіант:
в мене вийшло те що потрібно

ВЫБРАТЬ
    0 КАК n
ПОМЕСТИТЬ Т_Цифри

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    1

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    2

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    3

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    4

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    5

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    6

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    7

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    8

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    9
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ДОБАВИТЬКДАТЕ(&Дата1, ГОД, а_Одиниці.n + б_Десятки.n * 10 + в_Сотні.n * 100 + г_Тисячі.n * 1000) КАК Дата
ПОМЕСТИТЬ Т_Дат
ИЗ
    Т_Цифри КАК а_Одиниці
        ЛЕВОЕ СОЕДИНЕНИЕ Т_Цифри КАК б_Десятки
        ПО (ИСТИНА)
        ЛЕВОЕ СОЕДИНЕНИЕ Т_Цифри КАК в_Сотні
        ПО (ИСТИНА)
        ЛЕВОЕ СОЕДИНЕНИЕ Т_Цифри КАК г_Тисячі
        ПО (ИСТИНА)
ГДЕ
    а_Одиниці.n + б_Десятки.n * 10 + в_Сотні.n * 100 + г_Тисячі.n * 1000 <= РАЗНОСТЬДАТ(&Дата1, &Дата2, ГОД)
;

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

СГРУППИРОВАТЬ ПО
    ВложенныйЗапрос.Сотрудник
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Т_Робітників.Робітник,
    ГОД(Т_Дат.Дата) КАК Рік,
    ВЫБОР
        КОГДА Т_Робітників.ДатаПрийому МЕЖДУ НАЧАЛОПЕРИОДА(Т_Дат.Дата, ГОД) И КОНЕЦПЕРИОДА(Т_Дат.Дата, ГОД)
            ТОГДА Т_Робітників.ДатаПрийому
        ИНАЧЕ Т_Дат.Дата
    КОНЕЦ КАК ДатаПочаток,
    ВЫБОР
        КОГДА Т_Робітників.ДатаЗвільнення МЕЖДУ НАЧАЛОПЕРИОДА(Т_Дат.Дата, ГОД) И КОНЕЦПЕРИОДА(Т_Дат.Дата, ГОД)
            ТОГДА Т_Робітників.ДатаЗвільнення
        ИНАЧЕ КОНЕЦПЕРИОДА(Т_Дат.Дата, ГОД)
    КОНЕЦ КАК ДатаКінець
ИЗ
    Т_Робітників КАК Т_Робітників,
    Т_Дат КАК Т_Дат

Автор: Vofka 27.11.24, 17:21

Цитата(andrew76 @ 27.11.24, 16:01) *
а может результат запроса выгрузить в Таблицу Значений ?

Может, почему нету. Моя основная мысль была в том, что только запросом я бы это, скорее всего, не делал бы. Я не знаю делает ли то что надо запрос выше, который alex1c написал, но понять, что там происходит мне лично сложно. Я бы избегал таких запросов там, где это можно.

Автор: andrew76 27.11.24, 17:35

Vofka @ Сегодня, 20:21 * ,
Если нужен срочно этот отчет и сверху команды от руководящих -"Давай быстрее ! Когда будет готово ?!",
то проще мне кажется через ТЗ это решить.А если времени достаточно и без нервозности,то можно и запросами.

Автор: alex1c 27.11.24, 20:02

№ Робітник Рік ДатаПочаток ДатаКінець
1 Наташа 2 016 21.06.2016 0:00:00 31.12.2016 23:59:59
2 Наташа 2 017 01.01.2017 0:00:00 31.12.2017 23:59:59
3 Наташа 2 018 01.01.2018 0:00:00 31.12.2018 23:59:59
4 Наташа 2 019 01.01.2019 0:00:00 31.12.2019 23:59:59
5 Наташа 2 020 01.01.2020 0:00:00 31.12.2020 23:59:59
6 Наташа 2 021 01.01.2021 0:00:00 31.12.2021 23:59:59
7 Наташа 2 022 01.01.2022 0:00:00 31.12.2022 23:59:59
8 Наташа 2 023 01.01.2023 0:00:00 31.12.2023 23:59:59
9 Наташа 2 024 01.01.2024 0:00:00 10.08.2024 0:00:00

Це результат реальної бази, 10-15 хв. витратив на запит.
я просто показав, що можна і запитом

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua