Документ Word в базе 1С: прикрепить файл, сохранить в реквизит или достать текст

· 10 мин

Содержание

Загрузить документ 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?

Загрузка документа Word через присоединённые файлы

Это основной способ для пользователя. Он одинаков в Бухгалтерии, ЗУП и УТ, потому что механизм приходит из Библиотеки стандартных подсистем.

Как прикрепить файл

  1. Откройте объект, к которому относится документ: договор в справочнике Договоры, карточку сотрудника, документ реализации.
  2. Запишите объект, если он новый. К незаписанному объекту файл не прикрепить — у него ещё нет ссылки.
  3. Нажмите кнопку со скрепкой в командной панели формы. Откроется список присоединённых файлов.
  4. Перетащите .docx мышью из проводника в этот список или нажмите команду добавления и выберите файл на диске.
  5. Закройте список. Счётчик рядом со скрепкой покажет количество файлов.

Как отредактировать Word прямо из 1С

Двойной щелчок по файлу откроет его в Word на просмотр. Чтобы правки вернулись в базу, нужен режим редактирования:

  1. В списке файлов выберите команду редактирования. Файл помечается как занятый вами, другие пользователи видят это.
  2. Внесите правки в Word и сохраните документ клавишами Ctrl+S.
  3. Вернитесь в 1С и завершите редактирование. Только после этого изменённый файл попадёт в базу.

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

При включённом хранении версий каждое завершение редактирования создаёт новую версию. Это удобно для договоров с несколькими кругами согласования: всегда видно, кто и когда менял текст.

Word как шаблон печатной формы

Если задача — не хранить файл, а печатать документы по своему шаблону, используйте Администрирование → Печатные формы, отчеты и обработки → Макеты печатных форм. Для части форм можно загрузить макет в формате Office Open XML (.docx) с полями-параметрами. Это отдельная тема, но путают её с загрузкой вложений часто.

Программная загрузка Word в реквизит через двоичные данные

Когда файл нужно хранить в своём объекте — например, шаблон письма в справочнике ШаблоныПисем, — создают реквизит типа ХранилищеЗначения и строковый реквизит для имени файла.

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

Ключевая деталь: реквизит типа ХранилищеЗначения не передаётся в данные формы. Поэтому файл кладут во временное хранилище, а в объект записывают в обработчике ПередЗаписьюНаСервере.

&НаКлиенте
Процедура ЗагрузитьФайлWord(Команда)
	Оповещение = Новый ОписаниеОповещения("ПослеПомещенияФайла", ЭтотОбъект);
	НачатьПомещениеФайла(Оповещение, , , Истина, УникальныйИдентификатор);
КонецПроцедуры

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

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

Что здесь происходит:

  1. НачатьПомещениеФайла открывает диалог выбора и передаёт файл на сервер во временное хранилище. Синхронные вызовы не нужны, код работает и в веб-клиенте.
  2. Адрес запоминается в реквизите формы, имя — в объекте.
  3. При записи двоичные данные упаковываются в ХранилищеЗначения со сжатием. Документ 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 договоров, имя файла — номер договора. Нужно прикрепить каждый к своему элементу справочника. Вручную — полдня, обработкой — минута.

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

Как устроить:

  1. Создайте в Конфигураторе внешнюю обработку (Файл → Новый → Внешняя обработка) с реквизитом Каталог и командой «Загрузить».
  2. В серверной процедуре получите список файлов: НайтиФайлы(Каталог, "*.docx"). Каталог должен быть доступен серверу 1С.
  3. Для каждого файла по ИмяБезРасширения найдите объект-владелец, например договор по номеру.
  4. Прикрепите файл через программный интерфейс БСП: модуль РаботаСФайлами, функция ДобавитьФайл, параметры готовит РаботаСФайлами.ПараметрыДобавленияФайла(). Файл передаётся адресом во временном хранилище: ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(Путь)).
  5. Ведите протокол: какие файлы загружены, для каких не нашёлся владелец.

Запуск: в тонком клиенте через Файл → Открыть (нужно право на интерактивное открытие внешних обработок) или через регистрацию в Администрирование → Печатные формы, отчеты и обработки → Дополнительные отчеты и обработки.

Перед массовой загрузкой
Выполнено: 0 / 5

Как открыть или выгрузить сохранённый документ Word

С присоединёнными файлами всё штатно: в списке файлов есть команды открыть и сохранить на диск. Для своего реквизита нужен код — файл из хранилища возвращается во временное хранилище, а оттуда на компьютер пользователя.

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

&НаКлиенте
Процедура ВыгрузитьФайлWord(Команда)
	Описание = Новый ОписаниеПередаваемогоФайла(Объект.ИмяФайлаWord, АдресФайлаДляВыгрузки());
	Файлы = Новый Массив;
	Файлы.Добавить(Описание);
	НачатьПолучениеФайлов(Новый ОписаниеОповещения("ПослеПолученияФайлов", ЭтотОбъект), Файлы, , Истина);
КонецПроцедуры

&НаКлиенте
Процедура ПослеПолученияФайлов(ПолученныеФайлы, ДополнительныеПараметры) Экспорт
	// ПолученныеФайлы = Неопределено, если пользователь отменил сохранение
КонецПроцедуры

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

Если Получить() вернул Неопределено, в реквизит ничего не записывали — проверьте, сработал ли ПередЗаписьюНаСервере и был ли объект сохранён после выбора файла.

Ошибки при загрузке Word в 1С и что с ними делать

Диагностика: выберите симптом

Частые вопросы

Сильно ли растёт база от файлов Word?
На объём самих файлов. Сотня договоров по 200 КБ — около 20 МБ. Со сканами внутри рост в разы больше, тогда лучше тома на диске.
Можно ли искать по тексту прикреплённых документов Word?
Да, если включён полнотекстовый поиск: БСП извлекает текст из файлов и включает его в индекс. Индекс нужно обновлять регламентным заданием.
Работает ли загрузка Word в 1С:Фреш и других облаках?
Присоединённые файлы работают. COM-объекты и запуск внешних обработок без проверки в облаке обычно запрещены, поэтому разбор doc через Word там недоступен.
Чем docx лучше doc для хранения в 1С?
Docx можно прочитать средствами платформы без Office и на сервере Linux. Doc читается только через Word, а он есть не у всех пользователей.
Попадут ли файлы из томов в выгрузку .dt?
Нет, в выгрузку попадают только данные базы. Каталоги томов копируйте отдельно, иначе после восстановления ссылки на файлы будут вести в пустоту.