Как вывести строковое представление регистратора в таблицу значений через СКД

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

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

Почему ПРЕДСТАВЛЕНИЕ() в запросе СКД может не работать

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

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

Способ 1. Использование вычисляемых полей

Это наиболее надежный и простой метод, который был предложен в обсуждении. Мы делегируем формирование строки самому процессору компоновки данных. Разберем по шагам, как это настроить:

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

Рассмотрим разницу между выражениями для вычисляемого поля:

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

Способ 2. Настройка выражения представления в наборе данных

Если мы не хотим плодить лишние поля в списке, мы можем модифицировать поведение существующего поля Регистратор. Посмотрим на закладку Наборы данных в конструкторе СКД. У каждого поля есть колонка Выражение представления.

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

Способ 3. Программный вывод СКД в таблицу значений

Чтобы данные действительно попали в таблицу значений, нам нужно правильно написать программный код вызова компоновки. Проанализируем пример кода, который обеспечивает корректное заполнение ТЗ:


// Создаем необходимые объекты для компоновки
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.ПолучитьНастройки(), ДанныеРасшифровки);

ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);

// Создаем таблицу значений для результата
ТаблицаРезультата = Новый ТаблицаЗначений;

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

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

Нюансы производительности и работы с "Объект не найден"

Рассмотрим ситуацию, когда документов в отчете очень много (десятки тысяч). Использование функции Строка() или Представление() внутри СКД заставляет платформу выполнять дополнительные запросы к таблицам этих документов для получения их текстового представления (обычно это "Номер от Дата").

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

  1. В запросе СКД выберите отдельно Регистратор.Номер и Регистратор.Дата.
  2. Добавьте вычисляемое поле, которое собирает строку из этих примитивных типов: "Документ № " + Номер + " от " + Формат(Дата, "ДЛФ=D").

Такой подход будет работать быстрее, так как данные будут получены одним запросом вместе с основными показателями, без обращения к механизму представлений ссылок. Кроме того, это гарантирует 100% отсутствие проблем при передаче данных между разными базами, так как в ТЗ вообще не будет ссылочных типов, только числа, даты и строки.

Итоги

Мы разобрали, что для вывода строкового представления в таблицу значений через СКД лучше всего:

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

← На главную