Почему в отчете СКД не выводятся ссылки на присоединенные файлы, хотя в консоли запросов они есть?

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

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

Проблема представления и типа данных в запросе

Первым делом проанализируем, как именно мы выбираем данные в запросе. В консоли запросов платформа автоматически формирует представление для ссылочных типов. В СКД механизм компоновки макета работает иначе. Если мы просто выбираем Файлы.Ссылка, компоновщик может не понять, как именно отобразить этот объект, если у него не задано поле представления или возникли проблемы с правами доступа к конкретным полям справочника.

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


ВЫБРАТЬ
    ДокТовары.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
    Файлы.Ссылка КАК Файл,
    Файлы.Наименование КАК ФайлНаименование
ИЗ
    РегистрНакопления.РегистрПОРезерв КАК РегистрПОРезерв
    ЛЕВОЕ СОЕДИНЕНИЕ Справочник.бит_стр_присоединенныефайлы КАК Файлы
        ПО РегистрПОРезерв.Регистратор = Файлы.ВладелецФайла

В настройках поля СКД на закладке «Наборы данных» для поля Файл обязательно проверим колонку «Выражение представления». Попробуем прописать там Файл.Наименование или ПРЕДСТАВЛЕНИЕ(Файл). Это принудительно заставит компоновщик извлекать текстовое описание объекта.

Работа с составными типами данных и полем Владелец

Одной из скрытых причин отсутствия данных является использование составного типа в поле ВладелецФайла справочника присоединенных файлов. В СКД при левом соединении по составному полю механизм компоновки может отсекать записи, если типы не сопоставлены явно. Выясним причину, используя конструкцию ВЫРАЗИТЬ. Если мы знаем, что владельцем файла в нашем регистре является конкретный тип документа, стоит указать это в условии связи или в полях выбора.

Рассмотрим пример уточнения типа в запросе:


ВЫБРАТЬ
    ВЫРАЗИТЬ(РегистрПОРезерв.Регистратор КАК Документ.ПоступлениеТоваровУслуг) КАК ДокументСсылка,
    Файлы.Ссылка КАК Файл
ИЗ
    РегистрНакопления.РегистрПОРезерв КАК РегистрПОРезерв
    ЛЕВОЕ СОЕДИНЕНИЕ Справочник.бит_стр_присоединенныефайлы КАК Файлы
        ПО (ВЫРАЗИТЬ(РегистрПОРезерв.Регистратор КАК Документ.ПоступлениеТоваровУслуг)) = Файлы.ВладелецФайла

Такой подход помогает оптимизатору запросов СКД правильно построить план выполнения и корректно типизировать соединение на уровне СУБД.

Проверка прав доступа и влияние RLS

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

Использование набора данных «Объект»

Если стандартный запрос в СКД упорно не желает выводить данные, разберем альтернативный и зачастую более надежный способ — передачу заранее подготовленной Таблицы Значений (ТЗ) в СКД. Это гарантирует, что данные, которые мы видим в консоли запросов, попадут в отчет без искажений компоновщика.

Для этого выполним следующие шаги:

  1. В схеме СКД создадим новый «Набор данных - объект». Имя набора данных укажем как ТЗ_Данные.
  2. Добавим в этот набор все необходимые поля, включая Файл с типом СправочникСсылка.бит_стр_присоединенныефайлы.
  3. В модуле отчета напишем код для заполнения этой таблицы и передачи ее в компоновщик.

Посмотрим на пример реализации в коде 1С:


Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    
    // Выполняем запрос вручную
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ ... Файлы.Ссылка КАК Файл ИЗ ...";
    ТаблицаДанных = Запрос.Выполнить().Выгрузить();
    
    // Подготавливаем внешние данные
    ВнешниеНаборыДанных = Новый Структура;
    ВнешниеНаборыДанных.Вставить("ТЗ_Данные", ТаблицаДанных);
    
    // Компонуем результат
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.ПолучитьНастройки(), ДанныеРасшифровки);
    
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных, ДанныеРасшифровки);
    
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
    ПроцессорВывода.Вывести(ПроцессорКомпоновки);
КонецПроцедуры

Настройка типа значения в схеме компоновки

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

Влияние функциональных опций БСП

В конфигурациях на базе БСП присоединенные файлы часто подчиняются функциональным опциям (ФО). Если глобальная опция «Использовать присоединенные файлы» выключена, система может на лету модифицировать запросы СКД, удаляя из них обращения к соответствующим таблицам. Проверим в настройках программы (НСИ и администрирование -> Настройки параметров системы), включена ли работа с файлами. Также выясним, не наложены ли программные фильтры в модуле менеджера отчета, которые могут очищать поля ссылок из соображений безопасности.

Сброс кэша и пересоздание поля

В редких случаях мы можем столкнуться с некорректным кэшированием структуры метаданных в самой схеме СКД. Если вы вносили изменения в справочник файлов (например, меняли его длину кода или наименования), СКД может хранить старые идентификаторы полей. Попробуем радикальный метод: удалим поле Файл из набора данных запроса, сохраним схему, а затем добавим его заново под другим псевдонимом, например СсылкаНаФайл. Это принудительно обновит дерево доступных полей в компоновщике настроек.

Проанализировав все вышеперечисленные шаги, мы можем сделать вывод: проблема пустых колонок в СКД чаще всего кроется не в самом запросе, а в механизмах компоновки типов, правах доступа и специфических настройках БСП. Последовательная проверка каждого уровня — от ВЫРАЗИТЬ в запросе до явного указания Типа значения в наборе данных — позволяет решить задачу вывода присоединенных файлов в 99% случаев.

← На главную