К статье
Практический материал

Администрирование · 13 мин

Зацикливание 1С 8.3: как найти причину и исправить

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

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

Причины у этих сценариев разные, и универсального «лекарства» не существует. Бесконечный цикл в коде обработки лечится правкой алгоритма, циклическая ошибка при обновлении — анализом логов и откатом, а зацикленный обмен — очисткой очередей и регистрации изменений. Поэтому первый шаг всегда один: точно определить, какой именно сценарий зацикливания наблюдается у вас.

Ниже разобраны основные варианты зацикливания в 1С 8.3, способы диагностики и конкретные действия для каждого случая — от зависшего сеанса до бесконечной рекурсии в модуле.

Как определить, что именно зациклилось

Прежде чем что-то исправлять, нужно локализовать проблему. Один и тот же симптом — «программа висит» — может означать совершенно разные неисправности: от тяжёлого запроса, который просто долго выполняется, до настоящего бесконечного цикла, который не завершится никогда.

Первый источник информации — журнал регистрации (в конфигураторе: «Администрирование» → «Журнал регистрации»). Отфильтруйте события по времени начала проблемы и по пользователю. Повторяющиеся с одинаковым интервалом ошибки фонового задания — признак зацикленного регламентного процесса. Отсутствие записей при «висящем» клиенте чаще указывает на цикл в клиентском коде или на ожидание ответа от СУБД.

Второй инструмент — консоль кластера серверов 1С. В списке сеансов видно, какой сеанс потребляет процессорное время и сколько длится текущий вызов. Сеанс с постоянно растущим временем текущего вызова и высокой загрузкой CPU — почти наверняка выполняет бесконечный цикл на сервере.

Клиент не отвечает, CPU процесса rphost загруженВероятен бесконечный цикл на сервере

Время текущего вызова сеанса в консоли кластера

Ошибка повторяется каждые N минут в журналеЗациклено регламентное задание

Расписание и текст ошибки фонового задания

Обмен идёт, но данные не приходятЗациклена очередь обмена

Номера принятых/отправленных сообщений в узлах плана обмена

Обновление конфигурации «крутится» часамиЗависла обработка обновления или реструктуризация

Технологический журнал и активность на СУБД

Бесконечный цикл в коде: поиск и исправление

Классическая причина зацикливания — конструкция Пока ... Цикл или Для ... Цикл, в которой условие выхода никогда не наступает. Типичные ошибки разработчика: счётчик не увеличивается, выборка из запроса не сдвигается методом Следующий(), условие выхода проверяет данные, которые внутри цикла не меняются.

Если есть доступ к конфигуратору и проблема воспроизводится на тестовой базе, включите отладку («Отладка» → «Подключение»), запустите сценарий и при зависании нажмите «Прервать». Отладчик покажет строку, на которой крутится цикл. Дальше анализируйте, почему условие выхода не срабатывает: проверьте значения переменных в табло.

Отдельный частый случай — обход дерева или подчинённых элементов, где в данных появилась циклическая ссылка: элемент справочника ссылается сам на себя или образуется кольцо «А → Б → В → А». Код обхода при этом никогда не закончится. Лечится либо исправлением данных, либо добавлением в алгоритм защиты — например, коллекции уже посещённых элементов или ограничителя глубины.

Типичные ошибки в циклах
01
Забытый вызов Следующий() у выборки — цикл обрабатывает первую запись бесконечно
02
Условие выхода сравнивает данные, которые не изменяются внутри цикла
03
Рекурсивный обход без проверки уже посещённых элементов — при циклических ссылках в данных обход не завершается
04
Цикл по датам без шага приращения — дата стоит на месте, цикл вечный

Рекурсия и взаимные вызовы обработчиков

Рекурсия без корректного условия выхода приводит к переполнению стека: платформа либо падает с ошибкой, либо сеанс зависает. Такое бывает в процедурах обхода иерархии, расчёта зависимых данных, разбора вложенных структур. Признак — ошибка вида «Переполнение стека» в журнале регистрации или аварийное завершение сеанса.

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

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

Зацикленное регламентное задание

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

Порядок действий: откройте консоль заданий (в типовых конфигурациях — «Администрирование» → «Обслуживание» → «Регламентные и фоновые задания»), найдите проблемное задание и временно отключите его. Затем по тексту ошибки устраните причину — чаще всего это нарушение прав доступа, отсутствие объекта по ссылке, ошибка соединения с внешним сервисом или нехватка места на диске.

Проверьте также настройку «Количество повторов при аварийном завершении» и «Интервал повтора». Агрессивные настройки перезапуска при постоянной ошибке создают лавину неудачных запусков. Разумно ограничить число повторов, пока причина не устранена.

Порядок действий с зацикленным заданием
  1. 1
    Найдите в журнале регистрации повторяющуюся ошибку и определите задание
  2. 2
    Отключите задание в консоли регламентных заданий
  3. 3
    Проанализируйте текст ошибки и устраните причину (права, данные, доступность сервиса)
  4. 4
    Запустите задание вручную один раз и проверьте успешное завершение
  5. 5
    Включите расписание обратно и понаблюдайте за журналом в течение нескольких циклов

Зацикливание обмена данными

В распределённых базах и обменах через планы обмена встречается ситуация «бесконечного обмена»: узлы шлют друг другу одни и те же сообщения, номера принятых сообщений не сходятся, объём трафика растёт, а данные не сходятся. Причины — потерянные или повреждённые сообщения, сбитая нумерация, циклическая регистрация изменений (узел А отправляет узлу Б, тот регистрирует изменение обратно для А).

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

Если зацикливание вызвано тем, что изменения «отражаются» обратно, проверьте настройки состава плана обмена и обработчики регистрации: объект, загруженный из обмена, не должен снова регистрироваться к отправке в тот же узел. В типовых механизмах за это отвечает корректная работа с ОбменДанными.Загрузка = Истина и отправителем в параметрах регистрации.

Зависшее обновление конфигурации и реструктуризация

Обновление конфигурации базы, которое «крутится» часами, не всегда зациклено: реструктуризация больших таблиц на большой базе объективно занимает много времени. Отличить норму от проблемы помогает наблюдение за активностью: если на СУБД идёт интенсивная работа с данными (растёт число обработанных записей, есть дисковая активность) — процесс идёт, и прерывать его опасно.

Признаки настоящей проблемы: полное отсутствие активности на СУБД при занятом сеансе, повторяющиеся ошибки в технологическом журнале, взаимоблокировки. В этом случае обновление придётся прервать, базу — восстановить из резервной копии (обновление на половине реструктуризации оставляет базу в неконсистентном состоянии), а затем повторить с включённым технологическим журналом для анализа.

Циклические ошибки при обновлении типовых конфигураций (например, обработчик обновления падает и при следующем запуске начинается заново) лечатся анализом конкретного обработчика: в журнале регистрации видно, на каком шаге обновления возникает ошибка. Иногда помогает пропуск проблемного обработчика через отладку с последующим ручным исправлением данных, но это работа для специалиста, хорошо знающего конфигурацию.

Маршрут решения

Как выбрать действие

На СУБД видна активная работа с таблицами, число обработанных строк растётНе прерывайте процесс — реструктуризация идёт, дождитесь завершения
Сеанс висит, активности на СУБД нет, в техножурнале повторяются ошибкиПрервите обновление, восстановите базу из копии, анализируйте причину
Обработчик обновления падает с одной и той же ошибкой при каждом запускеНайдите обработчик по тексту ошибки, исправьте данные, мешающие его выполнению

Что делать с зависшим сеансом прямо сейчас

Если пользовательский сеанс завис и мешает работать, его нужно корректно завершить. В файловой базе сеанс завершается через «Администрирование» → «Активные пользователи» (из другого сеанса) либо перезапуском всех сеансов, если база монопольно заблокирована. В клиент-серверном варианте — через консоль кластера: найдите сеанс, убедитесь, что это именно проблемный процесс, и удалите его.

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

Контрольные точки

Как проверить результат

Журнал регистрации после исправления
Норма

Ошибка больше не повторяется в течение нескольких циклов расписания

Тревожный признак

Та же ошибка появляется снова через равные интервалы

Загрузка CPU процессами rphost
Норма

Нет сеансов с постоянно растущим временем вызова

Тревожный признак

Сеанс снова «прилипает» к 100% CPU надолго

Номера сообщений обмена
Норма

Отправлено и принято сходятся на обоих узлах, очередь уменьшается

Тревожный признак

Номера расходятся, сообщения копятся

Поведение базы после завершения зависшего сеанса
Норма

Тестирование не находит ошибок, пользователи работают

Тревожный признак

Появляются ошибки целостности, битые ссылки

Профилактика зацикливания

Большинство случаев зацикливания предотвращается простыми мерами. В прикладном коде — защитные ограничители: максимальное число итераций в циклах с внешними данными, проверка сдвига выборки, контроль глубины рекурсии. Один вложенный счётчик с аварийным выходом после, скажем, миллиона итераций превращает вечное зависание в понятную ошибку с диагностикой.

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

Итог

Что важно запомнить

Зацикливание 1С 8.3 — это симптом, а не диагноз: за ним стоит бесконечный цикл в коде, рекурсия, падающее регламентное задание, сбитый обмен или зависшее обновление. Диагностика начинается с журнала регистрации и консоли кластера, а любые действия с данными и обменом — только после резервной копии.

Частые вопросы

1С зависла у одного пользователя, у остальных всё работает. Что делать?

Завершите только его сеанс через консоль кластера или список активных пользователей, не перезапуская весь сервер. После этого выясните, какую операцию он выполнял: если зависание повторяется на том же действии — проблема в данных или коде этой операции, а не в сеансе.

Как отличить долгую операцию от бесконечного цикла?

Посмотрите на активность: если на СУБД идёт работа с данными, в технологическом журнале появляются новые события, а время вызова растёт вместе с объёмом обработанных записей — операция выполняется. Если активности нет, а CPU загружен на 100% одним сеансом — вероятен цикл. Точный ответ даёт прерывание в отладчике на копии базы.

Можно ли просто перезапустить сервер 1С, чтобы снять зацикливание?

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

Обмен зациклился: сообщения отправляются, но не принимаются. С чего начать?

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

Опасно ли прерывать зависшее обновление конфигурации?

Да. Если реструктуризация прервана посередине, база может остаться в неконсистентном состоянии. Прерывайте только убедившись, что процесс действительно завис (нет активности на СУБД), и всегда имейте актуальную резервную копию для восстановления.

Как защитить собственную обработку от бесконечного цикла?

Добавьте счётчик итераций с аварийным выходом и понятным сообщением об ошибке, проверяйте, что выборка сдвигается (Следующий() возвращает Истина), а при рекурсивном обходе храните коллекцию уже посещённых элементов. Это превращает зависание в диагностируемую ошибку.