При разработке бухгалтерских отчетов на базе Схемы компоновки данных (СКД) разработчики часто сталкиваются с ситуацией, когда по одним счетам (например, доходы и себестоимость) данные выводятся корректно, а по другим (например, прочие расходы) — отчет остается пустым или содержит неполную информацию. Особенно остро эта проблема проявляется в конфигурациях типа «1С:Бухгалтерия для Казахстана», где план счетов имеет свою специфику, а счета внутри одной группы могут иметь разный набор или порядок видов субконто. В этой статье мы подробно разберем, почему так происходит (не забывая о том, что иногда может потребоваться привилегированный режим для доступа к данным) и как правильно настроить виртуальные таблицы регистра бухгалтерии для получения точного результата.
Рассмотрим стандартную ситуацию. В запросе используется виртуальная таблица Обороты регистра бухгалтерии. Когда мы обращаемся к полям Субконто1, Субконто2 и Субконто3, платформа 1С пытается определить, какие именно виды характеристик им соответствуют. Если в параметре Счет передается группа счетов (используя В ИЕРАРХИИ), и у счетов внутри этой группы виды субконто различаются или идут в разном порядке, система не может однозначно сопоставить данные. В итоге в полях субконто могут оказаться значения NULL, или запрос вовсе не вернет строк, так как не сможет построить корректное соединение таблиц. Проверить результат запроса «вживую» поможет консоль запросов для управляемых форм.
Проанализируем типичный код, который может приводить к ошибке при работе со счетом 7400:
ВЫБРАТЬ РАЗРЕШЕННЫЕ
ХозрасчетныйОбороты.ПериодМесяц КАК ПериодМесяц,
ХозрасчетныйОбороты.Организация КАК Организация,
ВЫРАЗИТЬ(ХозрасчетныйОбороты.Субконто1 КАК Справочник.СтатьиЗатрат) КАК Субконто1,
ВЫРАЗИТЬ(ХозрасчетныйОбороты.Субконто2 КАК Справочник.ПодразделенияОрганизаций) КАК Подразделение,
ХозрасчетныйОбороты.СуммаОборотДт КАК СуммаОборотДт
ПОМЕСТИТЬ ВТ_ПрочиеРасходы
ИЗ
РегистрБухгалтерии.Типовой.Обороты(&НачалоПериода, &КонецПериода, Авто, Счет В ИЕРАРХИИ (&МассивСчетовПрочиеРасходы), , , , ) КАК ХозрасчетныйОбороты
В данном примере 5-й параметр виртуальной таблицы (условие по видам субконто) пуст. Это главная причина проблемы. Если счет 7410 имеет первым субконто «Статьи затрат», а счет 7420 — «Номенклатурные группы», то обращение к Субконто1 станет непредсказуемым.
Для того чтобы жестко закрепить порядок субконто в выборке, независимо от настроек конкретного счета в плане счетов, необходимо использовать 5-й параметр виртуальной таблицы Обороты. Этот параметр принимает массив или список значений, содержащий объекты ПланыВидовХарактеристик.ВидыСубконтоТиповые.
Разберем, как это реализовать. В программном коде или непосредственно в настройках параметров СКД нам нужно создать массив и передать его в запрос. Посмотрим на примеры программной работы с СКД, которые решают эту задачу:
// Пример формирования массива в коде (если запрос выполняется программно)
ВидыСуб = Новый Массив;
ВидыСуб.Добавить(ПланыВидовХарактеристик.ВидыСубконтоТиповые.СтатьиЗатрат);
ВидыСуб.Добавить(ПланыВидовХарактеристик.ВидыСубконтоТиповые.Подразделения);
ВидыСуб.Добавить(ПланыВидовХарактеристик.ВидыСубконтоТиповые.НоменклатурныеГруппы);
Запрос.УстановитьПараметр("ВидыСубконто", ВидыСуб);
В тексте запроса виртуальная таблица теперь будет выглядеть так:
ИЗ
РегистрБухгалтерии.Типовой.Обороты(
&НачалоПериода,
&КонецПериода,
Авто,
Счет В ИЕРАРХИИ (&МассивСчетов),
&ВидыСубконто, // 5-й параметр
, , ) КАК ХозрасчетныйОбороты
Важный момент: Теперь Субконто1 всегда будет содержать «Статьи затрат», а Субконто2 — «Подразделения», так как мы явно указали их порядок в массиве. Если у какого-то счета из выборки нет одного из этих субконто, в соответствующем поле просто будет NULL, но структура данных не нарушится.
Если вы работаете исключительно в конструкторе СКД, выполните следующие шаги для настройки параметра &ВидыСубконто:
ВидыСубконто).ПланВидовХарактеристикСсылка.ВидыСубконтоТиповые.Выясним причину, по которой данные могут пропадать при использовании оператора ВЫРАЗИТЬ. Например, на счете 7410 (Выбытие активов) субконто может иметь тип «Внеоборотные активы». Это тип-описание (ПВХ), который может включать в себя справочники «Основные средства», «Нематериальные активы» и другие.
Если вы напишете ВЫРАЗИТЬ(ХозрасчетныйОбороты.Субконто2 КАК Справочник.ОсновныеСредства), то все записи, где субконто является нематериальным активом, будут превращены в NULL. Чтобы избежать этого, в СКД рекомендуется:
Во-первых, не использовать ВЫРАЗИТЬ для полей субконто в тексте запроса, если вы хотите выводить их «как есть». СКД сама прекрасно справляется с отображением ссылочных типов.
Во-вторых, если нужно разделение, используйте конструкцию ВЫБОР:
ВЫБОР
КОГДА ХозрасчетныйОбороты.Субконто2 ССЫЛКА Справочник.ОсновныеСредства
ТОГДА ВЫРАЗИТЬ(ХозрасчетныйОбороты.Субконто2 КАК Справочник.ОсновныеСредства)
КОГДА ХозрасчетныйОбороты.Субконто2 ССЫЛКА Справочник.НематериальныеАктивы
ТОГДА ВЫРАЗИТЬ(ХозрасчетныйОбороты.Субконто2 КАК Справочник.НематериальныеАктивы)
ИНАЧЕ ХозрасчетныйОбороты.Субконто2
КОНЕЦ КАК СубконтоАктив
Проанализируем ситуацию, когда отчет строится через ОБЪЕДИНИТЬ ВСЕ. Часто разработчики объединяют выручку (счет 6000) и расходы (счет 7400). Если в первой части объединения поле Субконто1 имеет тип Справочник.Доходы, а во второй — Справочник.СтатьиЗатрат, система приведет их к составному типу.
Убедитесь, что:
ОБЪЕДИНИТЬ совпадает.Таким образом, использование пятого параметра виртуальной таблицы — это фундаментальное правило при написании универсальных отчетов по регистру бухгалтерии. Это гарантирует, что ваши данные по счету 7400 и любым другим сложным счетам всегда будут на своих местах, а отчет будет формироваться без ошибок.