Почему функция СКД в 1С 7.7 не выводит отрицательные остатки в запросах и как это исправить

Программист 1С v7.7 1C:Бухгалтерия Бухгалтерский учет
← На главную

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

Проблема: Куда исчезают отрицательные значения?

Рассмотрим типичную ситуацию. Программист пишет запрос к объекту Операция, чтобы вытащить данные по остаткам, введенным при свертке базы. В коде это выглядит примерно так:


ТекстЗапроса = "
|Период с ДатаС по ДатаПо;
|Сч = Операция.Счет; 
|Склад = Операция.Субконто.МестаХранения; 
|Номен = Операция.Субконто.Номенклатура; 
|Количество = Операция.Количество;     
|Группировка Номен;
|Функция КолСКД = СКД(Количество); 
|Условие (Сч = ВыбСч);  
|";

Проанализируем результат: если в базе по конкретной номенклатуре числится проводка с количеством -1 (минус один), то стандартный отчет «Анализ счета» покажет этот минус, а наш запрос в переменной КолСКД вернет 0. Это сбивает с толку, так как данные в системе есть, но запрос их «не видит».

Разбираем причину: Логика «черного запроса»

Выясним причину такого поведения. В 1С 7.7 функции СКД() (Сальдо Конечное Дебетовое) и СКК() (Сальдо Конечное Кредитовое) внутри объекта Запрос работают по жестко зашитому бухгалтерскому алгоритму.

Математически это выглядит так: СКД = Макс(0, Дебет - Кредит).

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

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

Решение №1: Использование агрегатной функции СУММА

Если нам нужно получить именно математическое значение (включая минусы), не опираясь на правила бухгалтерского отображения сальдо, мы должны изменить подход к агрегации данных в тексте запроса.

Вместо функции СКД(Количество) следует использовать простую математическую сумму. Проанализируем исправленный фрагмент кода:


// Вместо функции сальдо используем простую сумму
|Функция КолИтого = Сумма(Количество); 

Функция Сумма() в «черном запросе» не делает никаких логических проверок на знак результата. Она просто складывает все значения поля Количество для каждой группировки. Если итоговая сумма будет равна -1, то в отчет попадет именно -1. Это самый простой способ решить проблему, если вы продолжаете использовать объект Запрос.

Решение №2: Переход на объект БухгалтерскиеИтоги

Рассмотрим более профессиональный и надежный метод. Для получения остатков в 1С 7.7 рекомендуется использовать специализированный объект БухгалтерскиеИтоги. В отличие от «черного запроса», этот объект обращается к заранее рассчитанным таблицам итогов, что работает быстрее и корректнее.

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

  1. Создаем объект БухгалтерскиеИтоги.
  2. Используем метод ИспользоватьСубконто для фильтрации по складам и номенклатуре.
  3. Выполняем запрос методом ВыполнитьЗапрос.
  4. Получаем значение сальдо через метод СКД(3) (где 3 означает количественное сальдо).

Посмотрим на пример кода:


БИ = СоздатьОбъект("БухгалтерскиеИтоги");
БИ.ИспользоватьСубконто(ВидыСубконто.МестаХранения, ВыбСклад, 2);
БИ.ИспользоватьСубконто(ВидыСубконто.Номенклатура, , 1);
Если БИ.ВыполнитьЗапрос(ДатаС, ДатаПо, ВыбСч, , , 3, , "С") = 1 Тогда
    БИ.ВыбратьСубконто(2);
    Пока БИ.ПолучитьСубконто(2) = 1 Цикл
        ТекНомен = БИ.Субконто(2);
        // Метод СКД("К") вернет отрицательное число, если оно есть в итогах
        ОстатокКол = БИ.СКД("К"); 
        Сообщить("Номенклатура: " + ТекНомен + " Остаток: " + ОстатокКол);
    КонецЦикла;
КонецЕсли;

Важный нюанс: методы СКД() и СКК() в объекте БухгалтерскиеИтоги имеют параметры, позволяющие гибко управлять знаком. Если в настройках счета разрешено отрицательное сальдо (активно-пассивные счета), этот объект вернет его без искажений.

Сравнение методов

Проанализируем, какой метод выбрать именно вам:

Важные замечания по количественному учету

В системе 1С 7.7 количественный учет всегда жестко привязан к дебету или кредиту. Если вы вводите «минусовое» количество в дебет, это технически воспринимается системой как уменьшение дебетового оборота.

Рассмотрим ситуацию: если вы используете Операция.Количество в запросе, вы обращаетесь к значению конкретной проводки. Если в одной проводке стоит 10, а в другой -11, то СКД покажет 0, СКК покажет 1, а Сумма покажет -1. Понимание этой разницы поможет вам избежать ошибок при свертке базы и формировании управленческой отчетности.

Таким образом, мы выяснили, что «черный запрос» — это инструмент для линейного перечисления проводок, а не для вычисления сальдо. Используйте правильные агрегатные функции или переходите на объект БухгалтерскиеИтоги для получения точных результатов.

← На главную