При разработке нетиповых конфигураций или расширении возможностей стандартных систем (таких как 1С:ERP, 1С:Комплексная автоматизация или 1С:Управление торговлей) разработчики часто сталкиваются с необходимостью прикрепления внешних файлов к новым, созданным вручную документам. Использование простых ссылок на диске или самописных реквизитов типа ХранилищеЗначения уходит в прошлое. Современный стандарт разработки на платформе 1С 8.3 диктует использование возможностей библиотеки стандартных подсистем (БСП), а именно подсистемы "Работа с файлами".
В этой статье мы подробно рассмотрим, как интегрировать типовой механизм хранения файлов БСП для вашего нетипового документа. Мы разберем весь процесс по шагам: от создания структуры метаданных до настройки прав доступа и разбора типовых ошибок, с которыми часто сталкиваются программисты в процессе реализации.
Прежде чем перейти к практическим шагам в конфигураторе, проанализируем, как устроен этот механизм изнутри. БСП не хранит файлы непосредственно в самом документе. Вместо этого для каждого прикладного объекта, к которому могут прикрепляться файлы, создается отдельный подчиненный справочник. Например, для документа ДоговорКонтрагента существует справочник ДоговорыКонтрагентовПрисоединенныеФайлы.
Связь между документами и их файлами осуществляется через механизм определяемых типов и общих команд. Благодаря этому платформа может централизованно управлять файлами: переносить их в тома на диске, контролировать версии, подписывать ЭЦП и оптимизировать хранение двоичных данных в базе.
---
Для начала нам необходимо создать справочник, который будет хранить карточки файлов для нашего нетипового документа. Создавать такой справочник с нуля вручную крайне трудоемко и высока вероятность ошибиться в типах реквизитов. Поэтому мы рекомендуем скопировать уже существующий типовой справочник присоединенных файлов. В рамках масштабных проектов по развитию систем управления предприятием доступен подбор решений для переноса данных в 1С:ERP.
Рассмотрим порядок действий по шагам:
ДоговорыКонтрагентовПрисоединенныеФайлы или НоменклатураПрисоединенныеФайлы.[ИмяВашегоДокумента]ПрисоединенныеФайлы (например, ЗаявкаНаТранспортПрисоединенныеФайлы).Владелец убедимся, что длина наименования составляет не менее 150 символов, а проверка заполнения установлена в значение "Выдавать ошибку".Автор (тип СправочникСсылка.Пользователи) — создатель карточки файла;ДатаСоздания (тип Дата) — время добавления файла;ИндексКартинки (тип Число) — для визуализации типа файла (pdf, doc, xls) в списках;Размер (тип Число) — размер файла в байтах;Расширение (тип Строка) — формат файла;ТипХраненияФайла (тип ПеречислениеСсылка.ТипыХраненияФайлов) — определяет, где лежит файл: в базе данных или в томе на диске;Том (тип СправочникСсылка.ТомаХраненияФайлов) — конкретный дисковый том, если используется соответствующий режим;ФайлХранилище (тип ХранилищеЗначения) — сам двоичный код файла при хранении в базе данных.---
После создания справочника нам необходимо "объяснить" механизмам БСП, что наш новый документ является владельцем файлов, а созданный справочник — хранилищем этих файлов. Для этого используются определяемые типы. Если пропустить этот шаг, система не поймет, к каким таблицам ей обращаться, и будет выдавать системные ошибки. Чтобы вовремя обнаружить проблемы после изменения метаданных, удобно настроить автоматическое тестирование и обслуживание баз 1С.
Нам необходимо добавить наши новые объекты метаданных в четыре ключевых определяемых типа:
ВладелецПрисоединенныхФайлов — в состав этого типа добавляем ссылку на наш нетиповой документ (например, ДокументСсылка.ЗаявкаНаТранспорт).ВладелецПрисоединенныхФайловОбъект — добавляем сюда объект нашего нетипового документа (ДокументОбъект.ЗаявкаНаТранспорт). Это критично для корректного выполнения транзакций записи на стороне сервера.ПрисоединенныйФайл — добавляем ссылку на наш вновь созданный справочник файлов (СправочникСсылка.ЗаявкаНаТранспортПрисоединенныеФайлы).ПрисоединенныйФайлОбъект — добавляем объект этого справочника (СправочникОбъект.ЗаявкаНаТранспортПрисоединенныеФайлы).Важное примечание: Обратите внимание на разделение между ссылочными типами данных и объектами (с суффиксом Объект). Ошибки при заполнении этих типов часто приводят к падению системы при попытке записи или интерактивного открытия прикрепленного файла.
---
Для оптимизации работы с файлами и кэширования двоичных данных БСП использует специальный регистр сведений ДвоичныеДанныеФайлов. Нам необходимо предоставить регистру возможность сохранять информацию по нашему новому справочнику.
Выполним следующие действия:
ДвоичныеДанныеФайлов.Объект.ЗаявкаНаТранспортПрисоединенныеФайлы и установим напротив него галочку.Если этого не сделать, при попытке сохранить прикрепленный файл вы столкнетесь с ошибкой работы с типами данных, так как регистр не сможет записать двоичные данные для неопределенного типа объекта.
---
Для автоматизации рутинных операций (например, удаления связанных файлов при удалении самого документа или копирования вложенных файлов при копировании документа) в БСП используются подписки на события. Нам необходимо расширить состав этих подписок, включив туда наши новые объекты.
Разберем три важнейшие подписки, которые начинаются с префикса ПрисоединенныеФайлы...:
ПрисоединенныеФайлыПередУдалениемОбъекта — отвечает за очистку базы от "осиротевших" файлов. В источник подписки добавляем наш нетиповой документ (тип ДокументОбъект). Если этого не сделать, при удалении документа файлы навсегда останутся лежать мертвым грузом в вашей базе или на диске.ПрисоединенныеФайлыПриКопированииОбъекта — отвечает за корректное создание новых связей при копировании документа-владельца. В источник добавляем наш нетиповой документ.ОпределитьИсточникСобытияПрисоственногоФайла (или аналогичная подписка в зависимости от версии БСП) — необходима для корректной маршрутизации событий интерактивного изменения файлов. В источник добавляем наш справочник файлов (тип СправочникОбъект).---
Теперь, когда вся серверная и логическая часть настроена, нам нужно предоставить пользователю удобный интерфейс для работы с файлами. Для этого используется общая команда ПрисоединенныеФайлыКОбъекту (в некоторых конфигурациях она может называться просто ПрисоединенныеФайлы).
Выясним, как вывести эту команду на форму нашего документа:
ПрисоединенныеФайлыКОбъекту.ПрисоединенныеФайлыКОбъекту, установим для нее флаг видимости и настроим ее отображение (например, в виде гиперссылки в верхней панели формы или в командной панели).После этого на форме документа появится привычная пользователям стандартная кнопка/ссылка со значком скрепки и текстом "Файлы".
---
Часто разработчики забывают о настройке прав доступа, тестируя функционал под полными правами администратора. Однако обычные пользователи при попытке прикрепить или прочитать файл могут столкнуться с ошибкой нарушения прав доступа.
Для предотвращения этой проблемы выполним следующие действия:
ЗаявкаНаТранспортПрисоединенныеФайлы.---
Даже при строгом следовании инструкциям могут возникнуть непредвиденные ситуации. Рассмотрим самую популярную ошибку, возникающую при попытке открытия или добавления файла:
{ОбщийМодуль.ОбщегоНазначенияКлиентСервер.Модуль(2873)}: Недопустимое значение параметра ПрисоединенныйФайл в РаботаСФайлами.ДвоичныеДанныеФайла.
Ожидалось: Присоединенный файл ([ТипДокумента]), Присоединенные файлы ([ТипДокумента])...
Причина возникновения: Эта ошибка указывает на то, что вы забыли прописать ваш новый справочник присоединенных файлов в определяемом типе ПрисоединенныйФайл или забыли добавить поддержку этого справочника в измерение Объект регистра сведений ДвоичныеДанныеФайлов.
Решение: Еще раз внимательно проверьте шаги 2 и 3 нашей инструкции. Убедитесь, что конфигурация была полностью обновлена (нажмите F7 в конфигураторе), и все изменения применились к базе данных.
---
Мы успешно разобрали процесс подключения стандартного механизма БСП для работы с присоединенными файлами в произвольном документе 1С 8.3. Теперь файлы ваших документов будут аккуратно структурированы, смогут храниться на внешних томах диска (что значительно снизит размер самой информационной базы SQL) и будут иметь стандартный, интуитивно понятный для пользователей интерфейс. Для дополнительной оптимизации и сокращения объема накопленных данных применяется механизм многопоточной свёртки 1С:ERP.