Как правильно реализовать добавление и хранение фотографий сотрудников в справочнике 1С

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

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

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

Архитектурный подход: Где хранить данные?

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

В типовых решениях (например, ЗУП 3.1 или ERP) существует четкое разделение между объектами Сотрудники и ФизическиеЛица. Один и тот же человек (физическое лицо) может увольняться и приниматься на работу снова, или работать по внутреннему совместительству. В таких случаях в базе будет несколько элементов справочника Сотрудники, но только один элемент в справочнике ФизическиеЛица. Чтобы не дублировать фотографии и не занимать лишнее место в базе данных, логичнее привязывать фото именно к физическому лицу.

Рассмотрим варианты технической реализации хранения:

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

Реализация через ХранилищеЗначения (простой способ)

Посмотрим на пример прямой реализации в справочнике. Если вы создаете свою конфигурацию «с нуля», разберем по шагам создание функционала.

Во-первых, добавим в справочник ФизическиеЛица реквизит Фотография с типом ХранилищеЗначения. Обратите внимание, что этот реквизит не стоит выводить в список, так как он предназначен для хранения тяжелых данных.

Во-вторых, на форме элемента справочника нам понадобится строковый реквизит (например, АдресКартинки), который будет служить временным путем для отображения фото на форме. Для элемента управления на форме установим вид Поле картинки.

Рассмотрим пример кода для загрузки изображения с диска и его сохранения в базу:


&НаКлиенте
Процедура ВыбратьФотографию(Команда)
    Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
    Диалог.Фильтр = "Изображения (*.jpg;*.png)|*.jpg;*.png";
    
    Если Диалог.Выбрать() Тогда
        ВыбранныйФайл = Диалог.ВыбранныеФайлы[0];
        // Помещаем файл во временное хранилище для отображения на форме
        АдресКартинки = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ВыбранныйФайл), ЭтаФорма.УникальныйИдентификатор);
        Модифицированность = Истина;
    КонецЕсли;
КонецПроцедуры

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


&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
    Если ЭтоАдресВременногоХранилища(АдресКартинки) Тогда
        // Создаем объект ХранилищеЗначения из двоичных данных
        ТекущийОбъект.Фотография = Новый ХранилищеЗначения(ПолучитьИзВременногоХранилища(АдресКартинки));
    КонецЕсли;
КонецПроцедуры

Отображение фотографии при открытии формы

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


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

Использование Библиотеки стандартных подсистем (БСП)

Если вы работаете в современной типовой конфигурации (ЗУП 3.1, КА 2, ERP), крайне не рекомендуется создавать свои реквизиты типа ХранилищеЗначения. В таких системах внедрена подсистема «Присоединенные файлы».

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

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

Оптимизация и важные технические нюансы

Проанализируем вопрос производительности. Современные фотографии могут весить от 5 до 15 Мб. Если в справочнике 1000 сотрудников, база вырастет на 15 Гб только за счет фото, что недопустимо для файловых баз и нежелательно для SQL-серверов. Для уменьшения размера фотографий можно использовать готовый механизм сжатия изображений в 1С.

Рекомендуемые практики:

1. Программное сжатие: Перед помещением в ХранилищеЗначения используйте объект Картинка и метод Преобразовать(). Для карточки сотрудника на форме достаточно разрешения 300x400 пикселей в формате JPG. Это уменьшит размер файла до 50-100 Кб без потери визуального качества.

2. Асинхронная работа: В управляемом приложении (особенно в веб-клиенте) передача больших двоичных данных может "подвешивать" интерфейс. Используйте асинхронные методы (НачатьПомещениеФайла), чтобы работа пользователя оставалась комфортной.

3. Юридические аспекты: Помните, что фотография — это биометрические персональные данные. Согласно законодательству (например, 152-ФЗ в РФ), необходимо получить письменное согласие сотрудника на обработку и хранение его фото в информационной системе.

Подведем итог: для простых учебных задач или небольших самописных баз допустимо использование реквизита типа ХранилищеЗначения в справочнике ФизическиеЛица. Однако для профессиональной разработки стандартом является использование подсистемы присоединенных файлов с хранением данных в томах на диске.

← На главную