Как открыть прикрепленный файл двойным кликом мышки из отчета 1С?

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

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

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

Разбираем по шагам: как настроить открытие присоединенных файлов

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

1. Понимание механизма расшифровки отчета и данных

Когда пользователь дважды кликает по ячейке отчета, срабатывает обработчик ОбработкаРасшифровки. В этот обработчик передается ИдентификаторРасшифровки, который является уникальным идентификатором для конкретной ячейки или группы ячеек. Важно понимать, что этот идентификатор сам по себе не содержит полных данных или ссылок. Для получения реальных значений полей, включая ссылки на документы, справочники или непосредственно на присоединенные файлы, необходимо использовать объект ДанныеРасшифровки.

Объект ДанныеРасшифровки — это специальный объект, который хранит подробную информацию о каждой ячейке отчета, для которой была разрешена расшифровка. Его необходимо создать и передать в методы Выполнить компоновщика макета и Инициализировать процессора компоновки данных при формировании отчета. Если объект ДанныеРасшифровки не заполнен или в нем нет нужных полей, мы не сможем получить ссылку на владельца или файл.

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

2. Настройка СКД для получения ссылки на владельца файла или сам файл

Для того чтобы при расшифровке мы могли получить ссылку на объект, к которому прикреплены файлы, или непосредственно на сам присоединенный файл, необходимо выполнить следующие действия в схеме компоновки данных:

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

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

    Здесь СсылкаНаДокумент будет являться владельцем, а СсылкаНаПрисоединенныйФайл, если ЗапросПФ - это справочник присоединенных файлов, будет прямой ссылкой на файл. Мы рассмотрим оба варианта использования этих ссылок.

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

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

3. Обработка расшифровки на клиенте

После того как СКД настроена, нам необходимо написать код в обработчике ОбработкаРасшифровки формы отчета. Этот код будет выполняться на клиенте.

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

    
        &НаКлиенте
        Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)
    
            СтандартнаяОбработка = Ложь; // Отменяем стандартную обработку, чтобы выполнять свою логику
    
            // Получаем объект ДанныеРасшифровки из атрибута формы
            // Предполагается, что в форме отчета есть атрибут "ДанныеРасшифровкиОтчета" типа "ДанныеРасшифровкиКомпоновкиДанных"
            Если НЕ ЗначениеЗаполнено(ДанныеРасшифровкиОтчета) Тогда
                Возврат;
            КонецЕсли;
    
            // Получаем поля расшифровки по ИдентификаторуРасшифровки
            ПоляРасшифровки = ДанныеРасшифровкиОтчета.ПолучитьПоля(Расшифровка);
    
            Перем СсылкаНаВладельца;
            Перем СсылкаНаФайл;
    
            Для Каждого Поле Из ПоляРасшифровки Цикл
                Если Поле.Имя = "СсылкаНаДокумент" Тогда // Имя поля, которое мы настроили в СКД как ссылку на владельца
                    СсылкаНаВладельца = Поле.Значение;
                    Продолжить;
                КонецЕсли;
                Если Поле.Имя = "СсылкаНаПрисоединенныйФайл" Тогда // Имя поля, которое мы настроили в СКД как прямую ссылку на присоединенный файл
                    СсылкаНаФайл = Поле.Значение;
                    Продолжить;
                КонецЕсли;
            КонецЦикла;
            // Дальнейшая логика открытия файла или его карточки
            // ...
        Кодбиг>
        

    Обратите внимание, что ПолучитьПоля() возвращает коллекцию всех полей, настроенных для данной области расшифровки. Мы перебираем их, чтобы найти нужную нам ссылку.

4. Открытие присоединенного файла: три основных варианта

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

Вариант А: Открытие формы списка присоединенных файлов для владельца

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

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

    // Продолжение процедуры РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка) // ... Если ЗначениеЗаполнено(СсылкаНаВладельца) Тогда ПараметрыФормы = Новый Структура; ПараметрыФормы.Вставить("ВладелецФайла", СсылкаНаВладельца); // ПараметрыФормы.Вставить("СкрыватьВладельца", Истина); // Можно скрыть поле владельца в форме ОткрытьФорму("Обработка.РаботаСФайлами.Форма.ПрисоединенныеФайлы", ПараметрыФормы); Иначе // Обработка случая, если владелец не найден или нужно открыть что-то другое ПоказатьПредупреждение(, "Не удалось получить ссылку на владельца файлов."); КонецЕсли;

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

Вариант Б: Открытие карточки конкретного присоединенного файла

Этот вариант применяется, если в расшифровку попала прямая ссылка на элемент справочника ПрисоединенныеФайлы (например, Справочник.ПрисоединенныеФайлы.ВашДокумент_ПрисоединенныеФайлы). В этом случае мы можем открыть карточку конкретного файла.

  1. Использование ПоказатьЗначение: Для открытия карточки элемента справочника используем глобальную функцию ПоказатьЗначение.

    
    // Продолжение процедуры РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)
    // ...
    Если ЗначениеЗаполнено(СсылкаНаФайл) Тогда
        ПоказатьЗначение(, СсылкаНаФайл);
    ИначеЕсли ЗначениеЗаполнено(СсылкаНаВладельца) Тогда
        // Если прямой ссылки на файл нет, но есть ссылка на владельца,
        // открываем форму списка файлов для владельца
        ПараметрыФормы = Новый Структура;
        ПараметмыФормы.Вставить("ВладелецФайла", СсылкаНаВладельца);
        ОткрытьФорму("Обработка.РаботаСФайлами.Форма.ПрисоединенныеФайлы", ПараметрыФормы);
    Иначе
        ПоказатьПредупреждение(, "Не удалось получить ссылку ни на файл, ни на владельца.");
    КонецЕсли;
    

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

Вариант В: Программное открытие самого файла во внешней программе

Если требуется не просто открыть карточку или список, а непосредственно запустить файл во внешней программе (например, PDF-редакторе, MS Word и т.п.), нам потребуется более сложный подход с использованием функционала Библиотеки стандартных подсистем (БСП) для работы с файлами и асинхронного взаимодействия.

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

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

    Этот подход требует больше кода, так как он асинхронный и предполагает создание отдельной процедуры-колбэка. Также необходимо обеспечить наличие модуля РаботаСФайламиКлиент в вашей конфигурации (часть БСП).

Важные моменты и рекомендации

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

← На главную