Каждый бухгалтер-расчетчик или администратор систем на базе 1С:Зарплата и Управление Персоналом 2.5 или 1С:Управление производственным предприятием 1.3 рано или поздно сталкивается со специфической проблемой взаимной блокировки документов. Типичный сценарий: был зарегистрирован отпуск сотрудника, затем расчетчик создал к нему документ-исправление («исправил» исходный отпуск в текущем периоде), а позже возникла необходимость откатить операцию назад. При попытке распровести документы система выдает жесткое предупреждение: «Документ был исправлен, отмена проведения документа запрещена!».
В этой статье мы подробно проанализируем, почему возникает этот так называемый «замкнутый круг» (дедлок) между кадровыми и расчетными документами, и разберем по шагам пять проверенных способов его устранения — от простых пользовательских манипуляций до административных программных решений.
Давайте разберем логику работы системы, которая приводит к возникновению этой ошибки. В программах 1С реализован строгий контроль последовательности проведения документов учета времени и расчетов. Когда вы пытаетесь отменить цепочку исправлений отпуска при наличии проведенного табеля, система выстраивает следующую цепочку блокировок:
Начисление отпуска жестко блокируется, так как на него ссылается созданный документ-исправление через внутренний реквизит связи ПерерассчитываемыйДокумент. Попытка его распроведения напрямую сразу выдает ошибку о запрете отмены проведения исправленного документа.Табель учета рабочего времени. Этот документ зафиксировал фактически отработанные дни и невыходы сотрудника.Табель и отменить его проведение, но система блокирует и это действие! Модуль проведения табеля содержит алгоритм контроля: нельзя распровести табель, если по сотрудникам в этом периоде проведены расчетные документы (в данном случае — то самое проведенное начисление-исправление отпуска).Таким образом, круг замыкается: «Табель» не распроводится из-за проведенного исправления отпуска, а исправление отпуска нельзя пометить на удаление из-за проведенного «Табеля». Выяснив причину блокировки, рассмотрим эффективные варианты выхода из этого тупика.
Рассмотрим базовое решение, заложенное разработчиками 1С. В форме документа Начисление отпуска работникам организаций в левом нижнем углу интерфейса предусмотрена специальная кнопка.
Если в системе нет дополнительных блокирующих документов (например, табель еще не проведен или период открыт), последовательность действий следующая:
Начисление отпуска работникам организаций.Если же кнопка выдает ошибку удаления, переходим к альтернативным методам.
Если вы не обладаете правами администратора или программиста, но проблему нужно решить прямо сейчас, воспользуйтесь этим простым и безопасным обходным путем. Мы временно исключим влияние табеля на конкретного сотрудника:
Табель учета рабочего времени организации за тот месяц, в котором производились начисления.Табель. Поскольку данные по сотруднику из табеля временно исключены, система снимет блокировку с его расчетных документов.Начисление отпуска и нажмите кнопку «Отменить исправление». Процедура пройдет штатно: документ-исправление пометится на удаление, а связь разорвется.Табель, добавьте сотрудника обратно (или восстановите исходные коды невыходов), перезаполните его данные и заново проведите документ.Связь между исходным документом и исправлением удерживает реквизит ПерерассчитываемыйДокумент, расположенный в документе-исправлении. Если мы очистим этот реквизит, система перестанет считать исходный отпуск исправленным, что позволит легко его распровести.
Для реализации этого способа выполним следующие шаги:
Начисление отпуска работникам организаций.ПерерассчитываемыйДокумент равен вашему исходному документу отпуска).ПерерассчитываемыйДокумент и установите напротив него флаг изменения, оставив значение **пустым**.После выполнения обработки логическая связь между документами в базе данных будет разорвана. Теперь вы сможете беспрепятственно отменять проведение обоих документов в любом удобном порядке.
Большинство транзакционных блокировок и проверок в 1С срабатывают исключительно при интерактивной работе пользователя через формы интерфейса. Если выполнить операцию отмены проведения программно, проверки проведения можно обойти.
Проанализируем пример кода внешней обработки, который принудительно распроводит документ, используя свойство отключения контроля проведения ОбменДанными.Загрузка:
// Процедура принудительного программного распроведения документа
Процедура РаспровестиДокументВОбходПроверок(СсылкаНаДокумент) Экспорт
// Получаем объектную сущность документа из ссылки
ДокументОбъект = СсылкаНаДокумент.ПолучитьОбъект();
// Включаем режим загрузки данных для отключения подписок на события и проверок при записи
ДокументОбъект.ОбменДанными.Загрузка = Истина;
Попытка
// Выполняем запись документа в режиме отмены проведения
ДокументОбъект.Записать(РежимЗаписиДокумента.ОтменаПроведения);
Сообщить("Документ " + СсылкаНаДокумент + " успешно распроведен!");
Исключение
Сообщить("Не удалось отменить проведение: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Этот способ гарантированно снимает проведение с любого документа («Табеля» или «Начисления отпуска»), полностью игнорируя любые взаимные блокировки конфигурации.
Иногда эта проблема проявляется при попытке обновить базу данных на новые релизы (например, при переходе на релиз 2.5.145.1). Обновление аварийно завершается из-за того, что фоновые алгоритмы обновления пытаются пересчитать движения прошлых периодов и натыкаются на поврежденные или заблокированные связи документов прошлых лет.
Чтобы успешно завершить обновление, выполните следующие действия:
Для того чтобы полностью исключить появление подобных «замкнутых кругов» в будущем, рассмотрим методологию учета рабочего времени, рекомендуемую разработчиками фирмы 1С.
В программах линейки 1С:ЗУП реализован удобный метод отклонений. Это означает, что если у ваших сотрудников стандартные графики работы (например, обычная пятидневка), вам нет необходимости ежемесячно создавать документы «Табель учета рабочего времени». Система автоматически рассчитывает фактически отработанное время на основании назначенных графиков за вычетом зарегистрированных документов отклонений (отпусков, больничных, командировок). Если вы откажетесь от ручного ввода документов Табель там, где это возможно, проблема взаимных блокировок исчезнет сама собой.