1с вычислить выражение по условию

Обновлено: 04.07.2024

Использование произвольных выражений в итогах языка запроса

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

Произвольные выражения в итогах

Синтаксис и функциональность выражения для расчета итогов аналогичны простому выражению языка запроса, однако имеются некоторые особенности:

  • в выражениях для расчета итогов нельзя использовать операции В и В ИЕРАРХИИ со вложенными запросами.
  • в выражениях для расчета итогов результат функции Представление() может быть использован в другом выражении.

В случае если для расчета итога используется произвольное выражение, необходимо обозначить имя поля, в которое будет помещен результат расчета итога, для этого необходимо после описания выражения итога после не обязательного ключевого слова КАК указать псевдоним поля из списка выборки запроса.

ИТОГИ
100 * Сумма(Прибыль) / СУММА(Оборот) КАК ПроцентПрибыли

В данном примере результате выражения будет помещаться в поле "ПроцентПрибыли". Заметим, что поле "ПроцентПрибыли" должно присутствовать в списке выборки запроса.

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

В выражениях для расчета итога вне агрегатных функций могут использоваться только поля, по которым рассчитываются итоги.

ИТОГИ
Номенклатура КАК Номенклатура,// Правильно, т.к. поле присутствует в списке группировок итогов
СуммаОборот КАК СуммаОборот, // Неправильно, т.к. поле отсутствует в списке группировок итогов
Сумма(КоличествоОборот) КАК КоличествоОборот // Правильно, т.к. поле используется в агрегатной функции
ПО
Номенклатура,
Контрагент

В случае если поле - группировка используется в итоговом выражении, и по данному полю еще не было получена группировка - значение поля будет равняться NULL .

Примеры использования

Расчет выражений от агрегатных функций

Для расчета выражений от агрегатных функций достаточно описать выражение, в котором будут использоваться агрегатные функции.

ВЫБРАТЬ
Номенклатура,
СуммаОборот КАК Оборот,
СуммаПрибыль КАК Прибыль,
100 * СуммаПрибыль / СуммаОборот КАК ПроцентПрибыли
ИЗ
РегистрНакопления.УчетПрибыли.Обороты
ИТОГИ
СУММА(Оборот),
СУММА(Прибыль),
100 * СУММА(Прибыль) / СУММА(Оборот) КАК ПроцентПрибыли
ПО
Номенклатура ИЕРАРХИЯ

В данном примере в поле "ПроцентПрибыли" итоговых записей будет помещено значение суммы по полю "Прибыль" умноженное на 100 и поделенное на значение суммы по полю "Оборот".

Расчет итогов только для уже полученных группировок

Для того, чтобы значение некоторых суммируемых полей рассчитывалось только для группировок, по которым уже получены итоги, в выражении для расчета итога можно воспользоваться тем фактом, что значение полей - группировок для еще не полученных группировок равняется NULL .

ВЫБРАТЬ
ОсновнойОстатки.Счет КАК Счет,
ОсновнойОстатки.Валюта КАК Валюта,
ОсновнойОстатки.СуммаОстаток КАК СуммаОстаток,
ОсновнойОстатки.ВалютнаяСуммаОстаток КАК ВалютнаяСуммаОстаток
ИЗ
РегистрБухгалтерии.Основной.Остатки КАК ОсновнойОстатки
ИТОГИ
СУММА(СуммаОстаток),
ВЫБОР
КОГДА Валюта ЕСТЬ НЕ NULL
ТОГДА СУММА(ВалютнаяСуммаОстаток)
КОНЕЦ КАК ВалютнаяСуммаОстаток
ПО
Счет,
Валюта

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

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

ВЫБРАТЬ
ОсновнойОстатки.Счет КАК Счет,
ОсновнойОстатки.Валюта КАК Валюта,
ОсновнойОстатки.СуммаОстаток КАК СуммаОстаток,
ОсновнойОстатки.ВалютнаяСуммаОстаток КАК ВалютнаяСуммаОстаток
ИЗ
РегистрБухгалтерии.Основной.Остатки КАК ОсновнойОстатки
ИТОГИ
СУММА(СуммаОстаток),
ВЫБОР
КОГДА КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Валюта) = 1
ТОГДА СУММА(ВалютнаяСуммаОстаток)
КОНЕЦ КАК ВалютнаяСуммаОстаток
ПО
Счет,
Валюта

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

Переопределение представлений для группировок

В случае если поле является представлением поля группировки, переопределение выражения для данного поля приведет к тому, что в результат, в качестве представления поля, будет выведен результат выражения итога. Используя данную особенность, возможно переопределить представления для группировок.

ВЫБРАТЬ
ПродажиОбороты.Номенклатура КАК Номенклатура,
ПродажиОбороты.Номенклатура.Код КАК НоменклатураКод,
ПРЕДСТАВЛЕНИЕ(ПродажиОбороты.Номенклатура) КАК НоменклатураПредставление,
ПродажиОбороты.КоличествоОборот КАК КоличествоОборот,
ПродажиОбороты.СуммаОборот КАК СуммаОборот
ИЗ
РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты
ИТОГИ
НоменклатураКод + ") " + НоменклатураПредставление КАК НоменклатураПредставление,
СУММА(КоличествоОборот),
СУММА(СуммаОборот)
ПО
Номенклатура

В данном примере, в качестве представления поля "Номенклатура" в итоговых записях, будет использоваться выражение, состоящее из кода и основного представления.

В платформе 1С 8.3 существует три вида циклов. Это циклы «Для Цикл», «Для каждого Цикл» и «Пока Цикл». При помощи циклов «Для Цикл» и «Пока Цикл» можно осуществлять цикличное повторение произвольных операторов. А цикл «Для каждого Цикл» необходим для обхода коллекций значений (массивов, таблиц значений и т.п.). В этой статье на разберем простые примеры всех трёх видов циклов.

Цикл «Для Цикл»

Разберем самый простой вид цикла. Этот цикл имеет следующий синтаксис.

В этом цикле, переменной НазваниеПерем в самом начале присваивается выражение СчетчНачало, которое имеет числовое значение (целое число). Потом, в каждой итерации цикла переменная НазваниеПерем увеличивается на 1. Цикл будет выполняться пока переменная НазваниеПерем меньше или равно переменной СчетчКонец.

СчетчНачало и СчетчКонец могут быть как числами, так и переменными с типом число.

Причем СчетчНачало может быть меньше нуля.

Чтобы цикл корректно работал СчетчНачало должно быть меньше СчетчКонец.

Такой код будет не корректен!!

С этим циклом удобно работать, когда нам нужно линейно заполнить какие-нибудь величины. Например, заполним массив в 1С цифрами от -3 до 3.

Или когда нужно получить какие-нибудь значения, которые следуют друг за другом. Например, значения того же массива.

Цикл «Пока Цикл»

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

Данный цикл имеет следующий синтаксис

ЗначениеВыражения – какое-то логическое выражение. Пока это выражение истинно, то операторы цикла будут выполняться. Если выражение принимает значение Ложь, то цикл прекращается.

При помощи данного цикла можно делать различные нестандартные обходы. Например, выше мы заполнили массив цифрами начиная от -3 до 3, но циклом «Для Цикл» мы не можем заполнить массив цифрами от 3 до -3. Но, мы можем это сделать при помощи цикла «Пока Цикл»

Этот цикл можно также использовать, когда нужно что-то заполнить датами.

В этом коде мы заполняем массив датами, начиная с 1 января и заканчивая 31 января.

Цикл «Для каждого Цикл»

Этот вид цикла предназначен для обхода различных коллекций, например, массивов, таблиц значений, табличных частей и т.д.

Этот цикл имеет следующий синтаксис:

Переменной ЭлементКоллекции присваивает очередное значение элемента коллекции.

Например, если мы напишем вот такой код.

Это массив, у него, по сути, каждый элемент это значение какого-то типа, а если будет обход более сложной коллекции? Например, таблицы значений. В том случае, если будет обход таблицы, значений, то в переменной ЭлементКоллекции будет содержать очередная строка этой таблицы значений. Мы можем получить значение колонок в этой строке через оператор «.».

Пример в этом коде

И результат работы этого кода

Обход циклом Для каждого цикл

Прервать цикл 1С

Иногда возникают такие ситуации, когда нужно из цикла выйти. Сделать это можно при помощи оператора Прервать. Этот оператор применим ко всем тремя видам циклов.

После выполнения этого оператора Прервать все последующие операторы в теле цикла не выполняются, и следующим выполняется оператор после ключевого слова КонецЦикла.

Рассмотрим следующий пример.

В этом примере мы обходим простым циклом ряд чисел от -5 до 5, и делим 1 на обходимое число. Если же переменная счетчика равна 0, то чтобы не происходила исключительная ситуация, то выходим из цикла. Т.е. мы выполним деление только для отрицательных чисел.

Продолжить цикл 1С

А есть ситуации, когда нам не нужно выходить из цикла, но и не нужно продолжать текущую итерацию. Помочь нам в этом может оператор Продолжить. Этот оператор также применим ко всем тремя видам циклов.

Операторы после этого ключевого слова выполняться не будут, и произойдет следующая итерация цикла.

Рассмотрим такой пример.

Это измененный предыдущий пример, только когда счетчик цикла равно 0, то мы не выходим а продолжаем цикл, в этом случае деление будет выполнено как для отрицательных, так и для положительных чисел.

Более подробно и основательно начальные вопросы программирования в 1С есть в моей книге:


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

Выдает ошибку, что процент не найден. Если процент заменить на Выбор Когда ПланыПродажСтоимостьСНДС=0 Тогда 100 Иначе ПродажиСтоимостьСНДС*100/ПланыПродажСтоимостьСНДС Конец, идет неверный расчет.

Плюс еще несколько полей нужно рассчитать на основе этих. Каким образом это можно сделать?

2. user705522_constantin_h 35 11.12.17 14:08 Сейчас в теме
Вычисляемые поля

Ресурсы
5. user705522_constantin_h 35 11.12.17 14:17 Сейчас в теме (3)Попробуйте первое выражение напрямую записать во втором. (4) подскажите, каким образом можно рассчитать процент выполнения плана (факт*100/план), потом на основании процента, коэффициент, потом этом коэффициент умножить на факт и еще один коэффициент умножить на получившееся значение? Подскажите, пожалуйста, как в ресурсах написать чтобы считалось количество полей у которых значение >0,4?
Примерно так
Выбор когда Выбор Когда ПланыПродажСтоимостьСНДС=0 Тогда 100 Иначе ПродажиСтоимостьСНДС*100/ПланыПродажСтоимостьСНДС Конец< 40 тогда 0 Когда Выбор Когда ПланыПродажСтоимостьСНДС=0 Тогда 100 Иначе ПродажиСтоимостьСНДС*100/ПланыПродажСтоимостьСНДС Конец>= 120 тогда 1.2 иначе Выбор Когда ПланыПродажСтоимостьСНДС=0 Тогда 100 Иначе ПродажиСтоимостьСНДС*100/ПланыПродажСтоимостьСНДС Конец/100 конец

(7) а потом мне еще этот коэффициент нужно умножить на число из отчета и получить некий Y, а потом, сумму Y умножить еще на один коэффициент.
Там будет просто миллион строк. отчет будет отрабатывать миллион лет.

Как бы лучше выйти из этой ситуации?

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

Либо если конфигурация не типовая создать общий модуль где будут вычисляться нужные выражения и уже функции общего модуля использовать в вычисляемых полях

(8) подскажите, пожалуйста, как это сделать? причем у меня сначала рассчитываются поля расшифровки, потом вычисляются коэффициенты (как для группировок так и для расшифровок), потом производятся вычисления.
(8) Либо если конфигурация не типовая создать общий модуль где будут вычисляться нужные выражения и уже функции общего модуля использовать в вычисляемых полях (12) А можно ли рассчитывать только на основании группового поля? Почти все посчиталось. Осталось перемножить три поля только в группировках:
1.

Пишу в вычисляемых полях: ВычислитьВыражение("(ВесьКодПоля1)*(ВесьКОдПоля2)*(ВесьКодПоля3)","Проект","группировка")

Отчет не исполняется и пишет: Ожидается ) ")" Продолжить редактирование?
Куда только не добавляла скобку - ничего не работает. Что делать. Помогите, пожалуйста!!

ВызватьИсключение (Raise)

Выполнить (Execute)

ДобавитьОбработчик (AddHandler)

Описание:
Добавляет обработчик события. При добавлении обработчика события производится проверка соответствия числа параметров события числу параметров метода, назначаемого в качестве обработчика.
Синтаксис:
ДобавитьОбработчик <Событие>, <ОбработчикСобытия>;
Англоязычный синтаксис:
AddHandler <Событие>, <ОбработчикСобытия>;
Параметры:
< Событие >
Событие, которому добавляется обработчик.
Событие задается в форме < Выражение>.<ИмяСобытия >, где:
● < Выражение > – произвольное выражение на встроенном языке. Его результатом должен быть объект, к событию которого добавляется обработчик.
● < ИмяСобытия > – идентификатор (имя) события. Процедура/функция-обработчик события.
Обработчиком события может являться метод объекта встроенного языка. Тогда < ОбработчикСобытия > задается как <Выражение>.<ИмяОбработчика >,
где:
● < Выражение> – произвольное выражение на встроенном языке. Его результатом должен быть объект, метод которого служит обработчиком события.
● < ИмяОбработчика > – имя метода обработчика события.
Также в качестве обработчика события может быть задана процедура/функция, находящаяся в области видимости. В этом случае обработчик события
задается как имя процедуры/функции.
Имеется возможность оформлять подписку на одноименные (в COM-объектах) события, но с разным числом параметров. Для этого на встроенном языке необходимо создать несколько обработчиков (каждый с указанием уникального имени и с указанием нужного количества параметров), а механизм подписки сам выберет нужный обработчик для нужной подписки.
Пример:

Для (For)

Описание:
Оператор цикла Для предназначен для циклического повторения операторов, находящихся внутри конструкции Цикл – КонецЦикла. Перед началом
выполнения цикла значение <Выражение 1 > присваивается переменной < Имя переменной >. Значение < Имя переменной > автоматически увеличивается
при каждом проходе цикла. Величина приращения счетчика при каждом выполнении цикла равна 1. Цикл выполняется, пока значение переменной
< Имя переменной > меньше или равно значению < Выражение 2 >. Условие выполнения цикла всегда проверяется вначале, перед выполнением цикла.
Синтаксис:
Для < Имя переменной> = <Выражение 1 > По < Выражение 2 > Цикл
// Операторы
[ Прервать ;]
// Операторы
[ Продолжить ;]
// Операторы
КонецЦикла;

Англоязычный синтаксис:
For < Имя переменной> = <Выражение 1> To < Выражение 2 > Do
// Операторы
[ Break ;]
// Операторы
[ Continue ;]
// Операторы
EndDo;
Параметры:

Для каждого (For each)

Описание:
Оператор цикла Для каждого предназначен для циклического обхода коллекций значений. При каждой итерации цикла возвращается новый элемент коллекции. Обход осуществляется до тех пор, пока не будут перебраны все элементы коллекции, или может быть завершен досрочно при выполнении оператора Прервать .
Синтаксис:
Для каждого <Имя переменной 1> Из <Имя переменной 2> Цикл
// Операторы
[ Прервать ;]
// Операторы
[ Продолжить ;]
// Операторы
КонецЦикла;

Читайте также: