Конструктор Cron расписания

10.11.25

Разработка - Инструментарий разработчика

Внешняя обработка для формирования расписания в формате CRON. Возможности: 1. Конструктор строки cron в формате для установки расписания перезапуска рабочих процессов в кластере на платформе 8.3.27 и выше. 2. Определение ближайших запусков на основе строки cron начиная с текущей даты

Файлы

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

Наименование Скачано Купить файл
Конструктор Cron расписания
.epf 17,15Kb
3 1 850 руб. Купить

Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний

Оформите подписку на компанию для решения рабочих задач

Оформить подписку и скачать решение со скидкой

 

Нововведение в платформе 1С 8.3.27: задание расписания перезапуска процессов

В версии платформы 1С:Предприятие 8.3.27 изменился подход к настройке расписания перезапуска рабочих процессов.

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

Теперь, начиная с версии 8.3.27, расписание задаётся в формате cron, что позволяет гибко контролировать время перезапуска и исключить нежелательные простои.

Подробнее об изменениях можно прочитать здесь:

Для удобства можно использовать специальную обработку, которая помогает сформировать расписание в нужном формате с помощью визуального конструктора и сгенерировать даты запуска на основе заданных параметров.

Код для парсинга cron строки и получения дат запуска, работает быстро (от 3 до 50 мил.сек.):

// ТекстРасписания - Строка в формате cron
// ДатаНачалаРасчета - Дата начала с которой начнется расчет
// МаксимальноеКоличество - Максимальное количество возвращаемых дат
// Возврат - Массив - Даты следующих запусков

Функция ПолучитьБлижайшиеДатыРасписания(знач ТекстРасписания,ДатаНачалаРасчета,МаксимальноеКоличество) Экспорт
	// Приводим cron-текст в единообразный вид: удаляем табуляции и переводы строк
	ТекстРасписания = СтрЗаменить(ТекстРасписания,Символы.Таб," ");
	ТекстРасписания = СтрЗаменить(ТекстРасписания,Символы.ПС,"");
	
	// Убираем лишние пробелы подряд
	Пока СтрНайти(ТекстРасписания,"  ") > 1 Цикл
		ТекстРасписания = СтрЗаменить(ТекстРасписания,"  "," ");
	КонецЦикла;
	
	// Расписаний может быть несколько, разделенных точкой с запятой
	пМассивРасписаний = СтрРазделить(ТекстРасписания,";");
	
	пНайденныеЗначения = Новый Соответствие; // Здесь будут храниться все найденные даты выполнения
	Отказ = Ложь;
	// Обрабатываем каждое расписание отдельно
	Для Каждого ТекРасписание Из пМассивРасписаний Цикл
		ОбработатьКонкретноеРасписание(СокрЛП(ТекРасписание),пНайденныеЗначения,ДатаНачалаРасчета,МаксимальноеКоличество,Отказ);
		Если Отказ Тогда
			прервать;
		КонецЕсли;
	КонецЦикла;
	
	// Если ошибок не было — пишем, что всё успешно
	Если не Отказ Тогда
		Комментарий = "Все ок!";
	КонецЕсли;
	
	// Преобразуем найденные значения в список и сортируем
	СЗ = Новый СписокЗначений;
	Для Каждого Тек Из пНайденныеЗначения Цикл
		СЗ.Добавить(Тек.Ключ);
	КонецЦикла;
	
	СЗ.СортироватьПоЗначению();
	// Возвращаем массив найденных дат
	Возврат СЗ.ВыгрузитьЗначения();		
КонецФункции

Процедура ОбработатьКонкретноеРасписание(ТекРасписаниеТекст,пНайденныеЗначения,ДатаНачалаРасчета,МаксимальноеКоличество,Отказ)
    // Разбиваем cron-запись по пробелам
	пМассивЗначений = СтрРазделить(ТекРасписаниеТекст," ",Ложь);
	пКоличествоЗначений = пМассивЗначений.Количество(); 
	
	// Проверяем количество частей cron-строки (должно быть 5 или 6)
	Если пКоличествоЗначений < 5 Или пКоличествоЗначений > 6  Тогда        
		Комментарий = "В расписании: " + ТекРасписаниеТекст + " обнаружено некорректное количество значений: " + Строка(пКоличествоЗначений);
		Отказ = Истина;
		Возврат;
	КонецЕсли;
	
	// Получаем возможные значения минут, часов, дней, месяцев и дней недели
	пМассивМинут 		= ПолучитьМассивЗначений(пМассивЗначений[0],0,59,Отказ,Истина);
	пМассивЧас 			= ПолучитьМассивЗначений(пМассивЗначений[1],0,23,Отказ,Истина);
	пМассивДень 		= ПолучитьМассивЗначений(пМассивЗначений[2],1,31,Отказ);
	пМассивМесяц 		= ПолучитьМассивЗначений(пМассивЗначений[3],1,12,Отказ);
	пМассивДеньНедели 	= ПолучитьМассивЗначений(пМассивЗначений[4],0,6,Отказ);
	
	// Инициализация параметров поиска
	пДеньНачала 				= НачалоДня(ДатаНачалаРасчета);
	пКоличествоНайденных 		= 0;
	пСекундВСутках 				= 60*60*24;
	пМаксимальнаяГлубинаПоиска 	= 365*3; // ограничение на 3 года вперёд
	
	// Перебор дней для поиска совпадений с расписанием
	Для сч = 0 по пМаксимальнаяГлубинаПоиска Цикл
		пТекДень = пДеньНачала + (пСекундВСутках*сч);
		// Получаем совпадения по текущему дню
		пМассивНайденных = ПолучитьМассивСовпадений(пТекДень,пМассивМинут,пМассивЧас,пМассивДень,пМассивМесяц,пМассивДеньНедели);
	    Для Каждого ТекНайденное Из пМассивНайденных Цикл
			// Добавляем дату, если она не раньше даты начала расчета
			Если ТекНайденное >= ДатаНачалаРасчета Тогда
				пНайденныеЗначения.Вставить(ТекНайденное,Истина);
				пКоличествоНайденных = пКоличествоНайденных + 1;
			КонецЕсли;	
		КонецЦикла;
		
		
		// Прерываем поиск, если достигнуто нужное количество дат
		Если пКоличествоНайденных >= МаксимальноеКоличество Тогда
			Прервать;
		КонецЕсли;
	КонецЦикла;
	
КонецПроцедуры 

Функция ПолучитьМассивСовпадений(пТекДень,пМассивМинут,пМассивЧас,пМассивДень,пМассивМесяц,пМассивДеньНедели)
	пМасСовпадений = Новый массив;
	
	// Проверяем, соответствует ли день недели расписанию
	пТекДеньНедели = ДеньНедели(пТекДень);
	Если Не СовпалоЗначение(пМассивДеньНедели,7,?(пТекДеньНедели=7,0,пТекДеньНедели)) Тогда
		Возврат пМасСовпадений;
	КонецЕсли;

	// Проверяем месяц
	Если Не СовпалоЗначение(пМассивМесяц,12,Месяц(пТекДень)) Тогда
		Возврат пМасСовпадений;
	КонецЕсли;
	
	// Проверяем день месяца
	Если Не СовпалоЗначение(пМассивДень,31,День(пТекДень)) Тогда
		Возврат пМасСовпадений;
	КонецЕсли;
	
	// Если день подходит — формируем список дат с учётом часов и минут
	Для Каждого ТекЧас ИЗ пМассивЧас Цикл
		Для Каждого ТекМин Из пМассивМинут Цикл
			пМасСовпадений.Добавить(пТекДень + ТекЧас * 3600 + ТекМин *60);
		КонецЦикла;
	КонецЦикла;
	
	Возврат пМасСовпадений;
КонецФункции

Функция СовпалоЗначение(пМассивЗначений,МаксимальноеКоличество,ТекщееЧисло)
	// Если массив содержит все возможные значения (например, "*"), то всегда совпадает
	пКолВо = пМассивЗначений.Количество();
	Если пКолВо = МаксимальноеКоличество Тогда
		Возврат Истина;
	КонецЕсли;
	
	// Проверяем, содержится ли текущее число в массиве значений
	пСовпало = Ложь;
	Для Каждого ТекЗН Из пМассивЗначений Цикл
		Если ТекЗН = ТекщееЧисло Тогда
			пСовпало = Истина;
			Прервать;
		КонецЕсли;
	КонецЦикла;	
	
	Возврат пСовпало;
КонецФункции

Функция ПолучитьМассивЗначений(пТекст,Минзнч,МаксЗнч,Отказ,ПрибавитьЕдиницу = Ложь)
	пСоотв = Новый Соответствие;
	
	// Разбиваем строку значений по запятым (например, "1,15,30")
	пМассивЗначений = СтрРазделить(пТекст,",",Ложь);
	Для Каждого ТекЗнч Из пМассивЗначений Цикл
		Попытка
			Если ТекЗнч = "*" Тогда // Все возможные значения
				Для сч = Минзнч по МаксЗнч Цикл
					пСоотв.Вставить(сч,Истина);
				КонецЦикла;
			Иначе
				// Проверяем, содержит ли выражение шаг "/" или диапазон "-"
				пЕстьКаждые = СтрНайти(ТекЗнч,"/") > 0;
				пЕстьИнтервал = СтрНайти(ТекЗнч,"-") > 0;
				
				Если пЕстьКаждые Тогда
					// Обрабатываем выражения вроде */5 (каждые 5 минут)
					пМас = СтрРазделить(ТекЗнч,"/",Ложь);
					пНачатьС = ?(пМас[0]="*",МинЗнч,Макс(Минзнч,Число(пМас[0])));
					пЗначенияТекст = пМас[1];
				Иначе
					пНачатьС = МинЗнч;
					пЗначенияТекст = ТекЗнч;
				КонецЕсли;
				
				пМассивТекущихЗначений = Новый Массив;
				
				Если пЕстьИнтервал Тогда
					// Обрабатываем диапазон, например "10-20"
					пМасИнтервалов = СтрРазделить(пЗначенияТекст,"-",ложь);
					Для счЗначений = Число(пМасИнтервалов[0]) по Число(пМасИнтервалов[1]) Цикл
						пМассивТекущихЗначений.Добавить(счЗначений);
					КонецЦикла;	
				Иначе
					// Простое число без диапазона
					пМассивТекущихЗначений.Добавить(Число(пЗначенияТекст));
				КонецЕсли;
				
				Если пЕстьКаждые Тогда
					// Формируем список значений для выражений "*/n" или "x/n"
					Для Каждого сч_Период Из пМассивТекущихЗначений Цикл
						пТекНомерПериода = 1;
						Для сч_Число = Минзнч по МаксЗнч Цикл
							Если сч_Период = пТекНомерПериода Тогда
								Если сч_Число >= пНачатьС Тогда 
									сч_Число_нов = ?(ПрибавитьЕдиницу,?(сч_Число + 1 = МаксЗнч,0,сч_Число + 1),сч_Число);
									пСоотв.Вставить(сч_Число_нов,Истина);
								КонецЕсли;
								пТекНомерПериода = 0;
							КонецЕсли;	
							пТекНомерПериода = пТекНомерПериода + 1;
						КонецЦикла;
					КонецЦикла;
				Иначе
					// Добавляем конкретные значения в пределах диапазона
					Для Каждого сч_Число Из пМассивТекущихЗначений Цикл
						Если сч_Число >= Минзнч и сч_Число <= МаксЗнч Тогда
							пСоотв.Вставить(сч_Число,Истина);	
						КонецЕсли;	
					КонецЦикла;
				КонецЕсли;
			КонецЕсли;
		Исключение;
			// При ошибке парсинга фиксируем текст ошибки и выходим
			Комментарий = Строка(ОписаниеОшибки());
			Отказ = Истина;
			Возврат новый Массив;
		Конецпопытки;	
	КонецЦикла;
	
	// Преобразуем найденные значения в список и сортируем
	СЗ = Новый СписокЗначений;
	Для Каждого Тек Из пСоотв Цикл
		СЗ.Добавить(Тек.Ключ);
	КонецЦикла;
	
	СЗ.СортироватьПоЗначению();
	Возврат СЗ.ВыгрузитьЗначения();		
КонецФункции

 

Проверено на следующих конфигурациях и релизах:

  • 1С:Библиотека стандартных подсистем, редакция 3.1, релизы 3.1.11.299

Вступайте в нашу телеграмм-группу Инфостарт

1С кластер Администрирование cron расписание

См. также

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

Инструменты для разработчиков 1С 8.3: Infostart Toolkit. Автоматизация и ускорение разработки на управляемых формах. Легкость работы с 1С.

15500 руб.

02.09.2020    224776    1220    415    

1071

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

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

14400 руб.

20.08.2024    47497    264    133    

242

Инструментарий разработчика Нейросети Платные (руб)

Первые попытки разработки на 1С с использованием больших языковых моделей (LLM) могут разочаровать. LLMки сильно галлюцинируют, потому что не знают устройства конфигураций 1С, не знают нюансов синтаксиса. Но если дать им подсказки с помощью MCP, то результат получается кардинально лучше. Далее в публикации: MCP для поиска по метаданым 1С, справке синтакс-помошника и проверки синтаксиса.

9900 руб.

25.08.2025    21540    54    9    

58

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

Расширение для создания и редактирования печатных форм в системе 1С:Предприятие 8.3. Благодаря конструктору можно значительно снизить затраты времени на разработку печатных форм, повысить качество и прозрачность разработки, а также навести порядок в многообразии корпоративных печатных форм.

22200 руб.

06.10.2023    29074    76    30    

103

Инструментарий разработчика Программист 1С v8.3 Платные (руб)

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

9500 руб.

17.05.2024    41040    152    57    

188

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

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

16000 руб.

10.11.2023    20511    81    42    

93

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

Восстановление партий или взаиморасчетов, расчет зарплаты, пакетное формирование документов или отчетов - теперь все это стало доступнее. * Есть желание повысить скорость работы медленных алгоритмов! Но... * Нет времени думать о реализации многопоточности? * о запуске и остановке потоков? * о поддержании потоков в рабочем состоянии? * о передаче данных в потоки и как получить ответ из потока? * об организации последовательности? Тогда ЭТО - то что надо!!!

6000 руб.

07.02.2018    109411    250    100    

314
Для отправки сообщения требуется регистрация/авторизация