В типовой конфигурации «1С:Бухгалтерия предприятия 3.0» документ Реализация товаров и услуг формирует сложную структуру проводок. Часто возникают задачи, когда в одном отчете необходимо сопоставить данные из разных бухгалтерских записей: например, выручку со счета 90.01.1 и начисленный НДС со счета 90.03. Поскольку это разные проводки, простое обращение к виртуальной таблице оборотов по одному счету не даст полной картины. В данной статье мы разберем, как правильно сконструировать запрос для решения этой задачи несколькими способами.
Проанализируем ситуацию: сумма выручки (Дт 62.01 — Кт 90.01.1) и сумма НДС (Дт 90.03 — Кт 68.02) — это две разные записи в регистре бухгалтерии. Чтобы «склеить» их в одну строку отчета, наиболее надежным способом является использование временных таблиц в одном пакете запроса.
Рассмотрим пошагово реализацию этого подхода:
90.01.1 (или 62.01), фильтруя по виду документа и нужной аналитике.90.03.ВНУТРЕННЕЕ СОЕДИНЕНИЕ (или ЛЕВОЕ СОЕДИНЕНИЕ) по полю Регистратор.Разберем пример готового кода, который корректно собирает данные:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ХозрасчетныйОбороты.СуммаОборотДт КАК СуммаРасход,
| ХозрасчетныйОбороты.Субконто3 КАК ДокументРасход,
| ХозрасчетныйОбороты.КорСубконто3 КАК НоменклатураРасход,
| ХозрасчетныйОбороты.Регистратор КАК Регистратор
|ПОМЕСТИТЬ втВыручка
|ИЗ
| РегистрБухгалтерии.Хозрасчетный.Обороты(&Дата1, &Дата2, Запись, Счет = &Счет6201, , , КорСчет В (&КоррСчет90011), ) КАК ХозрасчетныйОбороты
|ГДЕ
| ХозрасчетныйОбороты.Регистратор ССЫЛКА Документ.РеализацияТоваровУслуг
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| Хозрасчетный.Регистратор КАК Регистратор,
| СУММА(Хозрасчетный.Сумма) КАК СуммаНДС
|ПОМЕСТИТЬ втНДС
|ИЗ
| РегистрБухгалтерии.Хозрасчетный КАК Хозрасчетный
|ГДЕ
| Хозрасчетный.Регистратор В
| (ВЫБРАТЬ втВыручка.Регистратор ИЗ втВыручка)
| И Хозрасчетный.СчетДт = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.Продажи_НДС)
|СГРУППИРОВАТЬ ПО
| Хозрасчетный.Регистратор
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| втВыручка.Регистратор,
| втВыручка.СуммаРасход КАК СуммаСНДС,
| ЕСТЬNULL(втНДС.СуммаНДС, 0) КАК СуммаНДС,
| втВыручка.СуммаРасход - ЕСТЬNULL(втНДС.СуммаНДС, 0) КАК ВыручкаБезНДС
|ИЗ
| втВыручка КАК втВыручка
| ЛЕВОЕ СОЕДИНЕНИЕ втНДС КАК втНДС
| ПО втВыручка.Регистратор = втНДС.Регистратор";
Важный нюанс: Обратите внимание на условие связи ПО втВыручка.Регистратор = втНДС.Регистратор. Если его пропустить (как это часто бывает при простом перечислении таблиц в секции ИЗ), система выполнит декартово произведение, и количество строк в отчете увеличится в геометрической прогрессии.
Выясним интересную особенность ведения учета в БП 3.0. Для организаций на общей системе налогообложения (ОСНО) на счете 90.01.1 данные отражаются следующим образом:
Проанализируем ситуацию: если нам нужно получить НДС по документу в целом, нам не обязательно обращаться к счету 90.03. Мы можем использовать ресурсы виртуальной таблицы Обороты и просто вычислить разницу. Это значительно упрощает запрос и ускоряет его выполнение.
Пример логики вычисления в запросе:
ВЫБРАТЬ
ХозрасчетныйОбороты.Регистратор,
ХозрасчетныйОбороты.СуммаОборотКт КАК СуммаБУ,
ХозрасчетныйОбороты.СуммаНУОборотКт КАК СуммаНУ,
ХозрасчетныйОбороты.СуммаОборотКт - ХозрасчетныйОбороты.СуммаНУОборотКт КАК СуммаНДС_Вычисленная
ИЗ
РегистрБухгалтерии.Хозрасчетный.Обороты(,, Регистратор, Счет = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.ВыручкаНеЕНВД),,,) КАК ХозрасчетныйОбороты
Этот метод считается более профессиональным для простых отчетов, так как он минимизирует количество обращений к физическим таблицам базы данных.
Разберем более сложный случай. Документ реализации может содержать десятки строк с разными товарами. В проводках по счету 90.01.1 аналитика Номенклатура (Субконто3) присутствует. Однако на счете 90.03 (НДС) аналитика обычно ведется только до Номенклатурных групп.
Если вам нужно получить сумму НДС в разрезе каждого товара, придется использовать математическое распределение. Посмотрим, как это реализовать:
В запросе для этого используется конструкция ВЫРАЗИТЬ(СуммаНДС_Общая * СуммаТовара / СуммаДокумента_Общая КАК ЧИСЛО(15, 2)). При этом важно помнить о «проблеме копеек» — при округлении распределенных сумм может возникнуть небольшое отклонение от общего итога. Чтобы его нивелировать, остаток отклонения обычно приплюсовывают к строке с максимальной суммой в документе.
Рассмотрим несколько правил, которые помогут вашему отчету работать быстрее:
Счет, КорСчет) в параметры виртуальной таблицы (первые скобки), а не в секцию ГДЕ. Это позволяет серверу 1С и SQL отсечь лишние данные на самом раннем этапе.Продажи. В нем суммы выручки, НДС и себестоимости уже лежат в одной строке. Если ваша задача позволяет, лучше использовать его — это сократит объем кода в разы.ССЫЛКА Документ.РеализацияТоваровУслуг. Это поможет оптимизатору запросов SQL правильно построить план выполнения.Таким образом, мы проанализировали основные способы получения данных из проводок. Выбор метода зависит от требований к точности (нужна ли детализация до товара) и производительности системы.