Почему программно созданные проводки не отображаются в отчетах и как это исправить

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия Бухгалтерский учет
← На главную

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

Причина 1. Флаг Активность в наборе записей

Проанализируем механику работы регистров бухгалтерии. Каждая запись в регистре имеет системное поле Активность. Это логический признак, который определяет, учитывается ли данная запись в виртуальных таблицах (обороты, остатки), на которых строятся все отчеты. Если при программном заполнении проводок вы не установили этот флаг в значение Истина, записи попадут в физическую таблицу базы данных, но будут игнорироваться механизмом итогов.

Рассмотрим пример правильного заполнения свойства Активность при переборе строк набора записей:


// Создаем набор записей регистра бухгалтерии
НаборЗаписей = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(ДокументСсылка);

// ... (код заполнения набора записей)

Для Каждого Запись Из НаборЗаписей Цикл
    // Критически важная строка:
    Запись.Активность = Истина;
КонецЦикла;

НаборЗаписей.Записать();

Причина 2. Статус документа и режим записи

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

Если вы записываете движения напрямую через набор записей регистра, объект документа об этом «не знает» и его статус не меняется. Чтобы отчеты начали видеть данные, выполним запись документа в режиме проведения или явно установим флаг:


ДокОбъект = ДокументСсылка.ПолучитьОбъект();
// Устанавливаем статус проведенного документа
ДокОбъект.Записать(РежимЗаписиДокумента.Проведение);

Важно: При использовании РежимЗаписиДокумента.Запись статус проведения может не обновиться, если логика конфигурации требует именно транзакционного проведения.

Причина 3. Заполнение обязательных измерений (Организация)

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

Проанализируем типичный фрагмент кода:


НоваяПроводка = НаборЗаписей.Добавить();
НоваяПроводка.Период = ДатаОперации;
// Обязательно заполняем организацию!
НоваяПроводка.Организация = ВыбраннаяОрганизация; 
НоваяПроводка.СчетДт = ПланыСчетов.Хозрасчетный.ТоварыНаСкладах;
НоваяПроводка.СчетКт = ПланыСчетов.Хозрасчетный.РасчетыСПоставщиками;
НоваяПроводка.Сумма = 1000;

Причина 4. Различия между Движения.Записать() и НаборЗаписей.Записать()

Разберем разницу в подходах. Программисты часто путают работу с коллекцией Движения внутри объекта документа и работу с независимым объектом РегистрБухгалтерииНаборЗаписей.

  1. Если вы работаете внутри объекта (например, в обработке заполнения): используйте ЭтотОбъект.Движения.Хозрасчетный.Записывать = Истина;. В этом случае при вызове Записать() самого документа платформа сама запишет проводки и установит им активность.
  2. Если вы работаете «снаружи» (в обработке): создавайте набор записей через менеджер регистра. Но в этом случае после НаборЗаписей.Записать() обязательно проверьте, что у документа-регистратора стоит пометка «Проведен» (синяя галочка в списке).

Методика отладки: Сравнение движений

Если визуально проводки кажутся одинаковыми, но программные не работают, применим методику сравнения. Создадим один документ вручную (интерактивно), а второй — программно.

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

Причина 5. Использование ОбменДанными.Загрузка

Рассмотрим ситуацию, когда при записи документа используется флаг ОбменДанными.Загрузка = Истина. При включении этого режима платформа отключает большинство проверок и подписок на события. Если в вашей конфигурации пересчет итогов или регистрация в дополнительных регистрах (которые могут влиять на отчеты) реализованы через подписки, то установка этого флага «выключит» эти механизмы.

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

Итоги

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

  1. Всегда устанавливайте Запись.Активность = Истина для каждой создаваемой строки регистра.
  2. Убедитесь, что заполнены все балансовые измерения (Организация, Подразделение, если оно есть).
  3. После записи движений убедитесь, что сам документ имеет статус Проведен.
  4. Если используете объектную модель, не забывайте устанавливать свойство Движения.Хозрасчетный.Записывать = Истина перед вызовом Записать() объекта.

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

← На главную