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