1с не работает в запросе функция сумма

Обновлено: 07.07.2024

В этой статье мы хотим обсудить с Вами все функции языка запросов 1с, а также конструкции языка запросов. Чем же отличается функция от конструкции? Функция вызывается со скобками и возможными параметрами в них, а конструкция пишется без скобок. Безусловно все конструкции и функции языка запросов 1с делают процесс получения данных гибким и многофункциональным. Данные функции и конструкции применимы к полям запроса, а некоторые также применимы в условиях.

Функции языка запросов 1с

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

1. Функция ДАТАВРЕМЯ - данная функция создает константное поле с типом "Дата".

2. Функция РАЗНОСТЬДАТ - возвращает разность двух дат в одном из измерений (год, месяц, день, час, минута, секунда). Измерение передается в параметре.

Синтаксис: РАЗНОСТЬДАТ(<Дата1>, <Дата2>, <Тип>)

3. Функция ЗНАЧЕНИЕ - задает константное поле с предопределенной записью из базы данных, также можно получить пустую ссылку любого типа.

4. Функция ВЫБОР - перед нами аналог конструкции ЕСЛИ который используется в коде, только эта используется в запросах 1С.

Синтаксис: ВЫБОР КОГДА <Выражение> ТОГДА <Выражение> ИНАЧЕ <Выражение> КОНЕЦ

5. Функция ВЫРАЗИТЬ - позволяет выразить константное поле определенным типом.

Синтаксис: ВЫРАЗИТЬ(НазваниеПоля КАК НазваниеТипа)

Еще есть вариант использования функции ВЫРАЗИТЬ в полях смешанных типах, где такие встречаются? Самый простой пример это "Регистратор" у любого регистра. Так зачем нам может понадобиться уточнять тип в регистраторе? Давайте рассмотрим ситуацию когда мы из регистратора выбираем поле "Номер", из какой таблицы будет выбран номер? Правильный ответ из всех! Поэтому чтобы наш запрос работал быстро следует указывать явный тип с помощью функции ВЫРАЗИТЬ

6. Функция ISNULL (альтернативное написание ЕСТЬNULL) - если поле имеет тип NULL, то оно заменяется на второй параметр функции.

Синтаксис: ЕСТЬNULL(<Поле>, <ПодставляемоеЗначение>)

Также отметим что тип NULL желательно ВСЕГДА заменять на какое-то значение, т.к. сравнение с типом NULL всегда дает ЛОЖЬ даже если вы сравниваете NULL с NULL. Чаще всего значения NULL образуются в результате соединения таблиц (все виды соединений кроме внутреннего).

7. Функция ПРЕДСТАВЛЕНИЕ - позволяет получить представление поля запроса.

Конструкции в языке запросов 1с

Выше мы рассмотрели с Вами функции языка запросов 1с, теперь пришло время рассмотреть конструкции в языке запросов 1с, они не менее важны и полезны, приступаем.

1. Конструкция ССЫЛКА - представляет из себя логический оператор проверки ссылочного типа. Наиболее часто встречается при проверки поля составного типа на конкретный тип. Синтаксис: ССЫЛКА <Имя таблицы>

2. Конструкция МЕЖДУ - данный оператор проверяет входит ли значение в указанный диапазон.

Синтаксис: МЕЖДУ <Выражение> И <Выражение>

3. Конструкция В и В ИЕРАРХИИ - проверяют находится ли значение в передаваемом списке (в качестве списка могут передаваться массивы, таблицы значений и т.д.). Оператор В ИЕРАРХИИ позволяет просматривать иерархию (пример использования ПланСчетов).

Синтаксис: В(<СписокЗначений>), В ИЕРАРХИИ(<СписокЗначений>)

4. Конструкция ПОДОБНО - эта функция позволяет нам сравнивать строку с шаблоном строки.

Синтаксис: ПОДОБНО "<ТекстШаблона>"

Варианты шаблона строки:

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

_ - один произвольный символ.

[. ] - любой одиночный символ, либо последовательность символов из перечисленных внутри квадратных скобок. В перечислении могут задаваться диапазоны, например a-z, означающие произвольный символ, входящий в диапазон, включая концы диапазона.

[^. ] - любой одиночный символ, либо последовательность символов из перечисленных внутри квадратных скобок кроме тех, которые перечислены следом за значком отрицания.

5. Конструкция РАЗРЕШЕННЫЕ - этот оператор позволяет выбрать только те записи из БД, на которые вызывающий имеет право чтения. Данные права настраиваются на уровне записей (RLS).

Синтаксис: РАЗРЕШЕННЫЕ пишется после ключевого слова ВЫБРАТЬ

6. Конструкция РАЗЛИЧНЫЕ - позволяет выбрать записи в которых отсутствуют повторные записи.

Синтаксис: РАЗЛИЧНЫЕ пишется после ключевого слова ВЫБРАТЬ

Также Конструкция РАЗЛИЧНЫЕ может использоваться с оператором РАЗРЕШЕННЫЕ и другими операторами.

7. Конструкция ПЕРВЫЕ - выбирает указанное в параметре число записей из результата запроса.

Синтаксис: ПЕРВЫЕ <число>

8. Конструкция ДЛЯ ИЗМЕНЕНИЯ - позволяет заблокировать таблицу, работает только в транзакциях (актуально только для автоматических блокировок).

Синтаксис: ДЛЯ ИЗМЕНЕНИЯ <НаименованиеТаблицы>

9. Конструкция УПОРЯДОЧИТЬ ПО - упорядочивает данные по определенному полю. Если полем является ссылка то при установке флага АВТОУПОРЯДОЧИВАНИЕ будет происходить сортировка по представлению ссылки, если флаг выключен то ссылки сортируются по старшинству адреса ссылки в памяти.

Синтаксис: УПОРЯДОЧИТЬ ПО <НаименованиеПоля> АВТОУПОРЯДОЧИВАНИЕ

10. Конструкция СГРУППИРОВАТЬ ПО - используется для группировки строк запроса по определенным полям. Числовые поля должны использоваться с любой агрегатной функцией.

Синтаксис: СГРУППИРОВАТЬ ПО <НаименованиеПоля1>, . , <НаименованиеПоляN>

11. Конструкция ИМЕЮЩИЕ - позволяет применить агрегатную функцию к условию выборки данных, похожа на конструкцию ГДЕ.

Синтаксис: ИМЕЮЩИЕ <агрегатная функция с условием>

12. Конструкция ИНДЕКСИРОВАТЬ ПО - используется для индексации поле запроса. Запрос с индексацией дольше выполняется, но ускоряет поиск по индексированным полям. Можно использовать только в виртуальных таблицах.

Синтаксис: ИНДЕКСИРОВАТЬ ПО <Поле1, . , ПолеN>

13. Конструкция ГДЕ - позволяет наложить условие на любые поля выборки. В результат попадут записи только удовлетворяющие условию.

Синтаксис: ГДЕ <Условие1 ОператорЛогСоединения УсловиеN>

14. Конструкция ИТОГИ . ПО ОБЩИЕ - применяется для подсчета итогов, в конструкции указываются поля по которым будут считаться итоги и агрегатные функции применяемые к итоговым полям. При использовании итогов на каждое поле следующее после конструкции ИТОГИ производится группировка данных. Есть необязательная конструкция ОБЩИЕ, ее использование также обеспечивает дополнительную группировку. Пример результата запроса вы увидите ниже.

Синтаксис: ИТОГИ <АгрегатнаяФункция1, . , АгрегатнаяФункцияN> ПО <ОБЩИЕ> <Поле1, . , ПолеN>

Результат запроса с конструкцией ИТОГИ

На рисунке обведены группировки которые образовались в ходе выполнения запроса, самая верхняя относится к секции ОБЩИЕ, а вторая к полю ДоговорКонтрагентаВидДоговора.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

korney777@gmail. --> korney777@gmail.



Просмотр профиля

Добрый вечер. Застрял на тривиальной задаче. Есть запрос.

Как в запросе получить суммы за месяц.
Или посчитать суммы документов пока выполняется группировка? Выборка происходит за три месяца. в ТЗ должно попасть три строки. Голова уже не работает.

1Cv77 --> 1Cv77



Просмотр профиля

В ЦИКЛЕ, в конце, вставьТЕ такое:

P.S. Прошу прощения за "корявый" код, в плане отступов.

logist --> logist



Просмотр профиля 1Cv77, вы так редко пишите, что постоянно забываете правила форума. Bernet --> Bernet



Просмотр профиля
Боже, почему же 7-ка такая корявая. чтобы простенький запрос написать надо себе мозг вынести
Дописываю конфигурации на платформе 8.х.
- Управление торговым предприятием для Украины
- Управление производственным предприятием для Украины
- Управление небольшой фирмой для Украины
- Бухгалтерия для Украины;
- Общепит для Украины
- Ресторан (Рарус)
- Розница nysysimara --> nysysimara



Просмотр профиля 1С Предприятие 7.7: Бух. учет для Украины (активно дописанная) + самописка (учет производства и ЗП)
1С Предприятие 8.3: Бух.предприятия 3.0 + самописка

Кроме высшего образования, нужно иметь хотя бы среднее соображение

korney777@gmail. --> korney777@gmail.



Просмотр профиля 1Cv77, Работает, но запрос наваливает мне уже просуммированные цифры за период. Отчет не стыкуется. Может проще для каждого месяца делать запрос? Alegzander --> Alegzander



Просмотр профиля

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