База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › Как добавить группировку по виду услуги и рассчитать итоги в процедуре Сформиров
- В этой теме 1 ответ, 2 участника, последнее обновление 10 часов назад сделано
Odin — Одинэсник.
-
АвторСообщения
-
-
19 июня 2026 в 14:12 #37885
Процедура СформироватьНаСервере(Месяц)
Объект.Услуги.Очистить();
НастройкиРаспределения = ЗагрузитьНастройкиРаспределения(); // Объявляем и заполняем переменную// Константы для ключей
КлючОбъекта = «ГруппыСубконто»;
КлючНастроек = «»;
ИмяПользователя = «»;СохраненныеДанные = ХранилищеОбщихНастроек.Загрузить(КлючОбъекта, КлючНастроек, , ИмяПользователя);
Если СохраненныеДанные = Неопределено Тогда
Возврат;
КонецЕсли;Таблица = Неопределено;
ПараметрыСубконто = Новый Массив;// Пытаемся получить данные в зависимости от типа
Если ТипЗнч(СохраненныеДанные) = Тип(«ХранилищеЗначения») Тогда
Таблица = СохраненныеДанные.Получить();
ИначеЕсли ТипЗнч(СохраненныеДанные) = Тип(«Строка») Тогда
Попытка
Таблица = ЗначениеИзСтрокиВнутр(СохраненныеДанные);
Исключение
// Ошибка преобразования – игнорируем
КонецПопытки;
КонецЕсли;Для Каждого стр из Таблица Цикл
ПараметрыСубконто.Добавить(стр.Субконто);
КонецЦикла;Запрос = Новый Запрос;
Запрос.Текст =
«ВЫБРАТЬ
| РеестрЭлектронныхСчетовФактурСписокДокументов.СсылкаНаДокумент КАК СсылкаНаДокумент,
| РеестрЭлектронныхСчетовФактурСписокДокументов.Получатель КАК Получатель,
| Контрагенты.ЮрФизЛицо КАК ЮрФизЛицо
|ПОМЕСТИТЬ ВТ_Документы
|ИЗ
| Документ.РеестрЭлектронныхСчетовФактур.СписокДокументов КАК РеестрЭлектронныхСчетовФактурСписокДокументов
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты
| ПО РеестрЭлектронныхСчетовФактурСписокДокументов.Получатель = Контрагенты.Ссылка
|ГДЕ
| МЕСЯЦ(РеестрЭлектронныхСчетовФактурСписокДокументов.ДатаОперации) = МЕСЯЦ(&ДатаОперации)
| И ГОД(РеестрЭлектронныхСчетовФактурСписокДокументов.ДатаОперации) = ГОД(&ДатаОперации)
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| ВТ_Документы.СсылкаНаДокумент КАК СсылкаНаДокумент,
| РеализацияТоваровУслугТовары.СубконтоБУ1 КАК Субконто,
| ВТ_Документы.Получатель КАК Получатель,
| ВТ_Документы.ЮрФизЛицо КАК ЮрФизЛицо
|ПОМЕСТИТЬ ВТ_СубконтоТовары
|ИЗ
| ВТ_Документы КАК ВТ_Документы
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
| ПО ВТ_Документы.СсылкаНаДокумент = РеализацияТоваровУслугТовары.Ссылка
|ГДЕ
| РеализацияТоваровУслугТовары.СубконтоБУ1 ЕСТЬ НЕ NULL
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| ВТ_Документы.СсылкаНаДокумент КАК СсылкаНаДокумент,
| РеализацияТоваровУслугУслуги.СубконтоБУ1 КАК Субконто,
| ВТ_Документы.Получатель КАК Получатель,
| ВТ_Документы.ЮрФизЛицо КАК ЮрФизЛицо
|ПОМЕСТИТЬ ВТ_СубконтоУслуги
|ИЗ
| ВТ_Документы КАК ВТ_Документы
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг.Услуги КАК РеализацияТоваровУслугУслуги
| ПО ВТ_Документы.СсылкаНаДокумент = РеализацияТоваровУслугУслуги.Ссылка
|ГДЕ
| РеализацияТоваровУслугУслуги.СубконтоБУ1 ЕСТЬ НЕ NULL
| И РеализацияТоваровУслугУслуги.СубконтоБУ1 В(&СписокСубконто)
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| СУММА(НДСНачисленный.СуммаБезНДС) КАК СуммаБезНДС,
| СУММА(НДСНачисленный.НДС) КАК НДС,
| СУММА(НДСНачисленный.СуммаБезНДС + НДСНачисленный.НДС) КАК Сумма,
| НДСНачисленный.Регистратор КАК СсылкаНаДокумент
|ПОМЕСТИТЬ ВТ_Суммы
|ИЗ
| РегистрНакопления.НДСНачисленный КАК НДСНачисленный
|ГДЕ
| НДСНачисленный.Регистратор В
| (ВЫБРАТЬ
| ВТ_Документы.СсылкаНаДокумент
| ИЗ
| ВТ_Документы)
|
|СГРУППИРОВАТЬ ПО
| НДСНачисленный.Регистратор
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВТ_СубконтоТовары.Субконто КАК СубконтоТовары,
| ВТ_СубконтоУслуги.Субконто КАК СубконтоУслуги,
| СУММА(ВТ_Суммы.СуммаБезНДС) КАК СуммаБезНДС,
| СУММА(ВТ_Суммы.НДС) КАК НДС,
| СУММА(ВТ_Суммы.Сумма) КАК Сумма,
| ВТ_СубконтоУслуги.Получатель КАК Получатель,
| ВТ_СубконтоУслуги.ЮрФизЛицо КАК ЮрФизЛицоУслуги,
| ВТ_СубконтоТовары.ЮрФизЛицо КАК ЮрФизЛицоТовары
|ИЗ
| ВТ_Суммы КАК ВТ_Суммы
| ЛЕВОЕ СОЕДИНЕНИЕ ВТ_СубконтоТовары КАК ВТ_СубконтоТовары
| ПО ВТ_Суммы.СсылкаНаДокумент = ВТ_СубконтоТовары.СсылкаНаДокумент
| ЛЕВОЕ СОЕДИНЕНИЕ ВТ_СубконтоУслуги КАК ВТ_СубконтоУслуги
| ПО ВТ_Суммы.СсылкаНаДокумент = ВТ_СубконтоУслуги.СсылкаНаДокумент
|
|СГРУППИРОВАТЬ ПО
| ВТ_СубконтоТовары.Субконто,
| ВТ_СубконтоУслуги.Субконто,
| ВТ_СубконтоУслуги.Получатель,
| ВТ_СубконтоУслуги.ЮрФизЛицо,
| ВТ_СубконтоТовары.ЮрФизЛицо»;Запрос.УстановитьПараметр(«ДатаОперации», Месяц);
Запрос.УстановитьПараметр(«СписокСубконто», ПараметрыСубконто);РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
УслугиРаспределенныеПоГруппам = Новый ТаблицаЗначений;
УслугиРаспределенныеПоГруппам.Колонки.Добавить(«Группа», Новый ОписаниеТипов(«Строка»));
УслугиРаспределенныеПоГруппам.Колонки.Добавить(«НДС_ФизЛица», Новый ОписаниеТипов(«Число»));
УслугиРаспределенныеПоГруппам.Колонки.Добавить(«СуммаБезНДС_ФизЛица», Новый ОписаниеТипов(«Число»));
УслугиРаспределенныеПоГруппам.Колонки.Добавить(«Сумма_ФизЛица», Новый ОписаниеТипов(«Число»));
УслугиРаспределенныеПоГруппам.Колонки.Добавить(«НДС_ЮрЛица», Новый ОписаниеТипов(«Число»));
УслугиРаспределенныеПоГруппам.Колонки.Добавить(«СуммаБезНДС_ЮрЛица», Новый ОписаниеТипов(«Число»));
УслугиРаспределенныеПоГруппам.Колонки.Добавить(«Сумма_ЮрЛица», Новый ОписаниеТипов(«Число»));Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
ГруппаУслуг = Таблица.Найти(ВыборкаДетальныеЗаписи.СубконтоУслуги, «Субконто»);
ГруппаТоваров = Таблица.Найти(ВыборкаДетальныеЗаписи.СубконтоТовары, «Субконто»);
ГруппаСубконто = Неопределено;Если ГруппаУслуг <> Неопределено Тогда
ГруппаСубконто = ГруппаУслуг;
ИначеЕсли ГруппаТоваров <> Неопределено Тогда
ГруппаСубконто = ГруппаТоваров;
КонецЕсли;Если ГруппаСубконто <> Неопределено Тогда
СтрокаГруппы = УслугиРаспределенныеПоГруппам.Найти(ГруппаСубконто.Группа, «Группа»);
Если СтрокаГруппы = Неопределено Тогда
СтрокаГруппы = УслугиРаспределенныеПоГруппам.Добавить();
СтрокаГруппы.Группа = ГруппаСубконто.Группа;
Если ВыборкаДетальныеЗаписи.ЮрФизЛицоУслуги = Перечисления.ЮрФизЛицо.ФизЛицо ИЛИ ВыборкаДетальныеЗаписи.ЮрФизЛицоТовары = Перечисления.ЮрФизЛицо.ФизЛицо Тогда
СтрокаГруппы.СуммаБезНДС_ФизЛица = 0;
СтрокаГруппы.НДС_ФизЛица = 0;
СтрокаГруппы.Сумма_ФизЛица = 0;
ИначеЕсли ВыборкаДетальныеЗаписи.ЮрФизЛицоУслуги = Перечисления.ЮрФизЛицо.ЮрЛицо ИЛИ ВыборкаДетальныеЗаписи.ЮрФизЛицоТовары = Перечисления.ЮрФизЛицо.ЮрЛицо Тогда
СтрокаГруппы.СуммаБезНДС_ЮрЛица = 0;
СтрокаГруппы.НДС_ЮрЛица = 0;
СтрокаГруппы.Сумма_ЮрЛица = 0;
КонецЕсли;
КонецЕсли;Если ВыборкаДетальныеЗаписи.ЮрФизЛицоУслуги = Перечисления.ЮрФизЛицо.ФизЛицо ИЛИ ВыборкаДетальныеЗаписи.ЮрФизЛицоТовары = Перечисления.ЮрФизЛицо.ФизЛицо Тогда
СтрокаГруппы.СуммаБезНДС_ФизЛица = СтрокаГруппы.СуммаБезНДС_ФизЛица + ВыборкаДетальныеЗаписи.СуммаБезНДС;
СтрокаГруппы.НДС_ФизЛица = СтрокаГруппы.НДС_ФизЛица + ВыборкаДетальныеЗаписи.НДС;
СтрокаГруппы.Сумма_ФизЛица = СтрокаГруппы.Сумма_ФизЛица + ВыборкаДетальныеЗаписи.Сумма;
ИначеЕсли ВыборкаДетальныеЗаписи.ЮрФизЛицоУслуги = Перечисления.ЮрФизЛицо.ЮрЛицо ИЛИ ВыборкаДетальныеЗаписи.ЮрФизЛицоТовары = Перечисления.ЮрФизЛицо.ЮрЛицо Тогда
СтрокаГруппы.СуммаБезНДС_ЮрЛица = СтрокаГруппы.СуммаБезНДС_ЮрЛица + ВыборкаДетальныеЗаписи.СуммаБезНДС;
СтрокаГруппы.НДС_ЮрЛица = СтрокаГруппы.НДС_ЮрЛица + ВыборкаДетальныеЗаписи.НДС;
СтрокаГруппы.Сумма_ЮрЛица = СтрокаГруппы.Сумма_ЮрЛица + ВыборкаДетальныеЗаписи.Сумма;
Конецесли;
КонецЕсли;
КонецЦикла;Для Каждого СтрокаГруппы Из УслугиРаспределенныеПоГруппам Цикл
СтрокаУслуг = Объект.Услуги.Добавить();
СтрокаУслуг.ВидУслуги = СтрокаГруппы.Группа;
СтрокаУслуг.ВыручкаФизЛица = СтрокаГруппы.Сумма_ФизЛица;
СтрокаУслуг.НДСФизЛица = СтрокаГруппы.НДС_ФизЛица;
СтрокаУслуг.ВыручкаЮрЛица = СтрокаГруппы.Сумма_ЮрЛица;
СтрокаУслуг.НДСЮрЛица = СтрокаГруппы.НДС_ЮрЛица;
СтрокаУслуг.ВыручкаИтого = СтрокаГруппы.Сумма_ФизЛица + СтрокаГруппы.Сумма_ЮрЛица;
СтрокаУслуг.НДСИтого = СтрокаГруппы.НДС_ФизЛица + СтрокаГруппы.НДС_ЮрЛица;Сообщить(СтрокаГруппы.Группа + «: выручка физлиц=» +
Формат(СтрокаГруппы.Сумма_ФизЛица, «ЧДЦ=2») +
«, НДС=» + Формат(СтрокаГруппы.НДС_ФизЛица, «ЧДЦ=2») +
» выручка юрлиц=» + Формат(СтрокаГруппы.Сумма_ЮрЛица, «ЧДЦ=2») +
«, НДС=» + Формат(СтрокаГруппы.НДС_ЮрЛица, «ЧДЦ=2») +
«, Итого выручки =» + Формат(СтрокаГруппы.Сумма_ФизЛица + СтрокаГруппы.Сумма_ЮрЛица, «ЧДЦ=2») +
«, итого НДС =» + Формат(СтрокаГруппы.НДС_ФизЛица + СтрокаГруппы.НДС_ЮрЛица, «ЧДЦ=2»));
КонецЦикла;КонецПроцедуры
Как модифицировать код чтобы для вида услуги сделать еще группировку и посчитать по ней итог -
19 июня 2026 в 14:12 #37886
Чтобы добавить дополнительную группировку по виду услуги и посчитать итоги по ней, нужно:
1. В запрос добавить выборку и группировку по виду услуги (например, по полю
ВидУслугиили аналогичному).
2. В коде обработки результата добавить накопление итогов по виду услуги.
3. В итоговой таблице добавить колонку для вида услуги.
4. В цикле заполнения итоговой таблицы по группам учитывать и вид услуги.—
### Пример модификации:
#### 1. В запросе
В запросе нужно добавить поле вида услуги (например,
ВидУслуги) в выборку и в группировку.Если в исходном запросе нет поля вида услуги, нужно его добавить через соединение с нужной таблицей или получить из табличной части.
Пример (добавить в выборку и группировку):
MySQL1| РеализацияТоваровУслугУслуги.ВидУслуги КАК ВидУслуги,И в конце запроса добавить в
ГРУППИРОВАТЬ ПО:MySQL1| РеализацияТоваровУслугУслуги.ВидУслуги,Если поле называется иначе — подставьте правильное имя.
—
#### 2. В коде обработки результата
Добавьте колонку
ВидУслугив таблицуУслугиРаспределенныеПоГруппам:1С (Код)1УслугиРаспределенныеПоГруппам.Колонки.Добавить("ВидУслуги", Новый ОписаниеТипов("Строка"));—
#### 3. При обработке выборки
В цикле, где вы проходите по
ВыборкаДетальныеЗаписи, вместо группировки только поГруппаСубконто.Группагруппируйте по составному ключу — по группе и виду услуги.Для этого можно сформировать ключ, например:
1С (Код)1КлючГруппы = ГруппаСубконто.Группа + "|" + Строка(ВыборкаДетальныеЗаписи.ВидУслуги);И искать строку по этому ключу:
1С (Код)1СтрокаГруппы = УслугиРаспределенныеПоГруппам.Найти(КлючГруппы, "ГруппаВид");Если колонки
ГруппаВиднет — создайте её:1С (Код)1УслугиРаспределенныеПоГруппам.Колонки.Добавить("ГруппаВид", Новый ОписаниеТипов("Строка"));При добавлении новой строки:
1С (Код)1234СтрокаГруппы = УслугиРаспределенныеПоГруппам.Добавить();СтрокаГруппы.Группа = ГруппаСубконто.Группа;СтрокаГруппы.ВидУслуги = ВыборкаДетальныеЗаписи.ВидУслуги;СтрокаГруппы.ГруппаВид = КлючГруппы;—
#### 4. При заполнении итоговой таблицы объекта
В цикле по
УслугиРаспределенныеПоГруппамдобавьте заполнение поляВидУслуги:1С (Код)1СтрокаУслуг.ВидУслуги = СтрокаГруппы.ВидУслуги;—
### Итоговый пример фрагмента кода:
1С (Код)12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061// Добавляем колонку для составного ключа и вида услугиУслугиРаспределенныеПоГруппам.Колонки.Добавить("ВидУслуги", Новый ОписаниеТипов("Строка"));УслугиРаспределенныеПоГруппам.Колонки.Добавить("ГруппаВид", Новый ОписаниеТипов("Строка"));Пока ВыборкаДетальныеЗаписи.Следующий() ЦиклГруппаУслуг = Таблица.Найти(ВыборкаДетальныеЗаписи.СубконтоУслуги, "Субконто");ГруппаТоваров = Таблица.Найти(ВыборкаДетальныеЗаписи.СубконтоТовары, "Субконто");ГруппаСубконто = Неопределено;Если ГруппаУслуг <> Неопределено ТогдаГруппаСубконто = ГруппаУслуг;ИначеЕсли ГруппаТоваров <> Неопределено ТогдаГруппаСубконто = ГруппаТоваров;КонецЕсли;Если ГруппаСубконто <> Неопределено ТогдаКлючГруппы = ГруппаСубконто.Группа + "|" + Строка(ВыборкаДетальныеЗаписи.ВидУслуги);СтрокаГруппы = УслугиРаспределенныеПоГруппам.Найти(КлючГруппы, "ГруппаВид");Если СтрокаГруппы = Неопределено ТогдаСтрокаГруппы = УслугиРаспределенныеПоГруппам.Добавить();СтрокаГруппы.Группа = ГруппаСубконто.Группа;СтрокаГруппы.ВидУслуги = ВыборкаДетальныеЗаписи.ВидУслуги;СтрокаГруппы.ГруппаВид = КлючГруппы;// Инициализация сумм как в вашем кодеЕсли ВыборкаДетальныеЗаписи.ЮрФизЛицоУслуги = Перечисления.ЮрФизЛицо.ФизЛицо ИЛИ ВыборкаДетальныеЗаписи.ЮрФизЛицоТовары = Перечисления.ЮрФизЛицо.ФизЛицо ТогдаСтрокаГруппы.СуммаБезНДС_ФизЛица = 0;СтрокаГруппы.НДС_ФизЛица = 0;СтрокаГруппы.Сумма_ФизЛица = 0;ИначеЕсли ВыборкаДетальныеЗаписи.ЮрФизЛицоУслуги = Перечисления.ЮрФизЛицо.ЮрЛицо ИЛИ ВыборкаДетальныеЗаписи.ЮрФизЛицоТовары = Перечисления.ЮрФизЛицо.ЮрЛицо ТогдаСтрокаГруппы.СуммаБезНДС_ЮрЛица = 0;СтрокаГруппы.НДС_ЮрЛица = 0;СтрокаГруппы.Сумма_ЮрЛица = 0;КонецЕсли;КонецЕсли;// Накопление суммЕсли ВыборкаДетальныеЗаписи.ЮрФизЛицоУслуги = Перечисления.ЮрФизЛицо.ФизЛицо ИЛИ ВыборкаДетальныеЗаписи.ЮрФизЛицоТовары = Перечисления.ЮрФизЛицо.ФизЛицо ТогдаСтрокаГруппы.СуммаБезНДС_ФизЛица = СтрокаГруппы.СуммаБезНДС_ФизЛица + ВыборкаДетальныеЗаписи.СуммаБезНДС;СтрокаГруппы.НДС_ФизЛица = СтрокаГруппы.НДС_ФизЛица + ВыборкаДетальныеЗаписи.НДС;СтрокаГруппы.Сумма_ФизЛица = СтрокаГруппы.Сумма_ФизЛица + ВыборкаДетальныеЗаписи.Сумма;ИначеЕсли ВыборкаДетальныеЗаписи.ЮрФизЛицоУслуги = Перечисления.ЮрФизЛицо.ЮрЛицо ИЛИ ВыборкаДетальныеЗаписи.ЮрФизЛицоТовары = Перечисления.ЮрФизЛицо.ЮрЛицо ТогдаСтрокаГруппы.СуммаБезНДС_ЮрЛица = СтрокаГруппы.СуммаБезНДС_ЮрЛица + ВыборкаДетальныеЗаписи.СуммаБезНДС;СтрокаГруппы.НДС_ЮрЛица = СтрокаГруппы.НДС_ЮрЛица + ВыборкаДетальныеЗаписи.НДС;СтрокаГруппы.Сумма_ЮрЛица = СтрокаГруппы.Сумма_ЮрЛица + ВыборкаДетальныеЗаписи.Сумма;КонецЕсли;КонецЕсли;КонецЦикла;// Заполнение объекта с учетом вида услугиДля Каждого СтрокаГруппы Из УслугиРаспределенныеПоГруппам ЦиклСтрокаУслуг = Объект.Услуги.Добавить();СтрокаУслуг.Группа = СтрокаГруппы.Группа;СтрокаУслуг.ВидУслуги = СтрокаГруппы.ВидУслуги;СтрокаУслуг.ВыручкаФизЛица = СтрокаГруппы.Сумма_ФизЛица;СтрокаУслуг.НДСФизЛица = СтрокаГруппы.НДС_ФизЛица;СтрокаУслуг.ВыручкаЮрЛица = СтрокаГруппы.Сумма_ЮрЛица;СтрокаУслуг.НДСЮрЛица = СтрокаГруппы.НДС_ЮрЛица;СтрокаУслуг.ВыручкаИтого = СтрокаГруппы.Сумма_ФизЛица + СтрокаГруппы.Сумма_ЮрЛица;СтрокаУслуг.НДСИтого = СтрокаГруппы.НДС_ФизЛица + СтрокаГруппы.НДС_ЮрЛица;КонецЦикла;—
### Кратко:
— Добавьте в запрос поле вида услуги и группируйте по нему.
— В таблице значений добавьте колонку для вида услуги.
— В коде группировки используйте составной ключ из группы и вида услуги.
— При добавлении строки в итоговую таблицу заполняйте и вид услуги.—
Если нужно, могу помочь с конкретным запросом, если пришлёте структуру данных или пример поля вида услуги.
-
-
АвторСообщения
- Для ответа в этой теме необходимо авторизоваться.