В платформе 1С:Предприятие 7.7, в отличие от современных версий 8.x, отсутствует встроенный механизм регламентных заданий. Программистам приходится использовать стандартную функцию ОбработкаОжидания или внешние инструменты. В данной статье мы подробно разберем, как правильно организовать запуск процедур по расписанию, как гарантировать их однократное выполнение и какие архитектурные подходы наиболее стабильны.
Самый простой и популярный способ — это использование процедуры ОбработкаОжидания, которая прописывается в функции ПриНачалеРаботыСистемы глобального модуля. Рассмотрим типичную проблему: если вы установите интервал проверки, например, в 2 секунды, то внутри процедуры проверки времени условие «текущий час равен заданному» будет выполняться многократно в течение всего этого часа или минуты.
Чтобы избежать повторных запусков одной и той же задачи, проанализируем ситуацию и внедрим механизм «флаг-защелка». Мы будем сохранять время последнего успешного запуска в глобальную переменную или константу.
Разберем пример кода для глобального модуля:
Перем глВремяПоследнегоЗапуска Экспорт;
Процедура Планировщик() Экспорт
ТекущийЧас = 0;
ТекущаяМин = 0;
ТекущаяСек = 0;
ТекущееВремя(ТекущийЧас, ТекущаяМин, ТекущаяСек);
// Допустим, нам нужно запускать экспорт в 15 минут каждого часа
Если ТекущаяМин = 15 Тогда
Если глВремяПоследнегоЗапуска <> ТекущийЧас Тогда
// Выполняем полезную нагрузку
ОткрытьФорму("Отчет.ЭкспортвCSV#", "КопияФоток");
// Фиксируем, что в этом часе работа уже выполнена
глВремяПоследнегоЗапуска = ТекущийЧас;
Сообщить("Задание выполнено в " + ТекущееВремя());
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Процедура ПриНачалеРаботыСистемы()
// Запускаем проверку каждые 5 секунд
ОбработкаОжидания("Планировщик", 5);
КонецПроцедуры
Важный нюанс: использование глобальной переменной эффективно только в рамках одного сеанса. Если пользователь перезапустит 1С, переменная обнулится, и задание может выполниться повторно. Для критически важных задач лучше использовать константу или справочник.
Если задача должна выполняться строго один раз, независимо от перезагрузок системы, мы должны хранить дату и время последнего запуска в базе данных. Выясним, что лучше использовать: константу или справочник.
Многие разработчики предостерегают от использования констант в 1С 7.7, так как они хранятся в общей таблице CONSTANTS, и частая запись в них может приводить к эскалации блокировок. Проанализируем решение с использованием специального справочника «Планировщик», где каждая строка — это отдельное задание.
Рассмотрим алгоритм работы через справочник:
РегламентныеЗадания с реквизитами Наименование, ДатаПоследнегоЗапуска, ВремяПоследнегоЗапуска.
Процедура ВыполнитьЗаданиеПоРасписанию() Экспорт
Спр = СоздатьОбъект("Справочник.РегламентныеЗадания");
Если Спр.НайтиПоНаименованию("ЭкспортФото", 0, 1) = 1 Тогда
Если (Спр.ДатаПоследнегоЗапуска < ТекущаяДата()) Или (Лев(Спр.ВремяПоследнегоЗапуска, 2) <> Лев(ТекущееВремя(), 2)) Тогда
// Код задания...
Спр.ДатаПоследнегоЗапуска = ТекущаяДата();
Спр.ВремяПоследнегоЗапуска = ТекущееВремя();
Спр.Записать();
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Запуск планировщика у всех пользователей сразу — плохая практика. Это создает лишнюю нагрузку на сеть и может привести к конфликтам доступа к файлам. Правильнее всего выделить отдельного пользователя (например, с именем «Robot»), под которым 1С будет запущена на сервере постоянно.
Посмотрим, как ограничить выполнение кода только этим пользователем в глобальном модуле:
Процедура ПриНачалеРаботыСистемы()
Если ИмяПользователя() = "Robot" Тогда
ОбработкаОжидания("ГлПланировщик", 60); // Роботу достаточно проверять раз в минуту
Состояние("Запущен сеанс автоматической обработки данных");
КонецЕсли;
КонецПроцедуры
Преимущества данного подхода:
Если вам не нужно, чтобы 1С висела в памяти постоянно, можно использовать системный планировщик Windows. Мы настроим запуск 1С с определенным параметром командной строки, выполним действие и закроем программу.
Проанализируем шаги настройки:
1cv7s.exe./U"Robot" /P"Pass" /C"RunExport".ПриНачалеРаботыСистемы пишем обработчик параметра:
Процедура ПриНачалеРаботыСистемы()
Если СокрЛП(Константа.ИмяПользователяРобота) = ИмяПользователя() Тогда
Если КомандаСистемы = "RunExport" Тогда
ОткрытьФормуМодально("Отчет.ЭкспортДанных");
ЗавершитьРаботуСистемы(0); // Закрываем 1С после выполнения
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Рассмотрим главную опасность: 1С 7.7 — это однопоточное приложение. Если во время работы «робота» возникнет ошибка и на экране появится модальное окно (например, «Индекс не найден» или «Ошибка блокировки файла»), выполнение ОбработкиОжидания полностью остановится до тех пор, пока человек не нажмет «ОК».
Для минимизации таких рисков рекомендуется:
Попытка ... Исключение вокруг всего блока кода регламентного задания.Пример простейшего контроля жизнеспособности (Heartbeat):
// Внутри планировщика 1С
ТекстЛога = СоздатьОбъект("Текст");
ТекстЛога.ДобавитьСтроку(ТекущаяДата() + " " + ТекущееВремя() + " - Робот жив");
ТекстЛога.Записать(КаталогИБ() + "robot_status.txt");
Выясним причину, почему сеанс может зависнуть. Чаще всего это утечки памяти, характерные для 7.7 при длительной работе. Опытные системные администраторы рекомендуют перезапускать сеанс робота хотя бы раз в сутки ночью. Это очищает кэш и освобождает оперативную память.
Мы проанализировали основные способы автоматизации задач в 1С 7.7. Для простых разовых проверок подойдет ОбработкаОжидания с проверкой часа в глобальной переменной. Для надежных промышленных систем лучше использовать выделенный сеанс пользователя-робота с логированием действий в справочник или текстовый файл, а также внешние средства мониторинга состояния процесса.