Нарастающий итог в 1С

В этой статье разберем основные момент, которые касаются получения нарастающего итога 1С. Мы разберем получение нарастающего итога в запросе, но также рассмотрим получение нарастающего итога в СКД.

Нарастающий итог в запросе 1С

Рассмотрим простую задачу. Имеется документ с табличной частью.

Документ с табличной частью 1С

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

Табличная часть документа 1С

То для первой строки будет сумма 100, для второй 300 (100 + 200), для третей 400 (100 + 200 + 100) и тд.

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

ВЫБРАТЬ
	ЗаказТовары.Номенклатура КАК Номенклатура,
	ЗаказТовары.Сумма КАК Сумма,
	ЗаказТоварыДляИтога.Сумма КАК СуммаИтогом
ИЗ
	Документ.Заказ.Товары КАК ЗаказТовары
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.Заказ.Товары КАК ЗаказТоварыДляИтога
		ПО ЗаказТовары.Ссылка = ЗаказТоварыДляИтога.Ссылка
ГДЕ
	ЗаказТовары.Ссылка = &Ссылка
	И ЗаказТоварыДляИтога.Ссылка = &Ссылка

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

Нарастающий итог в 1С

Но, нам нужно сделать так, чтобы к первой строке добавились все строки, ко второй — все строки, начиная со второй и т.д. Поэтому, нужно связать обе табличные части по номеру строки, но так, чтобы номер из второй табличной части (для итога) был больше или равен номеру из первой табличной части.

ВЫБРАТЬ
	ЗаказТовары.Номенклатура КАК Номенклатура,
	ЗаказТовары.Сумма КАК Сумма,
	ЗаказТоварыДляИтога.Сумма КАК СуммаИтогом
ИЗ
	Документ.Заказ.Товары КАК ЗаказТовары
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.Заказ.Товары КАК ЗаказТоварыДляИтога
		ПО ЗаказТовары.Ссылка = ЗаказТоварыДляИтога.Ссылка
			И ЗаказТовары.НомерСтроки <= ЗаказТоварыДляИтога.НомерСтроки
ГДЕ
	ЗаказТовары.Ссылка = &Ссылка
	И ЗаказТоварыДляИтога.Ссылка = &Ссылка

В результате у нас запрос выведет такие данные.

Нарастающий итог в 1С

Если теперь сделаем группировку по номенклатуре и по сумме из первой таблицы, а просуммируем сумму из второй таблицы (для итога).

ВЫБРАТЬ
	ЗаказТовары.Номенклатура КАК Номенклатура,
	ЗаказТовары.Сумма КАК Сумма,
	СУММА(ЗаказТоварыДляИтога.Сумма) КАК СуммаИтогом
ИЗ
	Документ.Заказ.Товары КАК ЗаказТовары
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.Заказ.Товары КАК ЗаказТоварыДляИтога
		ПО ЗаказТовары.Ссылка = ЗаказТоварыДляИтога.Ссылка
			И ЗаказТовары.НомерСтроки >= ЗаказТоварыДляИтога.НомерСтроки
ГДЕ
	ЗаказТовары.Ссылка = &Ссылка
	И ЗаказТоварыДляИтога.Ссылка = &Ссылка

СГРУППИРОВАТЬ ПО
	ЗаказТовары.Номенклатура,
	ЗаказТовары.Сумма

То, получим нарастающий итог по каждой строке.

Нарастающий итог в 1С

Если нам нужно получить данные по всем документам, мы просто добавляем ссылку и включаем её в группировку. Ниже, в группировку также был включен номер строки (но не выведен), для сортировки.

ВЫБРАТЬ
	ЗаказТовары.Ссылка КАК Ссылка,
	ЗаказТовары.Номенклатура КАК Номенклатура,
	ЗаказТовары.Сумма КАК Сумма,
	СУММА(ЗаказТоварыДляИтога.Сумма) КАК СуммаИтогом
ИЗ
	Документ.Заказ.Товары КАК ЗаказТовары
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.Заказ.Товары КАК ЗаказТоварыДляИтога
		ПО ЗаказТовары.Ссылка = ЗаказТоварыДляИтога.Ссылка
			И ЗаказТовары.НомерСтроки >= ЗаказТоварыДляИтога.НомерСтроки

СГРУППИРОВАТЬ ПО
	ЗаказТовары.Номенклатура,
	ЗаказТовары.Сумма,
	ЗаказТовары.Ссылка,
	ЗаказТовары.НомерСтроки

УПОРЯДОЧИТЬ ПО
	ЗаказТовары.Ссылка,
	ЗаказТовары.НомерСтроки

В моем случае получился следующий результат.

Нарастающий итог в 1С

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

Запись в регистр накопления 1С

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

ВЫБРАТЬ
	ЗаказыОбороты.Период КАК Период,
	ЗаказыОбороты.СуммаОборот КАК СуммаЗаДень,
	СУММА(ЗаказыОборотыДляИтога.СуммаОборот) КАК СуммаОборотИтог
ИЗ
	РегистрНакопления.Заказы.Обороты(, , День, ) КАК ЗаказыОбороты
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.Заказы.Обороты(, , День, ) КАК ЗаказыОборотыДляИтога
		ПО ЗаказыОбороты.Период >= ЗаказыОборотыДляИтога.Период

СГРУППИРОВАТЬ ПО
	ЗаказыОбороты.Период,
	ЗаказыОбороты.СуммаОборот

УПОРЯДОЧИТЬ ПО
	ЗаказыОбороты.Период

Для моих данных (см. скрин выше) получится следующий результат.

Нарастающий итог 1С

Нарастающий итог в СКД

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

Нарастающий итог СКД 1С

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

Создадим вычисляемое поле, которое так и назовем СуммаНарастающийИтог.

Нарастающий итог СКД 1С

Это вычисляемое поле добавим в ресурсы, где напишем выражение:

ВычислитьВыражение("Сумма(СуммаОборот)",,,"Первая","Текущая")
Нарастающий итог СКД 1С

В этом выражении мы вычисляем сумму по колонке СуммаОборот с первой строки по текущую. Также в настройках добавим группировку Период (то поле, по которому будет считаться наша сумма), и выберем поля Период, СуммаОборот, СуммаНарастающийИтог.

Нарастающий итог СКД 1С

В результате у нас получится отчет с нарастающим итогом по колонке сумма.

Нарастающий итог СКД 1С

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

Успеха в обучении!

Подробно и основательно начальные вопросы программирования в 1С есть вы можете изучить в
Книга «Программировать в 1С за 11 шагов»

Изучайте программирование в 1С в месте с моей книгой «Программировать в 1С за 11 шагов»

Программировать в 1С за 11 шагов





Книга написана понятным и простым языком — для новичка.

  1. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
  2. Научитесь понимать архитектуру 1С;
  3. Станете писать код на языке 1С;
  4. Освоите основные приемы программирования;
  5. Закрепите полученные знания при помощи задачника





О том как разрабатывать под управляемым приложением 1С, читайте в книге Книга «Основы разработки в 1С: Такси»




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

Основы разработки в 1С такси
  1. Очень доступный и понятный язык изложения
  2. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
  3. Поймете идеологию управляемого приложения 1С
  4. Узнаете, как разрабатывать управляемое приложение;
  5. Научитесь разрабатывать управляемые формы 1С;
  6. Сможете работать с основными и нужными элементами управляемых форм
  7. Программирование под управляемым приложением станет понятным

Промо-код на скидку в 15% — 48PVXHeYu

Также, у меня имеются два комплекта книг, в которых присутствуют обе эти книги:

Комплект книг по разработке в 1С КОМБО-1

Комплект книг по разработке в 1С КОМБО-2
Только для читателей моего блога, промо-код на скидку в 300 рублей на оба комплекта: blog

Вступайте в мои группы:

Вконтакте: https://vk.com/1c_prosto
Фейсбуке: https://www.facebook.com/groups/922972144448119/
ОК: http://ok.ru/group/52970839015518
Твиттер: https://twitter.com/signum2009

Подписывайтесь на телеграмм-канал: https://t.me/Programming1CNizamutdinov

Обсудить вопросы программирования в 1С (и не только) можно в моём тг-чате

One Reply to “Нарастающий итог в 1С”

  1. Сперва в запросе: «И ЗаказТовары.НомерСтроки = ЗаказТоварыДляИтога.НомерСтроки»
    Результат после первого запроса, не для этой задачи.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *