Каждый разработчик 1С рано или поздно сталкивается с задачей написания собственного отчета или запроса для получения остатков и оборотов по взаиморасчетам. Казалось бы, задача тривиальная: достаточно обратиться к виртуальной таблице РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты, наложить фильтр по счету 62 и получить готовый результат. Однако на практике цифры в получившемся отчете часто не совпадают с показателями стандартной Оборотно-сальдовой ведомости (ОСВ) по счету 62.
В этой статье мы подробно разберем, почему возникают такие расхождения, проанализируем внутренние механизмы работы платформы 1С:Предприятие 8.3 с регистрами бухгалтерии и выработаем универсальное решение, которое позволит получать абсолютно идентичные ОСВ данные.
---
Давайте проанализируем типичную ситуацию. Разработчик пишет запрос к виртуальной таблице остатков и оборотов, выбирает субконто "Контрагенты" и "Договоры", указывает счета учета 62.01 и 62.02, но на выходе видит некорректные суммы. Основные причины расхождений кроются в пяти ключевых факторах:
СуммаНачальныйОстатокДт и СуммаНачальныйОстатокКт при группировке по контрагенту, система выполнит математическое вычитание (свернет сальдо). В результате общие итоги по контрагенту "схлопнутся", тогда как в ОСВ они должны показываться развернуто.23:59:59). Передача в параметры запроса простой даты без указания времени или игнорирование особенностей работы с типом Граница приводит к потере документов, проведенных на границе периода.---
Для того чтобы получить корректные остатки на активно-пассивных счетах, необходимо использовать специализированные поля виртуальной таблицы ОстаткиИОбороты. Вместо стандартных полей остатков мы должны выбирать поля развернутого остатка:
СуммаНачальныйРазвернутыйОстатокДтСуммаНачальныйРазвернутыйОстатокКтСуммаКонечныйРазвернутыйОстатокДтСуммаКонечныйРазвернутыйОстатокКтДавайте посмотрим, как будет выглядеть правильный выбор полей в тексте запроса:
ВЫБРАТЬ
ХозрасчетныйОстаткиИОбороты.Субконто1 КАК Контрагент,
ХозрасчетныйОстаткиИОбороты.Субконто2 КАК Договор,
ХозрасчетныйОстаткиИОбороты.Организация КАК Организация,
ХозрасчетныйОстаткиИОбороты.СуммаНачальныйРазвернутыйОстатокДт КАК НачОстатокДт,
ХозрасчетныйОстаткиИОбороты.СуммаНачальныйРазвернутыйОстатокКт КАК НачОстатокКт,
ХозрасчетныйОстаткиИОбороты.СуммаОборотДт КАК ОборотДт,
ХозрасчетныйОстаткиИОбороты.СуммаОборотКт КАК ОборотКт,
ХозрасчетныйОстаткиИОбороты.СуммаКонечныйРазвернутыйОстатокДт КАК КонОстатокДт,
ХозрасчетныйОстаткиИОбороты.СуммаКонечныйРазвернутыйОстатокКт КАК КонОстатокКт
ИЗ
РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, , , Счет В ИЕРАРХИИ (&Счет62), &ВидыСубконто, Организация = &Организация) КАК ХозрасчетныйОстаткиИОбороты
---
Обратите внимание на параметры виртуальной таблицы в запросе выше. Разберем их по шагам, так как здесь кроются важнейшие настройки:
Параметр "Счет": Вместо перечисления конкретных субсчетов через запятую мы используем условию Счет В ИЕРАРХИИ (&Счет62). В качестве параметра &Счет62 мы передадим предопределенное значение плана счетов ПланыСчетов.Хозрасчетный.Покупатели. Это позволит автоматически учесть все существующие субсчета счета 62 (включая валютные и авансовые субсчета), точно так же, как это делает типовая ОСВ.
Параметр "Субконто": Это ключевой момент для свертки избыточной аналитики. Чтобы система проигнорировала субконто Документы расчетов и корректно "схлопнула" расчеты на уровне договоров, мы обязаны явно передать массив видов субконто в шестой параметр виртуальной таблицы. В этот массив должны входить только два значения: ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Контрагенты и ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Договоры.
Рассмотрим пример кода на встроенном языке для инициализации этих параметров:
// Подготавливаем массив видов субконто
МассивСубконто = Новый Массив;
МассивСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Контрагенты);
МассивСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Договоры);
Запрос = Новый Запрос;
Запрос.Текст = "..."; // Наш текст запроса
// Установка параметров
Запрос.УстановитьПараметр("Счет62", ПланыСчетов.Хозрасчетный.Покупатели);
Запрос.УстановитьПараметр("ВидыСубконто", МассивСубконто);
Запрос.УстановитьПараметр("Организация", СсылкаНаОрганизацию);
---
Для того чтобы в запрос попали абсолютно все документы за выбранный период (включая пограничные транзакции, записанные в последнюю секунду), необходимо правильно рассчитывать конечную дату. Использование простой даты конца периода часто приводит к потере данных. Рекомендуется использовать объект Граница с типом Включая.
Посмотрим на пример установки временных рамок периода:
КонецПериодаГраница = Новый Граница(КонецДня(ДатаОкончанияОтчета), ВидГраницы.Включая);
Запрос.УстановитьПараметр("НачалоПериода", НачалоДня(ДатаНачалаОтчета));
Запрос.УстановитьПараметр("КонецПериода", КонецПериодаГраница);
Благодаря такому подходу мы гарантируем, что виртуальные таблицы остатков на конец периода учтут все движения, сделанные в последнюю секунду указанного дня.
---
Если мы разрабатываем отчет на базе СКД, то ручной расчет развернутого сальдо в самом тексте запроса можно переложить на плечи компоновщика. Это более гибкий и профессиональный подход, так как СКД умеет рассчитывать развернутый остаток динамически, подстраиваясь под те группировки, которые пользователь выбрал в настройках отчета.
Разберем по шагам, как настроить роли полей остатков на вкладке "Наборы данных" в схеме компоновки:
СуммаНачальныйОстатокДт задаем роль:
СуммаНачальныйОстатокКт задаем аналогичную роль с тем же именем СуммаНачальныйОстаток, но связываем его с кредитовым показателем.СуммаКонечныйОстатокДт и СуммаКонечныйОстатокКт) настраиваем роль:
При таких настройках СКД автоматически преобразует итоговые выборки и выведет развернутое сальдо на уровне группировок "Контрагент", "Организация" или "Счет", полностью дублируя логику работы стандартной Оборотно-сальдовой ведомости.
---
Мы выяснили, что для получения данных, полностью идентичных ОСВ по счету 62, необходимо соблюдать четыре золотых правила разработки бухгалтерских отчетов в 1С:
РазвернутыйОстатокДт/Кт) в обычных запросах или правильно настраивать роли полей остатков в схемах СКД.Граница(КонецДня(Дата), ВидГраницы.Включая).В ИЕРАРХИИ), чтобы не потерять валютные операции или расчеты в условных единицах.Соблюдение этих рекомендаций позволит вам создавать надежные, быстродействующие и точные отчеты, которые никогда не вызовут вопросов у бухгалтеров из-за расхождений с типовыми ведомостями программы.