Расписание: объект и примеры применения

24.07.23

Разработка - Универсальные функции

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

Скачать исходный код

Наименование Файл Версия Размер
Расписание: расширение со справочником для управляемых форм
.cfe 16,70Kb
7
.cfe 16,70Kb 7 Скачать

Когда обсуждается работа по расписанию, в указанный день и время, обычно имеется в виду установка регламентного задания на это время. Регламентные задания можно создавать программно, с разными расписаниями.

Возникла задача использовать расписания отдельно от регламента для следующих целей.

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

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

3) возможны требования использования расписания, которое невозможно реализовать через меню расписания регламентного задания - например "понедельник четной недели года", "15е и посл.день месяца" и т.п.

Недостатком данного метода является то, что у вас не будет привычного журналирования выполнения регламентных заданий. Также подразумевается, что у вас все эти задачи привязываются ко дню без учета времени.

Решить данную задачу предлагается созданием простенького справочника, содержащего либо строку с сериализованным объектом "Расписание регламентного задания", который превосходно работает и отдельно от самого регламентного задания, либо строку с формулой на языке 1с.

Далее - для рассылки вы добавляете поле "Расписание" в справочник настройки рассылки отчетов, устанавливаете регламент этой рассылки в ежедневный и при срабатывании регламента дополнительно проверяете срабатывание условия соответствия расписанию и только после этого высылаете отчет.

В случае с датой отгрузки можно искать следующую "правильную" дату после даты отгрузки указанной в заказе, и принудительно ставить дату отгрузки на нее.

В случае со скидками требуется аккуратная "прошивка" поля "Расписание" от документа установки скидки до функции вычисления результата скидки или акции.

 

Справочник расписание в конфигуратореМногострочное расписание

 

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

Табличная часть сделана для того чтобы можно было соединять несколько расписаний. В программе они соединяются через "или", но конечно можно настроить какие угодно соединения.

Модуль обработки расписания я для простоты выложил в менеджер объекта:

// Преобразует объект расписание в сериализованную строку, для хранения в справочнике
Функция РасписаниеВСтроку(Расписание) Экспорт
	Если Строка(Расписание) = "один день; один раз в день" Тогда
		Возврат "";
	Иначе
		ЗаписьXML = Новый ЗаписьXML;
		ЗаписьXML.УстановитьСтроку();
		СериализаторXDTO.ЗаписатьXML(ЗаписьXML,Расписание);
		Возврат ЗаписьXML.Закрыть();
	КонецЕсли;
КонецФункции

//В реквизите расписания будем хранить либо сериализованный объект либо формулу для вычисления
Функция ЭтоОбъектРасписание(стрРасписание) Экспорт
	Возврат Лев(стрРасписание,12) = "<JobSchedule"
КонецФункции

//Обратное преобразование строки в объект
Функция СтрокаВРасписание(стрРасписание0) Экспорт
	
	Если ТипЗнч(стрРасписание0) = Тип("СправочникСсылка.Расписания") Тогда
		стрРасписание = стрРасписание0.Расписание;
	Иначе
		стрРасписание = стрРасписание0;
	КонецЕсли;
		
	Если стрРасписание = "" Тогда Возврат Новый РасписаниеРегламентногоЗадания КонецЕсли;
	
	Попытка
		ЧтениеXML = Новый ЧтениеXML;
		ЧтениеXML.УстановитьСтроку(стрРасписание);
		Расписание = СериализаторXDTO.ПрочитатьXML(ЧтениеXML,Тип("РасписаниеРегламентногоЗадания"));
	Исключение
		Расписание = Новый РасписаниеРегламентногоЗадания;
	КонецПопытки;

	Возврат Расписание;
КонецФункции

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

//Интерфейс справочника. Предоставляем элемент справочника, и дату,
//Возвращаем истина если дата подходит под условия расписания.
Функция ВыполнятьЗадание(Расписание, ТестДата) Экспорт
	
	Если НЕ ЗначениеЗаполнено(Расписание) Тогда Возврат Истина КонецЕсли;

	Если ТипЗнч(Расписание) = Тип("Строка") Тогда
		Если Расписание = "" Тогда Возврат Истина КонецЕсли;
		Возврат ТребуетсяВыполнение(Расписание, тестДата);
	Иначе
		обРасписание = Расписание;
		фВыполнять = Ложь;
		Для каждого р из обРасписание.ДетальноеРасписание Цикл
			Если Не ЗначениеЗаполнено(р.Расписание) Тогда Продолжить КонецЕсли;
			фВыполнять = фВыполнять или ТребуетсяВыполнение(р.Расписание, тестДата);
		КонецЦикла;
		Возврат фВыполнять;
	КонецЕсли;	

КонецФункции

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

	Возврат Строка(обРасписание);

КонецФункции

//Переборка дат для получения следующей даты.
//рекомендуется вынести в модуль с повторным использованием если быстродействие
//будет снижаться
Функция ПолучитьСледующуюДату(Расписание, ДатаОтгрузки) Экспорт
	Если НЕ ЗначениеЗаполнено(Расписание) Тогда Возврат ДатаОтгрузки КонецЕсли;
	//Условно считаем что хотя бы раз в месяц должно выполняться
	максДата = ДобавитьМесяц(ДатаОтгрузки, 1);
	ТекДата = ДатаОтгрузки;
	Пока ТекДата<=максДата Цикл
		Если ВыполнятьЗадание(Расписание,ТекДата) Тогда Возврат ТекДата КонецЕсли;
		ТекДата = ТекДата + 86400;
	КонецЦикла;
	Возврат ДатаОтгрузки; // Не нашли - грузим по факту.
КонецФункции

Для формы элемента предлагается такая начинка

 
 Модуль элемента формы для обычных форм

 

При двойном клике на колонке расписания будет вызван стандартный диалог расписания регламентного задания (естественно без самого задания).

 

Открытие окна диалога расписания регламентного задания

 

При редактировании расписания учтите что в нем не будут работать настройки меньше чем то, что вы поставите в регламенте, кроме того не будет проверяться предыдущее выполнение, поэтому "один день" и "каждый день" при проверке будут выдавать один и тот же результат, настройка "повторять каждые" тоже не работает, так как в данном случае 1с эти самые каждые не хранит. А вот настройка периода с какой даты и по какую - работает.

Другой вариант - задание строки формулы. Для этого вам надо будет обойти двойной клик - сначала войти в редактирование строки скажем в колонке Период, а затем перейти в колонку Расписание и внести корректную формулу. Например - понедельник нечетной недели: ДеньНедели(Дата)=1 и НеделяГода(Дата)%2=1

 

Расписание формулой

 

Тестирование даты на картинке выше:

Сообщить(Расписание.Наименование + ", " + пТестДаты + " - " + Справочники.Расписания.ВыполнятьЗадание(Расписание,пТестДаты));

где пТестДаты - поле тестовой даты.

Чтобы вернуться обратно в режим открытия окна расписания, нужно сначала стереть эту формулу и выйти из редактирования.

Примеры использования.

1) для рассылки моя компания использует замечательную разработку Автоматическая рассылка отчетов из 1С: Управление торговлей 10.3 и 1С:УПП по электронной почте.

В справочник "Настройка рассылки отчетов" я поместил реквизит Расписание, поместил его на форме и для его обработки добавил в модуль РассылкаОтчетов в процедуру РассылкаОтчетов (которая вызывается по регламентному заданию) следующий фрагмент

	//...........начало пропущено.
	//далее идет цикл выборки по записям справочника настроек отчетов для рассылки.
	Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
		
		Попытка
			
			НастройкаРассылки = ВыборкаДетальныеЗаписи.НастройкаРассылки;
			
			//+++++ Расписание в расписании
			Если НЕ Справочники.Расписания.ВыполнятьЗадание(НастройкаРассылки.Расписание,ТекущаяДата()) Тогда
				Продолжить;
			КонецЕсли;

			//+++++ Конец вставки

Расписание для регламентного задания РассылкаОтчетов подразумевается ежедневное один раз в день. Время отправки вы настраиваете именно в этом расписании. Отдельные регламенты для каждого отчета создавать после этой добавки не нужно.

2) Для корректировки даты отгрузки в модуль ПередЗаписью, или на форму в событие заполнения/изменения даты/даты отгрузки достаточно добавить строчку

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

- это при условии что у вас реквизит Расписание добавлен в справочник Контрагенты.

Естественно что вам необходимо тщательно продумать проверку, в каких случаях можно автоматически переставлять дату отгрузки в соответствии с бизнес-условиями вашего предприятия. Желательно проверять наличие уже выданной накладной и закрытие заказа.

Если вашему бизнесу требуется возможность корректировки даты отгрузки, скажем если у вас машина отправляется по средам но на следующей неделе вам необходимо ее отправить в четверг, то придется заводить дополнительный документ, записывающий соответствие типовой следующей даты и той, которая должна быть.

3) для проставления расписания для скидки вам потребуется:

- внести реквизит Расписание в документ "Установка скидок номенклатуры", вывести его на форму;

- Заведем также реквизит в регистре сведений СкидкиНаценкиНоменклатуры, если вы добавляли реквизит расписания в основные реквизиты документа, то в модуле проведения добавляется строчка записи в регистр из СтруктураШапкиДокумента.

- в модуле ОбработкаТабличныхЧастей в запросе в функции ЗапросПоСкидкам в запрос вписывается реквизит Расписание,

- в функцию РассчитатьСкидкиПриПродаже вставляется проверка расписания, такая же как для рассылки отчетов.

Upd 24.07.2023 - Версия для управляемых форм

Форма элемента справочника Расписания на управляемой форме

- Отличается только модулем элемента формы. Модуль менеджера объекта остается такой же.

(форму предлагается скачать по ссылке внизу).

P.S. Естественно при необходимости можно создавать Календари, События, добавить в справочник время и т.п. У меня пока таких задач не стояло.

P.P.S. Примеры применения для УТ11 будут до конца года.

P.P.P.S. Добавлен файл для скачивания - расширение для Управляемых Форм. Вы можете его скачать для поддержания разработчика, а также воспользоваться привязкой событий к элементам формы. Все тексты модуля опубликованы в статье.

Расписание регламентного задания расписание отгрузки акций расписание рассылки отчетов.

См. также

Автоподбор ролей для профилей и групп доступа в любых типовых базах 1С УТ 11, КА 2, ERP2, Розница 2/3, УНФ 16/3, БП 3, ЗУП 3 и подобных (УФ, Платформа 8.3.14+)

Инструменты администратора БД Роли и права 8.3.14 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:Документооборот 1С:Зарплата и кадры государственного учреждения 3 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Платные (руб)

Роли… Вы тратите много времени и сил на подбор ролей среди около 2400 в ERP или 1500 в Рознице 2, пытаясь понять какими правами они обладают? Вы все время смотрите права в конфигураторе или отчетах чтоб создать нормальные профили доступа? Вы хотите наглядно видеть какие права дает профиль и редактировать все в простом виде? А может хотите просто указать подсистему и дать права на просмотр и добавление на объекты и не лезть в дебри прав и чтоб обработка сама подобрала нужные роли? Все это теперь стало возможно! Обновление от 15.12.2023, версия 1.1.

14400 руб.

06.12.2023    3717    19    1    

40

Infostart УДиФ: Управление данными и формами 1С

Инструменты администратора БД Инструментарий разработчика Роли и права Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

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

10000 руб.

10.11.2023    4649    12    2    

38

SALE! %

PowerTools

Инструментарий разработчика Инструменты администратора БД Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Россия Платные (руб)

Универсальный инструмент программиста для администрирования конфигураций. Сборник наиболее часто используемых обработок под единым интерфейсом.

3600 2280 руб.

14.01.2013    178841    1085    0    

862

Ускоренное проведение документов (x4), устранение ошибок 60/62 счетов и зачет авансов (Бухгалтерия 3.0)

Закрытие периода Инструменты администратора БД Корректировка данных Бухгалтерский учет 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Платные (руб)

Расширение «Оперативное проведение» в 4 раза уменьшает время проведения документов и закрытия месяца. Является комплексным решением проблем 62 и 60 счетов. Оптимизирует проведение при включенной функциональной опции «Раздельный учет НДС». Используется в более 10 организациях уже 2 года. Совместимо с конфигурацией Бухгалтерия 3.0 (+КОРП).

14400 руб.

29.04.2020    28101    83    146    

61

Автоматическая рассылка отчетов из 1С: Управление торговлей 10.3 и 1С:УПП по электронной почте

Email рассылки Оптовая торговля Платформа 1С v8.3 1С:Управление торговлей 10 1С:Управление производственным предприятием Управленческий учет Платные (руб)

Многим сотрудникам предприятия требуется актуальная и достоверная информация для принятия верных управленческих решений. Получить данную информацию можно при помощи отчетов, существующих в конфигурации «1С: Управление торговлей 10.3» или «1С:УПП». Но не всегда у пользователей есть время, возможность и/или желание формировать отчеты непосредственно в системе. Намного привычней и удобней получать готовые отчеты на электронную почту, не открывая 1С.

12000 руб.

16.04.2014    84449    100    91    

94

"Менеджер потоков 2.1": УПП: "Восстановление партий"

Инструменты администратора БД Платформа 1С v8.3 1С:Управление производственным предприятием Россия Бухгалтерский учет Управленческий учет Платные (руб)

Как оптимизировать то, что, считалось, не поддается оптимизации? Как повысить доступность базы данных? Как проводить самую «времяемкую» операцию не по паре раз в неделю, а по несколько раз в день*? Ответ есть!

20000 руб.

12.09.2019    11883    5    9    

7

Система хранения присоединенных файлов в томах на диске

Инструменты администратора БД Платформа 1С v8.3 1С:Комплексная автоматизация 1.х 1С:Управление производственным предприятием Платные (руб)

Конфигурация Комплексная автоматизация 1.1 (и УПП 1.3 тоже) хранит файлы и изображения в справочнике Хранилище дополнительной информации в реквизите Хранилище типа ХранилищеЗначений. Та же история с ВложениямиЭлектроннойПочты. Но при этом присоединенные файлы в Электронном документообороте хранит в томах на диске. Эта доработка позволяет использовать стандартный механизм хранения файлов, изображений и вложений электронных писем в томах на диске. При этом можно разделить тома хранения по объектам конфигурации.

4200 руб.

10.11.2015    61600    90    59    

74

Конфигурация Session Monitor

Мониторинг Инструменты администратора БД Платформа 1С v8.3 Россия Платные (руб)

Конфигурация Session Monitor предназначена для мониторинга сервера 1С с целью отслеживания чрезмерной нагрузки от конкретных сеансов и скорости реакции рабочих процессов.

1500 руб.

01.12.2020    14445    35    0    

49
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Sergafan10 30.07.21 08:53 Сейчас в теме
Активно жду для УТ11 и УФ
2. babikoff 1 19.07.23 12:59 Сейчас в теме
Добрый день. Появилась ли версия для УТ 11?
3. schthaxe 53 24.07.23 10:41 Сейчас в теме
(2) Добрый день! Спасибо за ваше внимание, вот решил воспользоваться свободным выходным и добавил версию для УФ.
4. stepan13 01.11.23 00:30 Сейчас в теме
Подскажите, есть ли какая-то принципиальная разница хранения именно через сериализатор вместо ЗначениеВСтрокуВнутр?
Оставьте свое сообщение