При разработке конфигураций на платформе 1С:Предприятие 8.3 часто возникает задача привязки внешних документов (например, договоров в формате Word) к конкретным элементам справочников. Это необходимо не только для хранения, но и для последующего анализа содержимого файла, извлечения данных и формирования на их основе печатных форм или сложных макетов. В этой статье мы подробно разберем, как спроектировать такую систему, где лучше хранить файлы и как организовать программную связь между справочником и документом.
Прежде чем приступать к написанию кода, проанализируем, где именно будут физически располагаться файлы. Это критически важный вопрос, так как неправильный выбор может привести к чрезмерному росту объема базы данных и замедлению выполнения бэкапов. Рассмотрим основные подходы:
ХранилищеЗначения с бинарными данными файла. Это позволяет легко отслеживать историю версий и удалять связи, не загромождая объектную таблицу справочника.Разберем вариант с использованием Регистра Сведений, так как он обеспечивает наилучший баланс между производительностью и удобством управления данными. Создадим регистр, назовем его, например, ПрисоединенныеФайлы. Проанализируем, какие поля нам понадобятся:
Объект (Тип: СправочникСсылка.ВашСправочник) — владелец файла.ДанныеФайла (Тип: ХранилищеЗначения) — бинарные данные Word-документа.ИмяФайла (Тип: Строка) — оригинальное имя для корректного сохранения.Расширение (Тип: Строка) — например, "docx".ДатаДобавления (Тип: Дата) — для ведения истории.Рассмотрим пример кода для загрузки файла из диалогового окна и записи его в этот регистр:
&НаКлиенте
Процедура ПрикрепитьФайл(Команда)
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
Диалог.Фильтр = "Документы Word (*.docx)|*.docx";
Если Диалог.Выбрать() Тогда
ВыбранныйФайл = Диалог.ПолноеИмяФайла;
ДанныеФайла = Новый ДвоичныеДанные(ВыбранныйФайл);
ПоместитьФайлНаСервер(ДанныеФайла, Диалог.ИмяФайла);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ПоместитьФайлНаСервер(ДанныеФайла, ИмяФайла)
МенеджерЗаписи = РегистрыСведений.ПрисоединенныеФайлы.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Объект = Объект.Ссылка;
МенеджерЗаписи.ДанныеФайла = Новый ХранилищеЗначения(ДанныеФайла, Новый СжатиеДанных(9));
МенеджерЗаписи.ИмяФайла = ИмяФайла;
МенеджерЗаписи.ДатаДобавления = ТекущаяДата();
МенеджерЗаписи.Записать();
КонецПроцедуры
Профессиональный подход в современной разработке на 1С подразумевает использование БСП. В ней уже реализована подсистема "Работа с файлами". Выясним, почему это лучше ручного написания:
Для интеграции достаточно включить справочник в состав типов определяемого характеристики ВладелецФайлов и настроить стандартные команды на формах. Это сэкономит десятки часов разработки.
Теперь перейдем к самому сложному этапу: получению данных из прикрепленного файла для включения их в печатную форму документа. Проанализируем два основных способа работы с форматом .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 на сервере. Рассмотрим алгоритм:
.zip.ЧтениеZipФайла для извлечения файла word/document.xml.ЧтениеXML разбираем структуру документа и находим текстовые узлы.Выясним несколько нюансов, о которых часто забывают при реализации прикрепления файлов:
Контроль объема: Если вы решили хранить файлы в базе, обязательно настройте регламентное задание, которое будет проверять размер таблицы регистра сведений. Если объем файлов превышает 50–100 Гб, рассмотрите возможность переноса данных в тома хранения (на сетевой диск).
Очистка временных данных: При извлечении файла из ХранилищаЗначения для анализа через COM-объект, 1С создает временный файл на диске сервера. Всегда используйте конструкцию Попытка...Исключение и обязательно вызывайте УдалитьФайлы() в блоке КонецПопытки, чтобы не переполнять системные каталоги временными данными.
Бэкап: Если файлы хранятся на диске (вне базы), помните, что обычный бэкап 1С (dt-файл) их не содержит. Вам необходимо настроить синхронное резервное копирование и базы данных SQL, и сетевой папки с томами хранения файлов.
Таким образом, правильное прикрепление файла к справочнику — это не просто создание ссылки, а проектирование надежной системы хранения и эффективных алгоритмов чтения данных, которые позволят автоматизировать формирование ваших печатных форм и отчетов.