Как в одном запросе получить суммы выручки и НДС из разных проводок в 1С:Бухгалтерия 3.0

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

В типовой конфигурации «1С:Бухгалтерия предприятия 3.0» документ Реализация товаров и услуг формирует сложную структуру проводок. Часто возникают задачи, когда в одном отчете необходимо сопоставить данные из разных бухгалтерских записей: например, выручку со счета 90.01.1 и начисленный НДС со счета 90.03. Поскольку это разные проводки, простое обращение к виртуальной таблице оборотов по одному счету не даст полной картины. В данной статье мы разберем, как правильно сконструировать запрос для решения этой задачи несколькими способами.

Метод 1: Использование временных таблиц и соединений по регистратору

Проанализируем ситуацию: сумма выручки (Дт 62.01 — Кт 90.01.1) и сумма НДС (Дт 90.03 — Кт 68.02) — это две разные записи в регистре бухгалтерии. Чтобы «склеить» их в одну строку отчета, наиболее надежным способом является использование временных таблиц в одном пакете запроса.

Рассмотрим пошагово реализацию этого подхода:

  1. Создаем временную таблицу для выручки. Выбираем данные по счету 90.01.1 (или 62.01), фильтруя по виду документа и нужной аналитике.
  2. Создаем временную таблицу для НДС. Выбираем обороты по счету 90.03.
  3. Соединяем таблицы. Используем ВНУТРЕННЕЕ СОЕДИНЕНИЕ (или ЛЕВОЕ СОЕДИНЕНИЕ) по полю Регистратор.

Разберем пример готового кода, который корректно собирает данные:


Запрос = Новый Запрос;
Запрос.Текст = 
"ВЫБРАТЬ
|    ХозрасчетныйОбороты.СуммаОборотДт КАК СуммаРасход,
|    ХозрасчетныйОбороты.Субконто3 КАК ДокументРасход,
|    ХозрасчетныйОбороты.КорСубконто3 КАК НоменклатураРасход,
|    ХозрасчетныйОбороты.Регистратор КАК Регистратор
|ПОМЕСТИТЬ втВыручка
|ИЗ
|    РегистрБухгалтерии.Хозрасчетный.Обороты(&Дата1, &Дата2, Запись, Счет = &Счет6201, , , КорСчет В (&КоррСчет90011), ) КАК ХозрасчетныйОбороты
|ГДЕ
|    ХозрасчетныйОбороты.Регистратор ССЫЛКА Документ.РеализацияТоваровУслуг
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
|    Хозрасчетный.Регистратор КАК Регистратор,
|    СУММА(Хозрасчетный.Сумма) КАК СуммаНДС
|ПОМЕСТИТЬ втНДС
|ИЗ
|    РегистрБухгалтерии.Хозрасчетный КАК Хозрасчетный
|ГДЕ
|    Хозрасчетный.Регистратор В
|            (ВЫБРАТЬ втВыручка.Регистратор ИЗ втВыручка)
|    И Хозрасчетный.СчетДт = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.Продажи_НДС)
|СГРУППИРОВАТЬ ПО
|    Хозрасчетный.Регистратор
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
|    втВыручка.Регистратор,
|    втВыручка.СуммаРасход КАК СуммаСНДС,
|    ЕСТЬNULL(втНДС.СуммаНДС, 0) КАК СуммаНДС,
|    втВыручка.СуммаРасход - ЕСТЬNULL(втНДС.СуммаНДС, 0) КАК ВыручкаБезНДС
|ИЗ
|    втВыручка КАК втВыручка
|        ЛЕВОЕ СОЕДИНЕНИЕ втНДС КАК втНДС
|        ПО втВыручка.Регистратор = втНДС.Регистратор";

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

Метод 2: «Лайфхак» через разницу БУ и НУ

Выясним интересную особенность ведения учета в БП 3.0. Для организаций на общей системе налогообложения (ОСНО) на счете 90.01.1 данные отражаются следующим образом:

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

Пример логики вычисления в запросе:


ВЫБРАТЬ
    ХозрасчетныйОбороты.Регистратор,
    ХозрасчетныйОбороты.СуммаОборотКт КАК СуммаБУ,
    ХозрасчетныйОбороты.СуммаНУОборотКт КАК СуммаНУ,
    ХозрасчетныйОбороты.СуммаОборотКт - ХозрасчетныйОбороты.СуммаНУОборотКт КАК СуммаНДС_Вычисленная
ИЗ
    РегистрБухгалтерии.Хозрасчетный.Обороты(,, Регистратор, Счет = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.ВыручкаНеЕНВД),,,) КАК ХозрасчетныйОбороты

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

Метод 3: Распределение НДС по номенклатуре

Разберем более сложный случай. Документ реализации может содержать десятки строк с разными товарами. В проводках по счету 90.01.1 аналитика Номенклатура (Субконто3) присутствует. Однако на счете 90.03 (НДС) аналитика обычно ведется только до Номенклатурных групп.

Если вам нужно получить сумму НДС в разрезе каждого товара, придется использовать математическое распределение. Посмотрим, как это реализовать:

  1. Рассчитаем общую сумму НДС по документу (через счет 90.03 или разницу БУ/НУ).
  2. Рассчитаем общую сумму выручки по документу.
  3. Для каждой строки с конкретным товаром вычислим долю выручки этого товара в общей массе.
  4. Умножим общий НДС документа на полученную долю.

В запросе для этого используется конструкция ВЫРАЗИТЬ(СуммаНДС_Общая * СуммаТовара / СуммаДокумента_Общая КАК ЧИСЛО(15, 2)). При этом важно помнить о «проблеме копеек» — при округлении распределенных сумм может возникнуть небольшое отклонение от общего итога. Чтобы его нивелировать, остаток отклонения обычно приплюсовывают к строке с максимальной суммой в документе.

Рекомендации по оптимизации

Рассмотрим несколько правил, которые помогут вашему отчету работать быстрее:

Таким образом, мы проанализировали основные способы получения данных из проводок. Выбор метода зависит от требований к точности (нужна ли детализация до товара) и производительности системы.

← На главную