Как добавить кнопку "Присоединенные файлы" к документу "Путевые Листы" в 1С с использованием расширения?

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

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

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

Понимание механизма "Присоединенные файлы" БСП

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

  1. Определяемые типы: Это набор типов метаданных, которые могут быть владельцами файлов или самими файлами. Например, ОпределяемыйТип.ВладелецПрисоединенныхФайлов включает в себя ссылки на все объекты, к которым можно прикрепить файлы (Документы, Справочники и т.д.). А ОпределяемыйТип.ПрисоединенныйФайл и ОпределяемыйТип.ПрисоединенныйФайлОбъект включают ссылки на справочники, которые непосредственно хранят информацию о присоединенных файлах для каждого владельца.
  2. Справочники для хранения файлов: Для каждого типа объекта, к которому нужно прикреплять файлы, создается отдельный справочник, например, АвансовыйОтчетПрисоединенныеФайлы. В нем хранится информация о файле (имя, размер, дата создания, автор) и самое главное – ссылка на объект-владелец через реквизит ВладелецФайла.
  3. Регистр сведений "Двоичные данные файлов": Сами двоичные данные файлов (их содержимое) хранятся в этом регистре сведений или в томах на диске. Связь с элементами справочников присоединенных файлов осуществляется через реквизит Файл данного регистра, тип которого должен включать в себя все справочники присоединенных файлов (через ОпределяемыйТип.ПрисоединенныйФайл).
  4. Общие команды и модули: За отображение кнопки, вызов форм добавления/просмотра файлов и основную логику работы с файлами отвечают общие команды (например, ПФ_ПрисоединенныеФайлы) и общие модули (например, РаботаСФайлами).

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

Ограничения расширений и эволюция их возможностей

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

Однако, начиная с версии платформы 1С:Предприятие 8.3.20, эта ситуация значительно улучшилась. Разработчики добавили возможность расширять состав ОпределяемыхТипов из расширений. Это критически важное изменение, которое делает интеграцию подсистем БСП с новыми объектами в расширениях гораздо более "кошерной" и менее трудоемкой. Если вы используете платформу более ранней версии, то вам придется прибегать к более сложным методам, которые мы также кратко рассмотрим.

Пошаговое решение: добавление кнопки "Присоединенные файлы" к документу "Путевые Листы" в расширении (для платформы 8.3.20 и выше)

Предположим, у нас есть документ Документ.ПутевыеЛисты, созданный в расширении или существующий в основной конфигурации, к которому мы хотим добавить функционал прикрепленных файлов. Рассмотрим подробнее, какие шаги нам необходимо выполнить.

Шаг 1: Создание справочника для хранения присоединенных файлов документа

Сначала нам потребуется создать в расширении новый справочник, который будет хранить метаданные о файлах, прикрепленных именно к нашим "Путевым Листам". Этот справочник должен быть аналогом стандартных справочников типа АвансовыйОтчетПрисоединенныеФайлы.

  1. Создадим новый справочник в расширении, назовем его, например, ПутевойЛистПрисоединенныеФайлы.
  2. У этого справочника необходимо добавить следующие реквизиты, аналогичные стандартным справочникам присоединенных файлов:
    • ВладелецФайла (Тип: ДокументСсылка.ПутевыеЛисты). Этот реквизит будет указывать на документ, к которому прикреплен файл.
    • ИмяФайла (Тип: Строка).
    • ДатаСоздания (Тип: Дата).
    • Автор (Тип: СправочникСсылка.Пользователи).
    • Размер (Тип: Число).
    • Расширение (Тип: Строка).
    • ХранитьВерсии (Тип: Булево).
    • Версия (Тип: Число).
    • И другие, если они есть в стандартных справочниках БСП.
  3. Для нового справочника ПутевойЛистПрисоединенныеФайлы желательно установить ОсновноеПредставление по реквизиту ИмяФайла и настроить стандартные подписки на события ПередЗаписью, ПриЗаписи и ПриУдалении через расширение, если вы переопределяете соответствующую логику или она отсутствует.

Шаг 2: Расширение определяемых типов БСП

Это самый критически важный шаг. В расширении мы можем добавить наш новый документ и наш новый справочник присоединенных файлов в существующие ОпределяемыеТипы БСП. Это позволит системе корректно связывать файлы с владельцами и записывать данные в регистры.

  1. Откроем расширение и перейдем на вкладку "Конфигурация".
  2. Найдем ОпределяемыеТипы из основной конфигурации, которые относятся к работе с файлами. Обычно это:
    • ПФ_ВладелецПрисоединенныхФайлов (или ВладелецПрисоединенныхФайлов, ВладелецПрисоединенныхФайловБЗК в зависимости от версии БСП)
    • ПрисоединенныйФайл
    • ПрисоединенныйФайлОбъект
  3. Для каждого из этих ОпределяемыхТипов мы должны расширить их состав:
    • В ОпределяемыйТип.ПФ_ВладелецПрисоединенныхФайлов (или аналогичный): добавим тип ДокументСсылка.ПутевыеЛисты.
    • В ОпределяемыйТип.ПрисоединенныйФайл: добавим тип СправочникСсылка.ПутевойЛистПрисоединенныеФайлы.
    • В ОпределяемыйТип.ПрисоединенныйФайлОбъект: добавим тип СправочникОбъект.ПутевойЛистПрисоединенныеФайлы.

Важно: Убедитесь, что вы добавляете именно ссылку (ДокументСсылка, СправочникСсылка) или объект (СправочникОбъект) в соответствующие ОпределяемыеТипы, как это показано выше. Сообщение 8 и 9 форума прямо указывают на это, уточняя, что требуется именно ссылка.

Шаг 3: Добавление команды и ее параметров

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

  1. Найдем в основной конфигурации общую команду ПФ_ПрисоединенныеФайлы.
  2. В расширении расширим эту команду.
  3. В параметрах команды расширим ТипПараметраКоманды, добавив туда тип ДокументСсылка.ПутевыеЛисты. Это позволит команде принимать наш документ в качестве параметра.

Шаг 4: Размещение команды на форме документа

Последний шаг – добавить созданную команду на форму нашего документа ПутевыеЛисты.

  1. Откроем форму документа ПутевыеЛисты в расширении (расширим ее, если она уже существует).
  2. На форме документа добавим новую кнопку или элемент панели, который будет связан с общей командой ПФ_ПрисоединенныеФайлы.
  3. В свойстве "Параметр команды" укажем ссылку на сам документ ЭтотОбъект (если форма документа), чтобы команда знала, к какому объекту прикреплять файлы.

После выполнения этих шагов кнопка "Присоединенные файлы" должна появиться на форме документа, а система БСП сможет корректно работать с вашим документом, используя механизм присоединенных файлов. Для реализации более удобного прикрепления файлов перетаскиванием можно использовать инструмент переноса картинок на форму методом Drag and Drop.

Анализ ошибки "Значение поля "Файл" не может быть пустым!: ДвоичныеДанныеФайлов"

В ходе обсуждения на форуме (Сообщение 12) возникла ошибка:


{ОбщийМодуль.РаботаСФайлами.Модуль(720)}: Ошибка при добавлении присоединенного файла "NA0426.pdf": Запись не верна! Значение поля "Файл" не может быть пустым!: ДвоичныеДанныеФайлов: (Регистр сведений: Двоичные данные файлов) ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
.

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

  1. Неправильно сконфигурированы определяемые типы:

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

    Что проверить: Убедитесь, что вы добавили СправочникСсылка.ПутевойЛистПрисоединенныеФайлы в состав ОпределяемыйТип.ПрисоединенныйФайл и СправочникОбъект.ПутевойЛистПрисоединенныеФайлы в состав ОпределяемыйТип.ПрисоединенныйФайлОбъект.

  2. Отсутствие необходимых подписок на события:

    Для корректной работы БСП необходим целый набор подписок на события (например, ПриЗаписи, ПередЗаписью, ПриУдалении) для справочников присоединенных файлов. Эти подписки обрабатывают логику создания новых записей в регистре ДвоичныеДанныеФайлов, версионирования, удаления и т.д. Если ваш новый справочник ПутевойЛистПрисоединенныеФайлы не имеет этих подписок (или они не были правильно расширены/переопределены), это может привести к некорректной записи.

    Что проверить: Изучите стандартные подписки на события для типовых справочников присоединенных файлов (например, АвансовыйОтчетПрисоединенныеФайлы) и убедитесь, что аналогичные подписки настроены для вашего справочника ПутевойЛистПрисоединенныеФайлы в расширении. Возможно, потребуется создать новые подписки, указывающие на общие модули БСП, но с новым источником (ваш справочник).

  3. Проблемы с реквизитом "ВладелецФайла" в вашем справочнике:

    Если вы скопировали существующий справочник, убедитесь, что реквизит ВладелецФайла в вашем новом справочнике ПутевойЛистПрисоединенныеФайлы имеет правильный тип, включающий именно ДокументСсылка.ПутевыеЛисты. Если там остался старый тип или он настроен некорректно, это также может нарушить работу подсистемы.

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

Альтернативное решение для старых версий платформы (до 8.3.20)

Если вы работаете с версией платформы 1С:Предприятие ниже 8.3.20, прямое расширение ОпределяемыхТипов невозможно. В этом случае вам придется прибегать к более сложным обходным путям. Основной идеей является создание "собственной" мини-подсистемы работы с файлами внутри расширения, которая имитирует функционал БСП или использует его косвенно.

  1. Копирование и переопределение подсистемы в расширении:

    Один из подходов — это создание в расширении своих собственных объектов, которые будут имитировать или дублировать функционал БСП. Этот метод трудоемкий и требует глубокого понимания БСП.

    • Создание своих справочников присоединенных файлов в расширении: Вам придется создать свой справочник, например, ПутевойЛистПрисоединенныеФайлы_Расширение, со всеми необходимыми реквизитами.
    • Создание своих определяемых типов в расширении: Вы можете создать свои ОпределяемыеТипы в расширении, которые будут включать в себя ваш документ ПутевыеЛисты и ваш справочник ПутевойЛистПрисоединенныеФайлы_Расширение. Однако эти типы не будут напрямую взаимодействовать с ОпределяемымиТипами основной конфигурации.
    • Переопределение общих модулей и команд: Вам потребуется переопределить (заимствовать и изменить) общие модули и команды, отвечающие за работу с файлами, чтобы они использовали ваши новые объекты из расширения. Это может включать изменение кода, который обращается к ОпределяемымТипам или справочникам БСП, чтобы он использовал ваши аналоги.
  2. Обходной путь через справочник "ПапкиФайлов":

    Иногда используют более изощренные методы, например, через создание элемента справочника ПапкиФайлов для каждого объекта-владельца (ПутевыеЛисты). При вызове команды открытия файлов передается не сам объект ПутевыеЛисты, а созданный для него элемент справочника ПапкиФайлов.

    • Создаем в расширении справочник ПапкиФайловРасширения (или переопределяем существующий ПапкиФайлов).
    • При создании нового документа ПутевыеЛисты программно создаем или находим соответствующий элемент в справочнике ПапкиФайловРасширения и связываем его с документом.
    • При вызове команды ПФ_ПрисоединенныеФайлы передаем ей не сам документ ПутевыеЛисты, а ссылку на этот элемент справочника ПапкиФайловРасширения, который уже включен в ОпределяемыйТип.ВладелецПрисоединенныхФайлов основной конфигурации.
    • Таким образом, мы "обманываем" БСП, заставляя ее думать, что файлы прикрепляются к элементу справочника ПапкиФайлов, который уже умеет работать с файлами, а не напрямую к нашему документу.

    Этот метод требует написания дополнительного кода для управления связью между документом ПутевыеЛисты и его "папкой" для файлов, а также изменения логики вызова команды открытия файлов.

Очевидно, что оба этих метода гораздо сложнее и менее предпочтительны по сравнению с прямым расширением ОпределяемыхТипов, доступным в более новых версиях платформы.

Общие рекомендации и советы

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

  1. Используйте актуальную версию платформы и БСП: Чем новее версия платформы 1С:Предприятие (от 8.3.20 и выше), тем проще реализовать задачу с помощью расширений. Также важно использовать актуальную версию БСП, так как в ней постоянно дорабатываются и улучшаются механизмы.
  2. Активно используйте отладчик: При возникновении ошибок, подобных "Значение поля "Файл" не может быть пустым!", отладчик — ваш лучший друг. Он позволит вам пошагово отследить выполнение кода, увидеть значения переменных и понять, на каком этапе и по какой причине происходит сбой. Особое внимание уделяйте типам данных и тому, какие значения присваиваются реквизитам.
  3. Изучайте документацию на ИТС: На сайте ИТС 1С всегда доступна подробная документация по внедрению подсистем БСП. В ней описаны принципы работы, необходимые шаги для подключения подсистем к новым объектам, а также рекомендации по работе с расширениями.
  4. Проверяйте состав определяемых типов: Убедитесь, что все необходимые типы (ссылка на документ, ссылка на справочник присоединенных файлов, объект справочника присоединенных файлов) включены во все соответствующие ОпределяемыеТипы БСП (ПФ_ВладелецПрисоединенныхФайлов, ПрисоединенныйФайл, ПрисоединенныйФайлОбъект). Это самая частая причина проблем.
  5. Рассмотрите "небезопасный режим" для расширения: В некоторых случаях, для корректной работы расширений с привилегированными операциями или при отладке, может потребоваться запуск в "небезопасном режиме". Это позволяет расширению выполнять больше действий, но следует использовать его осторожно и только для доверенных расширений.

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

← На главную