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