Как прикрепить файлы к элементам справочника в 1С 8.3 на управляемых формах?

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

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

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

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

Рассмотрим подробнее недостатки такого метода:

  1. Существенное увеличение размера справочника: Если вы будете прикреплять большое количество "тяжелых" файлов (например, аудиозаписи звонков или сканы документов), справочник "Организации" или любой другой справочник-владелец файлов быстро разрастется до гигабайтов. Это усложняет обслуживание базы данных, увеличивает время резервного копирования и восстановления.
  2. Снижение производительности: Каждое обращение к элементу справочника (объекту), к которому прикреплены файлы, или к самим файлам будет вызывать повышенную нагрузку. При инициализации объекта могут вычитываться все связанные с ним двоичные данные, даже если они не нужны в данный момент. Это может блокировать параллельные обращения к объекту или файлам и замедлять работу системы, особенно при одновременной работе многих пользователей.
  3. Сложности с резервным копированием и обменом данными: Большая база данных требует значительно больше времени для создания резервных копий. Если в вашей архитектуре используются распределенные информационные базы (РИБ), передача такого объема данных между узлами станет ресурсоемкой задачей, что может привести к замедлению обменов и увеличению нагрузки на сеть.
  4. Неудобство для специфичных данных: Если вам нужно хранить не просто список файлов, а связанные с ними метаданные (например, для записи звонков – кто звонил, сотрудник, дата звонка, комментарий), табличная часть с одним реквизитом ХранилищеЗначения становится неудобной. Придется добавлять множество других реквизитов, что еще больше утяжелит объект и затруднит разработку отчетов.

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

Типовое решение: Библиотека стандартных подсистем (БСП)

Для реализации функционала работы с файлами в 1С 8.3 существует стандартное и наиболее рекомендуемое решение – это подсистема «Работа с файлами» из Библиотеки стандартных подсистем (БСП). БСП – это набор готовых к интеграции блоков кода и объектов метаданных, разработанных фирмой "1С" для ускорения разработки и обеспечения унификации механизмов в конфигурациях.

Преимущества использования БСП

Внедрение БСП при разработке конфигурации дает множество преимуществ:

  1. Стандартизация: Код и архитектурные решения БСП известны большинству 1С-разработчиков. Это существенно упрощает поддержку и доработку вашей конфигурации сторонними специалистами, поскольку им не придется знакомиться с уникальными, "самописными" алгоритмами. БСП – это фактически часть платформы с открытым кодом, что делает ее стандартом де-факто.
  2. Готовый функционал: Подсистема «Работа с файлами» предоставляет широкий набор возможностей "из коробки": прикрепление файлов с диска, создание файлов по шаблону, сканирование документов, просмотр и редактирование, версионирование файлов, а также гибкие настройки хранения, включая хранение в томах на диске. Это значительно сокращает время на разработку.
  3. Масштабируемость и производительность: БСП изначально спроектирована с учетом лучшей производительности и масштабируемости. Файлы хранятся в отдельных объектах, а при больших объемах данных используются тома, что снижает нагрузку на основную информационную базу и обеспечивает быструю работу даже при большом количестве прикрепленных файлов.
  4. Работа с метаданными: БСП позволяет не просто прикрепить файл, но и связать его с дополнительными атрибутами (например, для записей звонков можно хранить информацию о звонившем, сотруднике, комментарии и дате звонка). Это позволяет использовать более гибкие механизмы отчетности и анализа.
  5. Актуальность: БСП постоянно развивается и обновляется фирмой "1С", что гарантирует ее совместимость с новыми версиями платформы, соответствие современным требованиям безопасности и производительности.

Механизм хранения файлов в БСП

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

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

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

Пошаговое внедрение подсистемы «Работа с файлами» из БСП

Рассмотрим шаги, которые необходимо выполнить для интеграции подсистемы «Работа с файлами» в вашу самописную конфигурацию. Этот процесс требует внимательности и понимания структуры БСП.

  1. Скачивание и установка БСП:

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

  2. Обработка «Первое внедрение БСП»:

    Запустите информационную базу БСП в режиме предприятия. В ней найдите и откройте обработку ПервоеВнедрениеБСП.epf (она также находится в каталоге шаблонов БСП). В этой обработке выберите необходимые подсистемы. Для функционала работы с файлами вам понадобятся как минимум:

    • Базовая функциональность
    • Пользователи
    • Работа с файлами
    • Обновление версии ИБ (рекомендуется для корректного обновления конфигурации в будущем)

    Сохраните выбранные настройки в XML-файл. Этот файл будет использоваться при последующем объединении конфигураций.

  3. Сравнение/объединение конфигураций:

    Откройте конфигуратор вашей самописной базы данных. Выполните команду меню "Конфигурация" -> "Сравнить, объединить с конфигурацией из файла...". В качестве файла для объединения выберите файл 1Cv8.cf, который находится в каталоге установки БСП (например, C:\Users\...\AppData\Roaming\1C\1CE\tmplts\1c\bsp\3_1_4_122\ExtFiles\1Cv8.cf, путь может отличаться в зависимости от версии и ОС). В окне сравнения/объединения согласитесь на постановку конфигурации на поддержку. Затем используйте кнопку "Действия" -> "Загрузить настройки из файла" и загрузите ранее сохраненный XML-файл настроек подсистем. Это позволит вам объединить только необходимые объекты БСП, минимизируя размер конфигурации.

  4. Копирование и переименование общего модуля (для корректного обновления):

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

  5. Настройка определяемых типов:

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

    • ВладелецПрисоединенныхФайлов (это составной тип, который содержит ссылки на объекты, являющиеся владельцами файлов)
    • ВладелецПрисоединенныхФайловОбъект (это составной тип, который содержит сами объекты-владельцы файлов)

    Добавьте в их состав тип ссылки на ваш справочник "Организации" (например, СправочникСсылка.Организации для ВладелецПрисоединенныхФайлов и СправочникОбъект.Организации для ВладелецПрисоединенныхФайловОбъект). Это действие связывает ваш справочник с механизмом БСП.

  6. Добавление команд и обработчиков на форму справочника:

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

    
    &НаСервере
    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
        // СтандартныеПодсистемы.РаботаСФайлами
        ПараметрыГиперссылки = РаботаСФайлами.ГиперссылкаФайлов();
        РаботаСФайлами.ПриСозданииНаСервере(ЭтотОбъект, ПараметрыГиперссылки);
        // Конец СтандартныеПодсистемы.РаботаСФайлами
    КонецПроцедуры
    

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

  7. Настройка прав пользователей:

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

    • Базовые права БСП – эти права являются обязательными для корректной работы большинства подсистем БСП.
    • Права на подсистему Работа с файлами – обычно это роли типа ДобавлениеИзменениеФайлов, ПросмотрФайлов, УдалениеФайлов и т.д.
    • Права на сам справочник ПрисоединенныеФайлы и связанный с ним регистр сведений ДвоичныеДанныеФайлов.

Решение проблемы «Попытка получения неинициализированного значения параметра сеанса»

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

Чтобы решить эту проблему, выполните следующие действия:

  1. Проверим модуль сеанса:

    Откройте модуль сеанса вашей конфигурации. Для этого в конфигураторе кликните ПКМ по корню конфигурации, выберите "Свойства" и перейдите на вкладку "Модули", затем откройте "Модуль сеанса". Убедимся, что в этом модуле есть процедура, которая выполняется при старте сеанса (обычно ПриНачалеСеанса()) и инициализирует параметр сеанса ТекущийПользователь.

  2. Реализуем инициализацию пользователя:

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

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

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

  3. Проверим наличие справочника «Пользователи»:

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

Альтернативные упрощенные решения (для небольших задач)

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

Программная реализация с «ХранилищемЗначения» в отдельном справочнике

Вместо того чтобы встраивать файл в табличную часть основного справочника, мы можем создать отдельный вспомогательный справочник для файлов:

  1. Создадим справочник «ПрисоединенныеФайлыСамописный»:

    Создайте новый справочник с именем, например, ПрисоединенныеФайлыСамописный. В нем будут следующие реквизиты:

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

    На форме элемента справочника "Организации" добавьте кнопку или гиперссылку, которая будет открывать форму списка вашего нового справочника ПрисоединенныеФайлыСамописный, отфильтрованного по текущему владельцу. На этой форме или через отдельные команды реализуйте функционал:

    • Загрузка файла: Используйте объекты ДиалогВыбораФайла для выбора файла на диске, затем считывайте его содержимое в объект ДвоичныеДанные и сохраняйте в реквизит ДвоичныеДанные нового элемента справочника ПрисоединенныеФайлыСамописный.
    • Выгрузка/просмотр файла: При нажатии на файл вычитывайте ДвоичныеДанные из ХранилищаЗначения, сохраняйте их во временный файл на диске пользователя и открывайте его средствами операционной системы.

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

Хранение записей звонков с дополнительными атрибутами

Ваша задача по прикреплению записей звонков с метаданными (кто звонил, сотрудник, комментарий, дата звонка) требует более структурированного подхода, чем просто прикрепление файла. Независимо от того, используете ли вы БСП или свою реализацию, рекомендуем следующую структуру:

  1. Отдельный справочник/документ «ЗаписиЗвонков»:

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

    • Организация (тип: СправочникСсылка.Организации) – ссылка на организацию, к которой относится звонок.
    • ДатаЗвонка (тип: Дата) – дата и время совершения звонка.
    • КтоЗвонил (тип: Строка или СправочникСсылка.КонтактныеЛица) – имя или ссылка на контактное лицо, которое совершило звонок.
    • Сотрудник (тип: СправочникСсылка.Пользователи или СправочникСсылка.Сотрудники) – сотрудник вашей организации, который общался по звонку.
    • Комментарий (тип: Строка, неограниченной длины) – текстовый комментарий к звонку.
  2. Связь с файлом записи:

    В этот же справочник (или документ) ЗаписиЗвонков добавьте реквизит для хранения файла записи разговора:

    • Если вы используете БСП: добавьте реквизит ФайлЗаписи типа СправочникСсылка.ПрисоединенныеФайлы. Тогда запись звонка будет ссылаться на элемент справочника файлов БСП, а сами двоичные данные будут храниться в соответствии с настройками БСП (в базе или в томах).
    • Если вы используете свою реализацию: добавьте реквизит ДвоичныеДанныеЗаписи типа ХранилищеЗначения.
  3. Интеграция с АТС (опционально):

    Для автоматической загрузки записей звонков и их метаданных, как правило, требуется интеграция с АТС (автоматической телефонной станцией) или IP-телефонией. Многие АТС предоставляют API для доступа к записям разговоров и связанным данным, которые можно использовать для автоматического создания объектов ЗаписиЗвонков в 1С. Существуют также облачные сервисы распознавания речи (например, "1С:Распознавание речи"), которые могут преобразовывать аудиозаписи в текст и интегрироваться с 1С для еще более глубокого анализа.

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

Заключение

Мы рассмотрели различные подходы к прикреплению файлов в 1С 8.3 на управляемых формах. Мы выяснили, что хранение файлов непосредственно в табличных частях основных справочников является неэффективным и приводит к проблемам с производительностью и масштабируемостью. Наиболее правильным и масштабируемым решением является использование подсистемы «Работа с файлами» из Библиотеки стандартных подсистем (БСП).

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

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

← На главную