При выполнении регламентного задания «Автоматическое отражение документов в регламентированном учете» или при закрытии месяца в программах «1С:ERP Управление предприятием» и «1С:Комплексная автоматизация» можно столкнуться с критическим сбоем. Задание аварийно завершается, и ни один документ из текущего пакета не попадает в бухгалтерский и налоговый учет. Разберем детально, почему возникает эта ошибка, где кроется первопричина и как корректно решить проблему без нарушения учетной логики.
Посмотрим на типичный стек вызовов, возникающий при формировании проводок и расчете НДС:
Не удалось выполнить по причине:
Получение элемента по индексу для значения не определено
{ОбщийМодуль.УчетНДСУПСлужебный.Модуль(7349)}:СуммаЗачета = ?(ПогашенныйАвансПоСФ.СуммаЗачета > 0, РаспределениеСуммыЗачета[0], 0);
{ОбщийМодуль.УчетНДСУПСлужебный.Модуль(7224)}:ВыполнитьЗачетАвансаПолученного(ПараметрыРасчета, СтрокаАванса, СтрокиНачислениеНДС, СтрокиЗачетАванса, НДСАвансыПолученные, "Зачет");
{ОбщийМодуль.УчетНДСУПСлужебный.Модуль(5232)}:ИменаТаблицЗаписейНДСАвансыПолученные.Добавить(РассчитатьНДСАвансыПолученныеЗачеты(ПараметрыРасчета));
{ОбщийМодуль.УчетНДСУПСлужебный.Модуль(1291)}:СформироватьНДСАвансыПолученные(ПараметрыРасчета);
{ОбщийМодуль.УчетНДСУПСлужебный.Модуль(1279)}:ВыполнитьРасчет(ПараметрыРасчета);
{ОбщийМодуль.УчетНДСУПСлужебный.Модуль(1188)}:ВыполнитьРасчетСЗамеромВремени(ПараметрыРасчета);
{ОбщийМодуль.УчетНДСУП.Модуль(7181)}:УчетНДСУПСлужебный.ВыполнитьЗаданияКФормированиюДвиженийПоНДС(КонецПериода, МассивОрганизаций, МассивСчетовФактур);
{ОбщийМодуль.РеглУчетПроведениеСервер.Модуль(704)}:УчетНДСУП.ВыполнитьФормированиеДвиженийПоНДС(КонецМесяца(ТекущаяДата));
Проанализируем фрагмент кода, на котором происходит аварийная остановка. Непосредственно перед строкой с ошибкой вызывается функция библиотеки стандартных подсистем:
РаспределениеСуммыЗачета = ОбщегоНазначения.РаспределитьСуммуПропорциональноКоэффициентам(
ПогашенныйАвансПоСФ.СуммаЗачета,
Коэффициенты
);
В типовом коде разработчики предполагают, что при положительной сумме зачета функция ОбщегоНазначения.РаспределитьСуммуПропорциональноКоэффициентам всегда возвращает массив распределенных чисел. Однако по контракту самой функции значение Неопределено возвращается в следующих ситуациях:
Обращение к первому элементу РаспределениеСуммыЗачета[0] без предварительной проверки переменной на Неопределено приводит к выбросу исключения платформы.
Архитектура регистров расчетов с клиентами (РасчетыСКлиентами, РасчетыСКлиентамиПоДокументам) и регистров учета НДС (НДС авансы полученные, НДСЗаписиКнигиПродаж) категорически не рассчитана на прямые отрицательные строки в документах реализации или актах выполненных работ.
Часто в базы вносятся доработки табличных частей, позволяющие пользователям вручную вбивать строки с минусом (например, для отображения компенсаций, вычетов или особых условий для клиента прямо в печатной форме документа). В момент зачета аванса по такой реализации система пытается рассчитать базу коэффициентов по строкам. В массив попадают положительные и отрицательные числа либо сумма коэффициентов сворачивается в ноль. Функция БСП возвращает Неопределено, а регламентное задание падает.
Опасность заключается в том, что расчет движений по НДС вынесен в отложенную регламентную очередь. Пользователь может успешно записать и провести документ реализации, провести платеж, но регламентное задание «Формирование движений по НДС» споткнется именно на этапе регламентного закрытия периода.
Разберем по шагам, как найти конкретный документ, вызвавший сбой фонового процесса:
Реализация услуг и прочих активов, Акт выполненных работ или Реализация товаров и услуг.Если необходимо экстренно завершить процедуру закрытия месяца и отразить зависшие документы, выполним следующие действия:
Важно: Данный метод является временной мерой (обходным путем) и не устраняет архитектурную проблему, так как при любой перепроводке документов цепочки ошибка возникнет повторно.
Рассмотрим, как корректно решать бизнес-задачи, ради которых пользователи пытаются вносить отрицательные строки в документы реализации:
Корректировка по согласованию сторон или Исправление в первичных документах. Система штатно сформирует сторнирующие записи в регистрах НДС и корректно заполнит книгу продаж или дополнительных листов книги покупок.Если в информационной базе уже накоплен массив исторических документов с нетиповыми строками, и регламентное задание регулярно аварийно прерывается, доработаем логику через расширение конфигурации. Перехватим расчет в процедуре ВыполнитьЗачетАвансаПолученного общего модуля УчетНДСУПСлужебный.
Посмотрим на пример безопасной проверки результата распределения перед обращением по индексу:
// В типовом коде:
// СуммаЗачета = ?(ПогашенныйАвансПоСФ.СуммаЗачета > 0, РаспределениеСуммыЗачета[0], 0);
// Безопасный вариант обработки результата:
Если РаспределениеСуммыЗачета = Неопределено Тогда
СуммаЗачета = 0;
Иначе
СуммаЗачета = ?(ПогашенныйАвансПоСФ.СуммаЗачета > 0, РаспределениеСуммыЗачета[0], 0);
КонецЕсли;
Такая доработка гарантирует, что регламентное задание не упадет с аварийным исключением, а документы, не содержащие ошибок, будут успешно отражены в регламентированном учете.