При необходимости расширить функциональность типовой конфигурации 1С и добавить возможность прикрепления файлов к новым или существующим документам, часто возникает задача по интеграции стандартной подсистемы "Присоединенные файлы" из Библиотеки стандартных подсистем (БСП). Эта задача может быть особенно нетривиальной при использовании расширений конфигурации, поскольку они имеют определенные ограничения, касающиеся изменения метаданных, в частности, ОпределяемыеТипы.
В этой статье мы подробно рассмотрим, как правильно добавить кнопку "Присоединенные файлы" к документу, например, "Путевые Листы", используя расширение, а также проанализируем возможные сложности и способы их решения. Мы будем использовать подход, ориентированный на современные версии платформы 1С:Предприятие (начиная с 8.3.20), где функциональность расширений значительно улучшена.
Прежде чем приступать к изменениям, давайте разберем, как устроена подсистема "Присоединенные файлы" в БСП. Ее основной принцип работы заключается в универсализации хранения и прикрепления файлов к различным объектам конфигурации. Для этого используются следующие ключевые элементы:
ОпределяемыйТип.ВладелецПрисоединенныхФайлов включает в себя ссылки на все объекты, к которым можно прикрепить файлы (Документы, Справочники и т.д.). А ОпределяемыйТип.ПрисоединенныйФайл и ОпределяемыйТип.ПрисоединенныйФайлОбъект включают ссылки на справочники, которые непосредственно хранят информацию о присоединенных файлах для каждого владельца.АвансовыйОтчетПрисоединенныеФайлы. В нем хранится информация о файле (имя, размер, дата создания, автор) и самое главное – ссылка на объект-владелец через реквизит ВладелецФайла.Файл данного регистра, тип которого должен включать в себя все справочники присоединенных файлов (через ОпределяемыйТип.ПрисоединенныйФайл).ПФ_ПрисоединенныеФайлы) и общие модули (например, РаботаСФайлами).Ключевым моментом здесь является то, что ОпределяемыеТипы должны "знать" о всех новых объектах, к которым вы хотите прикреплять файлы, и о новых справочниках, которые будут хранить эти файлы. Иначе система просто не сможет найти нужные типы для записи данных.
Исторически одной из главных сложностей при работе с расширениями в 1С было невозможность напрямую изменять состав ОпределяемыхТипов основной конфигурации. Это означало, что если вы создавали новый документ в расширении и хотели использовать для него стандартную подсистему файлов БСП, вам приходилось либо снимать конфигурацию с поддержки, либо изобретать сложные обходные пути.
Однако, начиная с версии платформы 1С:Предприятие 8.3.20, эта ситуация значительно улучшилась. Разработчики добавили возможность расширять состав ОпределяемыхТипов из расширений. Это критически важное изменение, которое делает интеграцию подсистем БСП с новыми объектами в расширениях гораздо более "кошерной" и менее трудоемкой. Если вы используете платформу более ранней версии, то вам придется прибегать к более сложным методам, которые мы также кратко рассмотрим.
Предположим, у нас есть документ Документ.ПутевыеЛисты, созданный в расширении или существующий в основной конфигурации, к которому мы хотим добавить функционал прикрепленных файлов. Рассмотрим подробнее, какие шаги нам необходимо выполнить.
Сначала нам потребуется создать в расширении новый справочник, который будет хранить метаданные о файлах, прикрепленных именно к нашим "Путевым Листам". Этот справочник должен быть аналогом стандартных справочников типа АвансовыйОтчетПрисоединенныеФайлы.
ПутевойЛистПрисоединенныеФайлы.ВладелецФайла (Тип: ДокументСсылка.ПутевыеЛисты). Этот реквизит будет указывать на документ, к которому прикреплен файл.ИмяФайла (Тип: Строка).ДатаСоздания (Тип: Дата).Автор (Тип: СправочникСсылка.Пользователи).Размер (Тип: Число).Расширение (Тип: Строка).ХранитьВерсии (Тип: Булево).Версия (Тип: Число).ПутевойЛистПрисоединенныеФайлы желательно установить ОсновноеПредставление по реквизиту ИмяФайла и настроить стандартные подписки на события ПередЗаписью, ПриЗаписи и ПриУдалении через расширение, если вы переопределяете соответствующую логику или она отсутствует.Это самый критически важный шаг. В расширении мы можем добавить наш новый документ и наш новый справочник присоединенных файлов в существующие ОпределяемыеТипы БСП. Это позволит системе корректно связывать файлы с владельцами и записывать данные в регистры.
ОпределяемыеТипы из основной конфигурации, которые относятся к работе с файлами. Обычно это:
ПФ_ВладелецПрисоединенныхФайлов (или ВладелецПрисоединенныхФайлов, ВладелецПрисоединенныхФайловБЗК в зависимости от версии БСП)ПрисоединенныйФайлПрисоединенныйФайлОбъектОпределяемыхТипов мы должны расширить их состав:
ОпределяемыйТип.ПФ_ВладелецПрисоединенныхФайлов (или аналогичный): добавим тип ДокументСсылка.ПутевыеЛисты.ОпределяемыйТип.ПрисоединенныйФайл: добавим тип СправочникСсылка.ПутевойЛистПрисоединенныеФайлы.ОпределяемыйТип.ПрисоединенныйФайлОбъект: добавим тип СправочникОбъект.ПутевойЛистПрисоединенныеФайлы.Важно: Убедитесь, что вы добавляете именно ссылку (ДокументСсылка, СправочникСсылка) или объект (СправочникОбъект) в соответствующие ОпределяемыеТипы, как это показано выше. Сообщение 8 и 9 форума прямо указывают на это, уточняя, что требуется именно ссылка.
После того как ОпределяемыеТипы обновлены, нам нужно добавить команду для вызова формы присоединенных файлов.
ПФ_ПрисоединенныеФайлы.расширим эту команду.расширим ТипПараметраКоманды, добавив туда тип ДокументСсылка.ПутевыеЛисты. Это позволит команде принимать наш документ в качестве параметра.Последний шаг – добавить созданную команду на форму нашего документа ПутевыеЛисты.
ПутевыеЛисты в расширении (расширим ее, если она уже существует).ПФ_ПрисоединенныеФайлы.ЭтотОбъект (если форма документа), чтобы команда знала, к какому объекту прикреплять файлы.После выполнения этих шагов кнопка "Присоединенные файлы" должна появиться на форме документа, а система БСП сможет корректно работать с вашим документом, используя механизм присоединенных файлов. Для реализации более удобного прикрепления файлов перетаскиванием можно использовать инструмент переноса картинок на форму методом Drag and Drop.
В ходе обсуждения на форуме (Сообщение 12) возникла ошибка:
{ОбщийМодуль.РаботаСФайлами.Модуль(720)}: Ошибка при добавлении присоединенного файла "NA0426.pdf": Запись не верна! Значение поля "Файл" не может быть пустым!: ДвоичныеДанныеФайлов: (Регистр сведений: Двоичные данные файлов) ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
Эта ошибка указывает на то, что система пытается записать информацию о файле в регистр сведений ДвоичныеДанныеФайлов, но не может корректно заполнить поле Файл. Поле Файл в этом регистре, как правило, имеет тип ОпределяемыйТип.ПрисоединенныйФайл. Причин такой ошибки может быть несколько:
Несмотря на то, что вы добавили тип документа в ВладелецПрисоединенныхФайлов, возможно, вы забыли добавить ссылку на ваш новый справочник ПутевойЛистПрисоединенныеФайлы в ОпределяемыйТип.ПрисоединенныйФайл и ОпределяемыйТип.ПрисоединенныйФайлОбъект. Регистр ДвоичныеДанныеФайлов ожидает ссылку именно на элемент справочника присоединенных файлов в поле Файл. Если тип вашего нового справочника отсутствует в ОпределяемыйТип.ПрисоединенныйФайл, система не сможет установить связь и поле останется пустым, что вызовет ошибку.
Что проверить: Убедитесь, что вы добавили СправочникСсылка.ПутевойЛистПрисоединенныеФайлы в состав ОпределяемыйТип.ПрисоединенныйФайл и СправочникОбъект.ПутевойЛистПрисоединенныеФайлы в состав ОпределяемыйТип.ПрисоединенныйФайлОбъект.
Для корректной работы БСП необходим целый набор подписок на события (например, ПриЗаписи, ПередЗаписью, ПриУдалении) для справочников присоединенных файлов. Эти подписки обрабатывают логику создания новых записей в регистре ДвоичныеДанныеФайлов, версионирования, удаления и т.д. Если ваш новый справочник ПутевойЛистПрисоединенныеФайлы не имеет этих подписок (или они не были правильно расширены/переопределены), это может привести к некорректной записи.
Что проверить: Изучите стандартные подписки на события для типовых справочников присоединенных файлов (например, АвансовыйОтчетПрисоединенныеФайлы) и убедитесь, что аналогичные подписки настроены для вашего справочника ПутевойЛистПрисоединенныеФайлы в расширении. Возможно, потребуется создать новые подписки, указывающие на общие модули БСП, но с новым источником (ваш справочник).
Если вы скопировали существующий справочник, убедитесь, что реквизит ВладелецФайла в вашем новом справочнике ПутевойЛистПрисоединенныеФайлы имеет правильный тип, включающий именно ДокументСсылка.ПутевыеЛисты. Если там остался старый тип или он настроен некорректно, это также может нарушить работу подсистемы.
Активное использование отладчика при возникновении такой ошибки поможет вам точно определить место в коде, где происходит попытка записи в регистр ДвоичныеДанныеФайлов, и выяснить, какое значение пытается присвоиться полю Файл или почему оно остается пустым.
Если вы работаете с версией платформы 1С:Предприятие ниже 8.3.20, прямое расширение ОпределяемыхТипов невозможно. В этом случае вам придется прибегать к более сложным обходным путям. Основной идеей является создание "собственной" мини-подсистемы работы с файлами внутри расширения, которая имитирует функционал БСП или использует его косвенно.
Один из подходов — это создание в расширении своих собственных объектов, которые будут имитировать или дублировать функционал БСП. Этот метод трудоемкий и требует глубокого понимания БСП.
ПутевойЛистПрисоединенныеФайлы_Расширение, со всеми необходимыми реквизитами.ОпределяемыеТипы в расширении, которые будут включать в себя ваш документ ПутевыеЛисты и ваш справочник ПутевойЛистПрисоединенныеФайлы_Расширение. Однако эти типы не будут напрямую взаимодействовать с ОпределяемымиТипами основной конфигурации.ОпределяемымТипам или справочникам БСП, чтобы он использовал ваши аналоги.Иногда используют более изощренные методы, например, через создание элемента справочника ПапкиФайлов для каждого объекта-владельца (ПутевыеЛисты). При вызове команды открытия файлов передается не сам объект ПутевыеЛисты, а созданный для него элемент справочника ПапкиФайлов.
ПапкиФайловРасширения (или переопределяем существующий ПапкиФайлов).ПутевыеЛисты программно создаем или находим соответствующий элемент в справочнике ПапкиФайловРасширения и связываем его с документом.ПФ_ПрисоединенныеФайлы передаем ей не сам документ ПутевыеЛисты, а ссылку на этот элемент справочника ПапкиФайловРасширения, который уже включен в ОпределяемыйТип.ВладелецПрисоединенныхФайлов основной конфигурации.ПапкиФайлов, который уже умеет работать с файлами, а не напрямую к нашему документу.Этот метод требует написания дополнительного кода для управления связью между документом ПутевыеЛисты и его "папкой" для файлов, а также изменения логики вызова команды открытия файлов.
Очевидно, что оба этих метода гораздо сложнее и менее предпочтительны по сравнению с прямым расширением ОпределяемыхТипов, доступным в более новых версиях платформы.
Для успешной реализации задачи и быстрого устранения возможных проблем, мы рекомендуем следующее:
ОпределяемыеТипы БСП (ПФ_ВладелецПрисоединенныхФайлов, ПрисоединенныйФайл, ПрисоединенныйФайлОбъект). Это самая частая причина проблем.Внимательный и систематический подход к решению этой задачи, с учетом особенностей работы БСП и возможностей вашей версии платформы, позволит вам успешно добавить функционал "Присоединенные файлы" к любому документу в 1С. Для быстрого поиска примеров кода и изучения программного интерфейса подсистем можно использовать справочник по методам БСП с примерами использования.