При работе в крупной корпоративной информационной системе на базе «1С:Документооборот 3.0 КОРП» администраторы иногда сталкиваются с ситуацией, когда после аварийного завершения работы сервера (например, внезапного отключения питания, сбоя СУБД или принудительного перезапуска процессов) полностью останавливается процесс маршрутизации. Пользователи замечают, что новые задачи по согласованию договоров перестают приходить, а старые зависают в неопределенном статусе. При этом регламентные задания могут выполняться без видимых системных ошибок в консоли администрирования.
В этой статье мы подробно разберем, почему возникает подобный сбой, проанализируем внутренние механизмы работы платформы и конфигурации, а также рассмотрим пошаговый алгоритм восстановления работоспособности системы.
Для того чтобы понять природу этой неисправности, проанализируем ключевое отличие редакции 3.0 от предыдущих версий (2.1). В новой редакции «1С:Документооборот» механизмы маршрутизации процессов и создания новых задач выполняются асинхронно. Это сделано для повышения отзывчивости интерфейса у конечных пользователей.
Когда сотрудник нажимает кнопку «Согласовано», система не пытается мгновенно рассчитать всю цепочку процесса и создать следующую задачу в рамках текущей транзакции. Вместо этого происходит следующее:
ОчередьЗаданийДокументооборота записывается новое задание на обработку маршрута.ОчередьОбновленияКэширующихДанных служебные записи вносятся данные для последующего расчета прав доступа и обновления кэша.Если во время выполнения очередного фонового задания происходит аварийный останов сервера, транзакция прерывается. По умолчанию система программируется на несколько попыток выполнения (как правило, до 4 раз). Если после этих попыток задание завершается ошибкой, оно помечается как аварийное («ошибочное»), а его дальнейшая обработка прекращается. К сожалению, из-за особенностей внутренней логики одна зависшая или поврежденная задача в очереди может заблокировать выполнение всех последующих элементов, что приводит к полной остановке документооборота у всех пользователей предприятия.
Рассмотрим детально стек ошибки, который часто фиксируется в журнале регистрации в такие моменты:
Неверный первый параметр Ссылка в функции ОбщегоНазначения.ЗначенияРеквизитовОбъекта:
Значение должно быть ссылкой или именем предопределенного элемента.
{ОбщийМодуль.ОбщегоНазначения.Модуль(180)}:ВызватьИсключение (СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
{Справочник.Файлы.МодульМенеджера(164)}:РеквизитыВерсииФайла = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(
{ОбщийМодуль.ОбновлениеКэширующихДанных.Модуль(307)}:Менеджер.ОбновитьКэширующиеДанные(Выборка);
{ОбщийМодуль.ОбновлениеКэширующихДанных.Модуль(355)}:ЕстьОбработанныеДанные = ОбработатьОчередьОбновленияКэширующихДанных(Долгое);
Выясним причину этой ошибки. В момент падения сервера СУБД или рабочего процесса «1С:Предприятия» выполнялась запись новой версии файла. Транзакция была прервана на этапе, когда ссылка на уникальный идентификатор (GUID) версии файла уже записалась в очередь обновления кэширующих данных, но сам объект (версия файла) физически не успел сохраниться в базе данных.
В результате в системе образовалась так называемая «битая» (несуществующая) ссылка. Когда регламентная служба пытается выполнить обновление кэша для этого файла, метод ЗначенияРеквизитовОбъекта общего модуля ОбщегоНазначения получает в качестве параметра пустую или некорректную ссылку, не может прочитать реквизиты объекта и аварийно завершает работу, выбрасывая исключение. Вся очередь обработки кэша и связанных задач маршрутизации останавливается.
При переходе в форму списка очереди заданий администраторы часто обнаруживают ошибочные элементы, однако штатная кнопка «Сбросить ошибки» оказывается недоступной (неактивной). Это поведение связано с известной ошибкой платформы и конфигурации «1С:Документооборот» в релизах ниже 3.0.16.
В этих версиях присутствовал внутренний баг, при котором состояние заблокированных или аварийных задач некорректно обрабатывалось формой списка, из-за чего интерактивный сброс счетчика ошибок становился невозможным. В этом случае администраторам приходится решать проблему либо программным путем, либо ручным вмешательством.
Рассмотрим последовательность действий, которая позволит оперативно восстановить процесс согласования документов в системе.
Для того чтобы безопасно провести манипуляции с очередью заданий, необходимо исключить конкурентный доступ и попытки перезапуска задач со стороны сервера. Для этого выполним следующие действия:
services.msc в Windows или команду systemctl stop srv1cv83 в Linux) и запустим ее снова, чтобы гарантированно завершить зависшие рабочие потоки.После остановки фоновой активности необходимо очистить зависшие и ошибочные элементы. Перейдем в базу данных под правами администратора с отключенными регламентными заданиями:
Очередь заданий документооборота (или регистр сведений Очередь обновления кэширующих данных).Если удаление объектов кажется вам небезопасным, или вы хотите попытаться перезапустить задачи, для которых физические объекты существуют, воспользуемся внешней обработкой для программного сброса счетчика попыток. Для этого можно выполнить в контексте сервера следующий код:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Очередь.Ссылка КАК Ссылка
|ИЗ
| Справочник.ОчередьЗаданийДокументооборота КАК Очередь
|ГДЕ
| Очередь.Состояние = ЗНАЧЕНИЕ(Перечисление.СостоянияЗаданий.Ошибка)";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
ОбъектЗадания = Выборка.Ссылка.ПолучитьОбъект();
ОбъектЗадания.КоличествоПопыток = 0;
ОбъектЗадания.Состояние = Перечисления.СостоянияЗаданий.ВОчереди;
Попытка
ОбъектЗадания.Записать();
ИнформационноеСообщение("Задание успешно сброшено: " + Выборка.Ссылка);
Исключение
Предупреждение("Не удалось перезаписать задание: " + КраткоеПредставлениеОшибки(ОписаниеОшибки()));
КонецПопытки;
КонецЦикла;
Часто после аварийного завершения работы сеансов конфигурация продолжает хранить некорректные метаданные в кэше сервера приложений. Выполним очистку кэша сервера:
C:\srvinfo\reg_1541\).snccg и srvinfo (или просто очистим содержимое каталогов временных файлов Local Settings\Temp пользователя, от имени которого запускается служба сервера 1С).Чтобы гарантированно устранить последствия сбоя транзакции, запустим утилиту тестирования и исправления (ТиИ) через Конфигуратор:
Чтобы минимизировать риски возникновения подобных сбоев при последующей эксплуатации системы, рекомендуем выполнить следующие рекомендации:
Применяя указанный комплекс мер, мы сможем оперативно диагностировать сбои в асинхронных очередях «1С:Документооборот 3.0» и быстро восстанавливать штатную работу процессов согласования.