При разработке отчетов и выборок по регистрам бухгалтерии часто возникает задача выделить суммы по определенной аналитике (субконто), например, отдельно получить обороты по кассе, расчетному счету или взаимозачетам. Начинающие разработчики нередко сталкиваются с ошибками при попытке сравнить поле субконто со строкой или некорректно используют функцию ТИПЗНАЧЕНИЯ. Рассмотрим типичные ошибки, проанализируем причины их возникновения и разберем правильные способы решения этой задачи.
Разберем классический ошибочный пример, когда разработчик пытается отфильтровать сумму по определенной кассе или статье:
СУММА(ВЫБОР
КОГДА ХозрасчетныйОбороты.Субконто1 = "Касса"
ТОГДА ХозрасчетныйОбороты.СуммаОборотКт
ИНАЧЕ 0
КОНЕЦ) КАК СуммаКасса
Или еще одна частая попытка исправления:
КОГДА ТИПЗНАЧЕНИЯ(ХозрасчетныйОбороты.Субконто1) = ЗНАЧЕНИЕ("Касса")
Выясним причину, почему такие конструкции не работают:
Субконто1 в регистре бухгалтерии имеет ссылочный тип (или составной тип Характеристика.ВидыСубконтоХозрасчетные). Прямое сравнение ссылки со строковым литералом "Касса" всегда вернет ЛОЖЬ.ЗНАЧЕНИЕ() в языке запросов предназначена исключительно для обращения к предопределенным данным конфигурации, перечислениям или пустым ссылкам (например, ЗНАЧЕНИЕ(Перечисление.Статусы.Активен) или ЗНАЧЕНИЕ(Справочник.Кассы.ПустаяСсылка)). Передача строки в кавычках внутри ЗНАЧЕНИЕ("Касса") является синтаксической ошибкой.ТИПЗНАЧЕНИЯ(ХозрасчетныйОбороты.Регистратор) = ЗНАЧЕНИЕ(Документ.ОперацияБух) также избыточна и ошибочна. Для проверки типа документа в языке запросов 1С используется оператор ССЫЛКА.Если необходимо отобрать обороты по конкретному элементу справочника (например, определенной кассе или статье), правильным подходом является передача ссылки через параметр запроса.
Посмотрим на пример формирования условия в тексте запроса:
ВЫБРАТЬ
ХозрасчетныйОбороты.Субконто1 КАК Субконто1,
ХозрасчетныйОбороты.Подразделение КАК Подразделение,
СУММА(ХозрасчетныйОбороты.СуммаОборотДт) КАК Всего,
СУММА(ХозрасчетныйОбороты.СуммаОборотКт) КАК СуммаПродаж,
СУММА(ВЫБОР
КОГДА ХозрасчетныйОбороты.Регистратор ССЫЛКА Документ.ОперацияБух
ТОГДА ХозрасчетныйОбороты.СуммаОборотДт
ИНАЧЕ 0
КОНЕЦ) КАК СуммаБанк,
СУММА(ВЫБОР
КОГДА ХозрасчетныйОбороты.Субконто1 = &ПарамКасса
ТОГДА ХозрасчетныйОбороты.СуммаОборотКт
ИНАЧЕ 0
КОНЕЦ) КАК СуммаКасса
ИЗ
РегистрБухгалтерии.Хозрасчетный.Обороты(
&НачалоПериода,
&КонецПериода,
Регистратор,
Счет = &СчетЗатрат,
,
Подразделение В (&Подразделение),
,
) КАК ХозрасчетныйОбороты
СГРУППИРОВАТЬ ПО
ХозрасчетныйОбороты.Субконто1,
ХозрасчетныйОбороты.Подразделение
ИТОГИ
СУММА(Всего),
СУММА(СуммаПродаж),
СУММА(СуммаБанк),
СУММА(СуммаКасса)
ПО
ОБЩИЕ,
Подразделение
Теперь установим значение параметра во встроенном языке:
// Передаем ссылку на конкретный элемент справочника
Запрос.УстановитьПараметр("ПарамКасса", СсылкаНаЭлементКассы);
Если аналитика на счете может содержать разные типы значений (например, в качестве субконто выступают как кассы, так и банковские счета или договоры), а вам нужно сгруппировать обороты по типу объекта метаданных, используем оператор ССЫЛКА:
СУММА(ВЫБОР
КОГДА ХозрасчетныйОбороты.Субконто1 ССЫЛКА Справочник.Кассы
ТОГДА ХозрасчетныйОбороты.СуммаОборотКт
ИНАЧЕ 0
КОНЕЦ) КАК СуммаКасса
Если субконто принимает значение предопределенного элемента справочника или плана видов характеристик, значение можно получить прямо в запросе без использования параметров:
СУММА(ВЫБОР
КОГДА ХозрасчетныйОбороты.Субконто1 = ЗНАЧЕНИЕ(Справочник.СтатьиДвиженияДенежныхСредств.ПоступлениеВКассу)
ТОГДА ХозрасчетныйОбороты.СуммаОборотКт
ИНАЧЕ 0
КОНЕЦ) КАК СуммаКасса
Для обеспечения стабильности и высокой производительности запросов обратим внимание на следующие правила:
Субконто1, Субконто2 и Субконто3 нумеруются в виртуальной таблице согласно порядку, заданному на счете. Если в плане счетов изменится порядок видов субконто, запрос вернет неверные данные. Чтобы зафиксировать аналитику, передавайте массив видов субконто в соответствующий параметр виртуальной таблицы Обороты.ТИПЗНАЧЕНИЯ(...) = ЗНАЧЕНИЕ(Документ.ОперацияБух) всегда применяйте Регистратор ССЫЛКА Документ.ОперацияБух. Это оптимизирует трансляцию запроса в SQL.ОборотыДтКт с проверкой корреспондирующих счетов (50, 51, 60/62), а не опираться исключительно на субконто счета затрат.