Имя: Пароль:
1C
1С v8
Система расписания (планирования по времени) и работа с запросами
0 GrayT
 
24.07.12
09:47
Помогите продвинутся в разработке сабжа.
Можно ли написать запрос который вернет таблицу содержащую список времени с определенным интервалом? Т.е. есть рабочая смена с 8 до 17, есть ограничение, что на операцию тратится 30 минут. Нужен запрос возвращающий колонку с периодами: 24.07.12 08:00; 24.07.12 08:30; 24.07.12 09:00; .....; 24.07.12 16:30; 25.07.12 08:00 .....

Возможно построить такой запрос?
1 х86
 
24.07.12
09:51
джоин + добавить к дате
2 Maxus43
 
24.07.12
09:53
колонку с периодами можно (датами), есть статья в КЗ, насчет времени ещё подумать надо
3 GrayT
 
24.07.12
10:00
(1)Можно пример, может немного другой, но отражающий смысл. Просто только-только начал заниматься восьмеркой вплотную. И если для "стандартных" запросов примеров много, то тут просто в ступор впал. На ИТС Смотрел ДобавитьКДате, но как сделать список дат (времени) не пойму
(2)Попробую там поискать
4 Spieluhr
 
24.07.12
10:05
как вариант сформировать ТаблицуЗначений нужного содержания, а потом из нее выбрать во временную таблицу пакетного запроса
5 Maxus43
 
24.07.12
10:09
можно прицепится к производственному календарю, если он есть. Даты вытащить будет легко
6 МихаилМ
 
24.07.12
10:12
не нужен такой запрос.
путаете получение данных с представлением.

обработайте (представте) полученные данные на клиенте субд.


+ если таблица периодов не дискретицированна на периоды, то не будет эффективного индекса
и через 100 000 записей начнуться проблемы производительности.
7 х86
 
24.07.12
10:16
8 GrayT
 
24.07.12
10:20
(4)Вот как раз от ТЗ и хочу уйти - все сделать запросом.
(5) Нету. нетленка. Задача достаточно локальная и делается на пустой конфе
(6)Если правильно понял смысл термина дискретизации, то тут она полная. Смена поколота на 30 минут

Может я вообще не стой стороны зашел. Расскажу по задаче в целом.
9 Kashemir
 
24.07.12
10:21
ВЫБРАТЬ
   ДОБАВИТЬКДАТЕ(&НачалоСмены, МИНУТА, &Шаг * (aa.a * 1000 + bb.b * 100 + cc.c * 10 + dd.d)) КАК НачалоИнтервала
ИЗ
   (ВЫБРАТЬ
       0 КАК a
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       1
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       2
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       3
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       4
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       5
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       6
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       7
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       8
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       9) КАК aa,
   (ВЫБРАТЬ
       0 КАК b
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       1
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       2
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       3
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       4
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       5
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       6
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       7
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       8
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       9) КАК bb,
   (ВЫБРАТЬ
       0 КАК c
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       1
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       2
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       3
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       4
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       5
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       6
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       7
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       8
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       9) КАК cc,
   (ВЫБРАТЬ
       0 КАК d
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       1
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       2
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       3
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       4
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       5
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       6
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       7
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       8
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       9) КАК dd
ГДЕ
   ДОБАВИТЬКДАТЕ(&НачалоСмены, МИНУТА, 30 * (aa.a * 1000 + bb.b * 100 + cc.c * 10 + dd.d)) <= &КонецСмены
10 GrayT
 
24.07.12
10:22
расширенное описание задачи - можно не читать :)
На текущий момент реализовано следующее. Имеем единицу оборудования и условие, что одна операция выполняется 30 минут. Т.е. имеем матрицу дней и участков времени в 30 минут. Используя диаграмму Ганта, организую построение графика. Алгоритм прост: в цикле плюсую время по 30 минут и строю в ТЗ список доступного времени (с учетом начала и окончания смены). Далее запросом к регистру сведений графика операций выбираю заполненные участки времени, до-заполняю ТЗ доступного времени и строю диаграмму.
Требуется расширить функционал следующим образом - единиц оборудования несколько. Мало того график работы (по дням) каждой единицы самостоятельный (ремонты, профилактика, и т.п.). Хотелось бы организовать заполнение графика полностью запросами - в идеале одним, но пока и простой запрос толком построить не могу.
Структур БД вижу так.
1. Справочник календари + регистр сведений календари. Измерения - Календарь (Ссылка на календарь), День (Дата(Состав дата)), Ресурс - Доступно (Булево). Т.е. регистр содержит все календарные даты с указание доступности в целом.
2. Справочник оборудование + Реквизит Календарь
3. Регистр ГрафикОпераций - Регистр сведений Измерения - Оборудование (Ссылка на справочник), ПозицияВремени (Дата (Дата+Время)), Ресурс - Операция (Справочник операций)
4. Ну и документы, что все это дело шевелят.
Цель быстрое визуальное оформление графика.
Вот теперь думаю как ко всему этому хозяйству запросами обращаться.
11 GrayT
 
24.07.12
10:23
(7,9) Ага спасибо! Буду изучать :)
12 Kashemir
 
24.07.12
10:29
(11) Рекомендую где-то отдельно  сохранить - очень помогает когда надо динамически получить выборку определенной размерности:

ВЫБРАТЬ
   aa.a * 1000 + bb.b * 100 + cc.c * 10 + dd.d КАК ЧислоИнтервала
ИЗ
   (ВЫБРАТЬ
       0 КАК a
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       1
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       2
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       3
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       4
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       5
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       6
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       7
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       8
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       9) КАК aa,
   (ВЫБРАТЬ
       0 КАК b
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       1
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       2
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       3
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       4
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       5
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       6
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       7
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       8
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       9) КАК bb,
   (ВЫБРАТЬ
       0 КАК c
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       1
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       2
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       3
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       4
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       5
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       6
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       7
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       8
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       9) КАК cc,
   (ВЫБРАТЬ
       0 КАК d
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       1
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       2
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       3
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       4
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       5
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       6
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       7
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       8
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       9) КАК dd
13 МихаилМ
 
24.07.12
10:36
мы живем в слишком динамичном мире
чтобы ограничиваться условмем " одна операция выполняется 30 минут"
14 GrayT
 
24.07.12
10:45
(13)Задача упрощена. Вставить плановую продолжительность операции в справочник - не проблема. Сейчас на задачу накладываю ограничение и решаю с ним.