При работе с системой компоновки данных СКД часто возникает необходимость настроить сложное вычисляемое поле. Одной из самых частых задач является установка значения «0» при соблюдении определенных условий. Давайте разберем, почему конструкция ВЫБОР КОГДА иногда ведет себя «непредсказуемо» и как заставить её работать так, как нам нужно.
Первое, что мы должны усвоить: в 1С ВЫБОР КОГДА работает строго последовательно. Это не просто набор условий, это алгоритм, который выполняется сверху вниз. Как только система находит первое условие, которое возвращает ИСТИНА, она тут же прекращает все дальнейшие проверки и возвращает результат, указанный после ТОГДА. Никакие последующие блоки КОГДА уже не будут проверяться для данной строки данных.
Если вам кажется, что условие «не прерывает» вычисление, это означает лишь одно: для конкретной строки данных ни одно из условий, стоящих выше, не дало результат ИСТИНА. Система просто «проскакивает» ваши проверки и переходит к блоку ИНАЧЕ.
Если вы хотите, чтобы при попадании значения в определенный список (например, ИсключаемыеИзНачисления) результат всегда был равен 0, необходимо обеспечить правильную последовательность. Рассмотрим, как это реализовать на практике.
0, не обязательно писать их отдельными блоками. Объедините их в одном логическом выражении с помощью оператора ИЛИ. Это сделает код чище и исключит путаницу в очередности.Посмотрим на пример правильной структуры:
ВЫБОР
КОГДА СтатьяЗатрат ЕСТЬ NULL
ИЛИ СтатьяЗатрат = ЗНАЧЕНИЕ(Справочник.СтатьиЗатрат.ПустаяСсылка)
ИЛИ СтатьяЗатрат.ТипСтатьиЗатрат = ЗНАЧЕНИЕ(Перечисление.ТипыСтатейЗатрат.ГПХ)
ИЛИ ВидРасчета В(&ИсключаемыеИзНачисления)
ТОГДА 0
ИНАЧЕ РезультатСумма
КОНЕЦ
Если вы применили конструкцию выше, но отчет всё равно продолжает считать сумму, вместо того чтобы выдавать 0, значит, проблема скрыта в самих данных. Проанализируем ситуацию по шагам:
ИсключаемыеИзНачисления содержит ссылки, а поле ВидРасчета имеет другой тип, условие В (IN) всегда будет возвращать ЛОЖЬ. Убедитесь, что типы значений в списке параметров и в данных отчета идентичны.ИсключаемыеИзНачисления на форму отчета или в отчет, чтобы увидеть, что именно туда передается. Возможно, там массив пустых значений или данные, которые не соответствуют записям в колонке ВидРасчета.СКД сначала вычисляет выражение для каждой записи, а потом суммирует их. Проверьте настройки ресурсов: не происходит ли суммирование там, где требуется среднее или другое действие.ТИПЗНАЧЕНИЯ) и строковое представление вашего поля. Это позволит увидеть, нет ли там лишних пробелов или неявных приведений типов.Если логика становится слишком громоздкой для окна выражений СКД, не бойтесь переносить вычисления в текст запроса. Запрос — это место, где логика видна как на ладони. Вы можете проверить запрос в Консоли запросов, где проще понять, почему ВидРасчета не попадает в список исключений.
Также полезно использовать проверку значений. Если ВидРасчета — это перечисление, убедитесь, что вы сравниваете его именно с элементами этого же перечисления, а не с объектами другого справочника. Внимательность к типам данных — ключ к стабильной работе системы компоновки данных.
Помните, что СКД — это мощный инструмент, но он требует точности. Если условие не выполняется, значит, для 1С сравнение значений не дает ИСТИНА. Проверяйте типы, используйте ИЛИ для упрощения условий и всегда начинайте отладку с вывода самих значений, которые участвуют в сравнении.