Помогите с запросом (объединить две таблицы по периодам)
Добрый день!
Чот не могу понять как выполнить.
Есть две таблицы:
Первая это табель (Период, Сотрудник, часы) Период это 31 день.
01.01.2017 Иванов 8
02.01.2017 Иванов 8
03.01.2017 Иванов 8
04.01.2017 Иванов 8
05.01.2017 Иванов 8
06.01.2017 Иванов 8
07.01.2017 Иванов 8
08.01.2017 Иванов 8
09.01.2017 Иванов 8
10.01.2017 Иванов 8
11.01.2017 Иванов 8
12.01.2017 Иванов 8
13.01.2017 Иванов 8
14.01.2017 Иванов 8
15.01.2017 Иванов 8
16.01.2017 Иванов 8
Вторая, это когда менялись должности:
01.12.2016 Иванов Инженер
06.01.2017 Иванов Старший Инженер
Надо на выходе получить:
01.01.2017 Иванов 8 Инженер
02.01.2017 Иванов 8 Инженер
03.01.2017 Иванов 8 Инженер
04.01.2017 Иванов 8 Инженер
05.01.2017 Иванов 8 Инженер
06.01.2017 Иванов 8 Старший инженер
07.01.2017 Иванов 8 Старший инженер
08.01.2017 Иванов 8 Старший инженер
09.01.2017 Иванов 8 Старший инженер
10.01.2017 Иванов 8 Старший инженер
11.01.2017 Иванов 8 Старший инженер
12.01.2017 Иванов 8 Старший инженер
13.01.2017 Иванов 8 Старший инженер
14.01.2017 Иванов 8 Старший инженер
15.01.2017 Иванов 8 Старший инженер
16.01.2017 Иванов 8 Старший инженер
На T-SQL можно использовать SELECT в поле, а как в 1с сделать проще. Можно загорячиться и с временными табицами, но можно же как-то проще?
Чот не могу понять как выполнить.
Есть две таблицы:
Первая это табель (Период, Сотрудник, часы) Период это 31 день.
01.01.2017 Иванов 8
02.01.2017 Иванов 8
03.01.2017 Иванов 8
04.01.2017 Иванов 8
05.01.2017 Иванов 8
06.01.2017 Иванов 8
07.01.2017 Иванов 8
08.01.2017 Иванов 8
09.01.2017 Иванов 8
10.01.2017 Иванов 8
11.01.2017 Иванов 8
12.01.2017 Иванов 8
13.01.2017 Иванов 8
14.01.2017 Иванов 8
15.01.2017 Иванов 8
16.01.2017 Иванов 8
Вторая, это когда менялись должности:
01.12.2016 Иванов Инженер
06.01.2017 Иванов Старший Инженер
Надо на выходе получить:
01.01.2017 Иванов 8 Инженер
02.01.2017 Иванов 8 Инженер
03.01.2017 Иванов 8 Инженер
04.01.2017 Иванов 8 Инженер
05.01.2017 Иванов 8 Инженер
06.01.2017 Иванов 8 Старший инженер
07.01.2017 Иванов 8 Старший инженер
08.01.2017 Иванов 8 Старший инженер
09.01.2017 Иванов 8 Старший инженер
10.01.2017 Иванов 8 Старший инженер
11.01.2017 Иванов 8 Старший инженер
12.01.2017 Иванов 8 Старший инженер
13.01.2017 Иванов 8 Старший инженер
14.01.2017 Иванов 8 Старший инженер
15.01.2017 Иванов 8 Старший инженер
16.01.2017 Иванов 8 Старший инженер
На T-SQL можно использовать SELECT в поле, а как в 1с сделать проще. Можно загорячиться и с временными табицами, но можно же как-то проще?
По теме из базы знаний
- Полезные сведения о языке запросов 1С 8.2
- История оптимизации одного большого запроса средствами MSSQL Profiler и 1С
- Минимализмы 3
- Универсальные функции ЗУП 3.1 / ЗКГУ 3.1, которые помогут в разработке
- Быстрый фронт в базе размером 6.8 терабайт – наши стандарты при разработке и рефакторинге запросов
Ответы
В избранное
Подписаться на ответы
Сортировка:
Древо развёрнутое
Свернуть все
Ну, и поделились бы решением. Интересно глянуть, мне в свое время с подобной задачей пришлось сильно заморочиться, особенно для случая, когда в одном месяце было несколько кадровых изменений/перемещений по человеку.
(6) Извиняюсь, потерялся.
Вот моя заготовка:
Вот моя заготовка:
ВЫБРАТЬ РАЗЛИЧНЫЕ
1 КАК Вид,
РаботникиОрганизаций.Период КАК Период,
РаботникиОрганизаций.Сотрудник КАК Сотрудник,
РаботникиОрганизаций.ПодразделениеОрганизации,
РаботникиОрганизаций.Должность КАК Должность,
РаботникиОрганизаций.ПричинаИзмененияСостояния
ПОМЕСТИТЬ ВТ_Должности
ИЗ
РегистрСведений.РаботникиОрганизаций КАК РаботникиОрганизаций
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
2,
ДОБАВИТЬКДАТЕ(КадровоеПеремещениеОрганизацийРаботникиОрганизации.ДатаОкончания, ДЕНЬ, 1),
РаботникиОрганизаций.Сотрудник,
РаботникиОрганизаций.ПодразделениеОрганизацииЗавершения,
РаботникиОрганизаций.ДолжностьЗавершения,
РаботникиОрганизаций.ПричинаИзмененияСостоянияЗавершения
ИЗ
РегистрСведений.РаботникиОрганизаций КАК РаботникиОрганизаций
ЛЕВОЕ СОЕДИНЕНИЕ Документ.КадровоеПеремещениеОрганизаций.РаботникиОрганизации КАК КадровоеПеремещениеОрганизацийРаботникиОрганизации
ПО РаботникиОрганизаций.Регистратор = КадровоеПеремещениеОрганизацийРаботникиОрганизации.Ссылка
И РаботникиОрганизаций.Сотрудник = КадровоеПеремещениеОрганизацийРаботникиОрганизации.Сотрудник
И РаботникиОрганизаций.Период = КадровоеПеремещениеОрганизацийРаботникиОрганизации.ДатаНачала
ГДЕ
РаботникиОрганизаций.ПериодЗавершения <> ДАТАВРЕМЯ(1, 1, 1)
И НЕ ДОБАВИТЬКДАТЕ(КадровоеПеремещениеОрганизацийРаботникиОрганизации.ДатаОкончания, ДЕНЬ, 1) В
(ВЫБРАТЬ
ВТ_ПовторПериодов.Период
ИЗ
ВТ_ПовторПериодов
ГДЕ
ВТ_ПовторПериодов.Сотрудник = РаботникиОрганизаций.Сотрудник)
ИНДЕКСИРОВАТЬ ПО
Сотрудник,
Должность,
Период
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
РабочееВремяРаботниковОрганизаций.Сотрудник КАК Сотрудник,
РабочееВремяРаботниковОрганизаций.Часов КАК ОтработаноЧасовТабельОФ,
ВТ_Должн.Должность КАК Должность
ИЗ
РегистрНакопления.РабочееВремяРаботниковОрганизаций КАК РабочееВремяРаботниковОрганизаций
ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Должности КАК ВТ_Должн
ПО (ВТ_Должн.Период В
(ВЫБРАТЬ ПЕРВЫЕ 1
ВТ_Должности.Период
ИЗ
ВТ_Должности КАК ВТ_Должности
ГДЕ
ВТ_Должности.Период <= РабочееВремяРаботниковОрганизаций.Период
И ВТ_Должности.Сотрудник = РабочееВремяРаботниковОрганизаций.Сотрудник
УПОРЯДОЧИТЬ ПО
ВТ_Должности.Период УБЫВ))
И РабочееВремяРаботниковОрганизаций.Сотрудник = ВТ_Должн.Сотрудник
ГДЕ
РабочееВремяРаботниковОрганизаций.Активность = ИСТИНА
И РабочееВремяРаботниковОрганизаций.Период МЕЖДУ НАЧАЛОПЕРИОДА(&Месяц, МЕСЯЦ) И КОНЕЦПЕРИОДА(&Месяц, МЕСЯЦ)
И РабочееВремяРаботниковОрганизаций.ВидИспользованияРабочегоВремени В
(ВЫБРАТЬ
КлассификаторИспользованияРабочегоВремени.Ссылка
ИЗ
Справочник.КлассификаторИспользованияРабочегоВремени КАК КлассификаторИспользованияРабочегоВремени
ГДЕ
КлассификаторИспользованияРабочегоВремени.ЦифровойКод = "01")
И РабочееВремяРаботниковОрганизаций.Сотрудник = &Сотрудник
УПОРЯДОЧИТЬ ПО
Сотрудник
ПоказатьВЫБРАТЬ
РабочееВремяРаботниковОрганизаций.Период,
РабочееВремяРаботниковОрганизаций.Сотрудник,
МАКСИМУМ(РабочееВремяРаботниковОрганизаций.Период) КАК ПериодКадровый
ПОМЕСТИТЬ ВТ_Т1
ИЗ
РегистрНакопления.РабочееВремяРаботниковОрганизаций КАК РабочееВремяРаботниковОрганизаций
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.РаботникиОрганизаций КАК РаботникиОрганизаций
ПО
РабочееВремяРаботниковОрганизаций.Сотрудник = РаботникиОрганизаций.Сотрудник
И
РабочееВремяРаботниковОрганизаций.Период >= РаботникиОрганизаций.Период
ГДЕ
РабочееВремяРаботниковОрганизаций.Период МЕЖДУ &Д1 И &Д2
СГРУППИРОВАТЬ ПО
РабочееВремяРаботниковОрганизаций.Период,
РабочееВремяРаботниковОрганизаций.Сотрудник
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
ВТ_Т1.Период,
ВТ_Т1.Сотрудник,
РаботникиОрганизаций.Должность
ИЗ
ВТ_Т1 КАК ВТ_Т1
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.РаботникиОрганизаций КАК РаботникиОрганизаций
ПО ВТ_Т1.Сотрудник = РаботникиОрганизаций.Сотрудник
И ВТ_Т1.ПериодКадровый = РаботникиОрганизаций.Период
Показать
Я бы так сделал:
Во вложении - выгруженный из консоли запрос с двумя табличками с исходными данными. Только в строковых полях таблиц в параметрах запроса после загрузки этого примера в консоль нужно будет длину ограничить, иначе ошибку выдаёт.
И это, сорян, если поздно.
P.S. Блин, не разобрался, как тут синтаксис подсветить.
ВЫБРАТЬ
РабочееВремя.Дата как ДатаРаботы,
РабочееВремя.Фамилия как Фамилия,
Максимум(Назначение.Дата) как ДатаНазначения,
Максимум(Назначение.Должность) как Должность
ИЗ РабочееВремя
ЛЕВОЕ СОЕДИНЕНИЕ Назначение
ПО РабочееВремя.Фамилия = Назначение.Фамилия и
РабочееВремя.Дата >= Назначение.Дата
СГРУППИРОВАТЬ ПО
РабочееВремя.Дата,
РабочееВремя.Фамилия
УПОРЯДОЧИТЬ ПО
Фамилия,
ДатаРаботы
ПоказатьВо вложении - выгруженный из консоли запрос с двумя табличками с исходными данными. Только в строковых полях таблиц в параметрах запроса после загрузки этого примера в консоль нужно будет длину ограничить, иначе ошибку выдаёт.
И это, сорян, если поздно.
P.S. Блин, не разобрался, как тут синтаксис подсветить.
Прикрепленные файлы:
ЗапросПроИнженеров.q1c
Упс, погорячился. Я нуп и апазорился. Без вложенного запроса/временной таблички тут действительно никак. Вот правильный вариант:
ВЫБРАТЬ
РабочееВремя.Дата как ДатаРаботы,
РабочееВремя.Фамилия как Фамилия,
Максимум(РабочееВремя.Часы),
Максимум(Назначение.Дата) как ДатаНазначения
ПОМЕСТИТЬ ВремяРаботыСДатамиНазначения
ИЗ РабочееВремя
ЛЕВОЕ СОЕДИНЕНИЕ Назначение
ПО РабочееВремя.Фамилия = Назначение.Фамилия и
РабочееВремя.Дата >= Назначение.Дата
СГРУППИРОВАТЬ ПО
РабочееВремя.Дата,
РабочееВремя.Фамилия;
ВЫБРАТЬ
ВремяСДатами.ДатаРаботы,
ВремяСДатами.Фамилия КАК Сотрудник,
ВремяСДатами.Часы,
Назначение.Должность
ИЗ ВремяРаботыСДатамиНазначения КАК ВремяСДатами
ЛЕВОЕ СОЕДИНЕНИЕ Назначение
ПО ВремяСДатами.ДатаНазначения = Назначение.Дата
УПОРЯДОЧИТЬ ПО
Сотрудник,
ДатаРаботы
Показать
Вакансии
Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)