Как распределить месячный показатель по неделям в СКД и исправить ошибку «Поле не найдено»

Программист 1С v8.3 (Управляемые формы) Управленческий учет IT и автоматизация бизнеса
← На главную

При разработке отчетов в Системе компоновки данных (СКД) часто возникает необходимость пропорционально распределить плановые показатели за месяц по неделям в зависимости от количества календарных дней. Например, если в первой неделе месяца всего 4 календарных дня, а во второй — 7, месячный план должен делиться соответственно количеству дней, попавших в конкретную неделю.

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

Анализ ошибки «Поле не найдено» при работе с временными таблицами в СКД

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

Однако при попытке сформировать отчет система выдает ошибку вида:

Ошибка компоновки макета / Поле не найдено "ДнейНедели"

Выясним причину этой проблемы. Ошибка возникает из-за особенностей работы языкового процессора СКД с пакетными запросами:

  1. Если в тексте запроса набора данных используется инструкция ПОМЕСТИТЬ для создания временной таблицы и при этом отсутствует финальный выбор данных через оператор ВЫБРАТЬ, СКД не может определить доступные поля выборки.
  2. Система компоновки данных анализирует только последний итоговый запрос пакета. Если временная таблица была помещена, но не выбрана в результирующей выборке, поля из такой таблицы становятся недоступны для схемы компоновки.

Для исправления ошибки достаточно убрать ключевое слово ПОМЕСТИТЬ из запроса набора данных или дописать итоговый выбор из созданной временной таблицы:


// Неправильно для набора данных СКД:
ВЫБРАТЬ
	Даты.Дата КАК Дата,
	НЕДЕЛЯ(Даты.Дата) КАК НомерНедели
ПОМЕСТИТЬ ВТ_Даты
ИЗ
	...

// Правильно:
ВЫБРАТЬ
	Даты.Дата КАК Дата,
	НЕДЕЛЯ(Даты.Дата) КАК НомерНедели
ИЗ
	...

Способ 1. Расчет количества дней недели в рамках месяца прямо в запросе

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

Разберем логику по шагам:

  1. Определяем начальную дату пересечения недели и месяца: если начало недели раньше начала месяца, берем начало месяца, иначе — начало недели.
  2. Определяем конечную дату пересечения: если конец недели позже конца месяца, берем конец месяца, иначе — конец недели.
  3. Рассчитываем разницу в днях между полученными датами и добавляем единицу.

Посмотрим на пример реализации выражения на языке запросов 1С:


ВЫБРАТЬ
	ПродажиПланы.Период КАК Период,
	ПродажиПланы.ПланСумма КАК ПланСумма,
	РАЗНОСТЬДАТ(
		ВЫБОР
			КОГДА НАЧАЛОПЕРИОДА(ПродажиПланы.Период, НЕДЕЛЯ) < НАЧАЛОПЕРИОДА(ПродажиПланы.Период, МЕСЯЦ)
				ТОГДА НАЧАЛОПЕРИОДА(ПродажиПланы.Период, МЕСЯЦ)
			ИНАЧЕ НАЧАЛОПЕРИОДА(ПродажиПланы.Период, НЕДЕЛЯ)
		КОНЕЦ,
		ВЫБОР
			КОГДА КОНЕЦПЕРИОДА(ПродажиПланы.Период, НЕДЕЛЯ) > КОНЕЦПЕРИОДА(ПродажиПланы.Период, МЕСЯЦ)
				ТОГДА КОНЕЦПЕРИОДА(ПродажиПланы.Период, МЕСЯЦ)
			ИНАЧЕ КОНЕЦПЕРИОДА(ПродажиПланы.Период, НЕДЕЛЯ)
		КОНЕЦ,
		ДЕНЬ
	) + 1 КАК КоличествоДнейВНеделе
ИЗ
	РегистрСведений.ПродажиПланы КАК ПродажиПланы

Способ 2. Распределение показателя с использованием языка выражений СКД

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

Для этого применяется функция ВычислитьВыражение, которая позволяет получить значение ресурса вышестоящей группировки (в данном случае — сумму дней за весь месяц):


Сумма(ПлановаяВеличина) * Сумма(КоличествоДнейВНеделе) / ВычислитьВыражение("Сумма(КоличествоДнейВНеделе)", "ПериодМесяц")

Проанализируем работу данного выражения:

Особенности округления и списания погрешности

При пропорциональном делении сумм с округлением до копеек или целых единиц может возникать суммовая погрешность (расхождение итогов на 1–2 копейки). Обратите внимание на следующие нюансы:

← На главную