Как получить сальдо на начало периода в 1С с помощью запроса и избежать пустого результата?

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

Часто при разработке отчетов в 1С возникает необходимость получить данные о сальдо на начало периода, аналогичные тем, что выводятся в оборотно-сальдовой ведомости (ОСВ). На первый взгляд задача кажется простой, но на практике встречаются нюансы, из-за которых запросы могут возвращать неверные данные или даже пустоту. Рассмотрим, как правильно построить запрос для получения начального сальдо и устранить распространенные ошибки.

Почему запрос возвращает пустоту? Анализируем исходную проблему

Наш читатель столкнулся с ситуацией, когда его запрос к регистру бухгалтерии Хозрасчетный.ОстаткиИОбороты не возвращал данных, хотя в ОСВ они присутствовали. Исходный запрос выглядел так:


ВЫБРАТЬ
    ХозрасчетныйОстаткиИОбороты.СуммаНачальныйОстатокДт КАК СуммаНачальныйОстатокДт,
    ХозрасчетныйОстаткиИОбороты.СуммаНачальныйОстатокКт КАК СуммаНачальныйОстатокКт,
    ХозрасчетныйОстаткиИОбороты.Субконто1 КАК Субконто1,
    ХозрасчетныйОстаткиИОбороты.Субконто2 КАК Субконто2,
    ХозрасчетныйОстаткиИОбороты.Субконто3 КАК Субконто3
ИЗ
    РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(&Нач, &Кон, , , , , ) КАК ХозрасчетныйОстаткиИОбороты
ГДЕ
    ХозрасчетныйОстаткиИОбороты.Счет = &Счет

Проблема часто кроется в неточности фильтрации по счету. Условие ХозрасчетныйОстаткиИОбороты.Счет = &Счет означает, что мы ищем остатки только по строго указанному счету, без учета его субсчетов. Однако в ОСВ данные обычно агрегируются по всей иерархии счетов, что является стандартной практикой в бухгалтерском учете.

Решение проблемы "пустого" результата: Использование иерархии счетов

Чтобы запрос учитывал все субсчета, входящие в указанный счет, необходимо использовать оператор В ИЕРАРХИИ. Этот оператор позволяет выбрать все счета, которые являются подчиненными для заданного счета в плане счетов 1С.

Изменим условие в запросе. Для наилучшей производительности и корректности, условие по счету рекомендуется переносить непосредственно в параметры виртуальной таблицы, а не использовать в секции ГДЕ основного запроса:


ВЫБРАТЬ
    ХозрасчетныйОстаткиИОбороты.СуммаНачальныйОстатокДт КАК СуммаНачальныйОстатокДт,
    ХозрасчетныйОстаткиИОбороты.СуммаНачальныйОстатокКт КАК СуммаНачальныйОстатокКт,
    ХозрасчетныйОстаткиИОбороты.Субконто1 КАК Субконто1,
    ХозрасчетныйОстаткиИОбороты.Субконто2 КАК Субконто2,
    ХозрасчетныйОстаткиИОбороты.Субконто3 КАК Субконто3
ИЗ
    РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(&Нач, &Кон, , , Счет В ИЕРАРХИИ(&Счет), , ) КАК ХозрасчетныйОстаткиИОбороты

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

Выбор виртуальной таблицы: Остатки или ОстаткиИОбороты?

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

Виртуальная таблица ОстаткиИОбороты

Виртуальная таблица РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты является универсальным инструментом. Она позволяет в одном запросе получить начальный остаток, обороты за заданный период и конечный остаток. Именно эту таблицу использует стандартная оборотно-сальдовая ведомость, что делает её идеальным выбором, когда требуется комплексный отчет. Для автоматического построения такой ведомости в коде можно использовать обработку для программного формирования оборотно-сальдовой ведомости.

  1. Преимущества: Предоставляет полный набор данных (начальные, конечные остатки и обороты) в одном запросе, что удобно для комплексных отчетов, имитирующих ОСВ.
  2. Недостатки: Может быть менее производительной по сравнению с Остатки, так как для ее формирования система может выполнять до трех запросов к базе данных (для остатков на начало, оборотов и остатков на конец).

Пример использования с уточненным фильтром:


ВЫБРАТЬ
    ХозрасчетныйОстаткиИОбороты.СуммаНачальныйОстатокДт КАК СуммаНачальныйОстатокДт,
    ХозрасчетныйОстаткиИОбороты.СуммаНачальныйОстатокКт КАК СуммаНачальныйОстатокКт,
    ХозрасчетныйОстаткиИОбороты.Счет КАК Счет,
    ХозрасчетныйОстаткиИОбороты.Субконто1 КАК Субконто1,
    ХозрасчетныйОстаткиИОбороты.Субконто2 КАК Субконто2,
    ХозрасчетныйОстаткиИОбороты.Субконто3 КАК Субконто3
ИЗ
    РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(
        &Нач,                         // Дата начала периода (включая)
        &Кон,                         // Дата окончания периода (включая)
        ,                             // Периодичность (Авто, День, Неделя, Месяц, Квартал, Год)
        ,                             // Условие на тип движения (ВидДвижения: Дт, Кт, Оба)
        Счет В ИЕРАРХИИ(&Счет),      // Отбор по счету с учетом иерархии
        ,                             // Отбор по субконто (массив ПлановВидовХарактеристик.ВидыСубконтоХозрасчетные)
        // Массив ссылок на Субконто. Используется, когда нужно отбирать не по виду субконто, а по конкретному значению.
        // Пример: Субконто1 В (&МассивКонтрагентов)
    ) КАК ХозрасчетныйОстаткиИОбороты

Обратите внимание, что фильтр по счету перенесен в параметры виртуальной таблицы, что является более правильным с точки зрения производительности, так как фильтрация происходит на этапе формирования самой таблицы, а не после.

Виртуальная таблица Остатки

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

  1. Преимущества: Высокая производительность, так как таблица формируется быстрее, не вычисляя обороты за период. Идеально подходит, когда нужны только остатки на заданную точку времени.
  2. Недостатки: Предоставляет только остатки на заданную дату, без информации об оборотах.

Пример запроса к таблице Остатки:


ВЫБРАТЬ
    ХозрасчетныйОстатки.СуммаОстатокДт КАК СуммаОстатокДт,
    ХозрасчетныйОстатки.СуммаОстатокКт КАК СуммаОстатокКт,
    ХозрасчетныйОстатки.Счет КАК Счет,
    ХозрасчетныйОстатки.Субконто1 КАК Субконто1,
    ХозрасчетныйОстатки.Субконто2 КАК Субконто2,
    ХозрасчетныйОстатки.Субконто3 КАК Субконто3
ИЗ
    РегистрБухгалтерии.Хозрасчетный.Остатки(
        &Период,                      // Дата или граница периода, на которую нужны остатки
        Счет В ИЕРАРХИИ(&Счет),       // Отбор по счету с учетом иерархии
        ,                             // Отбор по видам субконто
        // Массив ссылок на Субконто
    ) КАК ХозрасчетныйОстатки

Правильное указание периода для получения сальдо

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

Для получения начального сальдо на определенную дату (например, 01.01.2023), то есть сальдо на конец предыдущего дня (31.12.2022 23:59:59), мы можем использовать следующие подходы:

  1. Начало дня: Если нам нужно сальдо на 00:00:00 указанной даты (т.е. на конец предыдущего дня), мы передаем саму дату, обернутую в функцию НачалоДня().
    
    // Для получения остатков на начало дня 01.01.2023 (т.е. на конец 31.12.2022)
    Запрос.УстановитьПараметр("Период", НачалоДня(ДатаНачалаОтчета));
    
  2. Использование объекта Граница: Для более точного контроля границ можно использовать объект Граница. Чтобы получить остатки на конец дня, предшествующего началу отчетного периода, мы можем указать саму дату начала периода с видом границы Исключая.
    
    // Для получения остатков, исключая текущий день, т.е. на конец предыдущего дня
    Запрос.УстановитьПараметр("Период", Новый Граница(ДатаНачалаОтчета, ВидГраницы.Исключая));
    

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

Понимание "развернутого сальдо" и выбор полей

В процессе обсуждения выяснилось, что поля СуммаОстатокДт и СуммаОстатокКт из таблицы Остатки или СуммаНачальныйОстатокДт и СуммаНачальныйОстатокКт из ОстаткиИОбороты не всегда совпадают с данными в оборотно-сальдовой ведомости. Это связано с тем, что стандартная ОСВ, как правило, использует развернутое сальдо.

Что такое развернутое сальдо?

По некоторым счетам (например, 60 "Расчеты с поставщиками и подрядчиками", 62 "Расчеты с покупателями и заказчиками") аналитический учет ведется таким образом, что по одной и той же аналитике (например, по одному контрагенту или договору) может быть одновременно и дебетовое, и кредитовое сальдо в разрезе разных документов или договоров. "Развернутое сальдо" показывает эти дебетовые и кредитовые остатки отдельно по каждому разрезу аналитики, не сворачивая их до одного сальдо по счету в целом или по крупной аналитике. При необходимости сформировать готовый отчет с детализацией и развернутым сальдо можно использовать отчет с поддержкой развернутого сальдо и аналитикой по субконто.

Для получения развернутого сальдо, соответствующего ОСВ, нам следует использовать поля, содержащие в названии "Развернутый". Эти поля обычно доступны в виртуальной таблице ОстаткиИОбороты:

  1. СуммаНачальныйРазвернутыйОстатокДт
  2. СуммаНачальныйРазвернутыйОстатокКт

Переработанный запрос для ОстаткиИОбороты с развернутым сальдо:


ВЫБРАТЬ
    ХозрасчетныйОстаткиИОбороты.СуммаНачальныйРазвернутыйОстатокДт КАК СуммаНачальныйРазвернутыйОстатокДт,
    ХозрасчетныйОстаткиИОбороты.СуммаНачальныйРазвернутыйОстатокКт КАК СуммаНачальныйРазвернутыйОстатокКт,
    ХозрасчетныйОстаткиИОбороты.Счет КАК Счет,
    ХозрасчетныйОстаткиИОбороты.Субконто1 КАК Субконто1,
    ХозрасчетныйОстаткиИОбороты.Субконто2 КАК Субконто2,
    ХозрасчетныйОстаткиИОбороты.Субконто3 КАК Субконто3
ИЗ
    РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(&Нач, &Кон, , , Счет В ИЕРАРХИИ(&Счет), , ) КАК ХозрасчетныйОстаткиИОбороты

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

  1. Выбрать все поля субконто (Субконто1, Субконто2, Субконто3), по которым ведется аналитический учет на данном счете.
  2. Использовать условные выражения (ВЫБОР КОГДА ... ТОГДА ... ИНАЧЕ ... КОНЕЦ) для разделения общего остатка (СуммаОстаток) на дебетовый и кредитовый по каждому субконто.

Пример такого запроса к таблице Остатки для получения развернутого сальдо:


ВЫБРАТЬ
    ХозрасчетныйОстатки.Счет КАК Счет,
    ХозрасчетныйОстатки.Субконто1 КАК Субконто1,
    ХозрасчетныйОстатки.Субконто2 КАК Субконто2,
    ХозрасчетныйОстатки.Субконто3 КАК Субконто3,
    ВЫБОР
        КОГДА ХозрасчетныйОстатки.СуммаОстаток > 0
            ТОГДА ХозрасчетныйОстатки.СуммаОстаток
        ИНАЧЕ 0
    КОНЕЦ КАК СуммаОстатокДтРазвернутое,
    ВЫБОР
        КОГДА ХозрасчетныйОстатки.СуммаОстаток < 0
            ТОГДА -ХозрасчетныйОстатки.СуммаОстаток
        ИНАЧЕ 0
    КОНЕЦ КАК СуммаОстатокКтРазвернутое
ИЗ
    РегистрБухгалтерии.Хозрасчетный.Остатки(&Период, Счет В ИЕРАРХИИ(&Счет), &ВидыСубконто, ) КАК ХозрасчетныйОстатки

Важно: Параметр &ВидыСубконто в виртуальной таблице Остатки (третий параметр) позволяет указать, по каким разрезам аналитики необходимо получать остатки. Например, это может быть массив из ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Контрагенты и ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Договоры. Если его не указать, остатки будут собираться по всем имеющимся разрезам, что может быть избыточно или недостаточно. В большинстве случаев для соответствия ОСВ требуется указывать этот параметр, чтобы получить остатки по тем субконто, которые используются на счете.

Дополнительные аспекты и возможные причины расхождений с ОСВ

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

  1. Неправильные параметры виртуальной таблицы: Мы должны убедиться, что параметры &Нач, &Кон или &Период установлены верно, и учитывают специфику работы виртуальных таблиц с границами периода (включая/исключая секунды или дни). Ошибки в определении границ часто приводят к несовпадению данных.
  2. Неучтенная аналитика (Субконто): Если в запросе не выбраны все необходимые разрезы аналитики (Субконто1, Субконто2, Субконто3), по которым на счете есть остатки, итоговые суммы могут не совпадать с ОСВ. Особенно это актуально для счетов с развернутым сальдо. Мы должны включать эти поля в секцию ВЫБРАТЬ и учитывать их в ГРУППИРОВАТЬ ПО, если применяем агрегацию к данным. Также важно корректно передавать параметр &ВидыСубконто в виртуальную таблицу.
  3. Настройки самого отчета ОСВ: Стандартный отчет ОСВ может иметь специфические отборы, группировки или дополнительные настройки (например, вывод по подразделениям, по налоговому учету, с детализацией по субсчетам или документам), которые не учтены в нашем запросе. Всегда внимательно проверяйте настройки ОСВ, с которой сравниваете результаты, чтобы максимально точно воспроизвести логику отчета.
  4. Ошибки в учете: Иногда причиной расхождений могут быть ошибки в данных самой учетной системы, например, списание количества без списания стоимости, некорректные ручные операции, проведенные "задним числом", или незакрытые периоды, которые влияют на формирование остатков.

Заключение

Получение начального сальдо в 1С с помощью запроса требует внимательности к деталям: выбору правильной виртуальной таблицы, корректному указанию периода, использованию оператора В ИЕРАРХИИ для счетов и пониманию концепции развернутого сальдо. Следуя этим рекомендациям, мы сможем построить точный запрос, который будет выводить данные, соответствующие оборотно-сальдовой ведомости, и обеспечивать достоверность наших отчетов.

← На главную