При разработке отчетов или обработок в «1С:Предприятии 8» начинающие разработчики часто сталкиваются с ситуацией, когда запрос к регистру бухгалтерии возвращает пустые значения в колонках аналитики (субконто). Казалось бы, данные в карточке счета видны, проводки заполнены, но в результате запроса вместо ссылок на справочники — пустота. Разберем детально, почему так происходит, как устроена архитектура хранения данных в 1С и как правильно составить запрос для получения нужной аналитики.
Для начала проанализируем, как система «1С:Предприятие» хранит данные бухгалтерского учета. В SQL-базе данных основная таблица регистра бухгалтерии (например, Хозрасчетный) содержит только базовые реквизиты: период, регистратор, номер строки, счет, организацию, сумму и количество. Субконто в основной таблице не хранятся в виде отдельных колонок.
Данные аналитики вынесены во вспомогательную таблицу субконто. Это сделано для обеспечения гибкости: на разных счетах может быть разное количество субконто (от 0 до 3 в типовых решениях), и их типы могут быть совершенно разными (от справочников до документов). Если бы система создавала колонки под каждое возможное субконто в основной таблице, она бы стала избыточной и крайне неэффективной.
Когда мы пишем запрос к таблице РегистрБухгалтерии.Хозрасчетный, мы обращаемся к этой «плоской» структуре. Попытка вытащить оттуда данные через точку от Субконто1 или аналогичных полей часто приводит к получению пустых значений, особенно если не наложены жесткие фильтры по счетам или если структура регистра была модифицирована.
Самый простой и правильный способ получить данные вместе с аналитикой — это использование виртуальной таблицы ДвиженияССубконто. Платформа 1С «на лету» соединяет основную таблицу движений с таблицей значений субконто и представляет их в удобном для разработчика виде.
Рассмотрим пример правильного запроса для получения данных по счету 08.03 «Строительство объектов основных средств»:
ВЫБРАТЬ
ХозрасчетныйДвиженияССубконто.Период КАК ДатаПроводки,
ХозрасчетныйДвиженияССубконто.Регистратор КАК Документ,
ХозрасчетныйДвиженияССубконто.СчетДт КАК СчетДебета,
ХозрасчетныйДвиженияССубконто.СубконтоДт1 КАК ОбъектСтроительства,
ХозрасчетныйДвиженияССубконто.СубконтоДт2 КАК СтатьяЗатрат,
ХозрасчетныйДвиженияССубконто.Сумма КАК Сумма
ИЗ
РегистрБухгалтерии.Хозрасчетный.ДвиженияССубконто(&НачалоПериода, &КонецПериода, Счет = &НужныйСчет, , ) КАК ХозрасчетныйДвиженияССубконто
В этом примере мы обращаемся к полям СубконтоДт1 и СубконтоДт2. Платформа сама определит, какие значения там лежат, основываясь на настройках плана счетов. Однако стоит учитывать важное замечание: эта таблица считается «тяжелой». Поскольку соединение происходит динамически, на огромных объемах данных такой запрос может выполняться медленно. Поэтому всегда старайтесь максимально ограничивать выборку параметрами (период, счет, организация).
Проанализируем ситуацию, упомянутую в исходном вопросе, где фигурировало поле К_ОбъектСтроительства. Префикс К_ обычно свидетельствует о том, что конфигурация либо отраслевая (например, «1С:Подрядчик строительства»), либо была доработана программистом.
В 1С существует два способа добавить аналитику в регистр бухгалтерии:
К_ОбъектСтроительства добавлено как измерение регистра, оно будет доступно в основной таблице РегистрБухгалтерии.Хозрасчетный напрямую.Если же вы видите такое название, но поле пустое, скорее всего, произошла путаница: данные записываются в стандартный механизм субконто, а вы пытаетесь прочитать их из пустого (незаполненного) измерения или реквизита. Выясним причину, заглянув в конфигуратор или проверив настройки плана счетов.
Поскольку поле субконто имеет составной тип данных, система запросов 1С иногда может некорректно обрабатывать ссылки, если тип не определен явно. Это особенно актуально при работе в СКД или при сложных соединениях. Рекомендуется всегда использовать конструкцию ВЫРАЗИТЬ.
Посмотрим на пример кода с приведением типов:
ВЫБРАТЬ
Движения.Период,
ВЫРАЗИТЬ(Движения.Субконто1 КАК Справочник.ОбъектыСтроительства) КАК ОбъектСтроительства
ИЗ
РегистрБухгалтерии.Хозрасчетный.ДвиженияССубконто(&НачалоПериода, &КонецПериода, Счет = &Счет08, , ) КАК Движения
ГДЕ
Движения.Субконто1 ССЫЛКА Справочник.ОбъектыСтроительства
Использование ВЫРАЗИТЬ решает сразу две задачи: помогает системе оптимизировать SQL-запрос (обращаясь к конкретной таблице справочника) и гарантирует, что в результате вы получите объект нужного типа, а не пустую «битую» ссылку составного типа.
Как было отмечено опытными специалистами, таблица ДвиженияССубконто может работать медленно. Разберем по шагам, почему это происходит и как этого избежать:
Субконто1, Субконто2, Субконто3 «на всякий случай». Выбирайте только те индексы, которые реально используются на данном счете.
Если вам нужны не детальные проводки, а итоговые цифры (остатки или обороты), всегда используйте виртуальные таблицы Остатки, Обороты или ОстаткиИОбороты. В них работа с субконто оптимизирована на уровне индексов СУБД, и они работают в разы быстрее, чем таблица движений.
Подводя итог, если вы столкнулись с пустыми значениями субконто в запросе к «1С:Бухгалтерии»:
РегистрБухгалтерии.Хозрасчетный используйте РегистрБухгалтерии.Хозрасчетный.ДвиженияССубконто.ВЫРАЗИТЬ(... КАК ...) для работы с составными типами данных аналитики.Следуя этим правилам, вы сможете эффективно извлекать любые аналитические данные из учетной системы и строить корректные отчеты любой сложности.