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