Почему в запросе к таблице ОборотыДтКт поле СубконтоДт3 оказывается пустым при наличии данных в проводках?

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

В процессе разработки отчетов или обработок в «1С:Бухгалтерия» программисты часто сталкиваются с ситуацией, когда данные в запросе к виртуальной таблице ОборотыДтКт регистра бухгалтерии отображаются некорректно. Типичный пример: при анализе счета 20.01 (Основное производство) поле СубконтоДт3 оказывается пустым, хотя в обычных проводках (таблица ДвиженияССубконто) это субконто заполнено. Разберем детально, почему это происходит и как правильно получать данные из итоговых таблиц.

Поймем разницу между физическими и виртуальными таблицами

Для начала проанализируем архитектуру регистра бухгалтерии. В системе 1С существует два принципиально разных способа хранения и получения данных:

  1. Физические таблицы записей: Это таблица движений, где хранятся каждая конкретная проводка. Когда мы обращаемся к таблице ДвиженияССубконто, платформа выполняет прямое чтение этих записей. Если в проводке заполнено третье субконто, мы его увидим в любом случае.
  2. Виртуальные таблицы итогов: Таблицы Обороты, ОстаткиИОбороты и ОборотыДтКт строятся не на лету из проводок, а на основе заранее рассчитанных итогов. Эти итоги хранятся в отдельных системных таблицах в агрегированном виде.

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

Причина 1: Специфика оборотного субконто

Рассмотрим ситуацию со счетом 20.01. В типовых конфигурациях третье субконто на этом счете часто имеет признак «Только обороты» (например, для аналитики «Продукция»).

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

Причина 2: Параметры виртуальной таблицы

Проанализируем типичную ошибку в тексте запроса. Часто разработчики обращаются к полям СубконтоДт1, СубконтоДт2, СубконтоДт3 напрямую, не заполняя параметры самой виртуальной таблицы в скобках.

Если в параметре СубконтоДт не передан массив видов субконто, система берет их «по умолчанию» в том порядке, в котором они определены в Плане счетов. Однако, если на счете настроено использование субконто, которое добавлено программно или через расширение, либо если порядок субконто в итоговых таблицах не совпадает с ожидаемым, СубконтоДт3 может вернуться пустым.

Решение: Всегда явно передавайте массив нужных видов субконто в параметры виртуальной таблицы. Рассмотрим пример кода на языке 1С:


// Формируем массив видов субконто, которые нам нужны в запросе
МассивСубконто = Новый Массив;
МассивСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.НоменклатурныеГруппы);
МассивСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.СтатьиЗатрат);
МассивСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Продукция);

// Передаем этот массив в параметры запроса
Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |   ХозрасчетныйОборотыДтКт.СубконтоДт1 КАК НоменклатурнаяГруппа,
    |   ХозрасчетныйОборотыДтКт.СубконтоДт2 КАК СтатьяЗатрат,
    |   ХозрасчетныйОборотыДтКт.СубконтоДт3 КАК Продукция,
    |   ХозрасчетныйОборотыДтКт.СуммаОборот КАК Сумма
    |ИЗ
    |   РегистрБухгалтерии.Хозрасчетный.ОборотыДтКт(&НачалоПериода, &КонецПериода, , СчетДт = &Счет20, &МассивСубконто, , , ) КАК ХозрасчетныйОборотыДтКт";

Запрос.УстановитьПараметр("НачалоПериода", НачалоКвартала);
Запрос.УстановитьПараметр("КонецПериода", КонецКвартала);
Запрос.УстановитьПараметр("Счет20", ПланыСчетов.Хозрасчетный.ОсновноеПроизводство);
Запрос.УстановитьПараметр("МассивСубконто", МассивСубконто);

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

Причина 3: Проблема с актуальностью итогов

Посмотрим на ситуацию со стороны базы данных. Поскольку ОборотыДтКт — это виртуальная таблица, ее содержимое напрямую зависит от того, рассчитаны ли итоги в системе. Если в программе велись интенсивные записи проводок (например, при групповом перепроведении или загрузке данных), но итоги не были обновлены или «слетели», данные в виртуальных таблицах будут неполными.

Пошаговый алгоритм исправления:

  1. Перейдите в меню «Все функции» (или «Функции для технического специалиста»).
  2. Выберите «Управление итогами».
  3. Проверьте, установлена ли дата актуальности итогов по текущий месяц.
  4. Выполните «Полный пересчет итогов» для Регистра бухгалтерии «Хозрасчетный». Это гарантированно синхронизирует физическую таблицу проводок с таблицами итогов.

Причина 4: Настройка «Учет по субконто» в Плане счетов

Проанализируем настройки самого счета в режиме «1С:Предприятие» или в Конфигураторе. В Плане счетов для каждого счета и каждого субконто есть флаги «Учет по субконто» и «Только обороты».

Если для третьего субконто снята галочка «Учет по субконто», то система будет записывать значение в проводку (физическую таблицу), но не будет включать его в итоги. В результате таблица ДвиженияССубконто покажет значение, а любая виртуальная таблица (включая ОборотыДтКт) вернет NULL или пустое значение.

Что проверить: Убедитесь, что в Плане счетов для счета 20.01 для всех трех субконто включен признак использования. Если это предопределенный счет, проверьте, не менялись ли его настройки пользователями или через расширения.

Резюме и рекомендации

Разберем краткий итог наших действий, если СубконтоДт3 упорно остается пустым:

  1. Проверьте параметры запроса: Всегда передавайте в пятый и шестой параметры таблицы ОборотыДтКт (СубконтоДт и СубконтоКт) явный список видов субконто.
  2. Проверьте итоги: Выполните пересчет итогов в администрировании.
  3. Сравните с другими таблицами: Если Обороты показывают данные, а ОборотыДтКт — нет, это почти всегда указывает на проблему с параметрами виртуальной таблицы или на специфику работы платформы с оборотной аналитикой при связи Дебет-Кредит.
  4. Используйте альтернативу: Если производительность не критична и вам нужны именно данные «как в проводках», можно использовать таблицу ДвиженияССубконто, но помните, что на больших объемах данных это существенно замедлит работу системы.

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

← На главную