При работе с типовыми отчетами в 1С ЗУП КОРП, мы можем столкнуться с ситуацией, когда после доработки и вывода новой колонки с числовыми данными, например, «Необходимо человек», по ней не считаются итоги. Более того, попытки вывести итоги через пользовательские выражения могут приводить к несовпадению значений. Эта проблема возникает потому, что изначально поле «Необходимо человек» не является ресурсом в системе компоновки данных (СКД).
Давайте подробно разберем, почему возникает такая ситуация и как мы можем ее эффективно решить, используя возможности СКД.
В системе 1С СКД, поле считается ресурсом, если его значения предназначены для агрегации, то есть для расчета итоговых значений (сумма, среднее, максимум, минимум и т.д.) по группировкам. Когда мы создаем схему компоновки данных, мы явно указываем, какие поля являются ресурсами на отдельной закладке «Ресурсы» в конструкторе СКД. Для каждого ресурса задается выражение, по которому будет производиться расчет (например, Сумма(Поле)), а также, при необходимости, для каких именно группировок этот ресурс должен быть доступен. Если поле не добавлено в список ресурсов, СКД не будет автоматически выполнять по нему никаких агрегатных функций, и мы не увидим итогов.
Когда мы пытаемся вывести такое поле через пользовательские выражения и получаем другие цифры, это часто связано с логикой построения запроса СКД. Например, при использовании левых соединений (ЛЕВОЕ СОЕДИНЕНИЕ) в запросе, данные для детальных записей могут задваиваться или затраиваться, если ресурс неверно настроен. В результате, простое суммирование значений в пользовательском выражении может дать некорректный результат, так как оно будет суммировать повторяющиеся строки.
Наиболее правильным и надежным способом является явное указание нашего поля НеобходимоЧеловек как ресурса в схеме компоновки данных отчета. Этот подход гарантирует, что СКД будет корректно агрегировать данные в соответствии с настройками.
НеобходимоЧеловек в этот список.Сумма(НеобходимоЧеловек). Это ключевой момент, который указывает СКД, как именно следует агрегировать данные по этому полю.После выполнения этих шагов, сохраняем изменения в схеме компоновки данных. При формировании отчета СКД автоматически посчитает и выведет корректные итоги по колонке НеобходимоЧеловек для всех заданных группировок.
Если мы не хотим или не имеем возможности изменять типовую схему компоновки данных отчета напрямую в конфигураторе, или же нам нужен более гибкий подход, мы можем использовать пользовательские поля, которые создаются непосредственно в режиме 1С:Предприятие или через программное формирование настроек СКД. Здесь важно понимать различие между выражением детальных записей и выражением итоговых записей.
НеобходимоЧеловек.Сумма(НеобходимоЧеловек). Именно это выражение СКД будет использовать для расчета итогов по группировкам.Этот подход позволяет нам гибко управлять отображением значений: в детальных записях может выводиться исходное значение поля, а в итоговых – его сумма.
Если, несмотря на наши усилия, при использовании пользовательского выражения значения итогов все равно не совпадают, нам следует проанализировать следующие моменты:
Сумма(), Среднее(), Максимум(), Минимум()) с указанием нашего поля. Простое повторение поля или сложной формулы без агрегации не даст нужного результата.Сумма(Различные НеобходимоЧеловек) или Сумма(Выбор Когда ... Тогда НеобходимоЧеловек Иначе 0 Конец), чтобы исключить дублирование.В некоторых случаях, когда нам требуется максимальная гибкость, поля и ресурсы могут быть добавлены в СКД программно, например, в модуле объекта отчета в процедуре ПриКомпоновкеРезультата. Этот подход позволяет динамически настраивать поля и их агрегацию в зависимости от условий или параметров отчета. Однако это требует более глубоких знаний программирования в 1С.
// Пример программного добавления ресурса (упрощенно)
КомпоновщикНастроек.Настройки.Поля.Добавить(Тип("ПолеКомпоновкиДанных"));
КомпоновщикНастроек.Настройки.Поля[0].Поле = Новый ПолеКомпоновкиДанных("НеобходимоЧеловек");
// Добавление ресурса
Ресурс = КомпоновщикНастроек.Настройки.Ресурсы.Добавить();
Ресурс.Поле = Новый ПолеКомпоновкиДанных("НеобходимоЧеловек");
Ресурс.Выражение = "Сумма(НеобходимоЧеловек)";
// Если нужно, указать, по каким группировкам считать:
// Ресурс.ВыражениеИтогов = "Сумма(НеобходимоЧеловек) ПО ОбщиеИтоги, Заявка";
Такой подход позволяет формировать схему СКД, включая ресурсы и их выражения, прямо в коде, что удобно для сложных и динамических отчетов.
Если наша колонка НеобходимоЧеловек является полем-характеристикой (дополнительным реквизитом или сведением), для вывода итога по ней также применимы описанные выше методы. Мы можем либо явно добавить ее как ресурс в СКД с выражением Сумма(ЗначениеХарактеристики), либо создать пользовательское поле и настроить для него выражение итога.
Для полей-характеристик особенно важно внимательно проверять запрос, чтобы избежать дублирования строк, так как они часто хранятся в отдельных регистрах сведений и присоединяются к основным данным через левые соединения.
Таким образом, для успешного решения проблемы с подсчетом итогов по колонке НеобходимоЧеловек, которая не является ресурсом, мы должны либо явным образом сделать это поле ресурсом в конструкторе СКД, указав для него функцию Сумма(НеобходимоЧеловек), либо использовать пользовательское поле с отдельно заданным выражением для итоговых записей, например, Сумма(НеобходимоЧеловек). В случае возникновения неверных значений, нам следует внимательно проверить логику выражений и настройку агрегации по группам, а также структуру запроса, лежащего в основе схемы компоновки данных.