Имя: Пароль:
1C
1С v8
Помогите с запросом, плз )
,
0 Dim351
 
11.07.13
17:28
Добрый день!

Пишу отчет в ЗУП по неявкам сотрудников с вычурными требованиями.

Вопрос - как соединить две таблицы: календарь (просто календарь от 1 до 31 числа) и список отработанного времени, где записи есть только по рабочим дням, в единую таблицу, примерно такую:

Календарь    Сотрудник  Раб Время            
1            
2            Иванов     8
3            Иванов     8
4            Иванов     8
5            Иванов     8
6            
7
8            Иванов     8
9            Иванов     8
.
.
.
31           Иванов     8
============================
1            Петров     8
2            
3            Петров     8
4            Петров     8
5            
6            Петров     8
7
8            Петров     8
9            Петров     8
.
.
.
31           Петров     8

Итого:

Проблема в том, что вложенный запрос, временная таблица - все берут календарь слева только один раз, т.к. сама таблица от 1 до 31, а справа - в несколько раз больше (по количеству сотрудников в подразделении).

Это похоже на связь один (календарный день) ко многим (рабочий день нескольких сотрудников). Можно выгрузить в ТЗ обе таблицы и их объединить; но разве нет красивого решения?

Спасибо.
1 rellyel
 
11.07.13
17:30
вкл скайп помогу
2 Dim351
 
11.07.13
17:38
Включен - dvborovkov
3 Dim351
 
11.07.13
17:55
Up :)
4 Лодырь
 
11.07.13
18:07
ВЫБРАТЬ
   ТаблицаДнейИСотрудников.Кто,
   ТаблицаДнейИСотрудников.День,
   ОтработанноеВремя.Сколько
ИЗ
   (ВЫБРАТЬ
       ВложенныйЗапрос.Кто КАК Кто,
       ТаблицаКалендаря.День КАК День
   ИЗ
       ТаблицаКалендаря КАК ТаблицаКалендаря,
       (ВЫБРАТЬ РАЗЛИЧНЫЕ
           ОтработаноеВремя.Кто КАК Кто
       ИЗ
           ОтработаноеВремя КАК ОтработаноеВремя) КАК ВложенныйЗапрос) КАК ТаблицаДнейИСотрудников
       ЛЕВОЕ СОЕДИНЕНИЕ ОтработанноеВремя КАК ОтработанноеВремя
       ПО ТаблицаДнейИСотрудников.Кто = ОтработанноеВремя.Кто
           И ТаблицаДнейИСотрудников.День = ОтработанноеВремя.День
5 Лодырь
 
11.07.13
18:07
Могут быть ошибки в наборе текста, но смысл думаю ты уловил.
6 fisher
 
11.07.13
18:11
(4) +1
7 Dim351
 
11.07.13
18:24
Спасибо, сейчас попробую :)
8 sirsp
 
11.07.13
18:24
(0)
   ВЫБРАТЬ 1 Дата ПОМЕСТИТЬ Календарь
   ОБЪЕДИНИТЬ ВЫБРАТЬ 2
   ОБЪЕДИНИТЬ ВЫБРАТЬ 3
   ОБЪЕДИНИТЬ ВЫБРАТЬ 4
   ОБЪЕДИНИТЬ ВЫБРАТЬ 5
   ОБЪЕДИНИТЬ ВЫБРАТЬ 6
   ОБЪЕДИНИТЬ ВЫБРАТЬ 7
   ОБЪЕДИНИТЬ ВЫБРАТЬ 8
   ОБЪЕДИНИТЬ ВЫБРАТЬ 9
   ОБЪЕДИНИТЬ ВЫБРАТЬ 10
   ;

   ВЫБРАТЬ 2 Дата, "Иванов" Сотр, 8 Время ПОМЕСТИТЬ РабочееВремя
   ОБЪЕДИНИТЬ ВЫБРАТЬ 3 Дата, "Иванов" Сотр, 8 Время
   ОБЪЕДИНИТЬ ВЫБРАТЬ 4 Дата, "Иванов" Сотр, 8 Время
   ОБЪЕДИНИТЬ ВЫБРАТЬ 5 Дата, "Иванов" Сотр, 8 Время
   ОБЪЕДИНИТЬ ВЫБРАТЬ 8 Дата, "Иванов" Сотр, 8 Время
   ОБЪЕДИНИТЬ ВЫБРАТЬ 9 Дата, "Иванов" Сотр, 8 Время

   ОБЪЕДИНИТЬ ВЫБРАТЬ 1 Дата, "Петров" Сотр, 8 Время
   ОБЪЕДИНИТЬ ВЫБРАТЬ 3 Дата, "Петров" Сотр, 8 Время
   ОБЪЕДИНИТЬ ВЫБРАТЬ 4 Дата, "Петров" Сотр, 8 Время
   ОБЪЕДИНИТЬ ВЫБРАТЬ 6 Дата, "Петров" Сотр, 8 Время
   ОБЪЕДИНИТЬ ВЫБРАТЬ 8 Дата, "Петров" Сотр, 8 Время
   ОБЪЕДИНИТЬ ВЫБРАТЬ 9 Дата, "Петров" Сотр, 8 Время
   ;

   ВЫБРАТЬ
       ВЗ.Дата
       ,РабочееВремя.Сотр
       ,РабочееВремя.Время
   ИЗ
       (
       ВЫБРАТЬ РАЗЛИЧНЫЕ
           Календарь.Дата
           ,Сотр
       ИЗ
           РабочееВремя, Календарь
       )ВЗ
       ЛЕВОЕ СОЕДИНЕНИЕ
       РабочееВремя
       ПО
           ВЗ.Дата = РабочееВремя.Дата
           И ВЗ.Сотр = РабочееВремя.Сотр
   УПОРЯДОЧИТЬ ПО
       ВЗ.Сотр
9 acsent
 
11.07.13
18:25
в зупе есть производственный календарь.
10 Dim351
 
11.07.13
18:59
(4) На основе твоего предложения слепил такой запрос:
ВЫБРАТЬ
   РПК.ДатаКалендаря КАК ДатаКалендаря,
   РПК.ВидДня КАК ВидДня,
   ВложенныйЗапрос.Сотрудник КАК Сотрудник,
   ВложенныйЗапрос.ВидИспользованияРабочегоВремени,
   ВложенныйЗапрос.ДнейОборот
ИЗ
   РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РПК
       ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
           РабочееВремяРаботниковОрганизацийОбороты.Сотрудник КАК Сотрудник,
           РабочееВремяРаботниковОрганизацийОбороты.ДнейОборот КАК ДнейОборот,
           РабочееВремяРаботниковОрганизацийОбороты.Период КАК Период,
           РабочееВремяРаботниковОрганизацийОбороты.ВидИспользованияРабочегоВремени КАК ВидИспользованияРабочегоВремени
       ИЗ
           РегистрНакопления.РабочееВремяРаботниковОрганизаций.Обороты(&Д1, &Д2, День, ) КАК РабочееВремяРаботниковОрганизацийОбороты) КАК ВложенныйЗапрос
       ПО РПК.ДатаКалендаря = ВложенныйЗапрос.Период
ГДЕ
   РПК.ДатаКалендаря МЕЖДУ &Д1 И &Д2

УПОРЯДОЧИТЬ ПО
   Сотрудник,
   РПК.ДатаКалендаря

Но он не совсем корректно работает - выбирает только Рабочее время, т.е. праздники и выходные дни в результирующую таблицу пустыми строками не попадают, а мне нужно.

Наверное нужно что-то типа Объединить - но не очень пойму, что с чем :)
11 Dim351
 
11.07.13
19:06
(8) Спасибо что, откликнулся!

Я такие конструкции видел в сторонних отчетах по среднесписочной - но уж очень они корявые, да и работают очень медленно (у тех, что я видел, отчет по одному подразделению до 1 минуты выполняется).

Хочется просто методику - как прикрепить к списку "Сотрудник, ОтработанноеВремя" список  "КалендарныеДни" таким образом, чтобы всем строчкам первой таблицы (600 строк) сопоставились календарные дни (31 строка), а если в отработанном времени нет такой даты, то такая строчка заполняется только календарной датой (это обычно выходной день). Надеюсь, понятно объяснил :)  

Спасибо
12 Dim351
 
11.07.13
19:09
(1) Барышня, ну теперь только на Вас надежда :)
13 Desna
 
11.07.13
19:19
"Это похоже на связь один (календарный день) ко многим (рабочий день нескольких сотрудников)"
"рабочий день нескольких сотрудников" - это как бы разные назначения
14 Dim351
 
11.07.13
19:31
(13) Согласен, некорректно. Имеется в виду список "Дата, Сотрудник, ОтработанноеВремя" за месяц объемом 600 строк (30 пользователей по 20 раб дней). Нужно объединить со списком в 31 строку (даты календаря). Связь один ко многим (один календарный день к нескольким рабочим дням нескольких сотрудников), например 2 мая работали все сотрудники по 8 часов, а 9 мая - только дежурные, а 1 мая - вообще никто не работал.
15 sirsp
 
11.07.13
20:42
(11)
Это просто модель по условиям задачи в (0). Естественно нужно напрячься и допилить под конкретную задачу. А на "корявость" моих решений ты первый жалуешься ;)
16 Dim351
 
11.07.13
21:28
(15) Там в (0) не совсем понятно вывелась таблица - имелось в виду, что на каждый день периода нужно сделать Объединить. Т.е. на месяц их нужно 31, а на произвольный период вообще не возможно. Или я не так понял?
17 Лодырь
 
12.07.13
05:40
Блин топикстартер, ты как будто математику в школе не изучал. Сделай декартово произведение дней месяца с работниками. Получишь таблицу ВСЕХ дней
18 Лодырь
 
12.07.13
05:40
add (17) Получишь таблицу ВСЕХ дней со ВСЕМИ сотрудниками. Потом сделай левое соединение с отработанным временем и сгруппируй при выводе по сотрудникам. ВСЕ.
Я не хочу быть самым богатым человеком на кладбище. Засыпать с чувством, что за день я сделал какую-нибудь потрясающую вещь — вот что меня интересует. Стив Джобс