Как реализовать прикрепление файлов к документам через общий журнал документов в 1С?

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

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

Выясним причину: почему «скрепка» не появляется автоматически?

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

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

Шаг 1. Создание команды на форме журнала

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

Рассмотрим процесс создания команды подробнее:

  1. Откроем форму журнала документов, в которой необходимо реализовать функционал.
  2. Перейдем на закладку Команды и создадим новую команду формы, назовем её, например, ПрисоединенныеФайлыЖурнал.
  3. В свойствах команды установим картинку ОбщаяКартинка.Скрепка. Это обеспечит визуальное соответствие стандартному интерфейсу 1С.
  4. Перетащим созданную команду в командную панель формы. Рекомендуется разместить её рядом с кнопками печати или создания на основании.

Шаг 2. Программная реализация вызова формы файлов

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

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


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

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


&НаКлиенте
Процедура ПрисоединенныеФайлыЖурнал(Команда)
    ТекущиеДанные = Элементы.Список.ТекущиеДанные;
    Если ТекущиеДанные <> Неопределено Тогда
        РаботаСФайламиКлиент.ОткрытьФормуПрисоединенныхФайлов(ТекущиеДанные.Ссылка);
    КонецЕсли;
КонецПроцедуры

Шаг 3. Индикация наличия файлов в списке (иконка скрепки)

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

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

  1. В конструкторе запроса добавим левое соединение с регистром сведений НаличиеФайлов.
  2. Условие связи: ЖурналДокументов.Ссылка = НаличиеФайлов.Объект.
  3. Выберем поле НаличиеФайлов.ЕстьФайлы. Если файлов нет, значение будет NULL, что в интерфейсе трактуется как Ложь.

После изменения запроса вернемся к форме. Добавим колонку ЕстьФайлы в таблицу формы. Чтобы она выглядела как «скрепка», выполним следующие настройки:

Шаг 4. Обработка ситуации с разными типами документов

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

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


&НаКлиенте
Процедура СписокПриАктивацииСтроки(Элемент)
    
    ТекущиеДанные = Элементы.Список.ТекущиеДанные;
    Если ТекущиеДанные = Неопределено Тогда
        Элементы.ФормаПрисоединенныхФайлыЖурнал.Доступность = Ложь;
        Возврат;
    КонецЕсли;
    
    // Проверяем программно через серверный вызов
    Элементы.ФормаПрисоединенныхФайлыЖурнал.Доступность = ПоддерживаетЛиФайлы(ТекущиеДанные.Ссылка);
    
КонецПроцедуры

&НаСервереБезКонтекста
Функция ПоддерживаетЛиФайлы(Ссылка)
    // Используем встроенный метод БСП для проверки метаданных
    Возврат РаботаСФайлами.ПоддерживаетсяРаботаСФайлами(Ссылка);
КонецФункции

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

Итоги

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

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

← На главную