Получить итоги запроса 1с

Обновлено: 07.07.2024

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Форум

При наличии в системе 1С:Предприятие компоненты «Бухгалтерский учет» система автоматически реализует специальный механизм работы с бухгалтерскими итогами. Данный механизм обеспечивает хранение, динамический пересчет бухгалтерских итогов и их извлечение средствами встроенного языка.

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

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

Обращение к бухгалтерским итогам выполняется при помощи агрегатного объекта типа «БухгалтерскиеИтоги». Объект может работать в трех режимах:

  • работа с основными итогами,
  • работа с временными итогами,
  • работа в режиме запроса.

Объект типа «БухгалтерскиеИтоги» при создании функцией «СоздатьОбъект()» работает в первом режиме. Переключение в другие режимы производится функциями «Рассчитать()» и «ВыполнитьЗапрос()».

Функции «ИспользоватьПланСчетов()» и «ИспользоватьРазделитель Учета()» позволяют назначить план счетов и разделитель учета по которым будут выдаваться итоги.

В пункте меню «Управление бухгалтерскими итогами» в системе «1С:Предприятие» устанавливается последний рассчитанный период. В режиме работы с основными итогами осуществляется доступ только к итогам по рассчитанный месяц включительно.

Функции работы с итогами:

Параметры: <Cчет> – счет, <ТипСуммы> = 1 – сумма, 2 – валютная сумма, 3 – количество, <Валюта> – значение типа “Справочник.Валюты”, <Субконто1> – значение первого субконто счета, <Субконто2> – значение второго субконто счета и т.д.

ОБ(<СчетДеб>,<СчетКред>,<ТипСуммы>,<Валюта>) – обороты между счетами;

Для получения остатков и оборотов по счетам, имеющим субсчета, используются аналогичные функции: СНДР(), СКДР(), СКДР(), СККР().

Чтобы получить итоги на любую дату нужно выполнять временный расчет (временный, потому что он хранится только во время существования переменной типа «БухгалтерскиеИтоги») с помощью функции

В параметре <ФильтрПоСчетам> можно задать в виде строки список счетов, разделенных запятой или точкой с запятой, по которым будет делаться расчет. Если параметр <ТолькоСинтетика> = 1, то расчет будет делаться только по счетам, иначе по счетам и субконто.

Для получения большего количества итогов (обороты и остатки по разным видам группировок) используется режим запроса.

Перед выполнением запроса устанавливаются различные фильтры:

ВключатьСубсчета() – устанавливать режим отбора по субсчетам.

Затем выполняется сам запрос функцией ВыполнитьЗапрос( <ДатаНач>,<ДатаКон>,<ФильтрПоСчетам>,<ФильтрПоКорСчетам>, <Валюта>,<ТипИтогов>,<Периодичность>,<ТипСуммы>), которая возвращает 1, если запрос выполнился успешно.

Параметр <ТипИтогов> принимает следующие значения: 1 – остатки и обороты по счетам, 2 – обороты между счетами, 3 – и то и другое.


Получение запросом всех строк со значениями всех столбцов из таблицы в 1С 8.3:

&НаСервере
Процедура ПолучениеЗапросомВсехСтрокСоЗначениямиВсехСтолбцовИзТаблицы ()

// Звездочка используется, когда нужно выбрать все столбцы из таблицы
Запрос = Новый Запрос ( "ВЫБРАТЬ
| *
|ИЗ
| Справочник.Материалы" );

РезультатЗапроса = Запрос . Выполнить ();
Если Не РезультатЗапроса . Пустой () Тогда // Такая проверка рекомендуется фирмой 1С
Записи = РезультатЗапроса . Выбрать ();
Пока Записи . Следующий () Цикл
// Обход результата запроса по каждой записи в полученной выборке
КонецЦикла;
Иначе // Например: Сообщить("Данные отсутствуют!");
КонецЕсли;

Получение запросом всех строк со значениями определенных столбцов в 1С 8.3:

&НаСервере
Процедура ПолучениеЗапросомВсехСтрокСоЗначениямиОпределенныхСтолбцов ()

// У каждого столбца в таблице есть своё соответствующее имя
Запрос = Новый Запрос ( "ВЫБРАТЬ
| Наименование,
| Производитель,
| СрокИспользования
|ИЗ
| Справочник.Материалы" );

РезультатЗапроса = Запрос . Выполнить ();
Если Не РезультатЗапроса . Пустой () Тогда // Такая проверка рекомендуется фирмой 1С
Записи = РезультатЗапроса . Выбрать ();
Пока Записи . Следующий () Цикл
// Обход результата запроса по каждой записи в полученной выборке
КонецЦикла;
Иначе // Сообщить("Данные отсутствуют!");
КонецЕсли;

Использование псевдонимов для столбцов и таблиц в запросах в 1С 8.3:

&НаСервере
Процедура ИспользованиеПсевдонимовДляСтолбцовИТаблицВЗапросах ()

// Для каждого столбца может быть назначен Псевдоним. Запрос станет более понятным
Запрос = Новый Запрос ( "ВЫБРАТЬ
| Запчасти.Наименование КАК НаименованиеМатериала,
| Запчасти.СрокИспользования КАК СрокИспМатериала,
| Запчасти.Производитель КАК ПроизводительМатериала
| ИЗ
| Справочник.Материалы КАК Запчасти" );

РезультатЗапроса = Запрос . Выполнить ();
Если Не РезультатЗапроса . Пустой () Тогда // Такая проверка рекомендуется фирмой 1С
Записи = РезультатЗапроса . Выбрать ();
Пока Записи . Следующий () Цикл
// Обход результата запроса по каждой записи в полученной выборке
КонецЦикла;
Иначе // Сообщить("Данные отсутствуют!");
КонецЕсли;

&НаСервере
Процедура УдалениеДубликатовИзРезультатаЗапроса ()

// В справочнике КлассификаторСроковПИ есть элементы-дубли. Строим запрос так,
// чтобы в результат попали только различные сроки использования
Запрос = Новый Запрос ( "ВЫБРАТЬ РАЗЛИЧНЫЕ
| Наименование
|ИЗ
| Справочник.КлассификаторСроковПИ" );

РезультатЗапроса = Запрос . Выполнить ();
Если Не РезультатЗапроса . Пустой () Тогда // Такая проверка рекомендуется фирмой 1С
Записи = РезультатЗапроса . Выбрать ();
Пока Записи . Следующий () Цикл
// Обход результата запроса по каждой записи в полученной выборке
КонецЦикла;
Иначе // Сообщить("Данные отсутствуют!");
КонецЕсли;

Ограничение количества строк в результате запроса в 1С 8.3:

&НаСервере
Процедура ОграничениеКоличестваСтрокВРезультатеЗапроса ()

// Создание выборки первых 30 самых тяжелых материалов
Запрос = Новый Запрос ( "ВЫБРАТЬ ПЕРВЫЕ 30
| Наименование,
| Вес
|ИЗ
| Справочник.Материалы
|УПОРЯДОЧИТЬ ПО
| Вес УБЫВ" );

РезультатЗапроса = Запрос . Выполнить ();
Если Не РезультатЗапроса . Пустой () Тогда // Такая проверка рекомендуется фирмой 1С
Записи = РезультатЗапроса . Выбрать ();
Пока Записи . Следующий () Цикл
// Обход результата запроса по каждой записи в полученной выборке
КонецЦикла;
Иначе // Сообщить("Данные отсутствуют!");
КонецЕсли;

Вставка столбца с определенным значением в результат запроса в 1С 8.3:

&НаСервере
Процедура ВставкаСтолбцаСОпределеннымЗначениемВРезультатЗапроса ()

// Добавление столбца СтавкаНДС и присвоение значения = 20
Запрос = Новый Запрос ( "ВЫБРАТЬ
| Наименование,
| 20 КАК СтавкаНДС,
| Вес
|ИЗ
| Справочник.Материалы" );

РезультатЗапроса = Запрос . Выполнить ();
Если Не РезультатЗапроса . Пустой () Тогда // Такая проверка рекомендуется фирмой 1С
Записи = РезультатЗапроса . Выбрать ();
Пока Записи . Следующий () Цикл
// Обход результата запроса по каждой записи в полученной выборке
КонецЦикла;
Иначе // Сообщить("Данные отсутствуют!");
КонецЕсли;

Выборка записей запроса только на которые имеются пользовательские права в 1С 8.3:

&НаСервере
Процедура ВыборкаЗаписейЗапросаТолькоНаКоторыеИмеютсяПользовательскиеПрава ()

// Необходимо только для баз, в которых ограничение прав доступа работает на уровне записей (RLS)
// Данная реализация кода дает возможность выполнить запрос без ошибки
// и выбрать только те данные, на которые у пользователя есть права
Запрос = Новый Запрос ( "ВЫБРАТЬ РАЗРЕШЕННЫЕ
| Ссылка
|ИЗ
| Документ.ПоступлениеМатериалов" );

РезультатЗапроса = Запрос . Выполнить ();
Если Не РезультатЗапроса . Пустой () Тогда // Такая проверка рекомендуется фирмой 1С
Записи = РезультатЗапроса . Выбрать ();
Пока Записи . Следующий () Цикл
// Обход результата запроса по каждой записи в полученной выборке
КонецЦикла;
Иначе // Сообщить("Данные отсутствуют!");
КонецЕсли;


&НаСервере
Процедура ПолучениеИтоговВЦеломПоТаблице ()

// Получение среднего веса материалов по всему справочнику
Запрос = Новый Запрос ( "ВЫБРАТЬ
| Наименование,
| Вес
|ИЗ
| Справочник.Материалы
|ГДЕ
| ЭтоГруппа = Ложь
|ИТОГИ
| СРЕДНЕЕ(Вес)
|ПО
| ОБЩИЕ" );

РезультатЗапроса = Запрос . Выполнить (); Записи = РезультатЗапроса . Выбрать ();
Пока Записи . Следующий () Цикл
// Обход результата запроса по каждой записи в полученной выборке
КонецЦикла;

Получение итогов по одному полю в разрезе другого поля в 1С 8.3:

&НаСервере
Процедура ПолучениеИтогоВПоОдномуПолюВРазрезеДругогоПоля ()

// Получение итогов по весу материалов в разрезе Срока Использования
Запрос = Новый Запрос ( "ВЫБРАТЬ
| СрокИспользования,
| Наименование,
| Вес
|ИЗ
| Справочник.Материалы
|ГДЕ
| ЭтоГруппа = Ложь
|ИТОГИ
| СУММА(Вес)
|ПО
| СрокИспользования" );

РезультатЗапроса = Запрос . Выполнить (); Записи = РезультатЗапроса . Выбрать ();
Пока Записи . Следующий () Цикл
// Обход результата запроса по каждой записи в полученной выборке
КонецЦикла;

Получение итогов одних полей в разрезе нескольких других в 1С 8.3:

&НаСервере
Процедура ПолучениеИтоговОднихПолейВРазрезеНесколькихДругих ()

// Получение итогов веса, плотности и фасовки материалов
// в разрезе производителей и сроков использования, по всему справочнику
Запрос = Новый Запрос ( "ВЫБРАТЬ
| СрокИспользования,
| Производитель,
| Наименование,
| Вес,
| Плотность,
| Фасовка,
|ИЗ
| Справочник.Материалы
|ГДЕ
| ЭтоГруппа = Ложь
|ИТОГИ
| СУММА(Вес),
| СУММА(Плотность),
| СУММА(Фасовка),
|ПО
| ОБЩИЕ,
| СрокИспользования,
| Производитель" );

РезультатЗапроса = Запрос . Выполнить (); Записи = РезультатЗапроса . Выбрать ();
Пока Записи . Следующий () Цикл
// Обход результата запроса по каждой записи в полученной выборке
КонецЦикла;

&НаСервере
Процедура ПолучениеИтоговПоИерархии ()

РезультатЗапроса = Запрос . Выполнить (); Записи = РезультатЗапроса . Выбрать ();
Пока Записи . Следующий () Цикл
// Обход результата запроса по каждой записи в полученной выборке
КонецЦикла;

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