Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Интерпретация ДиалогРасписанияРегламентногоЗадания в таблицу дат

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

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

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


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.