Сервис доступа к данным 1С для внешних систем
Жёлтый мост
Код · Аналитику

Все дни периода без производственного календаря: выручка по каждому дню, включая дни без продаж, в УТ 11.5.27.70, КА 2.5.27.93 и БП 3.0.203.18

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

Управление торговлей 11.5.27.70Комплексная автоматизация 2.5.27.93Бухгалтерия предприятия 3.0.203.18

Задача

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

Решение

Первый запрос пакета создает временную таблицу из десяти строк с цифрами от 0 до 9. Четыре копии этой таблицы, перечисленные через запятую, дают все номера от 0 до 9999. Номер прибавляется к началу периода функцией ДОБАВИТЬКДАТЕ, лишние даты после конца периода отсекаются условием. Получается таблица всех дней, до 27 лет.

Обороты за период по дням кладутся во вторую таблицу. Таблица дней соединяется с ней левым соединением, отсутствующие суммы заменяются нулем, день недели выводится по номеру.

В Управлении торговлей и Комплексной автоматизации выручка берется из оборотов регистра ВыручкаИСебестоимостьПродаж, в Бухгалтерии из кредитовых оборотов счета 90.01.

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

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

// 1. Цифры от 0 до 9: из них собираются номера дней без таблиц календаря.
ВЫБРАТЬ
	0 КАК Цифра
ПОМЕСТИТЬ втЦифры

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	1

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	2

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	3

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	4

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	5

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	6

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	7

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	8

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	9
;

// 2. Все дни периода. Четыре копии таблицы цифр дают номера от 0 до 9999,
//    то есть период до 27 лет. Номер дня прибавляется к началу периода.
ВЫБРАТЬ
	ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&Начало, ДЕНЬ), ДЕНЬ, Единицы.Цифра + 10 * Десятки.Цифра + 100 * Сотни.Цифра + 1000 * Тысячи.Цифра) КАК День
ПОМЕСТИТЬ втДни
ИЗ
	втЦифры КАК Единицы,
	втЦифры КАК Десятки,
	втЦифры КАК Сотни,
	втЦифры КАК Тысячи
ГДЕ
	ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&Начало, ДЕНЬ), ДЕНЬ, Единицы.Цифра + 10 * Десятки.Цифра + 100 * Сотни.Цифра + 1000 * Тысячи.Цифра) <= &Конец
ИНДЕКСИРОВАТЬ ПО
	День
;

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

// 4. Каждый день периода, даже без продаж: выручка и количество либо нули.
ВЫБРАТЬ
	Дни.День КАК День,
	ВЫБОР ДЕНЬНЕДЕЛИ(Дни.День)
		КОГДА 1 ТОГДА "пн"
		КОГДА 2 ТОГДА "вт"
		КОГДА 3 ТОГДА "ср"
		КОГДА 4 ТОГДА "чт"
		КОГДА 5 ТОГДА "пт"
		КОГДА 6 ТОГДА "сб"
		ИНАЧЕ "вс"
	КОНЕЦ КАК ДеньНедели,
	ЕСТЬNULL(Продажи.Выручка, 0) КАК Выручка,
	ЕСТЬNULL(Продажи.Количество, 0) КАК Количество,
	ВЫБОР
		КОГДА Продажи.День ЕСТЬ NULL
			ТОГДА ИСТИНА
		ИНАЧЕ ЛОЖЬ
	КОНЕЦ КАК НетПродаж
ИЗ
	втДни КАК Дни
		ЛЕВОЕ СОЕДИНЕНИЕ втПродажи КАК Продажи
		ПО (Продажи.День = Дни.День)

УПОРЯДОЧИТЬ ПО
	День
// Выручка по каждому дню периода, включая дни без продаж.
// Виртуальная таблица оборотов с периодичностью День отдает только дни с движениями.
// Недостающие дни достраиваются в самом запросе из таблицы цифр, без регламентированного
// производственного календаря и без заполнения таблицы в коде.

// 1. Цифры от 0 до 9: из них собираются номера дней без таблиц календаря.
ВЫБРАТЬ
	0 КАК Цифра
ПОМЕСТИТЬ втЦифры

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	1

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	2

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	3

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	4

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	5

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	6

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	7

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	8

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	9
;

// 2. Все дни периода. Четыре копии таблицы цифр дают номера от 0 до 9999,
//    то есть период до 27 лет. Номер дня прибавляется к началу периода.
ВЫБРАТЬ
	ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&Начало, ДЕНЬ), ДЕНЬ, Единицы.Цифра + 10 * Десятки.Цифра + 100 * Сотни.Цифра + 1000 * Тысячи.Цифра) КАК День
ПОМЕСТИТЬ втДни
ИЗ
	втЦифры КАК Единицы,
	втЦифры КАК Десятки,
	втЦифры КАК Сотни,
	втЦифры КАК Тысячи
ГДЕ
	ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&Начало, ДЕНЬ), ДЕНЬ, Единицы.Цифра + 10 * Десятки.Цифра + 100 * Сотни.Цифра + 1000 * Тысячи.Цифра) <= &Конец
ИНДЕКСИРОВАТЬ ПО
	День
;

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

// 4. Каждый день периода, даже без продаж: выручка и количество либо нули.
ВЫБРАТЬ
	Дни.День КАК День,
	ВЫБОР ДЕНЬНЕДЕЛИ(Дни.День)
		КОГДА 1 ТОГДА "пн"
		КОГДА 2 ТОГДА "вт"
		КОГДА 3 ТОГДА "ср"
		КОГДА 4 ТОГДА "чт"
		КОГДА 5 ТОГДА "пт"
		КОГДА 6 ТОГДА "сб"
		ИНАЧЕ "вс"
	КОНЕЦ КАК ДеньНедели,
	ЕСТЬNULL(Продажи.Выручка, 0) КАК Выручка,
	ЕСТЬNULL(Продажи.Количество, 0) КАК Количество,
	ВЫБОР
		КОГДА Продажи.День ЕСТЬ NULL
			ТОГДА ИСТИНА
		ИНАЧЕ ЛОЖЬ
	КОНЕЦ КАК НетПродаж
ИЗ
	втДни КАК Дни
		ЛЕВОЕ СОЕДИНЕНИЕ втПродажи КАК Продажи
		ПО (Продажи.День = Дни.День)

УПОРЯДОЧИТЬ ПО
	День
// Выручка по каждому дню периода по кредиту счета 90.01, включая дни без выручки.
// Обороты регистра бухгалтерии с периодичностью День отдает только дни с движениями.
// Недостающие дни достраиваются в самом запросе из таблицы цифр, без регламентированного
// производственного календаря и без заполнения таблицы в коде.

// 1. Цифры от 0 до 9: из них собираются номера дней без таблиц календаря.
ВЫБРАТЬ
	0 КАК Цифра
ПОМЕСТИТЬ втЦифры

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	1

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	2

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	3

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	4

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	5

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	6

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	7

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	8

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	9
;

// 2. Все дни периода. Четыре копии таблицы цифр дают номера от 0 до 9999,
//    то есть период до 27 лет. Номер дня прибавляется к началу периода.
ВЫБРАТЬ
	ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&Начало, ДЕНЬ), ДЕНЬ, Единицы.Цифра + 10 * Десятки.Цифра + 100 * Сотни.Цифра + 1000 * Тысячи.Цифра) КАК День
ПОМЕСТИТЬ втДни
ИЗ
	втЦифры КАК Единицы,
	втЦифры КАК Десятки,
	втЦифры КАК Сотни,
	втЦифры КАК Тысячи
ГДЕ
	ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&Начало, ДЕНЬ), ДЕНЬ, Единицы.Цифра + 10 * Десятки.Цифра + 100 * Сотни.Цифра + 1000 * Тысячи.Цифра) <= &Конец
ИНДЕКСИРОВАТЬ ПО
	День
;

// 3. Кредитовые обороты счета 90.01 "Выручка" по дням: только дни с выручкой.
ВЫБРАТЬ
	Обороты.Период КАК День,
	СУММА(Обороты.СуммаОборотКт) КАК Выручка
ПОМЕСТИТЬ втПродажи
ИЗ
	РегистрБухгалтерии.Хозрасчетный.Обороты(
			&Начало,
			&Конец,
			День,
			Счет В ИЕРАРХИИ (ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.Выручка)),
			,
			,
			,
			) КАК Обороты
СГРУППИРОВАТЬ ПО
	Обороты.Период
ИНДЕКСИРОВАТЬ ПО
	День
;

// 4. Каждый день периода, даже без продаж: выручка и количество либо нули.
ВЫБРАТЬ
	Дни.День КАК День,
	ВЫБОР ДЕНЬНЕДЕЛИ(Дни.День)
		КОГДА 1 ТОГДА "пн"
		КОГДА 2 ТОГДА "вт"
		КОГДА 3 ТОГДА "ср"
		КОГДА 4 ТОГДА "чт"
		КОГДА 5 ТОГДА "пт"
		КОГДА 6 ТОГДА "сб"
		ИНАЧЕ "вс"
	КОНЕЦ КАК ДеньНедели,
	ЕСТЬNULL(Продажи.Выручка, 0) КАК Выручка,
	ВЫБОР
		КОГДА Продажи.День ЕСТЬ NULL
			ТОГДА ИСТИНА
		ИНАЧЕ ЛОЖЬ
	КОНЕЦ КАК НетПродаж
ИЗ
	втДни КАК Дни
		ЛЕВОЕ СОЕДИНЕНИЕ втПродажи КАК Продажи
		ПО (Продажи.День = Дни.День)

УПОРЯДОЧИТЬ ПО
	День
Обработка для Управление торговлей 11.5.27.70Открыть через "Файл, Открыть", выбрать даты, нажать "Сформировать результат". Ничего не пишет в базу, работает от прав пользователя.
Скачать .epf

В Комплексной автоматизации запрос тот же, что в Управлении торговлей.

Обработка для Комплексная автоматизация 2.5.27.93Открыть через "Файл, Открыть", выбрать даты, нажать "Сформировать результат". Ничего не пишет в базу, работает от прав пользователя.
Скачать .epf

В Бухгалтерии предприятия выручка берется по кредиту счета 90.01 и включает НДС, как в проводках. Колонки количества в этом варианте нет: у оборотов счета 90.01 его нет.

Обработка для Бухгалтерия предприятия 3.0.203.18Открыть через "Файл, Открыть", выбрать даты, нажать "Сформировать результат". Ничего не пишет в базу, работает от прав пользователя.
Скачать .epf

Что учесть

Как воспользоваться

  1. Выберите вкладку своей конфигурации над кодом: под каждой лежит запрос, выполненный именно в этой конфигурации.
  2. Скачайте обработку под ней и откройте в 1С через "Файл, Открыть". Форма покажет поля отбора, результат появится в той же форме таблицей.
  3. Нужно иначе: скопируйте запрос кнопкой над кодом и подставьте в консоль запросов или в свою обработку. Все параметры перечислены в тексте, значения по умолчанию видны в обработке.
  4. Хотите то же самое, но под свою базу и свои поля: подключите базу к мосту и попросите ИИ доработать этот запрос. Он увидит структуру вашей конфигурации и проверит результат на ваших данных.
Свои задачи таким же способом. Подключение занимает около пятнадцати минут: обработка из кабинета, ключ, готовый текст для ИИ. При регистрации даются три дня работы одной базы, карта не нужна.
Подключить свою базу Другие решения

Комментарии

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