Как подсчитать итоги по колонке, значение которой не является ресурсом, в отчете 1С ЗУП КОРП?

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

При работе с типовыми отчетами в 1С ЗУП КОРП, мы можем столкнуться с ситуацией, когда после доработки и вывода новой колонки с числовыми данными, например, «Необходимо человек», по ней не считаются итоги. Более того, попытки вывести итоги через пользовательские выражения могут приводить к несовпадению значений. Эта проблема возникает потому, что изначально поле «Необходимо человек» не является ресурсом в системе компоновки данных (СКД).

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

Почему поле не является ресурсом и что это означает для итогов?

В системе 1С СКД, поле считается ресурсом, если его значения предназначены для агрегации, то есть для расчета итоговых значений (сумма, среднее, максимум, минимум и т.д.) по группировкам. Когда мы создаем схему компоновки данных, мы явно указываем, какие поля являются ресурсами на отдельной закладке «Ресурсы» в конструкторе СКД. Для каждого ресурса задается выражение, по которому будет производиться расчет (например, Сумма(Поле)), а также, при необходимости, для каких именно группировок этот ресурс должен быть доступен. Если поле не добавлено в список ресурсов, СКД не будет автоматически выполнять по нему никаких агрегатных функций, и мы не увидим итогов.

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

Решение 1: Превращаем поле в ресурс в конструкторе СКД

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

  1. Открываем схему компоновки данных: Для начала нам нужно открыть схему компоновки данных нашего отчета в режиме конфигуратора. Обычно это делается через объект «Отчет» в дереве конфигурации.
  2. Переходим на вкладку «Ресурсы»: В конструкторе схемы компоновки данных мы найдем несколько закладок: «Наборы данных», «Поля», «Параметры», «Ресурсы» и другие. Нам нужна закладка «Ресурсы».
  3. Добавляем новое поле в ресурсы: На этой закладке мы увидим список уже существующих ресурсов. Мы добавляем наше поле НеобходимоЧеловек в этот список.
  4. Указываем выражение для расчета итога: Для нового ресурса в колонке «Выражение» нам необходимо явно указать функцию агрегации. В нашем случае, для подсчета суммы, мы пропишем Сумма(НеобходимоЧеловек). Это ключевой момент, который указывает СКД, как именно следует агрегировать данные по этому полю.
  5. Настраиваем расчет по группировкам (опционально): В колонке «Рассчитывать по...» мы можем указать, для каких именно группировок должен рассчитываться этот ресурс. Если мы оставим это поле пустым, ресурс будет рассчитываться для всех группировок по умолчанию. В нашем сценарии, скорее всего, нам нужно, чтобы итоги считались по группировке «Заявка», поэтому мы можем выбрать ее.

После выполнения этих шагов, сохраняем изменения в схеме компоновки данных. При формировании отчета СКД автоматически посчитает и выведет корректные итоги по колонке НеобходимоЧеловек для всех заданных группировок.

Решение 2: Используем пользовательские поля с настроенным выражением итоговых записей

Если мы не хотим или не имеем возможности изменять типовую схему компоновки данных отчета напрямую в конфигураторе, или же нам нужен более гибкий подход, мы можем использовать пользовательские поля, которые создаются непосредственно в режиме 1С:Предприятие или через программное формирование настроек СКД. Здесь важно понимать различие между выражением детальных записей и выражением итоговых записей.

  1. Создаем пользовательское поле: В настройках отчета (обычно доступно через кнопку «Настройки» или «Еще» -> «Изменить вариант отчета») мы переходим на вкладку «Пользовательские поля» или «Вычисляемые поля». Здесь мы создаем новое вычисляемое поле.
  2. Определяем выражение детальных записей: В поле «Выражение детальных записей» мы указываем, как должно отображаться значение нашего поля для каждой отдельной строки отчета. В нашем случае, это будет просто само поле: НеобходимоЧеловек.
  3. Определяем выражение итоговых записей: Самое важное – это поле «Выражение итоговых записей». Здесь мы явно прописываем агрегатную функцию для подсчета итогов. Для нашего поля это будет Сумма(НеобходимоЧеловек). Именно это выражение СКД будет использовать для расчета итогов по группировкам.
  4. Добавляем поле в выбранные поля: После создания пользовательского поля, мы добавляем его в список выбранных полей отчета, чтобы оно отображалось в колонках.
  5. Настраиваем вывод ресурса только в итогах (опционально): В СКД мы также можем настроить вывод ресурса таким образом, чтобы он отображался только в итоговых строках, а не для каждой детальной записи. Это делается с помощью функции «Итоги по» в настройках поля, где можно выбрать, показывать ли детальные записи, итоги или и то, и другое.

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

Причины расхождения значений при использовании пользовательских выражений для итогов

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

  1. Некорректная настройка выражений: Убедитесь, что в «Выражении итоговых записей» мы используем именно агрегатную функцию (например, Сумма(), Среднее(), Максимум(), Минимум()) с указанием нашего поля. Простое повторение поля или сложной формулы без агрегации не даст нужного результата.
  2. Проблемы с запросом СКД: Как уже упоминалось, одной из частых причин неверных итогов являются дублирующиеся строки в выборке данных. Если запрос, лежащий в основе СКД, содержит левые соединения, которые могут задваивать данные (например, когда одна «Заявка» связана с несколькими «Кандидатами», но поле «Необходимо человек» относится к самой «Заявке»), то простое суммирование приведет к завышенным значениям. В таком случае нам нужно будет пересмотреть запрос набора данных или использовать более сложные выражения для ресурсов, например, Сумма(Различные НеобходимоЧеловек) или Сумма(Выбор Когда ... Тогда НеобходимоЧеловек Иначе 0 Конец), чтобы исключить дублирование.
  3. Неверно выбранные группировки для расчета: Убедитесь, что ресурс или пользовательское поле настроены для расчета по тем группировкам, по которым мы ожидаем увидеть итоги. В настройках ресурса (в конфигураторе) или в настройках отчета (в пользовательском режиме) мы можем явно указать, по каким группировкам СКД должна считать итоги.

Дополнительные аспекты и советы

Программное добавление полей и ресурсов

В некоторых случаях, когда нам требуется максимальная гибкость, поля и ресурсы могут быть добавлены в СКД программно, например, в модуле объекта отчета в процедуре ПриКомпоновкеРезультата. Этот подход позволяет динамически настраивать поля и их агрегацию в зависимости от условий или параметров отчета. Однако это требует более глубоких знаний программирования в 1С.


// Пример программного добавления ресурса (упрощенно)
КомпоновщикНастроек.Настройки.Поля.Добавить(Тип("ПолеКомпоновкиДанных"));
КомпоновщикНастроек.Настройки.Поля[0].Поле = Новый ПолеКомпоновкиДанных("НеобходимоЧеловек");

// Добавление ресурса
Ресурс = КомпоновщикНастроек.Настройки.Ресурсы.Добавить();
Ресурс.Поле = Новый ПолеКомпоновкиДанных("НеобходимоЧеловек");
Ресурс.Выражение = "Сумма(НеобходимоЧеловек)";
// Если нужно, указать, по каким группировкам считать:
// Ресурс.ВыражениеИтогов = "Сумма(НеобходимоЧеловек) ПО ОбщиеИтоги, Заявка";

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

Особенности для полей-характеристик

Если наша колонка НеобходимоЧеловек является полем-характеристикой (дополнительным реквизитом или сведением), для вывода итога по ней также применимы описанные выше методы. Мы можем либо явно добавить ее как ресурс в СКД с выражением Сумма(ЗначениеХарактеристики), либо создать пользовательское поле и настроить для него выражение итога.

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

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

← На главную