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

24.07.23

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

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Расписание: расширение со справочником для управляемых форм
.cfe 16,70Kb
10
10 Скачать (1 SM) Купить за 1 850 руб.

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

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

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С v8.3 Конфигурации 1cv8 1С:Управление торговлей 10 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 Россия Платные (руб)

Инструмент представляет собой обработку для проведения свёртки или обрезки баз данных. Работает на ЛЮБЫХ конфигурациях (УТ, БП, ERP и т.д.). Поддерживаются управляемые и обычные формы. Может выполнять свертку сразу нескольких баз данных и выполнять их автоматически без непосредственного участия пользователя.

8400 руб.

20.08.2024    8555    65    29    

76

Инструменты администратора БД Роли и права Системный администратор Программист Пользователь 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, пытаясь понять какими правами они обладают? Вы все время смотрите права в конфигураторе или отчетах чтоб создать нормальные профили доступа? Вы хотите наглядно видеть какие права дает профиль и редактировать все в простом виде? А может хотите просто указать подсистему и дать права на просмотр и добавление на объекты и не лезть в дебри прав и чтоб обработка сама подобрала нужные роли? Все это теперь стало возможно! Обновление от 18.09.2024, версия 1.2

16800 руб.

06.12.2023    9080    43    5    

74

SALE! %

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

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

15000 10000 руб.

10.11.2023    10656    38    27    

63

SALE! %

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

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

4800 3840 руб.

14.01.2013    188485    1142    0    

913

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

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

14400 руб.

29.04.2020    32877    106    152    

73

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

Данная разработка позволит решить вопрос с резервным копированием Ваших баз в автоматическом режиме, расположенных на сервере 1С. Система умеет ставить блокировки на вход, блокировать фоновые задания, принудительно отключать сеансы пользователей. И все это система делает в автоматически при создании бэкапа (или через команду). Выгрузка происходит в родной формат 1С - .dt. Так же система умеет архивировать данные выгрузки с установкой пароля. Умеет менять расширение файла zip или dt на любое указанное вами, что позволит сохранить выгрузки от шифровальщика. Может удалять старые копии выгрузок, оставляя указанное количество резервных копий, начиная с самой поздней. Только для WINDOWS!

6000 руб.

06.11.2012    72923    627    45    

85

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

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

4200 руб.

10.11.2015    62905    94    59    

79

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

Многие сталкиваются с проблемой когда изображения, находящиеся в базе разные по объему и размерам. Менеджеры могут добавить файлы в очень высоком разрешении, объемом свыше 20 Мегабайт. База данных становится слишком большой, выгрузка на сайт идёт медленно и требуется много место на хостинге. Как сжать картинки и уменьшить размер базы 1С? Это можно сделать с помощью данной обработки. Существует возможность выбрать различные варианты для того чтобы уменьшить картинки: в разы, в процентах от первоначального объема, а также сделать картинки одинаковой ширины. В результате размер базы 1С значительно сократится (в зависимости от количества и размера картинок), а изображения станут небольшого объема, равными по ширине, почти без потери качества. Работает на управляемых формах для УТ 11, КА, ERP.

3000 руб.

21.07.2022    9898    7    4    

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