При работе в сильно измененных, нетиповых конфигурациях «1С:Бухгалтерия предприятия 3.0» пользователи часто сталкиваются с аномальным поведением системы во время перепроведения документов. Одной из наиболее запутанных проблем является автоматическое сторнирование (минусование) проводок по регистру бухгалтерии при повторном проведении документа. На ОСВ по счету (например, по счету 08.34 или 90) данные обороты затираются, так как система делает сначала обычную проводку, а следом — точно такую же сторнирующую запись «красным».
В этой статье мы подробно разберем, почему возникает этот сбой, проанализируем внутренние механизмы платформы «1С:Предприятие 8.3» и рассмотрим пошаговый план локализации и устранения ошибки в Конфигураторе.
В типовой конфигурации «1С:Бухгалтерия» при перепроведении документа старые проводки просто удаляются из базы данных, а вместо них записываются новые актуальные движения. Появление компенсирующих отрицательных проводок (сторно) в том же самом периоде указывает на работу кастомного (доработанного) алгоритма.
Рассмотрим детально основные технические причины, которые приводят к такому поведению системы:
ОбработкаПроведения. Если при этом разработчик не предусмотрел принудительную программную очистку набора записей, система накладывает новые движения на старые, запуская некорректно написанные контроли остатков или корректирующие алгоритмы.ОбработкаПроведения документа РеализацияТоваровУслуг или на событие ПриЗаписи регистра бухгалтерии Хозрасчетный.&После или &Вместо для процедуры ОбработкаПроведения, обработчик в расширении может повторно считывать движения документа и накладывать ошибочное сторно.РучнаяКорректировка), система должна защищать движения от перезаписи. Если сторонний доработанный регламентный процесс или групповое перепроведение пытается обойти этот запрет программно, это может приводить к генерации корректирующих (сторнирующих) проводок.Для того чтобы разобраться в проблеме, нам потребуется выполнить последовательную диагностику. Пройдем по шагам весь путь от анализа интерфейса до отладки программного кода.
Прежде чем открывать Конфигуратор, провем экспресс-диагностику в режиме «1С:Предприятие»:
Если ручная корректировка не при чем, переходим в Конфигуратор и анализируем структуру метаданных:
РеализацияТоваровУслуг (или соответствующий доработанный документ реализации).Удалять автоматически. Если там установлено Не удалять автоматически, проанализируем, очищаются ли движения программно в самом начале процедуры проведения.Откроем модуль объекта исследуемого документа и перейдем к обработчику проведения. Нам нужно локализовать код, который может умножать суммы на «-1» или добавлять записи со знаком минус.
Рассмотрим пример типичной ошибки, когда разработчик пытается получить «старые» проводки для последующего сторно:
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
// ПРИМЕР ОШИБОЧНОГО КОДА:
// Попытка получить старые проводки текущего документа прямо в транзакции проведения
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Хозрасчетный.СчетДт,
| Хозрасчетный.СчетКт,
| Хозрасчетный.Сумма
|ИЗ
| РегистрБухгалтерии.Хозрасчетный КАК Хозрасчетный
|ГДЕ
| Хозрасчетный.Регистратор = &Ссылка";
Запрос.УстановитьПараметр("Ссылка", Ссылка);
РезультатЗапроса = Запрос.Выполнить();
Если Не РезультатЗапроса.Пустой() Тогда
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
// Формируем сторно-запись на основе старых данных
ПроводкаСторно = Движения.Хозрасчетный.Добавить();
ЗаполнитьЗначенияСвойств(ПроводкаСторно, Выборка);
ПроводкаСторно.Сумма = -Выборка.Сумма; // Здесь происходит зануление!
ПроводкаСторно.Период = Дата;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Для исправления такой логики необходимо переписать алгоритм так, чтобы получение старых движений происходило до начала транзакции записи новых проводок, либо использовать временные таблицы или анализировать движения, сохраненные в свойствах объекта при чтении (например, в событии ПередЗаписью).
Если в модуле объекта документа подозрительный код отсутствует, велика вероятность, что проводки искажаются «снаружи» через подписки на события. Выполним поиск активных подписок:
Источник) указан документ РеализацияТоваровУслуг (или тип ДокументОбъект), а событием является ОбработкаПроведения или ПриЗаписи.Хозрасчетный (события ПередЗаписью или ПриЗаписи для набора записей).Самый надежный и быстрый способ найти виновника автоматического сторно — запустить отладку:
Хозрасчетный (или общий модуль, где формируются движения) и найдем процедуру записи движений.Проводка.Сумма < 0.Используя данный системный подход, мы сможем быстро локализовать участок кода, вызывающий появление лишних сторнирующих записей, исправить логическую ошибку разработчиков и вернуть учет по ОСВ в корректное русло.