Почему не выбираются остатки по счету 41 в запросе 1С и как это исправить

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

При разработке отчетов или обработок в типовой конфигурации «1С:Бухгалтерия предприятия» программисты часто сталкиваются с ситуацией: запрос к виртуальной таблице остатков регистра бухгалтерии по счету 41 («Товары») возвращает пустой результат, хотя стандартный отчет «Оборотно-сальдовая ведомость по счету» (ОСВ) показывает наличие остатков.

Рассмотрим причину возникновения этой проблемы и разберем правильные способы построения запроса для получения корректных остатков.

Выясняем причину: особенности плана счетов

Откроем план счетов Хозрасчетный в конфигураторе или в пользовательском режиме. Для счета 41 установлена настройка «Запретить использовать в проводках» (счет является группой/родительским счетом). Все проводки и движения документов формируются не по самому счету 41, а по его подчиненным субсчетам, таким как:

Когда в условии виртуальной таблицы указывается точное равенство Счет.Код = "41" или Счет = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.Товары), система ищет записи, сделанные непосредственно по главному счету. Так как проводки по нему запрещены, запрос возвращает пустую выборку.

В стандартной ОСВ выборка работает корректно, потому что там используется условие иерархии, захватывающее все подчиненные субсчета.

Решение 1. Использование условия «В ИЕРАРХИИ» с предопределенным значением

Чтобы выбрать остатки по счету 41 и всем его субсчетам, заменим условие точного равенства на проверку иерархии Счет В ИЕРАРХИИ (...). Наиболее предпочтительный способ в коде — обращение к предопределенному счету с помощью функции ЗНАЧЕНИЕ() прямо в тексте запроса.

Проанализируем пример готового запроса:


ВЫБРАТЬ
    ХозрасчетныйОстатки.Счет КАК Счет,
    ХозрасчетныйОстатки.Субконто1 КАК Субконто1,
    ХозрасчетныйОстатки.Субконто2 КАК Субконто2,
    ХозрасчетныйОстатки.Субконто3 КАК Субконто3,
    ХозрасчетныйОстатки.Организация КАК Организация,
    ХозрасчетныйОстатки.СуммаОстаток КАК СуммаОстаток,
    ХозрасчетныйОстатки.СуммаОстатокДт КАК СуммаОстатокДт,
    ХозрасчетныйОстатки.СуммаОстатокКт КАК СуммаОстатокКт,
    ХозрасчетныйОстатки.КоличествоОстаток КАК КоличествоОстаток,
    ХозрасчетныйОстатки.КоличествоОстатокДт КАК КоличествоОстатокДт,
    ХозрасчетныйОстатки.КоличествоОстатокКт КАК КоличествоОстатокКт
ИЗ
    РегистрБухгалтерии.Хозрасчетный.Остатки(
        &ДатаОкончания,
        Счет В ИЕРАРХИИ (ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.Товары)),
        ,
        ) КАК ХозрасчетныйОстатки

В данном случае платформа 1С автоматически развернет условие и выберет остатки по всем субсчетам, входящим в группу Товары.

Решение 2. Передача счета через параметр запроса

Если счет выбирается пользователем на форме или определяется динамически в программном коде, передадим его в запрос через параметр.

Код запроса с параметром:


ВЫБРАТЬ
    ХозрасчетныйОстатки.Счет КАК Счет,
    ХозрасчетныйОстатки.Субконто1 КАК Субконто1,
    ХозрасчетныйОстатки.Субконто2 КАК Субконто2,
    ХозрасчетныйОстатки.Организация КАК Организация,
    ХозрасчетныйОстатки.СуммаОстаток КАК СуммаОстаток,
    ХозрасчетныйОстатки.КоличествоОстаток КАК КоличествоОстаток
ИЗ
    РегистрБухгалтерии.Хозрасчетный.Остатки(
        &ДатаОкончания,
        Счет В ИЕРАРХИИ (&Счет41),
        ,
        ) КАК ХозрасчетныйОстатки

Заполнение параметров в встроенном языке 1С:


Запрос = Новый Запрос;
Запрос.Текст = "..."; // Текст запроса выше

// Поиск счета по коду или получение предопределенного значения
СчетТовары = ПланыСчетов.Хозрасчетный.Товары; 
// Либо: СчетТовары = ПланыСчетов.Хозрасчетный.НайтиПоКоду("41");

Запрос.УстановитьПараметр("Счет41", СчетТовары);
Запрос.УстановитьПараметр("ДатаОкончания", Новый Граница(КонецДня(ТекущаяДата()), ВидГраницы.Включая));

РезультатЗапроса = Запрос.Выполнить();

Важные нюансы при работе с виртуальной таблицей остатков

Разберем несколько важных моментов, которые уберегут от ошибок при получении сальдо по 41 счету:

  1. Зафиксируйте состав видов субконто (Параметр № 3): Если на разных субсчетах счета 41 задан разный порядок субконто (например, на 41.01 — Номенклатура, Партии, Склады; а на 41.11 — Склады, Номенклатура), поля Субконто1 и Субконто2 в итоговой выборке перемешаются. Чтобы зафиксировать аналитику, передайте массив субконто в третий параметр таблицы:
    
    МассивСубконто = Новый Массив;
    МассивСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Номенклатура);
    МассивСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Склады);
    
    // Использование в запросе:
    // РегистрБухгалтерии.Хозрасчетный.Остатки(&Период, Счет В ИЕРАРХИИ (&Счет41), &МассивСубконто)
    
  2. Обработка значений NULL: Не на всех субсчетах 41 счета ведется количественный учет (например, при розничной торговле по суммовому учету). В таких строках поле КоличествоОстаток вернет NULL. Рекомендуется использовать функцию ЕСТЬNULL(ХозрасчетныйОстатки.КоличествоОстаток, 0).
  3. Корректное указание даты: Передача простой даты без времени (например, 01.10.2023 00:00:00) рассчитывает остаток на начало дня. Чтобы получить сальдо на конец дня с учетом всех проводок за дату, используйте объект Граница или функцию КОНЕЦПЕРИОДА(&Дата, ДЕНЬ).
← На главную