При программном формировании отчетов в Системе Компоновки Данных (СКД) разработчики часто сталкиваются с ситуацией, когда в результирующей коллекции значений (например, ДеревоЗначений или ТаблицаЗначений) появляются колонки с неожиданными именами, такими как ПользовательскиеПоляПоле1, ПользовательскиеПоляПоле2 и так далее. Это может вызвать замешательство, поскольку такие поля не всегда явно видны в запросе схемы компоновки данных или на вкладке «Пользовательские поля» с очевидными наименованиями. Давайте подробно разберем, откуда берутся эти поля и как их идентифицировать.
Представим типовую ситуацию, с которой столкнулся наш коллега. Мы программно формируем отчет на базе СКД, используя стандартные объекты для компоновки и вывода данных:
ДеревоЗначений или ТаблицаЗначений) с помощью ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений.Вот фрагмент кода, демонстрирующий эти шаги:
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(ЭтотОбъект.СхемаКомпоновкиДанных, НастройкиОтчета,,, Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
ПараметрыПолученияДанных = УчетРабочегоВремени.ПараметрыПолученияДанныхУчетаВремени();
ПараметрыПолученияДанных.ДатаНачала = "ДатаНачала";
ПараметрыПолученияДанных.ДатаОкончания = "ДатаОкончания";
УчетРабочегоВремени.ПолученияДанныхУчетаВремениПослеКомпоновкиМакета(МакетКомпоновки.НаборыДанных.ДанныеОВремени, ПараметрыПолученияДанных);
// Создадим и инициализируем процессор компоновки.
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , , Истина);
ДанныеОВремени = Новый ДеревоЗначений;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
ПроцессорВывода.УстановитьОбъект(ДанныеОВремени);
// Обозначим начало вывода
ПроцессорВывода.Вывести(ПроцессорКомпоновки, Истина);
После выполнения последней строки ПроцессорВывода.Вывести(ПроцессорКомпоновки, Истина), при просмотре объекта ДанныеОВремени в отладчике, мы обнаруживаем, что в нем появились колонки с именами, например, ПользовательскиеПоляПоле1, ПользовательскиеПоляПоле2 и так далее, вплоть до ПользовательскиеПоляПоле12. Естественным первым шагом является попытка найти эти поля:
МакетКомпоновки.НаборыДанных.ДанныеОВремени.Запрос – таких полей там нет.Возникает логичный вопрос: откуда же берутся эти поля?
Ключ к разгадке этой ситуации кроется в работе с пользовательскими полями в СКД. Поля, которые отображаются в отладчике как ПользовательскиеПоляПоле1, ПользовательскиеПоляПоле2 и т.п., являются именно теми «Пользовательскими полями», которые были созданы в вашей схеме компоновки данных. Однако для них не был указан явный «Путь к данным».
Разберем подробнее этот механизм:
На вкладке «Пользовательские поля» в схеме компоновки данных вы можете создавать произвольные вычисляемые поля, которые не берутся напрямую из источника данных (запроса), а формируются на основе выражений. Эти поля могут быть:
СУММА(Поле1) / СУММА(Поле2).ВЫБОР КОГДА Поле1 > 100 ТОГДА "Много" ИНАЧЕ "Мало" КОНЕЦ.У каждого поля в СКД, включая пользовательские, есть свойство «Путь к данным». Это свойство является внутренним идентификатором поля, который используется для обращения к нему в других выражениях, в программном коде или для формирования структуры результирующих данных. Например, если вы хотите сгруппировать отчет по этому полю или использовать его в выражении другого пользовательского поля, вы будете обращаться к нему по его «Пути к данным».
Если для пользовательского поля свойство «Путь к данным» не заполнено (оставлено пустым) ни в конфигураторе, ни программно, система 1С:Предприятие автоматически присваивает ему внутренний идентификатор. Для русскоязычного варианта встроенного языка эти идентификаторы формируются по шаблону ПользовательскиеПоля.ПолеN, где N – это уникальный порядковый номер поля, присваиваемый системой. Именно эти внутренние имена (возможно, без точки, например, ПользовательскиеПоляПолеN) вы и видите в колонках результирующей коллекции значений.
Важно различать «Путь к данным» и «Заголовок» поля. «Заголовок» – это то наименование, которое видит пользователь в отчете (например, «Итоговая сумма», «Статус»). «Путь к данным» – это техническое имя, используемое для внутреннего обращения к полю и его идентификации в структуре данных. Если «Заголовок» задан, но «Путь к данным» пуст, в итоговом ДеревеЗначений или ТаблицеЗначений колонка будет иметь автоматически сгенерированное имя ПользовательскиеПоляПолеN, а не заголовок.
Теперь, когда мы понимаем причину появления таких полей, давайте разберем, как их обнаружить и идентифицировать в вашей схеме компоновки данных.
Откройте схему компоновки данных вашего отчета в конфигураторе. Перейдите на вкладку «Пользовательские поля». Внимательно просмотрите все поля в списке. Обратите внимание на колонку «Путь к данным». Если вы видите поля, у которых «Путь к данным» пуст, но при этом заполнено «Выражение» или «Заголовок», скорее всего, именно они и порождают колонки типа ПользовательскиеПоляПолеN в вашей результирующей коллекции.
Порядок, в котором поля ПользовательскиеПоляПолеN появляются в отладчике, как правило, соответствует порядку их определения на вкладке «Пользовательские поля» или порядку их программного добавления в коллекцию СхемаКомпоновкиДанных.ПользовательскиеПоля.
Если ваша схема компоновки данных формируется или модифицируется программно, вам следует искать код, который добавляет пользовательские поля. Используется метод СхемаКомпоновкиДанных.ПользовательскиеПоля.Добавить(). Пример:
Поле = ЭтотОбъект.СхемаКомпоновкиДанных.ПользовательскиеПоля.Добавить(Тип("ПолеСхемыКомпоновкиДанных"));
Поле.Поле = "МоеПоле"; // Это и есть "Путь к данным"
Поле.Заголовок = "Мое вычисляемое поле";
Поле.Выражение = "СУММА(ПолеИзЗапроса) * 2";
Если в аналогичном коде свойство Поле.Поле (которое соответствует «Пути к данным») не заполняется, то система сама присвоит ему имя вида ПользовательскиеПоля.ПолеN. Проанализируйте все места, где добавляются пользовательские поля, и убедитесь, что «Путь к данным» задан явно, если вы ожидаете конкретное имя колонки в результате.
Когда вы дошли до строки ПроцессорВывода.Вывести(ПроцессорКомпоновки, Истина); и у вас есть список полей ПользовательскиеПоляПоле1, ПользовательскиеПоляПоле2 и т.д., вы можете попытаться сопоставить их с пользовательскими полями вашей СКД. Для этого:
МакетКомпоновки, затем в МакетКомпоновки.НаборыДанных.ДанныеОВремени.МакетКомпоновки.НаборыДанных.ДанныеОВремени.Поля или МакетКомпоновки.ПользовательскиеПоля. Там вы увидите полную структуру полей, включая те, что получили автоматические имена, и сможете найти их выражения или заголовки, чтобы понять, что это за данные.Появление полей с автоматически сгенерированными именами вроде ПользовательскиеПоляПолеN – это не ошибка, а особенность работы СКД, позволяющая создавать гибкие отчеты даже без явного указания всех внутренних идентификаторов. Однако для большей ясности и удобства работы, особенно при программной обработке результатов, мы рекомендуем всегда явно указывать «Путь к данным» для всех пользовательских полей.
Когда вы задаете «Путь к данным», вы получаете предсказуемые имена колонок в результирующих коллекциях, что упрощает отладку, дальнейшую обработку данных и поддержку кода. Например, вместо обращения к ДанныеОВремени.ПользовательскиеПоляПоле1 вы сможете обратиться к ДанныеОВремени.МоеВычисляемоеПоле, что гораздо понятнее и устойчивее к изменениям в схеме СКД.
Таким образом, если вы столкнулись с загадочными полями ПользовательскиеПоляПолеN, всегда в первую очередь обращайтесь к вкладке «Пользовательские поля» вашей схемы компоновки данных и ищите поля, у которых не задан «Путь к данным». Это позволит вам быстро идентифицировать их происхождение и при необходимости внести коррективы.