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