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