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