1с word saveas параметры
Microsoft.Interop.Word.Document.SaveAs. Неверное сохранение
Создаю новый документ .docх и пытаюсь сохранить в папке. Но файл сохраняется в папке на один.
Ошибка на saveas
procedure TForm1.MenuItem6Click(Sender: TObject); begin if filework='' then Saveas else .
Сохранение SaveAs
Подскажите, пожалуйста, как осуществить следующее: необходимо сохранить данные в новый файл excel.
Процедура клиент, сервер ?
Есть доступ до папки у пользователя ?
1С пробовал от админа запускать ?
И что за ошибка хоть ?
1. Процедура сервер
2. Есть доступ
3. Работаю по админом
4. Метод объекта не обнаружен (SaveAs)
Докум.SaveAs(ИмяФайла);
Ermak27, полностью процедуру всю переноси на клиент. А данные для заполнения вытаскивай через функции на сервере несли понадобится.
Перед процедурой у тебя написано &НаСервере, меняй это на &НаКлиенте. Повалятся ошибки, такие как обращение к константе например и начинай их исправлять потихоньку.
Я тебя не так понял на счёт сервера. У меня вообщем ничего не стоит перед процедурой. Нет &НаСервере и &НаКлиенте. У меня база крутиться на sql сервере
Модуле формы. Процедура срабатывает при нажатии кнопки
Попробуй так прописать
ну не стоит и не стоит. где процедура выполняется, когда не стоит? в воздухе? вряд ли.
посмотрите, есть ли у вас на сервере диск Е, куда вы пытаетесь записать, и есть ли права на запись на него
dggrom, выдаёт ошибку Поле объекта не обнаружено (Documents)
Докум.Documents.SaveAs(ИмяФайла);
Добавлено через 2 минуты
Yulunga, Я же писал что диск есть, права есть
Yulunga, у него метод записи самой не видет.
Ermak27, что за конфигурация, какие формы, управляемые или нет ?
по мне так проблема в этом:
Докум=Word.
Word=Докум;
Докум=Word.
запутал с какой-то целью. поэтому и нет там сейвас, что применяется не к тому к чему надо. чехарда. имена переменных закончились?
Yulunga, я закомментировал Word=Докум;, теперь выдаёт ошибку Метод объекта не обнаружен (Range)
Докум = Word.Range(0,0);
Код который в самом начале, он так и выводит как надо, но встала задача сохранить эти вордовские документы по индексу, вот тут проблема и появилась у меня. Вчера я переделал немного код
Создал форму с типом ActiveDocument. Написал код который сохраняет мне вордовские документы но значение заносит в каждый лист, а мне нужно два значения на лист.
Метод SaveAs в Excel
Всем доброго времени суток.Помогите разобраться с методом SaveAs Есть,ну назовем ее,небольшая.
SaveAS excel-файл на странице
привет всем на странице создаётся таблица с выбранными данными из базы данных, теперь требуется.
Lazarus MsWord SaveAs Error
Всем Доброго вечера. Уже 2 дня мучаюсь непонимаю что не так, не получается в lazarus-е сохранить.
Сохранение XL.ActiveWorkBook.SaveAs(buf);
Почему файл не сохраняется в папке в которой находится exe файл? В папке в которой хранится exe.
Не грузятся файлы! Call to a member function saveAs() on null
Я не пойму что он от меня хочет $form->file = UploadedFile::getInstance($form, 'file'); .
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Сохраняет указанный документ с новым именем или форматом. Некоторые аргументы этого метода соответствуют параметрам в диалоговом окне "Сохранить как" (меню "файл").
Параметры
Необязательный объект. Имя документа. Значение по умолчанию — текущая папка и имя файла. Если документ никогда не сохранялся, используется имя по умолчанию (например, Doc1. doc). Если документ с указанным именем уже существует, документ перезаписывается без запроса пользователя.
Необязательный объект. Формат, в котором сохранен документ. Может быть любой WdSaveFormat константой. Чтобы сохранить документ в другом формате, укажите соответствующее значение для SaveFormat свойства FileConverter объекта.
Необязательный объект. Значение true , чтобы заблокировать документ для примечаний. Значение по умолчанию - false.
Необязательный объект. Строка пароля для открытия документа. (См. примечания ниже).
Необязательный объект. Значение true , чтобы добавить документ в список недавно использовавшихся файлов в меню файл. По умолчанию используется значение True.
Необязательный объект. Строка пароля для сохранения изменений в документе. (См. примечания ниже).
Необязательный объект. Значение true , чтобы при открытии документа в Microsoft Word предлагалось состояние "только чтение". Значение по умолчанию - false.
Необязательный объект. Значение true для сохранения шрифтов TrueType вместе с документом. Если этот параметр опущен, EmbedTrueTypeFonts аргумент принимает значение EmbedTrueTypeFonts Свойства.
Необязательный объект. Если графика была импортирована с другой платформы (например, Macintosh), значение true , чтобы сохранить только версию Windows импортированной графики.
Необязательный объект. Значение true , чтобы сохранить данные, введенные пользователем в форме, в виде записи данных.
Необязательный объект. Если в документе есть вложенная почта, значение true , чтобы сохранить документ как аоце букву (средство рассылки сохраняется).
Необязательный параметр MsoEncoding . Кодовая страница или набор знаков, которые необходимо использовать для документов, сохраненных в виде кодированных текстовых файлов. По умолчанию используется системная кодовая страница.
Необязательный объект. Если документ сохраняется в виде текстового файла, значение true используется для вставки разрывов строк в конце каждой строки текста.
Необязательный объект. Если документ сохраняется в виде текстового файла, значение true позволяет Word заменять некоторые символы похожим на похожий текст. Например, отображение знака авторского права как (c). Значение по умолчанию - false.
Необязательный объект. Способ, с помощью которого Word помечает разрывы строк и абзацев в документах, сохраненных в виде текстовых файлов. Может быть любой WdLineEndingType константой.
Необязательный объект. Значение true добавляет управляющие символы в выходной файл для сохранения макета текста в исходном документе с двунаправленным письмом.
Комментарии
Избегайте использования в приложениях жестко заданных паролей. Если в процедуре требуется пароль, запросите пароль у пользователя, сохраните его в переменной, а затем используйте эту переменную в коде.
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Сохраняет указанный документ с новым именем или форматом. Некоторые аргументы этого метода соответствуют параметрам в диалоговом окне "Сохранить как" (вкладка "файл").
Параметры
Имя документа. Значение по умолчанию — текущая папка и имя файла. Если документ никогда не сохранялся, используется имя по умолчанию (например, Doc1. doc). Если документ с указанным именем уже существует, он перезаписывается без приглашения пользователя.
Формат, в котором сохранен документ. Может быть любой WdSaveFormat константой. Чтобы сохранить документ в другом формате, укажите соответствующее значение для SaveFormat свойства FileConverter объекта.
значение true , чтобы заблокировать документ для примечаний; в противном случае — false. Значение по умолчанию: false.
Строка пароля для открытия документа.
значение true , чтобы добавить документ в список недавно использовавшихся файлов в меню файл; в противном случае — false. Значение по умолчанию: true.
Строка пароля для сохранения изменений в документе.
значение true , чтобы при открытии документа в Microsoft Word предлагалось состояние "только чтение"; в противном случае — false. Значение по умолчанию: false.
значение true для сохранения шрифтов TrueType вместе с документом; в противном случае — false. Если этот параметр опущен, EmbedTrueTypeFonts параметр принимает значение EmbedTrueTypeFonts Свойства.
Если графика была импортирована с другой платформы (например, Macintosh), значение true , чтобы сохранить только версию импортированной графики Microsoft Windows.
значение true , чтобы сохранить данные, введенные пользователем в форме, в виде записи; в противном случае — false.
Если в документе есть вложенная почта, значение true , чтобы сохранить документ как аоце букву (средство рассылки сохраняется).
Кодовая страница или набор знаков, которые необходимо использовать для документов, сохраненных в виде кодированных текстовых файлов. По умолчанию используется системная кодовая страница. MsoEncodingС этим параметром нельзя использовать все константы.
Если документ сохраняется в виде текстового файла, значение true используется для вставки разрывов строк в конце каждой строки текста.
Если документ сохраняется в виде текстового файла, значение true позволяет Word заменять некоторые символы похожим на похожий текст. Например, отображение знака авторского права как (c). Значение по умолчанию: false.
Способ, с помощью которого Word помечает разрывы строк и абзацев в документах, сохраненных в виде текстовых файлов. Может быть одной из следующих WdLineEndingType констант: wdCRLF (по умолчанию) или ф:Микрософт.оффице.Интероп.Ворд.вдлининдингтипе.вдкронли.
значение true добавляет управляющие символы в выходной файл для сохранения макета текста в исходном документе с двунаправленным письмом.
Режим совместимости, который Word 2010 использует при открытии документа. WdCompatibilityModeизмен.
Когда мы работаем в файловом варианте и заполняем Word программно, можно не заморачиваться с передачей Word-овского документа на клиент, т.к. после методов выполненных НаСервере Word-овский документ отобразится на экране монитора пользователя, но в клиент-серверном варианте так просто поступить не получится.
Метод ПолучитьМакет работает только на сервере. Методы работы или заполнения Word-а работают как на клиенте, так и на сервере. Показывать пользователю документ (Visible = Истина; Activate();) нужно на клиенте. Получается, нам нужно получить документ на сервере и передать его на клиент, чтобы показать. В данной статье будет рассмотрено 2 способа передачи с сервера на клиент. 1 способ для ActiveDocument, второй для ДвоичныеДанные.
Немного об ActiveDocument
Что пишет о ActiveDocument 1С:
Технология ActiveDocument предназначена для редактирования документов внешними по отношению к 1С:Предприятию 8 редакторами.
Эта технология позволяет редактировать документы визуально (например, Word или Excel) непосредственно в окне 1С:Предприятия 8, при этом элементы пользовательского интерфейса (меню, панели команд и т.д.) заменяются на предоставляемые редактором. Документы могут быть предварительно отредактированы и сохранены в макетах конфигурации, а затем макеты могут использоваться пользователями как основы для создания окончательных версий документов.
Следует заметить, что использование макетов ActiveDocument в режиме Предприятия осуществляется только программно - визуальное редактирование возможно только на этапе создания и редактирования конфигурации.
Эта технология применяется в случае, когда в конфигурации необходимо хранить данные, редактируемые другим приложением - такие, например, как шаблоны для факсов или деловых писем, созданные в Microsoft Word, или шаблоны прайс-листов в Microsoft Excel. Такая необходимость возникает, как правило, при регламентировании формата документов (как во внутреннем документообороте, так и при обмене документами со сторонними организациями и клиентами), однако при отсутствии ограничений на формат документа рекомендуется использовать существующие в 1С:Предприятии 8 возможности по оформлению электронных и печатных документов.
Другими словами: в ДвоичныеДанные вы можете только «Загрузить из файла» и «Выгрузить в файл»
А ActiveDocument можно прямо в конфигураторе редактировать в привычном интерфейсе Microsoft Word. Выглядит это так:
Я писал базу с нуля, где было много шаблонов Word, которые постоянно приходилось переписывать. Было очень удобно в конфигураторе открывать фактически Word, редактировать, перезапускать отладку и смотреть, что получилось. Если у вас шаблон не так часто меняется, то можно в принципе использовать «Двоичные данные».
Передача ActiveDocument с сервера на клиент
Просто получить ActiveDocument на сервере и передать его на клиент не получится. Но можно документ полностью заполнить на сервере, на клиент передать уже полностью готовый документ, и на клиенте его просто запустить.
Пример кода:
При использовании этого кода на сервере должен быть установлен офисный пакет. Представленный код является шаблоном (примером) для дальнейшего программирования. Краткий анализ кода:
1. НаКлиенте мы просто получаем файл в виде двоичных данных с сервера, записываем во временную папку и открываем оттуда файл.
2. НаСервере мы получаем макет, его заполняем (дан пример заполнения через метод Find. Execute), сохраняем во временную папку (это будет папка на сервере вида: C:\Users\\AppData\Local\Temp\v8_F0FB_7f3.docx), переводим файл в двоичные данные и передаём на клиент. Для сохранения документа можно использовать методы Передача макет Word (Двоичные данные) с сервера на клиент
В случае передачи двоичных данных представлю практически весь код.
Краткий анализ кода:
Своим кодом я внедрился в СтандартныеПодсистемы.Печать. На форме документа 2 кнопки: «Письмо на оплату» (печать в табличный документ) и «Письмо на оплату (Word)» (печать в Word).
1. НаКлиенте на форме я получаю из модуля менеджера (функция ПечатьПисьма) структуру всех параметров. Далее получаю Word из макета (двоичные данные) и заполняю его на клиенте
2. Задача функции ПечатьПисьма модуля менеджера предназначена только для сбора сведений, которыми потом заполнится Word на клиенте.
Замечание: если вам адрес во временном хранилище нужен не сразу и единожды (как у меня), то корректней помещать во временное хранилище с уникальным идентификатором, дабы значение не удалилось пока не закрыли форму:
2. Можно сохранить файл Word в общую папку и с клиента его просто получать. Главное, чтобы файл никто не удалил.
Специальные предложения
(1) Franco, в "Альтернативы:" я уже дал ссылку на эту статью
(2) w.r., А в чём вопрос то? Боитесь, что значение будет удалено раньше чем вы успеете его использовать?
Кстати для 2-го примера можно и не писать
,т.к. в СтруктураВсехДокументов попадает СтруктураПараметров, в которую в свою очередь попадает только строковые значения (какое значение на какое заменить). Для строковых значений не нужно сериализовать значение. Именно эта строка написана для примера. Если вы так-же как и я в СтруктураПараметров будете писать только строковые значения, то можно и не помещать во временное хранилище.
Да, будет удалено.
Вы, кстати, еще используете без адреса временное хранилище здесь:
И вот тут лучше будет передавать в качестве адреса для временного хранилища идентификатор формы. Те вот так:
У меня даже нет переменной где бы я запомнил адрес во временном хранилище, т.к. как только я делаю "ПоместитьВоВременноеХранилище" потом сразу делаю "ПолучитьИзВременногоХранилища". Между этими двумя действиями нет ни строчки кода, поэтому пропасть значение до получения не может. Кстати код у меня установлен в рабочей базе и всё работает.
Если же кому-то исходя из специфики задачи нужен будет этот адрес не единожды и он его будет потом использовать вплоть до закрытия формы, то конечно корректней использовать УникальныйИдентификатор.
Другими словами: замечание хорошее, но в моей конкретной реализации задачи ничего не потеряется даже без уникального идентификатора.
Спасибо за замечание, статью позже чуть допишу (вдруг кому-то и правда адрес во временном хранилище нужен будет не единожды и сразу).
У меня даже нет переменной где бы я запомнил адрес во временном хранилище, т.к. как только я делаю "ПоместитьВоВременноеХранилище" потом сразу делаю "ПолучитьИзВременногоХранилища". Между этими двумя действиями нет ни строчки кода, поэтому пропасть значение до получения не может.
Вы не внимательно читали видимо описание. Написано:
Т.е. любое выполнение регламентного задания или иных действий параллельно работающих пользователей, использующих общие модули, в промежутке выполнения вашего кода на форме очистит временное хранилище, куда вы поместили макет еше до получения из хранилища
(7) w.r., Провожу следующий эксперимент:
Запускаю отладку.
На коде "Возврат Документы.ПисьмоНаОплату.ПечатьПисьма(МассивОбъектов, ОбъектыПечати, Word);" нажимаю F11. Захожу в модуль менеджера, через "Возврат ПоместитьВоВременноеХранилище(СтруктураВсехДокументов);) успешно возвращаюсь обратно на форму в функцию:
Я НаСервере в форме в процедуре ПечатьПисьма (см. скрин). Во временное хранилище произошло помещение объекта, но на клиент ещё не передано (и соответственно не получено из временного хранилища).
Жду 10 минут. Рабочая база, около 100 активных пользователей. За эти 10 минут было выполнено как минимум 4 фоновых задания (часть из них ни один раз) (см. скрин). Я открыл 2 сеанс, там вывел на печать письмо в Word. Ну явно за 10 минут одно из выше перечисленных условий для удаления файла было выполнено (если вы эти условия читаете в контексте всех пользователей и всех сеансов).
Далее 10 минут спустя я жму F11 выхожу на клиент и у меня он спокойно получает из временного хранилища и выходит файл Word на экран моего монитора.
При одновременной работе с файлом на клиенте и на сервере необходимо использовать передачу файла через временное хранилище (методы ПоместитьФайл, ПоместитьФайлы, ПолучитьФайл, ПолучитьФайлы, НачатьПомещениеФайла, ПоместитьВоВременноеХранилище, ПолучитьИзВременногоХранилища).
.
Для сохранения данных во временном хранилище между несколькими серверными вызовами, при помещении его в хранилище необходимо использовать параметр УникальныйИдентификаторФормы метода ПоместитьФайл, передав в него идентификатор текущей формы. Такие значение будут удалены их временного хранилища только при закрытии указанной формы.
Там конечно говорится про другой метод, но всё-таки имеется ввиду серверный вызов в пределах одного сеанса / одного кода, а не всех пользователей! Для указанного там в примере метода "Переместитьфайл" то-же самое написано в СП как и для ПоместитьВоВременноеХранилище
Если параметр не указан, помещенное значение будет удалено, после очередного запроса сервера из общего модуля, при контекстном и неконтекстном серверном вызове из формы, при серверном вызове из модуля команды или при получении формы.
Там даже приведён код с пометкой "Правильно:" вызов без уникального идентификатора. После этого вызова идёт всего один серверный вызов. И прямо указывается, что код корректный, но если нужно сделать несколько серверных вызова с сохранением адреса, то нужно использовать уникальный идентификатор! Почитайте ссылку.
Статья представляет собой еще один велосипед на тему формирования документов на основе шаблонов через СОМ-Объект. Как и все другие велосипеды, этот написан потому, что другие велосипеды - плохие. В действительности, если погуглить, мы получим огромное количество ссылок на советы в стиле "сделай так и будет тебе счастье". Но почему "так", зачем "так", какие есть альтернативы - авторы советов не раскрывают. Хуже того, половина найденных таким способом рецептов окажутся откровенно вредными. Судя по тому, как вредные рецепты копируются из совета в совет, большинство разработчиков, из тех, что переписываются на форумах, просто воспроизводят то, что когда-то нагуглили сами. Ну да, работает - не трогай :-)
Цель статьи - собрать в одном месте необходимый и достаточный набор рецептов по заполнению документов Ворд на основании шаблонов с помощью СОМ-Объекта
Оглавление:
Зачем и почему нужны файлы Ворд?
Немного философии. В действительности, зачем нужно формировать из информационной базы текстовые файлы, и почему обязательно в формате Ворд?
Потому, что пользователь для работы с текстом использует текстовый процессор. Строго говоря, кроме Ворда всегда существовали альтернативные программы, не уступающие по функционалу. Сейчас 2021 год и пользователи давно привыкли к таким вещам как жесткий пробел, запрет висящих строк, абзац, начинающийся с новой страницы, межстрочный интервал, колонтитулы и абзацные отступы. Довольно часто можно столкнуться с заявлением "наша разработка может формировать документы в формате Ворд". При дальнейшем рассмотрении оказывается, что "шаблон" хранится непосредственно в информационной базе либо в виде текста, либо в виде форматированного текста, либо в виде набора абзацев и так далее. Как бы ни старались разработчики платформы и приложения, полученный файл это не тот "Ворд", которого ожидает пользователь. Этот эрзац всегда является компромиссом между полноценным файлом Ворда и возможностями системы автоматизации. Для того, чтобы формировать полноценный файл Ворда, со всеми возможностями форматирования, которыми пользователи привыкли пользоваться, требуется пересоздать Ворд внутри информационной системы, что практически недостижимо.
Потому, что никакие другие файлы кроме файлов Ворда не будут приняты партнерами пользователя. В этом смысле Ворд безальтернативен т.к. все пользуются именно Вордом. Можно сколько угодно рассуждать о преимуществах Лайбре Офиса, но, когда ежедневно нужно обмениваться документами с десятком новых людей, без Ворда не обойтись.
Что значит сформировать файл Ворд?
В связи с неоднозначностью сложившейся терминологии, считаю нужным пояснить. Под формированием файла Ворд по пользовательскому шаблону я подразумеваю следующий процесс. Пользователь передает разработчику файл с образцом документа, который хочет получать из информационной системы в автоматизированном режиме. Разработчик дорабатывает информационную систему таким образом, чтобы она позволяла формировать файлы, точно соответствующие первоначальному образцу. Точно, значит без явных указаний пользователя разработчик не меняет по своему усмотрению ни одного элемента форматирования, ни шрифт, ни размер, ни поля, ни колонтитулы. НИЧЕГО не меняет. Совершенно ничего. На выходе пользователь должен получить документ неотличимый от документа, созданного собственноручно.
Способы формирования файла Ворд
Работа программы по формированию файла сводится к модификации образца, предоставленного пользователем. К счастью, пользователи приложений, построенных на базе 1С-Предприятия, люди скучные. И их запросы к формированию файлов невелики. Им не требуются информационные буклеты или рекламные плакаты. Им нужны документы. Договоры, акты, письма, исковые заявления, и т.д. Потому обработка файла программой сводится к замене (вставке) текста на полученный из базы данных, удаление каких-то блоков текста и, быть может, вставке небольших картинок, например, логотипа или штрих-кода.
Существует два популярных способа работы с файлами Ворд:
1. Через СОМ-Объект Ворд.
2. Через непосредственную модификацию файлов docx
Главное отличие между ними заключается в том, что первый способ предоставляет разработчику инструмент - полнофункциональный API, позволяющий делать с документом все то же самое, что может делает пользователь, непосредственно работая в редакторе. Второй же способ предполагает собственную разработку инструмента, на основании документации по формату хранения файла. Если функциональность разработанного инструмента перестанет удовлетворять возникающим потребностям - придется разрабатывать (или искать) новый инструмент. В то время как модернизация кода основанного на API СОМ-объектов не представляет сложностей.
Первый способ предполагает, что на том компьютере, где будет исполняться код приложения и формироваться файл, установлен Майкрософт Офис. При установке, Офис регистрирует в Виндоус СОМ-объекты для каждого из приложений входящих в пакет. Таким образом, другие приложения, запущенные на компьютере, могут через интерфейс СОМ-объектов выполнять любые действия с документами офисных приложений, возможности предоставленного программного интерфейса, как минимум, не уступают возможностям пользователя, редактирующего документ непосредственно в приложении.
Главная проблема примеров из интернета по рассматриваемой теме - игнорируется тот факт, что за компьютером сидит живой пользователь. Видимо, предполагается, что после нажатия кнопки "сформировать файл", пользователь должен замереть, не дышать, не дотрагиваться до мыши и клавиатуры в течение всего времени создания файла. А ведь формирование каждого файла может занимать заметное время, в некоторых случаях - больше минуты. И ладно бы вопрос стоял "или так или никак". Но ведь на самом деле, нет. Можно работать с СОМ-Объектом параллельно с работой пользователя, код чувствительный действиям пользователя не имеет никаких преимуществ перед кодом, не мешающим пользователю. Единственная причина, по которой он используется - нежелание разработчика вникнуть в проблему и рассмотреть альтернативные варианты решения.
Код языка 1С для работы с СОМ-Объектами на сервере и на клиенте ничем не отличается. Единственное, за сервером не работает реальный пользователь, поэтому проблема неудачного кода не выплывает с такой остротой. Повторюсь, преимуществ у такого кода все равно нет. Тем более, что код нужно отлаживать, часто это удобнее делать на клиенте, вот и появился пользователь. А еще, может потребоваться перенос работающего кода с сервера на клиент, например, в рамках рефакторинга и изменения архитектуры приложения. А еще, код может работать в файловой базе, где "сервер" очень условен - программный слой, запускаемый на машине каждого пользователя. Таким образом, лучше всего исходить из того, что пользователь за компьютером есть всегда.
Объектная модель Ворд
Ворд, запущенный в качестве СОМ-Объекта, предоставляет доступ к множеству объектов приложения. Понятие "объект" такое же как везде - программная абстракция, имеющая методы и свойства. Методы могут быть как процедурами, так и функциями, при этом функции можно вызывать как процедуры, игнорируя возвращаемое значение. Свойства могут быть либо объектами, либо обычными (скалярными, примитивными) данными, такими как число, строка, логический тип.
Среди объектов особо выделяются специальные объекты-контейнеры, называемые коллекциями. Каждая коллекция предназначена для хранения ссылок на группу однотипных объектов. Например, коллекция Documents хранит ссылки на объекты Document, коллекция Tables хранит ссылки на объекты Table и т.д. Все коллекции именованы во множественном числе, а обычные объекты в единственном. Нумерация объектов в коллекции начинается с единицы. Коллекции Ворд можно перебирать циклом "Для каждого" языка программирования 1С.
Полный список объектов можно, и нужно, смотреть в справочной системе Ворд (раздел справки по Вижуал Бейсику (VBA)). Для старых версий справка откроется локально на компьютере пользователя. Новые версии отправят на сайт Майкрософт: en-us /office/vba/api/overview/word/object-model
Многие методы объектов Ворда в качестве параметров принимают числовые значения. Для того, чтобы не путаться в числовых значениях, в Вижуал Бейсике предусмотрены именованные константы. Например, константа wdFormatRTF соответствует числу 6. В Вижуал Бейсике можно писать код так:
Вне VBA именованные константы недоступны, поэтому код 1С будет таким:
Или, без “магических” чисел, таким:
Я предпочитают последний вариант, терпеть не могу непонятных чисел в коде.
Запуск Ворд, открытие файла
Традиционно, первые три строчки работы СОМ-Объектом Ворд выглядят так:
… и это уже неправильно! Третья строчка сразу говорит о том, что перед вами бездумная копипаста. Справедливости ради, бывают и толковые примеры, начинающиеся именно так, но, это лишь подтверждает, что даже в толковых примерах присутствует копипаста, не осмысленная автором. Что неправильно с третьей командой будет объяснено ниже, сначала разберем первые две строки.
Запускает приложение Ворд и возвращает на него ссылку. Теперь по ссылке Word мы можем обращаться к СОМ-объекту. Возникает закономерный вопрос, влияет ли как-то окружение, в момент выполнения команды, на результат её работы? Из окружения нас интересует в первую очередь интерактивная работа пользователя с Вордом. Возможны два варианта:
- в момент выполнения Ворд запущен (имеются открытые пользователем файлы)
- в момент вызова Ворд не запущен
Так вот, нет, не влияет. Ворд запускается как новый экземпляр приложения, коллекция Documents запущенного приложения не содержит ни одной ссылки, т.е. доступа к ранее открытым документам через ссылку Word не получить.
Но, после запуска СОМ-Объекта, новые, открываемые пользователем, файлы могут открыться именно в этом экземпляре Ворда. Для пользователя разницы нет, но нам это следует, на всякий случай, учитывать.
Скрывает Ворд. Т.е. пользователь не будет видеть обрабатываемый файл в отдельном окне. Никакой особой пользы скрытие окна Ворд не несет. Если программа написана корректно, то пользователь не будет мешать программе, а программа не будет мешать пользователю, вне зависимости от того, видимо ли окно обрабатываемого файла. Естественно, при условии, что пользователь не начнет редактировать открытый документ.
Свойству Visible желательно присвоить одно из значений. В противном случае, СОМ-Объект Ворд откроется в скрытом режиме. Но если пользователь откроет какой-нибудь файл, то наш редактируемый файл может неожиданно стать видимым. С другой стороны, если пользователь успеет открыть свой файл после запуска СОМ-Объекта, но перед тем, как будет выполнено присвоение свойству значения Ложь , то открытый файл станет невидимым и недоступным для редактирования пользователем.
В общем, лично я предпочитаю оставлять редактируемый документ в видимом окне.
Перейдем к неправильной части примера
Открывает файл, в терминологии Ворд открытый файл называется "документ". Далее нужно получить ссылку на открытый документ, чтобы потом по этой ссылке можно было с ним работать. Вы можете найти такие примеры:
Ну что ж, разумно. Предполагаем, что открыт только наш документ, соответственно в коллекции Documents есть единственный элемент, значит этот элемент имеет индекс равный единице. Это работает, вероятность того, что пользователь успеет открыть файл в промежуток времени, между запуском СОМ-Объекта и этим присваиванием, ничтожно мала.
Ну что ж, разумно. Последний открытый в Ворде документ становится активным, можно получить на него ссылку и так. Это работает, вероятность того, что пользователь успеет открыть еще один документ после открытия нашего и до получения ссылки на него ничтожно мала.
Примеры чуточку безумные:
WTF? Хотя, безусловно, работает. С теми же оговорками, что и выше.
Как программировать неправильно, выяснили, теперь о том, как открывать документы правильно.
Для открытия документа можно использовать два метода коллекции Documents . Первый - Open() приведен выше, второй - Add() .
Метод Open() открывает файл для редактирования в Ворде, документ остается связанным с этим файлом - в заголовке окна Ворд указывается имя файла. Открыть можно любой файл, поддерживаемый Вордом, формат файла при редактировании не меняется. Например, открыли файл .rtf, отредактировали, сохранили, файл остался .rtf. Открывать непосредственно шаблон из папки, в которой хранятся шаблоны таким способом не стоит. Если что-то произойдет не так, например, сработает автосохранение в Ворде, шаблон будет испорчен. Сначала файл шаблона следует скопировать (при работе в клиент-серверном варианте это само собой разумеющиеся действие), а потом можно открывать.
Метод Add() создает новый документ на основании указанного шаблона. Шаблоном может быть любой файл, не обязательно родные для Ворда .doc или .docx или .dot. Открытый документ с файлом-шаблоном не связывается, в заголовке окна Ворд будет надпись "Документ1 - Word". При этом информация о формате исходного файла не сохраняется. Открывается просто документ Ворд, содержащий в себе всю информацию из указанного файла. При сохранении без явного указания типа файла он будет сохранен как .docx. Единственное исключение - документ, открытый на основе файла .doc, такие документы по умолчанию сохраняются в файлы .doc. Метод Add() можно использовать для создания документов на основании оригинала шаблона, шаблон повредить невозможно даже случайно.
Методы Open() и Add() являются функциями, т.е. возвращают значение. Причем возвращают они ссылку на новый документ. И ловить потом этот документ в коллекции Documents нам не нужно, ссылку можно сразу сохранить в переменной для дальнейшего использования. Таким образом, для открытия используются следующие команды:
Когда шаблон заполнен требуемым образом его необходимо сохранить. Самый простой вариант, если файл открыли методом Open() , для сохранения достаточно вызвать метод Save() :
Если же документ еще не связан с файлом, нужно вызвать метод SaveAs() :
Если формат по умолчанию нас не устраивает, вторым параметром метода можно явно задать тип файла:
Обратите внимание, не стоит указывать расширение файла. Ошибки не будет, если расширение будет указано явно, например так:
Имеется в виду, что не будет ошибки времени выполнения. Однако, приведенный выше пример идеологически неверен. Допустим, через некоторое время шаблон был заменен и файл шаблона получил расширение .docx. Для внесения изменений в программу нам потребуется две правки, первая в методе Add() , вторая в методе SaveAs() . В этом и проблема, код дублируется, одно изменение должно вносится в одном месте программы, а не в разных. Если расширение файла не будет указано, при сохранении будет добавлено расширение, соответствующее типу сохраняемого файла. Если же расширение будет указано неверно, т.е. не будет соответствовать типу файла, то. либо получаем ошибку времени исполнения, либо файл сохранится в формате, не соответствующем расширению (в зависимости от комбинации тип/расширение возможно и то и другое). Обе ситуации ненормальны. Ошибка времени выполнения, конечно, будет отловлена на этапе тестирования. А ошибка несоответствия расширения фактическому типу данных выйдет потом боком пользователю.
Завершение работы с СОМ-Объектом рекомендуют (неправильно) делать так:
На первый взгляд, можно и не заметить нолик в параметре метода Quit() . А он важен. Это просто константа wdDoNotSaveChanges :-). Закрыться-то Ворд закроется, вместе со всеми файлами, которые пользователь, возможно, открыл и редактирует.
Если мы исходим из предположения, а мы из него исходим, что пользователь может работать интерактивно со своими собственными файлами, которые могут быть открыты в том же экземпляре Ворда, что и наш СОМ-Объект, то торопиться принудительно выгонять пользователей и закрывать экземпляр приложения не стоит. Можно проверить, есть ли еще открытые документы, кроме нашего. Если есть, не закрывать экземпляр Ворда, пусть пользователь спокойно работает, если других документов нет - закрыть:
Не очень популярный, но иногда встречающийся способ.
Сначала в документ добавляются пользовательские свойства. Для Ворда 2016 это делается так:
Читайте также: