Как в 1С 7.7 реализовать запуск функций по расписанию и избежать повторных выполнений

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

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

Метод 1: Использование функции ОбработкаОжидания в глобальном модуле

Самый простой и популярный способ — это использование процедуры ОбработкаОжидания, которая прописывается в функции ПриНачалеРаботыСистемы глобального модуля. Рассмотрим типичную проблему: если вы установите интервал проверки, например, в 2 секунды, то внутри процедуры проверки времени условие «текущий час равен заданному» будет выполняться многократно в течение всего этого часа или минуты.

Чтобы избежать повторных запусков одной и той же задачи, проанализируем ситуацию и внедрим механизм «флаг-защелка». Мы будем сохранять время последнего успешного запуска в глобальную переменную или константу.

Разберем пример кода для глобального модуля:


Перем глВремяПоследнегоЗапуска Экспорт;

Процедура Планировщик() Экспорт
    ТекущийЧас = 0;
    ТекущаяМин = 0;
    ТекущаяСек = 0;
    ТекущееВремя(ТекущийЧас, ТекущаяМин, ТекущаяСек);

    // Допустим, нам нужно запускать экспорт в 15 минут каждого часа
    Если ТекущаяМин = 15 Тогда
        Если глВремяПоследнегоЗапуска <> ТекущийЧас Тогда
            // Выполняем полезную нагрузку
            ОткрытьФорму("Отчет.ЭкспортвCSV#", "КопияФоток");
            
            // Фиксируем, что в этом часе работа уже выполнена
            глВремяПоследнегоЗапуска = ТекущийЧас;
            Сообщить("Задание выполнено в " + ТекущееВремя());
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

Процедура ПриНачалеРаботыСистемы()
    // Запускаем проверку каждые 5 секунд
    ОбработкаОжидания("Планировщик", 5);
КонецПроцедуры

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

Метод 2: Использование констант или справочников для хранения меток времени

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

Многие разработчики предостерегают от использования констант в 1С 7.7, так как они хранятся в общей таблице CONSTANTS, и частая запись в них может приводить к эскалации блокировок. Проанализируем решение с использованием специального справочника «Планировщик», где каждая строка — это отдельное задание.

Рассмотрим алгоритм работы через справочник:

  1. Создаем справочник РегламентныеЗадания с реквизитами Наименование, ДатаПоследнегоЗапуска, ВремяПоследнегоЗапуска.
  2. В планировщике находим нужную строку и проверяем условия.

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

Метод 3: Выделенный сеанс «Робота»

Запуск планировщика у всех пользователей сразу — плохая практика. Это создает лишнюю нагрузку на сеть и может привести к конфликтам доступа к файлам. Правильнее всего выделить отдельного пользователя (например, с именем «Robot»), под которым 1С будет запущена на сервере постоянно.

Посмотрим, как ограничить выполнение кода только этим пользователем в глобальном модуле:


Процедура ПриНачалеРаботыСистемы()
    Если ИмяПользователя() = "Robot" Тогда
        ОбработкаОжидания("ГлПланировщик", 60); // Роботу достаточно проверять раз в минуту
        Состояние("Запущен сеанс автоматической обработки данных");
    КонецЕсли;
КонецПроцедуры

Преимущества данного подхода:

Метод 4: Внешний запуск через Windows Task Scheduler (Планировщик задач)

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

Проанализируем шаги настройки:

  1. Создаем в Windows задачу на запуск 1cv7s.exe.
  2. В аргументах указываем путь к базе и ключ /U"Robot" /P"Pass" /C"RunExport".
  3. В глобальном модуле 1С 7.7 в процедуре ПриНачалеРаботыСистемы пишем обработчик параметра:

Процедура ПриНачалеРаботыСистемы()
    Если СокрЛП(Константа.ИмяПользователяРобота) = ИмяПользователя() Тогда
        Если КомандаСистемы = "RunExport" Тогда
            ОткрытьФормуМодально("Отчет.ЭкспортДанных");
            ЗавершитьРаботуСистемы(0); // Закрываем 1С после выполнения
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

Проблема модальных окон и стабильности

Рассмотрим главную опасность: 1С 7.7 — это однопоточное приложение. Если во время работы «робота» возникнет ошибка и на экране появится модальное окно (например, «Индекс не найден» или «Ошибка блокировки файла»), выполнение ОбработкиОжидания полностью остановится до тех пор, пока человек не нажмет «ОК».

Для минимизации таких рисков рекомендуется:

Пример простейшего контроля жизнеспособности (Heartbeat):


// Внутри планировщика 1С
ТекстЛога = СоздатьОбъект("Текст");
ТекстЛога.ДобавитьСтроку(ТекущаяДата() + " " + ТекущееВремя() + " - Робот жив");
ТекстЛога.Записать(КаталогИБ() + "robot_status.txt");

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

Заключение

Мы проанализировали основные способы автоматизации задач в 1С 7.7. Для простых разовых проверок подойдет ОбработкаОжидания с проверкой часа в глобальной переменной. Для надежных промышленных систем лучше использовать выделенный сеанс пользователя-робота с логированием действий в справочник или текстовый файл, а также внешние средства мониторинга состояния процесса.

← На главную