При программной разработке или ручной корректировке движений документов в среде 1С программисты часто сталкиваются с загадочной ситуацией. Документ успешно проведен, мы открываем форму просмотра его движений и отчетливо видим все сформированные проводки (например, по дебету 19.03 и кредиту 60.01). Однако при формировании Оборотно-сальдовой ведомости (ОСВ) или Карточки счета эти проводки бесследно исчезают, либо отображаются некорректно.
В этой статье мы подробно разберем, почему возникает подобное поведение платформы, проанализируем ключевые причины рассинхронизации данных и выработаем пошаговый алгоритм устранения этой проблемы.
В типовых конфигурациях 1С (таких как «1С:Бухгалтерия», «1С:ERP» или «1С:Комплексная автоматизация») практически все регистры бухгалтерии имеют ключевое измерение Организация. Оно является разделителем учета. Если при программной записи набора записей регистра это измерение не заполнено, система запишет проводку с пустым значением организации.
Суть проблемы: Бухгалтерские отчеты (ОСВ, Карточка счета, Анализ счета) практически всегда формируются с установленным отбором по конкретной организации. Проводки, в которых организация осталась пустой, физически существуют в базе данных и привязаны к документу-регистратору, но отчеты их просто отсекают по условию фильтрации.
Рассмотрим пример кода, в котором допускается подобная ошибка:
// НЕКОРРЕКТНЫЙ КОД: Измерение Организация пропущено
Движение = Движения.Хозрасчетный.Добавить();
Движение.Регистратор = ЭтотОбъект.Ссылка;
Движение.Период = ЭтотОбъект.Дата;
Движение.СчетДт = ПланыСчетов.Хозрасчетный.НДСПриобретенныеЦенности;
Движение.СчетКт = ПланыСчетов.Хозрасчетный.РасчетыСПоставщиками;
Движение.Сумма = 500;
Чтобы исправить эту ситуацию, нам обязательно нужно явно передавать ссылку на организацию из реквизитов документа. Разберем правильный вариант заполнения движения регистра:
// КОРРЕКТНЫЙ КОД: Заполнение всех ключевых измерений
Движение = Движения.Хозрасчетный.Добавить();
Движение.Регистратор = ЭтотОбъект.Ссылка;
Движение.Период = ЭтотОбъект.Дата;
// Явно заполняем организацию
Движение.Организация = ЭтотОбъект.Организация;
Движение.СчетДт = ПланыСчетов.Хозрасчетный.НДСПриобретенныеЦенности;
Движение.СчетКт = ПланыСчетов.Хозрасчетный.РасчетыСПоставщиками;
Движение.Сумма = 500;
Движение.Активность = Истина;
Каждая запись в регистрах 1С (как накопления, так и бухгалтерии) обладает системным реквизитом Активность. Он определяет, влияют ли данные движения на итоговые остатки и обороты по счетам.
Суть проблемы: Если при программном формировании проводок свойство Активность приняло значение Ложь, проводки будут прекрасно видны в форме «Движения документа» (часто они выделяются серым цветом или специальной пиктограммой), но стандартные отчеты их полностью проигнорируют. Такое часто случается при копировании документов, программном переносе движений или использовании сложных обработок проведения.
Выясним причину и исправим её в коде. Перед вызовом метода Записать() необходимо убедиться, что у всех движений установлена активность:
Движения.Хозрасчетный.Записывать = Истина;
Для Каждого Движение Из Движения.Хозрасчетный Цикл
Движение.Активность = Истина;
КонецЦикла;
Для ускорения работы и быстрого построения тяжелых отчетов платформа 1С использует специальные таблицы хранения рассчитанных итогов. ОСВ берет данные именно из этих агрегированных таблиц, а не обращается напрямую к детальным записям регистра за весь период.
Суть проблемы: При аварийном завершении работы СУБД, некорректном динамическом обновлении конфигурации или массовой записи движений напрямую через транзакции СУБД таблицы итогов могут «разойтись» с реальными записями движений. В результате проводка физически записана в БД и привязана к документу, но в итогах её нет.
Проанализируем шаги по восстановлению работоспособности итогов:
Каждая проводка имеет свой независимый реквизит Период. При стандартном проведении платформа автоматически приравнивает период проводки к дате документа-регистратора.
Суть проблемы: Если при программном заполнении разработчик забыл синхронизировать дату проводки с датой документа, то период проводки может остаться пустым (значение 01.01.0001 00:00:00) либо записаться некорректной датой (например, из прошлого года). Бухгалтер строит ОСВ за текущий месяц и не видит этих проводок, поскольку они попали в совершенно другой период.
Посмотрим на пример правильной синхронизации дат в модуле проведения:
Движение.Период = ЭтотОбъект.Дата; // Проводка строго привязывается к дате документа
Если счет учета требует обязательного ведения аналитического учета (например, по Контрагентам, Договорам или Номенклатуре), а при программной генерации проводок эти субконто не заполнились или заполнились некорректным типом данных, могут возникнуть проблемы при отображении.
Суть проблемы: Если в настройках ОСВ установлен жесткий отбор по конкретному контрагенту или договору, а проводка была записана с пустым или битым субконто, отчет её скроет. При этом в карточке счета без отборов проводка может отображаться с пустым субконто вида <...>.
Для исключения этой проблемы всегда контролируйте типы передаваемых значений в субконто. Они должны строго соответствовать типам, заданным в Плане счетов для конкретного счета:
// Пример корректного заполнения субконто для счета 60.01
СчетУчета = ПланыСчетов.Хозрасчетный.РасчетыСПоставщиками;
Движение.СчетКт = СчетУчета;
БухгалтерскийУчет.УстановитьСубконто(Движение.СчетКт, Движение.СубконтоКт, "Контрагенты", ЭтотОбъект.Контрагент);
БухгалтерскийУчет.УстановитьСубконто(Движение.СчетКт, Движение.СубконтоКт, "Договоры", ЭтотОбъект.ДоговорКонтрагента);
Чтобы оперативно разобраться, почему проводка ведет себя некорректно, воспользуемся следующими диагностическими методами:
ВЫБРАТЬ
Хозрасчетный.Период КАК Период,
Хозрасчетный.Организация КАК Организация,
Хозрасчетный.СчетДт КАК СчетДт,
Хозрасчетный.СчетКт КАК СчетКт,
Хозрасчетный.Сумма КАК Сумма,
Хозрасчетный.Активность КАК Активность
ИЗ
РегистрБухгалтерии.Хозрасчетный КАК Хозрасчетный
ГДЕ
Хозрасчетный.Регистратор = &ДокументСсылка
Организация, каков реальный Период проводки и активна ли данная запись.Соблюдение правил программной работы с регистрами бухгалтерии и обязательное заполнение ключевых разрезов учета (Организация, Период, Субконто) гарантирует корректное и предсказуемое отражение всех операций в регламентированной отчетности вашего предприятия.