Как написать запрос в 1С, чтобы его результаты полностью совпадали с ОСВ по счету 62?

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

Каждый разработчик 1С рано или поздно сталкивается с задачей написания собственного отчета или запроса для получения остатков и оборотов по взаиморасчетам. Казалось бы, задача тривиальная: достаточно обратиться к виртуальной таблице РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты, наложить фильтр по счету 62 и получить готовый результат. Однако на практике цифры в получившемся отчете часто не совпадают с показателями стандартной Оборотно-сальдовой ведомости (ОСВ) по счету 62.

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

---

Выясняем причины расхождений

Давайте проанализируем типичную ситуацию. Разработчик пишет запрос к виртуальной таблице остатков и оборотов, выбирает субконто "Контрагенты" и "Договоры", указывает счета учета 62.01 и 62.02, но на выходе видит некорректные суммы. Основные причины расхождений кроются в пяти ключевых факторах:

  1. Проблема свернутого и развернутого сальдо на активно-пассивных счетах. Счет 62 является активно-пассивным. На уровне конкретного договора у контрагента может быть либо дебетовый остаток (долг за покупателем), либо кредитовый (наш аванс перед ним). Если мы просто суммируем поля СуммаНачальныйОстатокДт и СуммаНачальныйОстатокКт при группировке по контрагенту, система выполнит математическое вычитание (свернет сальдо). В результате общие итоги по контрагенту "схлопнутся", тогда как в ОСВ они должны показываться развернуто.
  2. Влияние субконто "Документы расчетов". На счете 62 в 1С:Бухгалтерии 3.0 часто настроено три субконто: Контрагенты, Договоры и Документы расчетов с контрагентом. Если при обращении к виртуальной таблице не ограничить состав используемых субконто, система рассчитает остатки в разрезе документов расчетов. Если в базе зависли некорректно разнесенные авансы (когда оплата и отгрузка прошли по разным документам расчетов в рамках одного договора), запрос покажет огромные развернутые остатки, которые не будут соответствовать действительности.
  3. Неверное определение границ периода. Документы в 1С могут записываться вплоть до последней секунды дня (23:59:59). Передача в параметры запроса простой даты без указания времени или игнорирование особенностей работы с типом Граница приводит к потере документов, проведенных на границе периода.
  4. Ограничение списка субсчетов. Зачастую разработчики жестко прописывают в запросе только счета 62.01 и 62.02. При этом забываются валютные субсчета (62.21, 62.22), расчеты в у.е. (62.31, 62.32) или векселя (62.03). Стандартная ОСВ по счету 62 строится по всей иерархии счета.
  5. Специфика вывода иерархических итогов в СКД. При построении отчета через Систему компоновки данных (СКД) необходимо правильно сопоставлять роли полей для корректного расчета итогов по группировкам.

---

Шаг 1. Использование развернутого сальдо в запросе

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

Давайте посмотрим, как будет выглядеть правильный выбор полей в тексте запроса:


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

---

Шаг 2. Настройка параметров виртуальной таблицы

Обратите внимание на параметры виртуальной таблицы в запросе выше. Разберем их по шагам, так как здесь кроются важнейшие настройки:

Параметр "Счет": Вместо перечисления конкретных субсчетов через запятую мы используем условию Счет В ИЕРАРХИИ (&Счет62). В качестве параметра &Счет62 мы передадим предопределенное значение плана счетов ПланыСчетов.Хозрасчетный.Покупатели. Это позволит автоматически учесть все существующие субсчета счета 62 (включая валютные и авансовые субсчета), точно так же, как это делает типовая ОСВ.

Параметр "Субконто": Это ключевой момент для свертки избыточной аналитики. Чтобы система проигнорировала субконто Документы расчетов и корректно "схлопнула" расчеты на уровне договоров, мы обязаны явно передать массив видов субконто в шестой параметр виртуальной таблицы. В этот массив должны входить только два значения: ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Контрагенты и ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Договоры.

Рассмотрим пример кода на встроенном языке для инициализации этих параметров:


// Подготавливаем массив видов субконто
МассивСубконто = Новый Массив;
МассивСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Контрагенты);
МассивСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Договоры);

Запрос = Новый Запрос;
Запрос.Текст = "..."; // Наш текст запроса

// Установка параметров
Запрос.УстановитьПараметр("Счет62", ПланыСчетов.Хозрасчетный.Покупатели);
Запрос.УстановитьПараметр("ВидыСубконто", МассивСубконто);
Запрос.УстановитьПараметр("Организация", СсылкаНаОрганизацию);

---

Шаг 3. Корректная установка границ периода

Для того чтобы в запрос попали абсолютно все документы за выбранный период (включая пограничные транзакции, записанные в последнюю секунду), необходимо правильно рассчитывать конечную дату. Использование простой даты конца периода часто приводит к потере данных. Рекомендуется использовать объект Граница с типом Включая.

Посмотрим на пример установки временных рамок периода:


КонецПериодаГраница = Новый Граница(КонецДня(ДатаОкончанияОтчета), ВидГраницы.Включая);

Запрос.УстановитьПараметр("НачалоПериода", НачалоДня(ДатаНачалаОтчета));
Запрос.УстановитьПараметр("КонецПериода", КонецПериодаГраница);

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

---

Шаг 4. Настройка ролей полей в СКД (Системе компоновки данных)

Если мы разрабатываем отчет на базе СКД, то ручной расчет развернутого сальдо в самом тексте запроса можно переложить на плечи компоновщика. Это более гибкий и профессиональный подход, так как СКД умеет рассчитывать развернутый остаток динамически, подстраиваясь под те группировки, которые пользователь выбрал в настройках отчета.

Разберем по шагам, как настроить роли полей остатков на вкладке "Наборы данных" в схеме компоновки:

  1. Для поля СуммаНачальныйОстатокДт задаем роль:
    • Тип поля: Остаток.
    • Имя: СуммаНачальныйОстаток.
    • Тип остатка: Начальный.
    • Счет: указываем поле Счет (если оно выбрано в запросе).
  2. Для поля СуммаНачальныйОстатокКт задаем аналогичную роль с тем же именем СуммаНачальныйОстаток, но связываем его с кредитовым показателем.
  3. Для конечных остатков (СуммаКонечныйОстатокДт и СуммаКонечныйОстатокКт) настраиваем роль:
    • Тип поля: Остаток.
    • Имя: СуммаКонечныйОстаток.
    • Тип остатка: Конечный.
  4. В свойствах полей субконто (Контрагент, Договор) в колонке "Обязательное" устанавливаем флаги, чтобы система всегда учитывала эту аналитику при расчете остатков на сервере СУБД.

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

---

Подведем итоги

Мы выяснили, что для получения данных, полностью идентичных ОСВ по счету 62, необходимо соблюдать четыре золотых правила разработки бухгалтерских отчетов в 1С:

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

← На главную