Как найти и понять происхождение полей типа «ПользовательскиеПоляПоле1» в 1С СКД?

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

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

Загадка неожиданных полей в результатах СКД

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

  1. Создаем компоновщик макета и выполняем компоновку схемы данных.
  2. Инициализируем процессор компоновки.
  3. Выводим результат компоновки в коллекцию значений (ДеревоЗначений или ТаблицаЗначений) с помощью ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений.

Вот фрагмент кода, демонстрирующий эти шаги:


КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(ЭтотОбъект.СхемаКомпоновкиДанных, НастройкиОтчета,,, Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
        
ПараметрыПолученияДанных = УчетРабочегоВремени.ПараметрыПолученияДанныхУчетаВремени();
ПараметрыПолученияДанных.ДатаНачала = "ДатаНачала";
ПараметрыПолученияДанных.ДатаОкончания = "ДатаОкончания";
        
УчетРабочегоВремени.ПолученияДанныхУчетаВремениПослеКомпоновкиМакета(МакетКомпоновки.НаборыДанных.ДанныеОВремени, ПараметрыПолученияДанных);
        
// Создадим и инициализируем процессор компоновки.
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , , Истина);
        
ДанныеОВремени = Новый ДеревоЗначений;
        
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
ПроцессорВывода.УстановитьОбъект(ДанныеОВремени);    
        
// Обозначим начало вывода
ПроцессорВывода.Вывести(ПроцессорКомпоновки, Истина);

После выполнения последней строки ПроцессорВывода.Вывести(ПроцессорКомпоновки, Истина), при просмотре объекта ДанныеОВремени в отладчике, мы обнаруживаем, что в нем появились колонки с именами, например, ПользовательскиеПоляПоле1, ПользовательскиеПоляПоле2 и так далее, вплоть до ПользовательскиеПоляПоле12. Естественным первым шагом является попытка найти эти поля:

  1. Мы проверяем текст запроса в МакетКомпоновки.НаборыДанных.ДанныеОВремени.Запрос – таких полей там нет.
  2. Мы открываем схему компоновки данных в конфигураторе и переходим на вкладку «Пользовательские поля» – и там их тоже нет с такими явными именами.

Возникает логичный вопрос: откуда же берутся эти поля?

Разгадка: Пользовательские поля без явного «Пути к данным»

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

Разберем подробнее этот механизм:

  1. Что такое «Пользовательские поля»?

    На вкладке «Пользовательские поля» в схеме компоновки данных вы можете создавать произвольные вычисляемые поля, которые не берутся напрямую из источника данных (запроса), а формируются на основе выражений. Эти поля могут быть:

    • Полями-выражениями: Например, СУММА(Поле1) / СУММА(Поле2).
    • Полями-выбора: Например, ВЫБОР КОГДА Поле1 > 100 ТОГДА "Много" ИНАЧЕ "Мало" КОНЕЦ.
  2. Роль свойства «Путь к данным».

    У каждого поля в СКД, включая пользовательские, есть свойство «Путь к данным». Это свойство является внутренним идентификатором поля, который используется для обращения к нему в других выражениях, в программном коде или для формирования структуры результирующих данных. Например, если вы хотите сгруппировать отчет по этому полю или использовать его в выражении другого пользовательского поля, вы будете обращаться к нему по его «Пути к данным».

  3. Автоматическое именование.

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

  4. «Путь к данным» против «Заголовка».

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

Как найти источник таких полей в СКД?

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

  1. Проверка вкладки «Пользовательские поля» в конфигураторе.

    Откройте схему компоновки данных вашего отчета в конфигураторе. Перейдите на вкладку «Пользовательские поля». Внимательно просмотрите все поля в списке. Обратите внимание на колонку «Путь к данным». Если вы видите поля, у которых «Путь к данным» пуст, но при этом заполнено «Выражение» или «Заголовок», скорее всего, именно они и порождают колонки типа ПользовательскиеПоляПолеN в вашей результирующей коллекции.

    Порядок, в котором поля ПользовательскиеПоляПолеN появляются в отладчике, как правило, соответствует порядку их определения на вкладке «Пользовательские поля» или порядку их программного добавления в коллекцию СхемаКомпоновкиДанных.ПользовательскиеПоля.

  2. Анализ программного создания пользовательских полей.

    Если ваша схема компоновки данных формируется или модифицируется программно, вам следует искать код, который добавляет пользовательские поля. Используется метод СхемаКомпоновкиДанных.ПользовательскиеПоля.Добавить(). Пример:

    
    Поле = ЭтотОбъект.СхемаКомпоновкиДанных.ПользовательскиеПоля.Добавить(Тип("ПолеСхемыКомпоновкиДанных"));
    Поле.Поле = "МоеПоле"; // Это и есть "Путь к данным"
    Поле.Заголовок = "Мое вычисляемое поле";
    Поле.Выражение = "СУММА(ПолеИзЗапроса) * 2";
    

    Если в аналогичном коде свойство Поле.Поле (которое соответствует «Пути к данным») не заполняется, то система сама присвоит ему имя вида ПользовательскиеПоля.ПолеN. Проанализируйте все места, где добавляются пользовательские поля, и убедитесь, что «Путь к данным» задан явно, если вы ожидаете конкретное имя колонки в результате.

  3. Использование отладчика для сопоставления.

    Когда вы дошли до строки ПроцессорВывода.Вывести(ПроцессорКомпоновки, Истина); и у вас есть список полей ПользовательскиеПоляПоле1, ПользовательскиеПоляПоле2 и т.д., вы можете попытаться сопоставить их с пользовательскими полями вашей СКД. Для этого:

    1. Зайдите в отладчике в объект МакетКомпоновки, затем в МакетКомпоновки.НаборыДанных.ДанныеОВремени.
    2. Изучите коллекцию МакетКомпоновки.НаборыДанных.ДанныеОВремени.Поля или МакетКомпоновки.ПользовательскиеПоля. Там вы увидите полную структуру полей, включая те, что получили автоматические имена, и сможете найти их выражения или заголовки, чтобы понять, что это за данные.

Практические рекомендации и заключение

Появление полей с автоматически сгенерированными именами вроде ПользовательскиеПоляПолеN – это не ошибка, а особенность работы СКД, позволяющая создавать гибкие отчеты даже без явного указания всех внутренних идентификаторов. Однако для большей ясности и удобства работы, особенно при программной обработке результатов, мы рекомендуем всегда явно указывать «Путь к данным» для всех пользовательских полей.

Когда вы задаете «Путь к данным», вы получаете предсказуемые имена колонок в результирующих коллекциях, что упрощает отладку, дальнейшую обработку данных и поддержку кода. Например, вместо обращения к ДанныеОВремени.ПользовательскиеПоляПоле1 вы сможете обратиться к ДанныеОВремени.МоеВычисляемоеПоле, что гораздо понятнее и устойчивее к изменениям в схеме СКД.

Таким образом, если вы столкнулись с загадочными полями ПользовательскиеПоляПолеN, всегда в первую очередь обращайтесь к вкладке «Пользовательские поля» вашей схемы компоновки данных и ищите поля, у которых не задан «Путь к данным». Это позволит вам быстро идентифицировать их происхождение и при необходимости внести коррективы.

← На главную