Имя: Пароль:
1C
1С v8
Интерпретация ДиалогРасписанияРегламентногоЗадания в таблицу дат
,
0 Веселый Джузеппе
 
28.06.19
09:08
Доброе утра, уважаемые форумчане!
Занимаюсь задачкой, в рамках которого требуется сделать некий механизм планирования процессов, планированием занимается пользователь.

Доработки веду на базе 1С Розница 2.2.11.30, 1С:Предприятие 8.3 (8.3.13.1513)

На данном этапе картина следующая, есть справочник "Группы обучения", у которого есть кроме всего прочего реквизит РегламентноеЗадание (тип УникальныйИдентификатор), подвязанный к моему регламентному заданию. Идея регламента - оповещение о проведении занятия, расписание настраивается отдельно, для каждого элемента справочника.

Вопрос в следующем, как мне интерпретировать расписание в некую структуру, чтобы на ее основании заполнять РС для формирования плана проведения занятий?
Может кто сталкивался с подобной реализацией? Поделитесь опытом!
1 Веселый Джузеппе
 
28.06.19
09:13
Также приветствуются альтернативные механизмы реализации планирования, календарь аля документооборот не предлагать)
2 Йохохо
 
28.06.19
09:19
ошибка проектирования
3 Веселый Джузеппе
 
28.06.19
09:21
(2) только в том, что гибкости не хватит? Проект не срочный, мне больше интересно разобраться в механизме
4 exwill
 
28.06.19
09:22
(0) Не умножайте сущности... Храните в справочнике РасписаниеРегламентногоЗадания и оповещайте себе на здоровье.
5 Йохохо
 
28.06.19
09:25
(3) в том что задание это изменяющаяся во времени сущность и вообще не привязана к предметной области, в реквизите ей делать нечего
6 Веселый Джузеппе
 
28.06.19
09:29
(4) (5) Справедливо, я уже столкнулся умножением регламентов, решил переделать.
Есть ли механизмы для работы с РасписаниеРегламентногоЗадания или придется писать свой парсер, чтобы на выходе получить, например, таблицу значений?
7 Веселый Джузеппе
 
28.06.19
09:31
Как бы вы подошли к реализации данной задачи?
8 palsergeich
 
28.06.19
09:36
Глянь как в БСП это сделано.
9 exwill
 
28.06.19
09:38
(6) Ну какой там парсер! Надо оповестить - используешь метод ТребуетсяВыполнение(). Надо визуализировать календарь - используешь его же. Выкинь таблицу из головы.
10 Веселый Джузеппе
 
28.06.19
09:38
(8) в части какой подсистемы?
11 palsergeich
 
28.06.19
09:40
Как бы сделал я
РС в котором хранится дата следующего запуска в разрезе заданий.
+ Регламентные задание которое рассчитывает дату следующего задания которое <= текущая дата.
+ Регламентные задание, которое запускает регламентные задание, время которого пришло, в принципе их можно объединить.
+ Вместе с объектом расписание регламентные задание хранил бы его хеш.
+ Подписка на событие - хеш изменился - делаем расчет даты следующего запуска.
12 palsergeich
 
28.06.19
09:40
(10) регламентные задания
13 palsergeich
 
28.06.19
09:41
Или рассылка отчётов по расписанию.
14 Веселый Джузеппе
 
28.06.19
09:44
(9) Действительно, можно этот метод в цикле погонять.
Вопрос, какой тип реквизиты справочника должен быть, чтобы хранить РасписаниеРегламентногоЗадания? Я видел только примеры с гуидом на конретный экземляр регламентного задания, где и хранилось расписание
15 Веселый Джузеппе
 
28.06.19
09:47
(11) В целом для просчета следующего подойдет, но есть потребность анализа всего расписания в целом, т.е. при изменении расписания надо прописывать все даты (ТребуетсяВыполнение()), когда оно отработает, например для вывода в диаграмму ганта
16 palsergeich
 
28.06.19
09:49
(15) ну рассчитывай на весь период.
Просто с расписанием храни его хеш и при изменении пересчитывая.
17 palsergeich
 
28.06.19
09:52
Пусть даже самым тупым способом.
Ясно что квант расписания одного задания не может быть меньше какой то величины.
Тупо циклом прибавляй у дате это значение и ТребуетсяВыполнение()
18 Веселый Джузеппе
 
28.06.19
09:52
(16) В (4) правильно написано, что мне экземпляр регламента на каждый элемент мне по сути не нужен, достаточно хранения расписания.
Но пока я не понял, как его можно привязать к элементу справочника
19 exwill
 
28.06.19
09:53
(14) Строка же. Строка все стерпит )))
20 Веселый Джузеппе
 
28.06.19
10:07
(19) допустим, как его в Новый РасписаниеРегламентногоЗадания конвертировать?
21 Веселый Джузеппе
 
28.06.19
10:08
Т.е. получается есть строка вида "c 1 января 2019 г. по 1 августа 2019 г. каждый 2-й день; с 7:00:00 по 20:00:00 каждые 5 секунд"
22 palsergeich
 
28.06.19
10:12
(21) нет.
Массив дат сериализуешь в json или xml и пихаешь в реквизит.
Но это костыль.лучше сделать РС.
2 измерения - ссылка на справочник и дата.
Тогда ты сможешь получать эти значения в запросе без постобработки, а оно потребуется, поверь.
23 palsergeich
 
28.06.19
10:13
А если само расписание - то значение в строкувнутр или сериализовать во чтотнибудь
24 palsergeich
 
28.06.19
10:13
(21) из такой строки ты обратно расписание не получишь.
25 Веселый Джузеппе
 
28.06.19
10:14
(23) было бы логично хранить именно расписание, я думаю. Для его корректировки возможной, как минимум...
26 palsergeich
 
28.06.19
10:21
(25) правильнее хранить и то и то.
Меняешь расписание -> пересчитывает даты.
Нужно отчёт/запрос или ещё что то - обращаешься к рассчитанным данным, а не пишешь набор данных.объекд для СКД и прочие непотребство.
Неужто ты для составления календаря на год будешь получать все расписания, потом получать все даты, а потом только выводить?
Ванную это будет работать так медленно, что ты потом пожалеешь, что сэкономил на спичках (регистре)
27 exwill
 
28.06.19
10:23
(20) Кошерно - через XDTO
Некошерно - через ЗначениеВСтрокуВнутр(), ЗначениеИзСтрокиВнутр().
28 exwill
 
28.06.19
10:24
(26) Это будет работать быстро. Чему там замедляться?
29 palsergeich
 
28.06.19
10:28
(28) во первых чисто суульная операция априори быстрее встроенного кода.
Во вторых 1000 расписаний за год это больше миллиона небесплатных проверок.
30 palsergeich
 
28.06.19
10:32
(29) с шагом. В час
31 Веселый Джузеппе
 
28.06.19
10:40
(27) прокатил некошерный вариант, спасибо!)
никогда не пользовался функциями, день прошел не зря)
32 Веселый Джузеппе
 
28.06.19
10:41
(31) именно этими ЗначениеВСтрокуВнутр(), ЗначениеИзСтрокиВнутр() (уточнение)
33 Вафель
 
28.06.19
10:42
с регистром нужен регламент для расчета дат
+ не забывать пересчитывать при изменении
34 Веселый Джузеппе
 
28.06.19
10:43
по факту получилось:
Реквизит справочника РасписаниеГруппы тип Строка(1000)

&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
    
    ПолучитьРасписаниеРегламентногоЗадания();
    
КонецПроцедуры

&НаСервере
Процедура ПолучитьРасписаниеРегламентногоЗадания()
    
    Если ЗначениеЗаполнено(Объект.РасписаниеГруппы) Тогда
       Расписание = ЗначениеИзСтрокиВнутр(Объект.РасписаниеГруппы);
    Иначе
       Расписание = Новый РасписаниеРегламентногоЗадания;        
    КонецЕсли;
    
КонецПроцедуры

&НаКлиенте
Процедура КомандаНастроитьРасписание(Команда)
    
    Если Расписание = Неопределено Тогда
        ПолучитьРасписаниеРегламентногоЗадания();
    КонецЕсли;
    
    ДиалогРасписания = Новый ДиалогРасписанияРегламентногоЗадания(Расписание);
    ДополнительныеПараметры = Новый Структура;
    ОбработчикОповещения = Новый ОписаниеОповещения("НастроитьРасписаниеЗавершение", ЭтотОбъект, ДополнительныеПараметры);
    ДиалогРасписания.Показать(ОбработчикОповещения);
    
КонецПроцедуры

&НаКлиенте
Процедура НастроитьРасписаниеЗавершение(Результат, ДополнительныеПараметры) Экспорт
    
    Если Результат <> Неопределено Тогда
        ЭтаФорма.Модифицированность = Истина;
        Расписание         = Результат;
        РасписаниеСтрокой  = Строка(Расписание);
        ЗаписатьРасписаниеНаСервере();
    КонецЕсли;
    
КонецПроцедуры

&НаСервере
Процедура ЗаписатьРасписаниеНаСервере()
    
    Объект.РасписаниеГруппы = ЗначениеВСтрокуВнутр(Расписание);
    
КонецПроцедуры
35 Веселый Джузеппе
 
28.06.19
10:44
ну и наверно, буду переписывать регистр сведений после изменения расписания, чтобы удобнее было работать в запросах.

Всем спасибо за участие в решении вопроса.
36 exwill
 
28.06.19
10:44
(29) Какая-такая тысяча расписаний? Мы что, МГУ просчитываем?
37 Вафель
 
28.06.19
10:44
(34) а где настройка рег заданий на расписание?
38 palsergeich
 
28.06.19
10:47
(36) За год даже в паршивеньком УЦ типо автошколы несколько сотен групп более чем реальность.
В МГУ и МГТУ счет идет на десятки тысяч
39 Веселый Джузеппе
 
28.06.19
10:49
(37) так оно уже не нужно, я с ним изначально завязался т.к. не знал, как реализовать работу с РасписаниеРегламентногоЗадания.

При записи элемента справочника заполняю регистр измерение ссылка на справочник, ресурс дата выполнения. Отдельное регламентное задание будет за текущий день собирать записи с регистра и формировать оповещения и т.д.
40 palsergeich
 
28.06.19
10:53
(39) Лучше не при записи, а при реальном изменении. Так будет оптимальнее.
Можно в лоб сравнить строки, можно хеш функцией.
41 Веселый Джузеппе
 
28.06.19
10:57
(40) я понял мысль, согласен, нужна контролька, чтобы попосту не переписывать