Разработка отчетов на системе компоновки данных (СКД) с использованием регистров бухгалтерии в 1С 8.3 — это стандартная задача, которая, однако, таит в себе множество нюансов. Часто программисты сталкиваются с ситуацией, когда запрос идеально отрабатывает в консоли запросов, но при запуске в режиме "1С:Предприятие" пользователь видит пустой экран или некорректные цифры. Разберем пошагово, почему это происходит и как правильно настроить отчет, чтобы данные по группам счетов (например, по 20 счету) суммировались корректно.
Рассмотрим исходный запрос, который часто становится причиной проблем при работе с виртуальными таблицами регистра бухгалтерии:
ВЫБРАТЬ
ХозрасчетныйОборотыДтКт.СчетДт КАК СчетДт,
ХозрасчетныйОборотыДтКт.СчетКт КАК СчетКт,
ХозрасчетныйОборотыДтКт.ПодразделениеДт КАК ПодразделениеДт,
ХозрасчетныйОборотыДтКт.СуммаОборот КАК СуммаОборот
ИЗ
РегистрБухгалтерии.Хозрасчетный.ОборотыДтКт(&НачалоПериода, &КонецПериода, , , , , , ) КАК ХозрасчетныйОборотыДтКт
ГДЕ
ХозрасчетныйОборотыДтКт.ПодразделениеДт = &Подразделение
Проанализируем ситуацию: использование конструкции ГДЕ для фильтрации данных виртуальной таблицы — это серьезная ошибка производительности и стабильности. Когда мы пишем условие после ключевого слова ГДЕ, система сначала выбирает все записи из регистра за указанный период, а затем начинает их отфильтровывать. В режиме "1С:Предприятие", особенно при наличии ограничений прав доступа (RLS), такой запрос может просто "отвалиться" по таймауту или вернуть пустой результат из-за неявных условий.
Правильный подход: Условия по подразделениям, счетам и организациям необходимо передавать в параметры виртуальной таблицы. Это позволит СУБД выполнить фильтрацию на самом раннем этапе. СКД умеет делать это автоматически, если мы правильно настроим схему компоновки.
Выясним причину, по которой консоль запросов выдает данные, а отчет — нет. Разберем основные факторы:
НачалоПериода и КонецПериода. Проверьте, чтобы на вкладке "Параметры" в конфигураторе у них не стоял флаг "Ограничение доступности", и они были правильно связаны с полями виртуальной таблицы.&Подразделение в текст запроса, а затем добавили его же в настройки СКД, может возникнуть коллизия. СКД может ожидать, что вы заполните параметр, а вы устанавливаете его через "Отбор".Одной из главных проблем является работа со счетами-группами. Например, счет 20 в плане счетов является группой, а проводки делаются по субсчетам 20.01, 20.02 и так далее. Если в отборе указать СчетДт Равно Значение(ПланСчетов.Хозрасчетный.ОсновноеПроизводство), то отчет будет пустым, так как записей именно по счету 20 (без субсчетов) в регистре нет.
Решение задачи: Для того чтобы отчет понимал структуру плана счетов, в настройках отбора СКД необходимо использовать вид сравнения "В иерархии". Посмотрим, как это работает:
СчетДт.20, 25, 28.В этом случае система автоматически включит в выборку все движения по всем субсчетам, входящим в данные группы. Но тут возникает следующий вопрос: как вывести в отчет только общую строку по счету 20, не "раздувая" его до детальных записей по субсчетам?
Проанализируем ситуацию с дублированием или неправильным расчетом итогов (например, когда итог по счету 20 вдруг становится равен итогу по счету 28). Это происходит из-за неправильной настройки ролей полей на закладке "Набор данных" в СКД.
Для корректной работы с регистрами бухгалтерии выполним следующие действия:
СчетДт в колонке "Роль" указано, что это поле является счетом. Для виртуальной таблицы ОборотыДтКт крайне важно правильно расставить измерения.СуммаОборот должно иметь выражение Сумма(СуммаОборот). Если вы видите странные итоги, проверьте, не стоит ли расчет ресурса "по всем полям", кроме тех, по которым вы группируете.СчетДт. В свойствах этой группировки выберем тип "Иерархия". Если же вам нужно видеть только итог по счету 20 без возможности развернуть его до субсчетов в самом отчете, используйте тип "Элементы", но при этом сам отбор должен оставаться "В иерархии".Рассмотрим более правильный вариант написания запроса для СКД. Попробуем максимально упростить текст, перекладывая работу на механизмы компоновки:
ВЫБРАТЬ
ХозрасчетныйОборотыДтКт.СчетДт КАК СчетДт,
ХозрасчетныйОборотыДтКт.ПодразделениеДт КАК ПодразделениеДт,
ХозрасчетныйОборотыДтКт.СуммаОборот КАК СуммаОборот
ИЗ
РегистрБухгалтерии.Хозрасчетный.ОборотыДтКт(&НачалоПериода, &КонецПериода, , , , , , ) КАК ХозрасчетныйОборотыДтКт
Почему это лучше?
Когда мы убираем жесткие условия из ГДЕ, мы даем возможность СКД самостоятельно управлять параметрами виртуальной таблицы. Если пользователь в настройках (на вкладке "Отбор") добавит ПодразделениеДт, СКД "умно" подставит это условие прямо в параметры виртуальной таблицы, что обеспечит максимальную скорость выполнения.
Хозрасчетный.СуммаОборот. Если сумма появится — проблема в фильтрах (отборах).ГДЕ 1=0 (или ГДЕ ЛОЖЬ), которое СКД добавляет при несовпадении типов параметров или ошибках в связях.20, убедитесь, что в плане счетов у него разрешено использование в проводках (хотя для групп это обычно запрещено, что и требует отбора "В иерархии").Таким образом, для создания корректного бухгалтерского отчета в СКД необходимо: использовать параметры виртуальных таблиц вместо условий ГДЕ, применять отборы по иерархии для счетов-групп и внимательно следить за ролями полей для правильного расчета итоговых сумм. Проанализировав эти моменты, вы сможете создавать стабильные и быстрые отчеты, которые будут выдавать идентичный результат как в консоли, так и в руках конечного пользователя.