Как добавить группировку по виду услуги и рассчитать итоги в процедуре Сформиров

База знаний Одина — Одинэсника Форумы ODIN — Форум по 1С Предприятию Как добавить группировку по виду услуги и рассчитать итоги в процедуре Сформиров

Просмотр 1 ветки ответов
  • Автор
    Сообщения
    • #37885
      Фото аватараOdineski
      Участник

        Процедура СформироватьНаСервере(Месяц)
        Объект.Услуги.Очистить();
        НастройкиРаспределения = ЗагрузитьНастройкиРаспределения(); // Объявляем и заполняем переменную

        // Константы для ключей
        КлючОбъекта = «ГруппыСубконто»;
        КлючНастроек = «»;
        ИмяПользователя = «»;

        СохраненныеДанные = ХранилищеОбщихНастроек.Загрузить(КлючОбъекта, КлючНастроек, , ИмяПользователя);

        Если СохраненныеДанные = Неопределено Тогда
        Возврат;
        КонецЕсли;

        Таблица = Неопределено;
        ПараметрыСубконто = Новый Массив;

        // Пытаемся получить данные в зависимости от типа
        Если ТипЗнч(СохраненныеДанные) = Тип(«ХранилищеЗначения») Тогда
        Таблица = СохраненныеДанные.Получить();
        ИначеЕсли ТипЗнч(СохраненныеДанные) = Тип(«Строка») Тогда
        Попытка
        Таблица = ЗначениеИзСтрокиВнутр(СохраненныеДанные);
        Исключение
        // Ошибка преобразования – игнорируем
        КонецПопытки;
        КонецЕсли;

        Для Каждого стр из Таблица Цикл
        ПараметрыСубконто.Добавить(стр.Субконто);
        КонецЦикла;

        Запрос = Новый Запрос;
        Запрос.Текст =
        «ВЫБРАТЬ
        | РеестрЭлектронныхСчетовФактурСписокДокументов.СсылкаНаДокумент КАК СсылкаНаДокумент,
        | РеестрЭлектронныхСчетовФактурСписокДокументов.Получатель КАК Получатель,
        | Контрагенты.ЮрФизЛицо КАК ЮрФизЛицо
        |ПОМЕСТИТЬ ВТ_Документы
        |ИЗ
        | Документ.РеестрЭлектронныхСчетовФактур.СписокДокументов КАК РеестрЭлектронныхСчетовФактурСписокДокументов
        | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты
        | ПО РеестрЭлектронныхСчетовФактурСписокДокументов.Получатель = Контрагенты.Ссылка
        |ГДЕ
        | МЕСЯЦ(РеестрЭлектронныхСчетовФактурСписокДокументов.ДатаОперации) = МЕСЯЦ(&ДатаОперации)
        | И ГОД(РеестрЭлектронныхСчетовФактурСписокДокументов.ДатаОперации) = ГОД(&ДатаОперации)
        |;
        |
        |////////////////////////////////////////////////////////////////////////////////
        |ВЫБРАТЬ РАЗЛИЧНЫЕ
        | ВТ_Документы.СсылкаНаДокумент КАК СсылкаНаДокумент,
        | РеализацияТоваровУслугТовары.СубконтоБУ1 КАК Субконто,
        | ВТ_Документы.Получатель КАК Получатель,
        | ВТ_Документы.ЮрФизЛицо КАК ЮрФизЛицо
        |ПОМЕСТИТЬ ВТ_СубконтоТовары
        |ИЗ
        | ВТ_Документы КАК ВТ_Документы
        | ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
        | ПО ВТ_Документы.СсылкаНаДокумент = РеализацияТоваровУслугТовары.Ссылка
        |ГДЕ
        | РеализацияТоваровУслугТовары.СубконтоБУ1 ЕСТЬ НЕ NULL
        |;
        |
        |////////////////////////////////////////////////////////////////////////////////
        |ВЫБРАТЬ РАЗЛИЧНЫЕ
        | ВТ_Документы.СсылкаНаДокумент КАК СсылкаНаДокумент,
        | РеализацияТоваровУслугУслуги.СубконтоБУ1 КАК Субконто,
        | ВТ_Документы.Получатель КАК Получатель,
        | ВТ_Документы.ЮрФизЛицо КАК ЮрФизЛицо
        |ПОМЕСТИТЬ ВТ_СубконтоУслуги
        |ИЗ
        | ВТ_Документы КАК ВТ_Документы
        | ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг.Услуги КАК РеализацияТоваровУслугУслуги
        | ПО ВТ_Документы.СсылкаНаДокумент = РеализацияТоваровУслугУслуги.Ссылка
        |ГДЕ
        | РеализацияТоваровУслугУслуги.СубконтоБУ1 ЕСТЬ НЕ NULL
        | И РеализацияТоваровУслугУслуги.СубконтоБУ1 В(&СписокСубконто)
        |;
        |
        |////////////////////////////////////////////////////////////////////////////////
        |ВЫБРАТЬ
        | СУММА(НДСНачисленный.СуммаБезНДС) КАК СуммаБезНДС,
        | СУММА(НДСНачисленный.НДС) КАК НДС,
        | СУММА(НДСНачисленный.СуммаБезНДС + НДСНачисленный.НДС) КАК Сумма,
        | НДСНачисленный.Регистратор КАК СсылкаНаДокумент
        |ПОМЕСТИТЬ ВТ_Суммы
        |ИЗ
        | РегистрНакопления.НДСНачисленный КАК НДСНачисленный
        |ГДЕ
        | НДСНачисленный.Регистратор В
        | (ВЫБРАТЬ
        | ВТ_Документы.СсылкаНаДокумент
        | ИЗ
        | ВТ_Документы)
        |
        |СГРУППИРОВАТЬ ПО
        | НДСНачисленный.Регистратор
        |;
        |
        |////////////////////////////////////////////////////////////////////////////////
        |ВЫБРАТЬ
        | ВТ_СубконтоТовары.Субконто КАК СубконтоТовары,
        | ВТ_СубконтоУслуги.Субконто КАК СубконтоУслуги,
        | СУММА(ВТ_Суммы.СуммаБезНДС) КАК СуммаБезНДС,
        | СУММА(ВТ_Суммы.НДС) КАК НДС,
        | СУММА(ВТ_Суммы.Сумма) КАК Сумма,
        | ВТ_СубконтоУслуги.Получатель КАК Получатель,
        | ВТ_СубконтоУслуги.ЮрФизЛицо КАК ЮрФизЛицоУслуги,
        | ВТ_СубконтоТовары.ЮрФизЛицо КАК ЮрФизЛицоТовары
        |ИЗ
        | ВТ_Суммы КАК ВТ_Суммы
        | ЛЕВОЕ СОЕДИНЕНИЕ ВТ_СубконтоТовары КАК ВТ_СубконтоТовары
        | ПО ВТ_Суммы.СсылкаНаДокумент = ВТ_СубконтоТовары.СсылкаНаДокумент
        | ЛЕВОЕ СОЕДИНЕНИЕ ВТ_СубконтоУслуги КАК ВТ_СубконтоУслуги
        | ПО ВТ_Суммы.СсылкаНаДокумент = ВТ_СубконтоУслуги.СсылкаНаДокумент
        |
        |СГРУППИРОВАТЬ ПО
        | ВТ_СубконтоТовары.Субконто,
        | ВТ_СубконтоУслуги.Субконто,
        | ВТ_СубконтоУслуги.Получатель,
        | ВТ_СубконтоУслуги.ЮрФизЛицо,
        | ВТ_СубконтоТовары.ЮрФизЛицо»;

        Запрос.УстановитьПараметр(«ДатаОперации», Месяц);
        Запрос.УстановитьПараметр(«СписокСубконто», ПараметрыСубконто);

        РезультатЗапроса = Запрос.Выполнить();

        ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

        УслугиРаспределенныеПоГруппам = Новый ТаблицаЗначений;
        УслугиРаспределенныеПоГруппам.Колонки.Добавить(«Группа», Новый ОписаниеТипов(«Строка»));
        УслугиРаспределенныеПоГруппам.Колонки.Добавить(«НДС_ФизЛица», Новый ОписаниеТипов(«Число»));
        УслугиРаспределенныеПоГруппам.Колонки.Добавить(«СуммаБезНДС_ФизЛица», Новый ОписаниеТипов(«Число»));
        УслугиРаспределенныеПоГруппам.Колонки.Добавить(«Сумма_ФизЛица», Новый ОписаниеТипов(«Число»));
        УслугиРаспределенныеПоГруппам.Колонки.Добавить(«НДС_ЮрЛица», Новый ОписаниеТипов(«Число»));
        УслугиРаспределенныеПоГруппам.Колонки.Добавить(«СуммаБезНДС_ЮрЛица», Новый ОписаниеТипов(«Число»));
        УслугиРаспределенныеПоГруппам.Колонки.Добавить(«Сумма_ЮрЛица», Новый ОписаниеТипов(«Число»));

        Пока ВыборкаДетальныеЗаписи.Следующий() Цикл

        ГруппаУслуг = Таблица.Найти(ВыборкаДетальныеЗаписи.СубконтоУслуги, «Субконто»);
        ГруппаТоваров = Таблица.Найти(ВыборкаДетальныеЗаписи.СубконтоТовары, «Субконто»);
        ГруппаСубконто = Неопределено;

        Если ГруппаУслуг <> Неопределено Тогда
        ГруппаСубконто = ГруппаУслуг;
        ИначеЕсли ГруппаТоваров <> Неопределено Тогда
        ГруппаСубконто = ГруппаТоваров;
        КонецЕсли;

        Если ГруппаСубконто <> Неопределено Тогда
        СтрокаГруппы = УслугиРаспределенныеПоГруппам.Найти(ГруппаСубконто.Группа, «Группа»);
        Если СтрокаГруппы = Неопределено Тогда
        СтрокаГруппы = УслугиРаспределенныеПоГруппам.Добавить();
        СтрокаГруппы.Группа = ГруппаСубконто.Группа;
        Если ВыборкаДетальныеЗаписи.ЮрФизЛицоУслуги = Перечисления.ЮрФизЛицо.ФизЛицо ИЛИ ВыборкаДетальныеЗаписи.ЮрФизЛицоТовары = Перечисления.ЮрФизЛицо.ФизЛицо Тогда
        СтрокаГруппы.СуммаБезНДС_ФизЛица = 0;
        СтрокаГруппы.НДС_ФизЛица = 0;
        СтрокаГруппы.Сумма_ФизЛица = 0;
        ИначеЕсли ВыборкаДетальныеЗаписи.ЮрФизЛицоУслуги = Перечисления.ЮрФизЛицо.ЮрЛицо ИЛИ ВыборкаДетальныеЗаписи.ЮрФизЛицоТовары = Перечисления.ЮрФизЛицо.ЮрЛицо Тогда
        СтрокаГруппы.СуммаБезНДС_ЮрЛица = 0;
        СтрокаГруппы.НДС_ЮрЛица = 0;
        СтрокаГруппы.Сумма_ЮрЛица = 0;
        КонецЕсли;
        КонецЕсли;

        Если ВыборкаДетальныеЗаписи.ЮрФизЛицоУслуги = Перечисления.ЮрФизЛицо.ФизЛицо ИЛИ ВыборкаДетальныеЗаписи.ЮрФизЛицоТовары = Перечисления.ЮрФизЛицо.ФизЛицо Тогда
        СтрокаГруппы.СуммаБезНДС_ФизЛица = СтрокаГруппы.СуммаБезНДС_ФизЛица + ВыборкаДетальныеЗаписи.СуммаБезНДС;
        СтрокаГруппы.НДС_ФизЛица = СтрокаГруппы.НДС_ФизЛица + ВыборкаДетальныеЗаписи.НДС;
        СтрокаГруппы.Сумма_ФизЛица = СтрокаГруппы.Сумма_ФизЛица + ВыборкаДетальныеЗаписи.Сумма;
        ИначеЕсли ВыборкаДетальныеЗаписи.ЮрФизЛицоУслуги = Перечисления.ЮрФизЛицо.ЮрЛицо ИЛИ ВыборкаДетальныеЗаписи.ЮрФизЛицоТовары = Перечисления.ЮрФизЛицо.ЮрЛицо Тогда
        СтрокаГруппы.СуммаБезНДС_ЮрЛица = СтрокаГруппы.СуммаБезНДС_ЮрЛица + ВыборкаДетальныеЗаписи.СуммаБезНДС;
        СтрокаГруппы.НДС_ЮрЛица = СтрокаГруппы.НДС_ЮрЛица + ВыборкаДетальныеЗаписи.НДС;
        СтрокаГруппы.Сумма_ЮрЛица = СтрокаГруппы.Сумма_ЮрЛица + ВыборкаДетальныеЗаписи.Сумма;
        Конецесли;
        КонецЕсли;
        КонецЦикла;

        Для Каждого СтрокаГруппы Из УслугиРаспределенныеПоГруппам Цикл
        СтрокаУслуг = Объект.Услуги.Добавить();
        СтрокаУслуг.ВидУслуги = СтрокаГруппы.Группа;
        СтрокаУслуг.ВыручкаФизЛица = СтрокаГруппы.Сумма_ФизЛица;
        СтрокаУслуг.НДСФизЛица = СтрокаГруппы.НДС_ФизЛица;
        СтрокаУслуг.ВыручкаЮрЛица = СтрокаГруппы.Сумма_ЮрЛица;
        СтрокаУслуг.НДСЮрЛица = СтрокаГруппы.НДС_ЮрЛица;
        СтрокаУслуг.ВыручкаИтого = СтрокаГруппы.Сумма_ФизЛица + СтрокаГруппы.Сумма_ЮрЛица;
        СтрокаУслуг.НДСИтого = СтрокаГруппы.НДС_ФизЛица + СтрокаГруппы.НДС_ЮрЛица;

        Сообщить(СтрокаГруппы.Группа + «: выручка физлиц=» +
        Формат(СтрокаГруппы.Сумма_ФизЛица, «ЧДЦ=2») +
        «, НДС=» + Формат(СтрокаГруппы.НДС_ФизЛица, «ЧДЦ=2») +
        » выручка юрлиц=» + Формат(СтрокаГруппы.Сумма_ЮрЛица, «ЧДЦ=2») +
        «, НДС=» + Формат(СтрокаГруппы.НДС_ЮрЛица, «ЧДЦ=2») +
        «, Итого выручки =» + Формат(СтрокаГруппы.Сумма_ФизЛица + СтрокаГруппы.Сумма_ЮрЛица, «ЧДЦ=2») +
        «, итого НДС =» + Формат(СтрокаГруппы.НДС_ФизЛица + СтрокаГруппы.НДС_ЮрЛица, «ЧДЦ=2»));
        КонецЦикла;

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

      • #37886
        bot_avaOdin — Одинэсник
        Участник

          Чтобы добавить дополнительную группировку по виду услуги и посчитать итоги по ней, нужно:

          1. В запрос добавить выборку и группировку по виду услуги (например, по полю ВидУслуги или аналогичному).
          2. В коде обработки результата добавить накопление итогов по виду услуги.
          3. В итоговой таблице добавить колонку для вида услуги.
          4. В цикле заполнения итоговой таблицы по группам учитывать и вид услуги.

          ### Пример модификации:

          #### 1. В запросе

          В запросе нужно добавить поле вида услуги (например, ВидУслуги) в выборку и в группировку.

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

          Пример (добавить в выборку и группировку):

          И в конце запроса добавить в ГРУППИРОВАТЬ ПО:

          Если поле называется иначе — подставьте правильное имя.

          #### 2. В коде обработки результата

          Добавьте колонку ВидУслуги в таблицу УслугиРаспределенныеПоГруппам:

          #### 3. При обработке выборки

          В цикле, где вы проходите по ВыборкаДетальныеЗаписи, вместо группировки только по ГруппаСубконто.Группа группируйте по составному ключу — по группе и виду услуги.

          Для этого можно сформировать ключ, например:

          И искать строку по этому ключу:

          Если колонки ГруппаВид нет — создайте её:

          При добавлении новой строки:

          #### 4. При заполнении итоговой таблицы объекта

          В цикле по УслугиРаспределенныеПоГруппам добавьте заполнение поля ВидУслуги:

          ### Итоговый пример фрагмента кода:

          ### Кратко:

          — Добавьте в запрос поле вида услуги и группируйте по нему.
          — В таблице значений добавьте колонку для вида услуги.
          — В коде группировки используйте составной ключ из группы и вида услуги.
          — При добавлении строки в итоговую таблицу заполняйте и вид услуги.

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

      Просмотр 1 ветки ответов
      • Для ответа в этой теме необходимо авторизоваться.
      База знаний 1С