В процессе эксплуатации системы 1С:Документооборот (1С:ДО) администраторы и пользователи иногда сталкиваются с крайне неприятным поведением программы. Сценарий выглядит следующим образом: пользователь создает внутренний документ, файл успешно генерируется по установленному шаблону, все реквизиты заполнены. Однако стоит запустить процесс согласования или направить документ по другому маршруту бизнес-процесса, как прикрепленный файл бесследно исчезает из карточки документа, а повторно сгенерировать его система не позволяет. Параллельно с этим может наблюдаться другой симптом — перестают автоматически присваиваться регистрационные номера письмам, приказам и другим документам, хотя настройки нумераторов никто не менял.
Особенно загадочно то, что у пользователей нет прав на удаление файлов, а в меню Еще — Показать удаленные пусто. Проблема носит плавающий («выборочный») характер: один документ проводится и нумеруется корректно, а точно такой же документ через пять минут дает сбой.
В этой статье мы подробно проанализируем, почему возникает данный сбой, какие внутренние механизмы платформы и конфигурации за это отвечают, и как навсегда решить эту проблему.
Практический опыт показывает, что в большинстве случаев «рандомные» сбои при генерации файлов и работе нумераторов связаны с накоплением ошибок в таблицах базы данных (особенно при использовании файлового варианта базы или при высокой нагрузке на СУБД в клиент-серверном варианте). Кэш таблиц, индексы или связи между справочниками могут повредиться.
Именно поэтому стандартная процедура Тестирование и исправление (ТиИ) является главным средством решения данной проблемы. Во время проведения этой процедуры платформа выполняет следующие действия:
Файлы.Для запуска тестирования необходимо открыть базу в режиме Конфигуратор, перейти в меню Администрирование — Тестирование и исправление, установить рекомендуемые настройки (в первую очередь реиндексацию и проверку целостности) и запустить процесс. Перед этим обязательно нужно создать резервную копию базы данных!
В конфигурации 1С:Документооборот присвоение номеров и запуск связанных процессов часто происходят асинхронно, то есть через механизм бизнес-событий. За это отвечает регламентное задание ОбработкаПроизошедшихБизнесСобытий. Если это задание зависает, работает некорректно или прерывается из-за ошибки в коде, система перестает корректно регистрировать события.
Выясним причину сбоя по шагам:
ПроизошедшиеБизнесСобытия.Проанализировать и извлечь ошибочные события из базы данных можно с помощью следующего запроса:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПроизошедшиеБизнесСобытия.Период КАК ВремяСобытия,
| ПроизошедшиеБизнесСобытия.БизнесСобытие КАК Событие,
| ПроизошедшиеБизнесСобытия.Источник КАК ДокументИсточник,
| ПроизошедшиеБизнесСобытия.НеУдалосьОбработать КАК ОшибкаОбработки
|ИЗ
| РегистрСведений.ПроизошедшиеБизнесСобытия КАК ПроизошедшиеБизнесСобытия
|ГДЕ
| ПроизошедшиеБизнесСобытия.НеУдалосьОбработать = ИСТИНА";
РезультатЗапроса = Запрос.Выполнить();
Если Не РезультатЗапроса.Пустой() Тогда
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
ЗаписьЖурналаРегистрации("БизнесСобытия.Ошибка",
УровеньЖурналаРегистрации.Предупреждение, , ,
"Сбой обработки события " + Выборка.Событие + " для документа: " + Выборка.ДокументИсточник);
КонецЦикла;
КонецЕсли;
В составе Библиотеки стандартных подсистем (БСП), используемой в 1С:ДО, есть фоновое задание по очистке неактуальных файлов. В ряде релизов платформы и конфигурации из-за программной ошибки может возникать конфликт дублирующихся ссылок:
Когда файл генерируется по шаблону, в справочнике Файлы могут временно создаваться две карточки (два уникальных идентификатора UUID), ссылающиеся на один и тот же физический файл на диске в томе хранения данных. Если в ходе изменения статуса документа или отмены одной из задач одна карточка помечается системой на удаление, то регламентное задание по очистке файлов физически стирает файл с диска. Активная карточка внутри документа остается, но сам файл внутри нее пропадает, и при попытке открыть его программа выдает ошибку доступа.
Для проверки этой гипотезы рекомендуется временно отключить регламентное задание ОчисткаНенужныхФайлов в консоли регламентных заданий и проследить, повторится ли сбой.
Симптомы вида «то создается, то нет» и «номера не присваиваются выборочно» указывают на классические конфликты блокировок (Lock Conflicts) на уровне СУБД (MS SQL Server или PostgreSQL). В момент старта процесса согласования система открывает транзакцию, в рамках которой:
Если в этот же момент другое фоновое задание (например, автоматический расчет прав доступа или построение индекса полнотекстового поиска) накладывает исключительную блокировку на связанные таблицы, транзакция записи документа и генерации файла аварийно откатывается. Пользователь может не увидеть явной ошибки на экране, поскольку система пытается выполнить операцию в фоновом режиме, но транзакция прерывается, и созданный файл «исчезает» (так как запись о нем не зафиксировалась в базе данных).
В этом случае помогает перезапуск службы сервера 1С:Предприятие для очистки серверного кэша и сброса зависших сеансов блокировок.
Нельзя исключать и стандартную методологическую ошибку пользователей. В процессе согласования исполнители часто прикрепляют согласуемые файлы, версии или протоколы разногласий непосредственно к своей задаче согласования, а не к самому документу.
Пока бизнес-процесс активен, эти файлы видны в контексте текущей работы. После того как процесс завершается (документ успешно согласован), задача закрывается и уходит в архив. Другие пользователи заходят в карточку документа, видят пустое поле на вкладке «Файлы» и считают, что файлы «исчезли». На самом деле файлы остались прикрепленными к выполненным задачам процесса. Нам следует обучить пользователей корректно работать со списком файлов в карточке документа.