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