Документ Word в базе 1С: прикрепить файл, сохранить в реквизит или достать текст
Содержание
Загрузить документ
Word в 1С проще всего без программирования: откройте нужный документ или элемент справочника, нажмите кнопку со скрепкой (присоединённые файлы) и перетащите туда файл .docx. Так работают все типовые конфигурации на БСП: Бухгалтерия 3.0, ЗУП 3.1, УТ 11, ERP. Если файл нужен не как вложение, а как данные — в своём реквизите, в виде текста или массово из папки, — понадобится код или внешняя обработка.
Выбор метода зависит от одного вопроса: что вы потом будете делать с документом. Открыть и посмотреть — хватит вложения. Хранить в своём объекте доработанной конфигурации — реквизит типа ХранилищеЗначения. Разобрать текст договора по полям — чтение содержимого .docx. Загрузить сотню файлов разом — обработка.
Что проверить до загрузки Word: формат, клиент, права
Перед первой загрузкой стоит потратить пару минут на проверку окружения. Большинство «не грузится» решаются здесь.
- 📄 Формат файла. Современный
.docx— это ZIP-архив с XML внутри. Его можно и хранить, и читать средствами платформы без установленного Word. Старый.doc— двоичный формат: хранить можно, а текст достать только через сам Word или конвертацию. - 💻 Клиент. В тонком клиенте под Windows загрузка работает сразу. В веб-клиенте браузер попросит установить расширение для работы с файлами — без него редактирование вложений не заработает.
- 🔐 Права. Пользователю нужно право добавлять и изменять файлы. В типовых конфигурациях оно входит в профили групп доступа; если кнопка добавления неактивна, начните с проверки профиля.
- 📦 Размер. В БСП есть ограничение на максимальный размер одного файла и список запрещённых расширений. Оба параметра задаёт администратор.
Отдельно решите, где будут жить файлы. Это определяет рост базы.
| Место хранения | Что происходит | Когда выбирать |
|---|---|---|
| В информационной базе | Файл лежит в таблице базы, попадает в выгрузку .dt и резервную копию | Файлов немного, база небольшая |
| В томах на диске | В базе только ссылка, сам файл — в каталоге на сервере | Сотни документов, сканы, тяжёлые вложения |
Тома настраивает администратор в разделе Администрирование → Общие настройки (группа настроек работы с файлами). Для клиент-серверной базы путь к тому указывайте сетевой, вида \\server\1c_files, и проверьте, что у пользователя службы сервера 1С есть права на запись в этот каталог.
Какой способ загрузки Word в 1С выбрать
| Способ | Нужен программист | Что получаете | Риски |
|---|---|---|---|
| Присоединённые файлы (скрепка) | Нет | Вложение к документу, версии, редактирование в Word | Рост базы без томов |
Реквизит ХранилищеЗначения | Да, доработка конфигурации | Файл внутри своего объекта | Снятие с поддержки, если менять типовую конфигурацию |
Чтение текста .docx | Да | Строка с текстом для разбора и поиска | Теряется форматирование, таблицы — построчно |
| Внешняя обработка | Да, но конфигурацию не трогаем | Массовая загрузка из папки | Нужны права на запуск внешних обработок |
| Макет печатной формы в Word | Нет | Свой шаблон для печати | Только для печатных форм, не для хранения |
Загрузка документа Word через присоединённые файлы
Это основной способ для пользователя. Он одинаков в Бухгалтерии, ЗУП и УТ, потому что механизм приходит из Библиотеки стандартных подсистем.
Как прикрепить файл
- Откройте объект, к которому относится документ: договор в справочнике
Договоры, карточку сотрудника, документ реализации. - Запишите объект, если он новый. К незаписанному объекту файл не прикрепить — у него ещё нет ссылки.
- Нажмите кнопку со скрепкой в командной панели формы. Откроется список присоединённых файлов.
- Перетащите
.docxмышью из проводника в этот список или нажмите команду добавления и выберите файл на диске. - Закройте список. Счётчик рядом со скрепкой покажет количество файлов.
Как отредактировать Word прямо из 1С
Двойной щелчок по файлу откроет его в Word на просмотр. Чтобы правки вернулись в базу, нужен режим редактирования:
- В списке файлов выберите команду редактирования. Файл помечается как занятый вами, другие пользователи видят это.
- Внесите правки в Word и сохраните документ клавишами
Ctrl+S. - Вернитесь в 1С и завершите редактирование. Только после этого изменённый файл попадёт в базу.
Если закрыть Word и забыть завершить редактирование, файл останется занятым, а в базе — старая версия. Правки живут только в рабочем каталоге на вашем компьютере.
При включённом хранении версий каждое завершение редактирования создаёт новую версию. Это удобно для договоров с несколькими кругами согласования: всегда видно, кто и когда менял текст.
Word как шаблон печатной формы
Если задача — не хранить файл, а печатать документы по своему шаблону, используйте Администрирование → Печатные формы, отчеты и обработки → Макеты печатных форм. Для части форм можно загрузить макет
в формате Office Open XML (.docx) с полями-параметрами. Это отдельная тема, но путают её с загрузкой вложений часто.
Программная загрузка Word в реквизит через двоичные данные
Когда файл нужно хранить в своём объекте — например, шаблон письма в справочнике ШаблоныПисем, — создают реквизит типа ХранилищеЗначения и строковый реквизит для имени файла.
Не дорабатывайте типовую конфигурацию напрямую — используйте расширение или свой объект, иначе следующее обновление превратится в сравнение и объединение.
Ключевая деталь: реквизит типа ХранилищеЗначения не передаётся в данные формы. Поэтому файл кладут во временное хранилище, а в объект записывают в обработчике ПередЗаписьюНаСервере.
&НаКлиенте
Процедура ЗагрузитьФайлWord(Команда)
Оповещение = Новый ОписаниеОповещения("ПослеПомещенияФайла", ЭтотОбъект);
НачатьПомещениеФайла(Оповещение, , , Истина, УникальныйИдентификатор);
КонецПроцедуры
&НаКлиенте
Процедура ПослеПомещенияФайла(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
Если Не Результат Тогда
Возврат;
КонецЕсли;
АдресФайлаWord = Адрес; // реквизит формы типа Строка
Объект.ИмяФайлаWord = Новый Файл(ВыбранноеИмяФайла).Имя;
Модифицированность = Истина;
КонецПроцедуры
&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
Если ЗначениеЗаполнено(АдресФайлаWord) Тогда
Данные = ПолучитьИзВременногоХранилища(АдресФайлаWord);
ТекущийОбъект.ФайлWord = Новый ХранилищеЗначения(Данные, Новый СжатиеДанных(9));
АдресФайлаWord = "";
КонецЕсли;
КонецПроцедуры
Что здесь происходит:
НачатьПомещениеФайлаоткрывает диалог выбора и передаёт файл на сервер во временное хранилище. Синхронные вызовы не нужны, код работает и в веб-клиенте.- Адрес запоминается в реквизите формы, имя — в объекте.
- При записи двоичные данные упаковываются в
ХранилищеЗначениясо сжатием. Документ Word на 2 МБ в хранилище обычно занимает меньше:.docxуже сжат, выигрыш небольшой, а вот.docсжимается заметно.
Если файл уже лежит на сервере, всё ещё короче: Новый ДвоичныеДанные("D:\Шаблоны\договор.docx") в серверной процедуре. Путь здесь — путь на сервере 1С, а не на компьютере пользователя.
Как прочитать текст из файла Word в 1С
Иногда сам файл не нужен — нужен его текст: номер договора, сумма, ФИО. Есть два приёма.
Без Word: docx как ZIP-архив
Текст документа лежит внутри .docx в файле word/document.xml, абзацы — в тегах w:p, фрагменты текста — в w:t. Платформа умеет и распаковать архив
, и прочитать XML. Работает на сервере, на Linux, без установленного Office.
Функция ТекстИзDocx(ПутьКФайлу) Экспорт
Каталог = ПолучитьИмяВременногоФайла("docx");
СоздатьКаталог(Каталог);
Архив = Новый ЧтениеZipФайла(ПутьКФайлу);
Для Каждого Элемент Из Архив.Элементы Цикл
Если Элемент.Имя = "document.xml" Тогда
Архив.Извлечь(Элемент, Каталог, РежимВосстановленияПутейФайловZIP.НеВосстанавливать);
КонецЕсли;
КонецЦикла;
Архив.Закрыть();
Чтение = Новый ЧтениеXML;
Чтение.ОткрытьФайл(Каталог + ПолучитьРазделительПути() + "document.xml");
Чтение.ИгнорироватьПробелы = Ложь;
Части = Новый Массив;
ВнутриТекста = Ложь;
Пока Чтение.Прочитать() Цикл
Если Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента И Чтение.Имя = "w:t" Тогда
ВнутриТекста = Истина;
ИначеЕсли Чтение.ТипУзла = ТипУзлаXML.КонецЭлемента И Чтение.Имя = "w:t" Тогда
ВнутриТекста = Ложь;
ИначеЕсли Чтение.ТипУзла = ТипУзлаXML.КонецЭлемента И Чтение.Имя = "w:p" Тогда
Части.Добавить(Символы.ПС);
ИначеЕсли Чтение.ТипУзла = ТипУзлаXML.Текст И ВнутриТекста Тогда
Части.Добавить(Чтение.Значение);
КонецЕсли;
КонецЦикла;
Чтение.Закрыть();
УдалитьФайлы(Каталог);
Возврат СтрСоединить(Части, "");
КонецФункции
Две тонкости, о которые спотыкаются:
- ✂️ Word режет одно слово на несколько
w:t, если в середине менялось форматирование или включалась проверка орфографии. Поэтому фрагменты склеиваем без пробела, а перенос строки ставим только в конце абзаца. - ␣ Свойство
ИгнорироватьПробелыпо умолчанию включено, и пробелы, стоящие отдельным фрагментом, пропадут. Отсюда строкаЧтение.ИгнорироватьПробелы = Ложь.
Ячейки таблиц Word тоже состоят из абзацев w:p, поэтому таблица превратится в столбик строк. Для разбора реквизитов этого обычно хватает: ищите нужное значение через СтрНайти по меткам вроде «Сумма договора:» и берите текст после метки до конца строки.
Через Word: COM-объект
Для старого .doc остаётся вариант с установленным Word на компьютере пользователя:
&НаКлиенте
Функция ТекстЧерезWord(ПутьКФайлу)
Word = Новый COMОбъект("Word.Application");
Документ = Word.Documents.Open(ПутьКФайлу);
Текст = Документ.Content.Text;
Документ.Close(0);
Word.Quit();
Возврат Текст;
КонецФункции
Close(0) закрывает документ без сохранения изменений. Без Word.Quit() в диспетчере задач копятся процессы WINWORD.EXE.
Запускать Word через COM на сервере 1С не стоит: служба работает под служебной учётной записью без интерактивного сеанса, Word там зависает или падает на диалогах. Делайте это на клиенте или конвертируйте .doc в .docx заранее.
Внешняя обработка для массовой загрузки файлов Word
Типичный случай: в папке 300 договоров, имя файла — номер договора. Нужно прикрепить каждый к своему элементу справочника. Вручную — полдня, обработкой — минута.
Почему внешняя обработка, а не доработка: она не меняет конфигурацию, её можно отладить на копии базы и выбросить после загрузки.
Как устроить:
- Создайте в Конфигураторе внешнюю обработку
(
Файл→Новый→Внешняя обработка) с реквизитомКаталоги командой «Загрузить». - В серверной процедуре получите список файлов:
НайтиФайлы(Каталог, "*.docx"). Каталог должен быть доступен серверу 1С. - Для каждого файла по
ИмяБезРасширениянайдите объект-владелец, например договор по номеру. - Прикрепите файл через программный интерфейс БСП: модуль
РаботаСФайлами, функцияДобавитьФайл, параметры готовитРаботаСФайлами.ПараметрыДобавленияФайла(). Файл передаётся адресом во временном хранилище:ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(Путь)). - Ведите протокол: какие файлы загружены, для каких не нашёлся владелец.
Запуск: в тонком клиенте через Файл → Открыть (нужно право на интерактивное открытие внешних обработок) или через регистрацию в Администрирование → Печатные формы, отчеты и обработки → Дополнительные отчеты и обработки.
Как открыть или выгрузить сохранённый документ Word
С присоединёнными файлами всё штатно: в списке файлов есть команды открыть и сохранить на диск. Для своего реквизита нужен код — файл из хранилища возвращается во временное хранилище, а оттуда на компьютер пользователя.
&НаСервере
Функция АдресФайлаДляВыгрузки()
Данные = Объект.Ссылка.ФайлWord.Получить();
Возврат ПоместитьВоВременноеХранилище(Данные, УникальныйИдентификатор);
КонецФункции
&НаКлиенте
Процедура ВыгрузитьФайлWord(Команда)
Описание = Новый ОписаниеПередаваемогоФайла(Объект.ИмяФайлаWord, АдресФайлаДляВыгрузки());
Файлы = Новый Массив;
Файлы.Добавить(Описание);
НачатьПолучениеФайлов(Новый ОписаниеОповещения("ПослеПолученияФайлов", ЭтотОбъект), Файлы, , Истина);
КонецПроцедуры
&НаКлиенте
Процедура ПослеПолученияФайлов(ПолученныеФайлы, ДополнительныеПараметры) Экспорт
// ПолученныеФайлы = Неопределено, если пользователь отменил сохранение
КонецПроцедуры
Параметр Интерактивно = Истина показывает пользователю диалог сохранения. Без него файл ляжет в каталог по умолчанию без вопросов.
Если Получить() вернул Неопределено, в реквизит ничего не записывали — проверьте, сработал ли ПередЗаписьюНаСервере и был ли объект сохранён после выбора файла.