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