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

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

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

Оптимизация запроса с помощью виртуальной таблицы

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

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


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

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

Как решить проблему дублирования данных и корректного суммирования?

Вторая распространенная ситуация — это наличие дублей. Например, если в бухгалтерском учете списание одной единицы номенклатуры разбито на несколько проводок (разные счета, частичные списания и т.д.), простое получение данных даст нам несколько строк с одинаковой номенклатурой. Использование оператора РАЗЛИЧНЫЕ здесь не поможет, так как он схлопнет строки полностью, не суммируя при этом количество и стоимость.

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

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

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

Важные нюансы при работе с субконто

При построении подобных отчетов всегда учитывайте следующие моменты:

1. Типизация данных: СубконтоДт1 может содержать данные разных типов, если на счете ведется аналитика по разным объектам (например, номенклатура и основные средства). Убедитесь, что запрос учитывает только нужные вам типы данных.

2. Пустые ссылки: В случае, если в проводке субконто не заполнено, в выборку попадет пустая ссылка. Для чистоты печатной формы рекомендуем добавлять условие ГДЕ СубконтоДт1 ССЫЛКА Справочник.Номенклатура.

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

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

← На главную