Почему оборотно-сальдовая ведомость формируется некорректно при программном создании проводок в 1С?

Программист 1С v8.3 (Обычные формы) Бухгалтерский учет IT и автоматизация бизнеса
← На главную

При изучении механизмов бухгалтерского учета на платформе 1С и разработке собственных отчетов, таких как оборотно-сальдовая ведомость (ОСВ), начинающие разработчики часто сталкиваются с ситуацией: документы проведены, суммы совпадают, но итоговый отчет выводит непредвиденные обороты или задвоенные остатки. Проанализируем причину такого поведения и подробно разберем, как правильно формировать записи в регистре бухгалтерии и отлаживать построение отчета.

Анализ основной причины ошибки в коде

Самая распространенная причина искажения данных в ОСВ при ручном или полуавтоматическом формировании проводок через табличную часть документа (например, документ «Операция») — это банальная опечатка при обходе строк табличной части и заполнении полей набора записей регистра бухгалтерии.

Посмотрим на пример ошибочного кода в модуле объекта документа:


Движения.Хозрасчетный.Очистить();
Для Каждого Стр Из ТабличнаяЧастьПроводки Цикл
    Движение = Движения.Хозрасчетный.Добавить();
    Движение.Период = Дата;
    Движение.СчетДт = Стр.СчетДт;
    // Ошибка: вместо Стр.СчетКт записано Стр.СчетДт
    Движение.СчетКт = Стр.СчетДт; 
    Движение.Сумма = Стр.Сумма;
КонецЦикла;
Движения.Хозрасчетный.Записать();

В приведенном фрагменте в оба поля — СчетДт и СчетКт — подставляется значение из колонки СчетДт табличной части. В результате формируется проводка между одним и тем же счетом (например, Дт Расчеты с учредителями — Кт Расчеты с учредителями), а счет кредита (например, Уставный капитал) вообще не получает никаких движений. Это полностью искажает обороты и сальдо в виртуальных таблицах регистра.

Исправленный вариант кода должен выглядеть следующим образом:


Движения.Хозрасчетный.Записывать = Истина;
Для Каждого Стр Из ТабличнаяЧастьПроводки Цикл
    Движение = Движения.Хозрасчетный.Добавить();
    Движение.Период = Дата;
    Движение.СчетДт = Стр.СчетДт;
    Движение.СчетКт = Стр.СчетКт; // Корректное обращение к колонке счета кредита
    Движение.Сумма = Стр.Сумма;
    Движение.Активность = Истина;
КонецЦикла;

Пошаговая методика поиска и устранения проблем в ОСВ

Если отчет показывает неожиданные результаты, разберем по шагам алгоритм диагностики:

  1. Проверка физической таблицы движений через консоль запросов. Не следует сразу анализировать виртуальную таблицу ОстаткиИОбороты. Сначала обратимся прямым запросом к физической таблице РегистрБухгалтерии.Хозрасчетный, чтобы увидеть реальные значения в колонках СчетДт, СчетКт, Сумма и Активность. Если в колонке СчетКт продублирован счет дебета или поле Активность равно Ложь, ошибка кроется в алгоритме проведения.
  2. Проверка видов счетов в Плане счетов. Платформа 1С рассчитывает сальдо исходя из признака счета: активный, пассивный или активно-пассивный. Если для пассивного счета по ошибке установлен вид Активный, дебетовое сальдо будет отображаться некорректно, а шахматка ведомости потеряет баланс.
  3. Проверка границ периода отчета. Если проводка сделана в конце дня (например, со временем 18:00:00), а параметр конца периода в запрос передан как дата без времени (00:00:00), проводка не попадет в выборку. Необходимо передавать границу периода с помощью функции КонецПериода(&КонецПериода, ДЕНЬ) либо через объект Граница с видом ВидГраницы.Включая.
  4. Корректный выбор полей из виртуальной таблицы. Для стандартной оборотно-сальдовой ведомости из таблицы РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты следует выбирать развернутые поля: СуммаНачальныйОстатокДт, СуммаНачальныйОстатокКт, СуммаОборотДт, СуммаОборотКт, СуммаКонечныйОстатокДт, СуммаКонечныйОстатокКт. Использование свернутых полей СуммаНачальныйОстаток и СуммаКонечныйОстаток возвращает единое число со знаком, что не соответствует формату бухгалтерской ведомости.

Особенности работы с субконто при формировании проводок

Рассмотрим еще один важный аспект: если счет содержит субконто, недостаточно просто назначить счета и сумму. Заполнение аналитики требует корректного обращения к коллекции субконто соответствующей стороны проводки:


// Пример заполнения субконто для дебета и кредита
Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Контрагенты] = Стр.Контрагент;
Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Договоры] = Стр.Договор;
Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.СтатьиДвиженияДенежныхСредств] = Стр.СтатьяДДС;

Если аналитика не заполнена или передано значение неверного типа, синтетические обороты по счету сойдутся, однако аналитическая оборотно-сальдовая ведомость с разворотом по субконто будет формировать пустые строки в группировках.

← На главную