Как правильно прикрепить Word-файл к элементу справочника и использовать его данные для макетов

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

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

Выбор архитектуры хранения: База данных или внешнее хранилище?

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

  1. Хранение непосредственно в информационной базе (в реквизите типа ХранилищеЗначения): Подходит для небольшого количества файлов (например, только шаблоны). Плюс в том, что файл всегда «внутри» бэкапа базы. Минус — база быстро растет.
  2. Хранение в Регистре Сведений (РС): Как отмечалось в обсуждении, это один из наиболее гибких вариантов. Мы создаем отдельный регистр, где измерением является ссылка на элемент справочника, а ресурсом — само ХранилищеЗначения с бинарными данными файла. Это позволяет легко отслеживать историю версий и удалять связи, не загромождая объектную таблицу справочника.
  3. Хранение в томах на диске (файловая система): В базе хранятся только пути к файлам и их метаданные. Сами файлы лежат в сетевой папке. Это оптимальный вариант для систем с большим объемом данных (десятки и сотни гигабайт).

Проектирование структуры данных через Регистр Сведений

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

Рассмотрим пример кода для загрузки файла из диалогового окна и записи его в этот регистр:


&НаКлиенте
Процедура ПрикрепитьФайл(Команда)
    Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
    Диалог.Фильтр = "Документы Word (*.docx)|*.docx";
    
    Если Диалог.Выбрать() Тогда
        ВыбранныйФайл = Диалог.ПолноеИмяФайла;
        ДанныеФайла = Новый ДвоичныеДанные(ВыбранныйФайл);
        ПоместитьФайлНаСервер(ДанныеФайла, Диалог.ИмяФайла);
    КонецЕсли;
КонецПроцедуры

&НаСервере
Процедура ПоместитьФайлНаСервер(ДанныеФайла, ИмяФайла)
    МенеджерЗаписи = РегистрыСведений.ПрисоединенныеФайлы.СоздатьМенеджерЗаписи();
    МенеджерЗаписи.Объект = Объект.Ссылка;
    МенеджерЗаписи.ДанныеФайла = Новый ХранилищеЗначения(ДанныеФайла, Новый СжатиеДанных(9));
    МенеджерЗаписи.ИмяФайла = ИмяФайла;
    МенеджерЗаписи.ДатаДобавления = ТекущаяДата();
    МенеджерЗаписи.Записать();
КонецПроцедуры

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

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

Для интеграции достаточно включить справочник в состав типов определяемого характеристики ВладелецФайлов и настроить стандартные команды на формах. Это сэкономит десятки часов разработки.

Извлечение данных из Word-файла для формирования макета

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

Способ 1: Использование COM-объекта (Microsoft Word)

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


&НаСервере
Функция ПолучитьТекстИзWord(СсылкаНаОбъект)
    Запись = РегистрыСведений.ПрисоединенныеФайлы.СоздатьМенеджерЗаписи();
    Запись.Объект = СсылкаНаОбъект;
    Запись.Прочитать();
    
    Если Не Запись.Выбран() Тогда Возврат ""; КонецЕсли;
    
    ДвоичныеДанные = Запись.ДанныеФайла.Получить();
    ВременныйПуть = КаталогВременныхФайлов() + "temp.docx";
    ДвоичныеДанные.Записать(ВременныйПуть);
    
    Попытка
        WordApp = Новый COMОбъект("Word.Application");
        WordDoc = WordApp.Documents.Open(ВременныйПуть);
        ПолныйТекст = WordDoc.Content.Text;
        WordDoc.Close();
        WordApp.Quit();
        Возврат ПолныйТекст;
    Исключение
        // Обработка ошибки, если Word не установлен
        Возврат "Ошибка чтения файла";
    КонецПопытки;
КонецФункции

Способ 2: Работа с Word как с ZIP-архивом (OpenXML)

Современные файлы .docx являются архивами, внутри которых лежат XML-файлы. Мы можем прочитать содержимое без установки Microsoft Office на сервере. Рассмотрим алгоритм:

  1. Переименовываем расширение файла в .zip.
  2. Используем объект ЧтениеZipФайла для извлечения файла word/document.xml.
  3. С помощью ЧтениеXML разбираем структуру документа и находим текстовые узлы.
  4. Вставляем полученный текст в ячейки табличного документа 1С или в параметры макета.

Важные рекомендации по безопасности и обслуживанию

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

Контроль объема: Если вы решили хранить файлы в базе, обязательно настройте регламентное задание, которое будет проверять размер таблицы регистра сведений. Если объем файлов превышает 50–100 Гб, рассмотрите возможность переноса данных в тома хранения (на сетевой диск).

Очистка временных данных: При извлечении файла из ХранилищаЗначения для анализа через COM-объект, 1С создает временный файл на диске сервера. Всегда используйте конструкцию Попытка...Исключение и обязательно вызывайте УдалитьФайлы() в блоке КонецПопытки, чтобы не переполнять системные каталоги временными данными.

Бэкап: Если файлы хранятся на диске (вне базы), помните, что обычный бэкап 1С (dt-файл) их не содержит. Вам необходимо настроить синхронное резервное копирование и базы данных SQL, и сетевой папки с томами хранения файлов.

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

← На главную