Особенности работы с колонтитулами
На самом деле, указанные выше приемы поиска и замены текста работают только в основном тексте документа и не затрагивают колонтитулы. Вообще, в Ворде колонтитулы очень обособлены и даже в простом документе их может быть несколько. Во-первых, есть нижние и верхние колонтитулы, во-вторых, колонтитулы первой и последующей страниц могут быть различными, наконец, у каждого раздела документа могут быть собственные колонтитулы. Для того, чтобы получить доступ ко всем колонтитулам документа нужно перебрать коллекции и , затем в каждом колонтитуле выполнить поиск и замену якорей. Но в документе нет этих коллекций. В документе есть коллекция (разделы), в каждом разделе есть свои коллекции и . Таким образом, перебор всех колонтитулов выполняется так:
WdReplaceAll = 2;
Для Каждого Section Из Документ.Sections Цикл
Для Каждого Header Из Section.Headers Цикл
Range = Header.Range;
Range.Find.Execute(“$(якорь)$”,,,,,,,,, “значение”, wdReplaceAll);
КонецЦикла;
Для Каждого Footer Из Section.Footers Цикл
Range = Footer.Range;
Range.Find.Execute(“$(якорь)$”,,,,,,,,, “значение”, wdReplaceAll);
КонецЦикла
КонецЦикла;
Более лаконичное решение заключается в использовании коллекции . Эта коллекция содержит диапазоны (range) всех блоков(?), частей(?) (в справке используется термин story) документа. Тело документа, это главный блок (main story), тоже есть в этой коллекции. Т.е. необязательно искать якоря отдельно в теле документа, отдельно в колонтитулах, все можно сделать одним циклом:
Для Каждого Range Из Документ.StoryRanges Цикл
Range.Find.Execute(“$(якорь)$”,,,,,,,,, “значение”, wdReplaceAll);
КонецЦикла;
Объектная модель Ворд
Ворд, запущенный в качестве СОМ-Объекта, предоставляет доступ к множеству объектов приложения. Понятие “объект” такое же как везде – программная абстракция, имеющая методы и свойства. Методы могут быть как процедурами, так и функциями, при этом функции можно вызывать как процедуры, игнорируя возвращаемое значение. Свойства могут быть либо объектами, либо обычными (скалярными, примитивными) данными, такими как число, строка, логический тип.
Среди объектов особо выделяются специальные объекты-контейнеры, называемые коллекциями. Каждая коллекция предназначена для хранения ссылок на группу однотипных объектов. Например, коллекция Documents хранит ссылки на объекты Document, коллекция Tables хранит ссылки на объекты Table и т.д. Все коллекции именованы во множественном числе, а обычные объекты в единственном. Нумерация объектов в коллекции начинается с единицы. Коллекции Ворд можно перебирать циклом “Для каждого” языка программирования 1С.
Многие методы объектов Ворда в качестве параметров принимают числовые значения. Для того, чтобы не путаться в числовых значениях, в Вижуал Бейсике предусмотрены именованные константы. Например, константа wdFormatRTF соответствует числу 6. В Вижуал Бейсике можно писать код так:
Document.SaveAs (“имя файла”, wdFormatRTF)
Вне VBA именованные константы недоступны, поэтому код 1С будет таким:
Document.SaveAs (“имя файла”, 6)
Или, без “магических” чисел, таким:
wdFormatRTF = 6;
Document.SaveAs (“имя файла”, wdFormatRTF);
Я предпочитают последний вариант, терпеть не могу непонятных чисел в коде.
Работа с таблицами
В основе всех подходов к заполнению таблиц принцип – программа знает о шаблоне документа и структуре таблицы достаточно информации, чтобы её заполнить. Заполнение деловых документов сводится к тому, что многократно копируется (вставляется) какая-то строка таблицы шаблона, затем ячейки вставленной строки заполняются текстом. Т.е. нам заранее, при создании шаблона, не известно, сколько строк будет в таблице. Если бы было известно, то задача свелась бы к обычному поиску и замене с помощью якорей или закладок. Но шапка, подвал таблицы заранее известны. В шаблоне размещается заготовка таблицы с шапкой, подвалом и единственной строкой-образцом для заполнения данными.
– поиск таблицы в документе с помощью размещенной внутри таблицы закладки.
– знание о структуре таблицы видно в применении команды , для таблиц с другой структурой шапки или другом расположении закладки, набор команд для перемещения выделения может быть другим. Также знание о структуре таблицы проявляется в знании о том, какие якоря нужно заменять, т.е. программа знает, что после вставки строки в документе появятся три якоря и какие именно тоже знает.
– копирование строки и вставка через буфер обмена
– заполнение вставленной строки через поиск и замену якорей
– удаление строки-образца перед завершением алгоритма
Однако, метод, предложенный автором статьи, совсем плох с точки зрения интерактивного воздействия на окружение пользователя. Если у пользователя что-то было помещено в буфер обмена до начала формирования файла, то это что-то будет тут же утеряно, вместо этого в буфере пользователь найдет строку таблицы с якорями. Во время работы приложения нельзя работать не только с Вордом, нельзя вообще ничего делать. Ведь при работе пользователю буфер обмена нужен очень часто. Даже при копировании файлов, многие им пользуются. Как только пользователь поместит что-то в буфер обмена, строка-образец из буфера исчезнет и программа не сможет закончить работу.
Заполнение таблицы по фен-шую:
– размещаем якорь в любой ячейке строки-образца
– средствами поиска устанавливаем объект на якорь. Теперь через свойства этого объекта у нас есть ссылки на таблицу, строку, столбец и ячейку.
– вставляем строку над строкой-образцом. Вставленная строка копирует все параметры (шрифт, цвет, заливка) строки-образца.
– заполняем каждую вставленную строку требуемым текстом, затем вставляем следующую строку и т.д. Каждая новая вставленная строка вставляется между уже заполненными строками и строкой-образцом
– удаляем строку-образец (как раз вместе с якорем, так что отдельно якорь удалять не нужно)
Закрытие файла, завершение работы с СОМ-Объектом
Когда шаблон заполнен требуемым образом его необходимо сохранить. Самый простой вариант, если файл открыли методом , для сохранения достаточно вызвать метод :
Если же документ еще не связан с файлом, нужно вызвать метод :
Документ.SaveAs (“C:готовые документыфайл”);
Если формат по умолчанию нас не устраивает, вторым параметром метода можно явно задать тип файла:
wdFormatRTF = 6;
Документ.SaveAs (“C:готовые документыфайл”, wdFormatRTF);
Обратите внимание, не стоит указывать расширение файла. Ошибки не будет, если расширение будет указано явно, например так:
Иногда после сохранения файла нужно узнать его полное имя, т.е. включая путь и расширение. Например, чтобы отправить файл по электронной почте или записать в базу. Если мы сохранили файл методом , то полного имени мы не знаем, ведь расширение к имени файла добавил Ворд. Ну так из Ворда же полное имя можно получить, у документа есть доступное для чтения свойство FullName:
ПолноеИмяФайла = Документ.FullName;
Завершение работы с СОМ-Объектом рекомендуют (неправильно) делать так:
На первый взгляд, можно и не заметить нолик в параметре метода . А он важен. Это просто константа wdDoNotSaveChanges :-). Закрыться-то Ворд закроется, вместе со всеми файлами, которые пользователь, возможно, открыл и редактирует.
Если мы исходим из предположения, а мы из него исходим, что пользователь может работать интерактивно со своими собственными файлами, которые могут быть открыты в том же экземпляре Ворда, что и наш СОМ-Объект, то торопиться принудительно выгонять пользователей и закрывать экземпляр приложения не стоит. Можно проверить, есть ли еще открытые документы, кроме нашего. Если есть, не закрывать экземпляр Ворда, пусть пользователь спокойно работает, если других документов нет – закрыть:
Документ.Close();
Если (Word.Documents.Count = 0) Тогда
Word.Quit();
КонецЕсли;
Исправляем ошибку
Теперь посмотрим на стандартные причины, которые уже были описаны выше. Но на несколько других примерах, чтобы было еще более наглядно.
Обновляем платформу
В первую очередь открываем информацию по самому обновлению. Нам нужно узнать номер поставки, чтобы дальше было удобно проводить операции по поиску.
Удаление настроек
Мы не раз уже упоминали про этот пункт. И не зря, ведь львиная доля неполадок связана с ним. Для устранения их необходимо перейти в настройки прав и доступа через меню администрирования.
В следующем меню нам нужно сделать важный выбор. Если конфликт возникает на персональном компьютере одного сотрудника, то конкретного его настройки и вызывают сбой. Тогда нам нужно провести полную чистку его прав и параметров. Но если детально неясно, у кого проблема появляется, а кто ее миновал, то имеет смысл провести глобальную чистку. То есть, удалить настройки всех пользователей, управляющих системой. Да, потом придется повозиться, чтобы восстановить права. Как исправить ситуацию, если в 1С поле агрегатного объекта не обнаружено – это вопрос зачастую с одним ответом – просто сносить все персональные настройки.
Восстанавливаем базу данных
Применяется методика в случае, когда все описанные выше приемы не дали результата. Тогда возникает серьезная вероятность, что неполадка кроется в самой базе. И восстановить ее весьма сложно. Если вы ранее не имели опыта в этом аспекте, возможно, лучше будет довериться профессионалам. Они быстро и без угрозы для системы проведут процедуру.
Самостоятельно же нам понадобится снова запустить конфигуратор, выбрать «тестирование и восстановление базы».
По сути, в нашем случае утрачена логическая адаптация файлов с формами. Выявленные повреждения нужно исправить. Для этого придется указать логическое действие, что делать с файлом. При проведении проверки он может быть удален, создан или очищен.
Создание файла – это имитация существующего элемента, которого на самом деле не будет. То есть ошибка исчезнет, потому что система будет считать, что обращается не к битому файлу. Но и открыть фантомный элемент не сможет, что логично. Если возникает баг, 1 С поле объекта не обнаружено, то после такой проверки уведомлений больше не будет, но корректная форма не появится из ниоткуда. Все равно придется обновлять платформу.
А вот в случае выбор удаления или очищения, все битые файлы будут автоматически удаляться с сервера. И обращаться к ним ПО не будет. Этот вариант тоже по-своему хорош. Но его лучше производить после обновления. Тогда, у нас останутся старые элементы, которые уже не нужны. И при обращении к ним будет появляться баг, который тормозит деятельность. А полное удаление во время тестирования все нерабочие файлы просто удалит, поэтому никакой путаницы возникать не будет.
Если вашей компании требуется ПО, с помощью которого можно ускорить рутинные операции, оптимизировать и автоматизировать многие рутинные процессы (например, маркировку товаров в магазине или инвентаризацию объектов на складе), обращайтесь в «Клеверенс». У нас найдется отличное решение для вашего бизнеса.
Что значит сформировать файл Ворд?
В связи с неоднозначностью сложившейся терминологии, считаю нужным пояснить. Под формированием файла Ворд по пользовательскому шаблону я подразумеваю следующий процесс. Пользователь передает разработчику файл с образцом документа, который хочет получать из информационной системы в автоматизированном режиме. Разработчик дорабатывает информационную систему таким образом, чтобы она позволяла формировать файлы, точно соответствующие первоначальному образцу. Точно, значит без явных указаний пользователя разработчик не меняет по своему усмотрению ни одного элемента форматирования, ни шрифт, ни размер, ни поля, ни колонтитулы. НИЧЕГО не меняет. Совершенно ничего. На выходе пользователь должен получить документ неотличимый от документа, созданного собственноручно.
Удаление фрагментов текста
Сложные документы могут содержать вариативные части. Например, если предусмотрена предоплата, то соответствующий раздел договора излагается в одной редакции, а если рассрочка, то в другой. Пользователь готовит шаблон со всеми возможными вариантами редакций, блоки, которые могут быть удалены помечаются специальными якорями. Затем, либо удаляется весь отмеченный блок, либо удаляются только якоря, а блок остается.
RangeBegin = Документ.Range();
RangeBegin.Find.Execute(“#(Блок1_begin)#”);
Range = Документ.Range();
Range.Find.Execute(“#(Блок1_end)#”);
Range.Start = RangeBegin.Start – 1;
Range.Text = “”;
Range = Документ.Range();
Range.Find.Execute(“#(Блок2_begin)#”);
Range.Start = Range.Start – 1;
Range.Text = “”;
Range = Документ.Range();
Range.Find.Execute(“#(Блок2_end)#”);
Range.Start = Range.Start – 1;
Range.Text = “”;
Может вызвать удивление, что за таинственные константы “1” используются для расчета начального символа удаляемого диапазона. Дело в том, что якорь всегда будет отделен от остального текста либо пробелом, либо символом конца абзаца, т.е. будет находится на отдельной строке. Если удалить только якорь, то в точке, где он находился, останется либо двойной пробел, либо пустая строка (абзац). Чтобы этого избежать, удаляется один дополнительный символ перед удаляемым блоком, это всегда будет либо пробел, либо “энтер”.
Проверка и исправление документа
Если же отображение закладок никак не помогло устранить ошибку «Не определена закладка», то нужно проверить наличие текста или объектов, на которые делается ссылка.
Это может быть удаленный заголовок раздела или подраздела, используемый для составления оглавления, или объект, подгружаемый из другого текстового документа.
Если в документе ссылок немного, то будет быстрее создать их заново.
Чтобы удалить все существующие ссылки, включая ошибочные, нужно:
Она удалит все поля и, соответственно, ссылки на них в документе за исключением нумерации страниц. Текст, который содержался в них, останется.
Как предотвратить появление ошибки «Код не уникален»?
Чтобы предотвратить появление данной ошибки при работе со справочниками 1С, в первую очередь не рекомендуется производить ручное редактирование кодов записей. Именно вмешательство в программную нумерацию и приводит чаще всего в ее возникновению. Если же без редактирования кодов не обойтись, то продумайте ситуацию наперед.
Рекомендуем также еще статьи по программам 1С:
Попробуем разобраться, почему появляется ошибка в 1С – значение поля Код не уникально (разновидности ошибки могут быть со значениями 002024, 002071 либо другими). В процессе добавления в справочник нового элемента, бывают случаи возникновения ошибки «поле код не уникально в 1C».
Системой, в автоматическом режиме, происходит процесс присвоения нового кода элементу.
При этом, она не позволяет произвести сохранение объекта. Причина кроется в ошибочной нумерации в справочнике. Такая ситуация возникает в момент, когда пользователь, в ручном режиме, пытается отредактировать поле «Код» в элементах справочника.
Закажите устранение ошибки 1С в IT RUSH!
Стоимость работ – 1600 руб./час, абонемент от 50 часов в месяц – 1500 руб. в час, от 100 часов в месяц – 1400 руб. в час
Справочник в 1С имеет определенный принцип собственной нумерации. Код состоит из префикса, числового кода предшествующего элемента на единицу больше. Представим, что код справочника представляет собой четыре цифры. Во всех элементах ставится префикс «А». Оставшиеся три символа отданы под числа, являющиеся составной частью кода.
В случае, если вручную элементу справочника будет присвоен код «А999», при попытке создания следующего элемента отобразится ошибка «поле код не уникально в 1с».
Причина заключается в том, что систем пытается прибавить единицу к числу 999, но для, получающегося в результате прибавления, кода «А1000» не достает разрядов.
Данный вид ошибки может проявиться не сразу. Например, пользователь создал код «А985». В таком случае, сообщение об не уникальном коде появиться на пятнадцатом по счету элементе, после упомянутого.
Решение проблемы «значение поля Код не уникально” заключается в поиске ошибочно пронумерованного элемента и исправления его кода на адекватный. Этот способ подразумевает смену нумерации кода и у всех последующих за ним элементов.
Упростить задачу, можно используя автоматическую обработку справочника, исправляющую коды нужных элементов.
Нам доверяют
При постоянном использовании программного обеспечения в коммерческой деятельности часто приходится сталкиваться с различными багами, которые могут серьезно затормозить экономический процесс. И одна из подобных проблем и станет темой сегодняшнего обзора. Это ошибка в «1С: Предприятие» – «Поле объекта не обнаружено», мы тщательно и детально разберем, как исправить подобную неполадку в 1C. Сразу стоит уточнить, что этот баг не носит критического характера, серьезными проблемами все равно не обернется. Но приостановить выполнение задачи вполне сможет, что неприятно. Особенно если от заполнения формы зависят сроки, нарушать которые ни в коем случае нельзя. Да и часто без базовых навыков приходится обращаться к профессионалам. А они появляются не мгновенно, придется отправить запрос в компанию, осуществляющую техническое сопровождение. Зачастую понадобится около суток. И гораздо проще все сделать самостоятельно прямо на месте. А как это возможно, мы и узнаем в статье.
Исправление содержимого полей
По умолчанию они не отображаются в документе. Чтобы сделать их видимыми, нужно:
После отображения нужно проверить формулу поля и, если это необходимо, внести исправления в нее. Это нужно для восстановления работоспособности ссылок, использующих их.
Ошибка «Не определена закладка» чаще всего возникает из-за невнимательности пользователя при редактировании. Избавиться от проблемы несложно, но нужно после внесения изменений обновлять связи в тексте с помощью команды «Выделить все» (Ctrl + A) и клавиши F9, чтобы увидеть изменения, связанные с работой ссылок и полей. А после проверки можно отправлять документ в печать.
Как исправить ошибку «Закладка не определена»
Этот метод подходит для версий Microsoft Word 2007 и боле поздних. Заключается он в следующем алгоритме:
После этих манипуляций в тексте отобразятся все закладки, а ошибка в Word «Закладка не определена» должна исчезнуть.
Запуск Ворд, открытие файла
Традиционно, первые три строчки работы СОМ-Объектом Ворд выглядят так:
Word = Новый COMОбъект (“Word.Application”);
Word.Visible = Ложь;
Word.Documents.Open (“C:готовые документыфайл.docx”);
Word = Новый COMОбъект(“Word.Application”);
Запускает приложение Ворд и возвращает на него ссылку. Теперь по ссылке мы можем обращаться к СОМ-объекту. Возникает закономерный вопрос, влияет ли как-то окружение, в момент выполнения команды, на результат её работы? Из окружения нас интересует в первую очередь интерактивная работа пользователя с Вордом. Возможны два варианта:
– в момент выполнения Ворд запущен (имеются открытые пользователем файлы)
– в момент вызова Ворд не запущен
Так вот, нет, не влияет. Ворд запускается как новый экземпляр приложения, коллекция Documents запущенного приложения не содержит ни одной ссылки, т.е. доступа к ранее открытым документам через ссылку Word не получить.
Но, после запуска СОМ-Объекта, новые, открываемые пользователем, файлы могут открыться именно в этом экземпляре Ворда. Для пользователя разницы нет, но нам это следует, на всякий случай, учитывать.
Word.Visible = Ложь; // (или Word.Visible = Истина;)
Скрывает Ворд. Т.е. пользователь не будет видеть обрабатываемый файл в отдельном окне. Никакой особой пользы скрытие окна Ворд не несет. Если программа написана корректно, то пользователь не будет мешать программе, а программа не будет мешать пользователю, вне зависимости от того, видимо ли окно обрабатываемого файла. Естественно, при условии, что пользователь не начнет редактировать открытый документ.
Свойству желательно присвоить одно из значений. В противном случае, СОМ-Объект Ворд откроется в скрытом режиме. Но если пользователь откроет какой-нибудь файл, то наш редактируемый файл может неожиданно стать видимым. С другой стороны, если пользователь успеет открыть свой файл после запуска СОМ-Объекта, но перед тем, как будет выполнено присвоение свойству значения , то открытый файл станет невидимым и недоступным для редактирования пользователем.
В общем, лично я предпочитаю оставлять редактируемый документ в видимом окне.
Перейдем к неправильной части примера
Открывает файл, в терминологии Ворд открытый файл называется “документ”. Далее нужно получить ссылку на открытый документ, чтобы потом по этой ссылке можно было с ним работать. Вы можете найти такие примеры:
Word.Documents.Open (“C:готовые документыфайл.docx”);
Документ = Word.Documents (1);
Ну что ж, разумно. Предполагаем, что открыт только наш документ, соответственно в коллекции есть единственный элемент, значит этот элемент имеет индекс равный единице. Это работает, вероятность того, что пользователь успеет открыть файл в промежуток времени, между запуском СОМ-Объекта и этим присваиванием, ничтожно мала.
Word.Documents.Open (“C:готовые документыфайл.docx”);
Документ = Word.ActiveDocument;
Ну что ж, разумно. Последний открытый в Ворде документ становится активным, можно получить на него ссылку и так. Это работает, вероятность того, что пользователь успеет открыть еще один документ после открытия нашего и до получения ссылки на него ничтожно мала.
Примеры чуточку безумные:
Word.Documents.Open (“C:готовые документыфайл.docx”);
Word.Documents(1).Activate();
Документ = Word.ActiveDocument;
WTF? Хотя, безусловно, работает. С теми же оговорками, что и выше.
Как программировать неправильно, выяснили, теперь о том, как открывать документы правильно.
Для открытия документа можно использовать два метода коллекции . Первый – приведен выше, второй – .
Метод открывает файл для редактирования в Ворде, документ остается связанным с этим файлом – в заголовке окна Ворд указывается имя файла. Открыть можно любой файл, поддерживаемый Вордом, формат файла при редактировании не меняется. Например, открыли файл .rtf, отредактировали, сохранили, файл остался .rtf. Открывать непосредственно шаблон из папки, в которой хранятся шаблоны таким способом не стоит. Если что-то произойдет не так, например, сработает автосохранение в Ворде, шаблон будет испорчен. Сначала файл шаблона следует скопировать (при работе в клиент-серверном варианте это само собой разумеющиеся действие), а потом можно открывать.
Метод создает новый документ на основании указанного шаблона. Шаблоном может быть любой файл, не обязательно родные для Ворда .doc или .docx или .dot. Открытый документ с файлом-шаблоном не связывается, в заголовке окна Ворд будет надпись “Документ1 – Word”. При этом информация о формате исходного файла не сохраняется. Открывается просто документ Ворд, содержащий в себе всю информацию из указанного файла. При сохранении без явного указания типа файла он будет сохранен как .docx. Единственное исключение – документ, открытый на основе файла .doc, такие документы по умолчанию сохраняются в файлы .doc. Метод можно использовать для создания документов на основании оригинала шаблона, шаблон повредить невозможно даже случайно.
Методы и являются функциями, т.е. возвращают значение. Причем возвращают они ссылку на новый документ. И ловить потом этот документ в коллекции нам не нужно, ссылку можно сразу сохранить в переменной для дальнейшего использования. Таким образом, для открытия используются следующие команды:
Документ = Word.Documents.Open (“C:готовые документыфайл.docx”);
Документ = Word.Documents.Add (“C:шаблоныфайл.docx”);
Как исправить ошибку «Код не уникален»?
Безусловно, решение этой проблемы предусмотрено разработчиками 1С. Заключается оно в полной перенумерации элементов справочника. Для этого на диске информационно-технологического сопровождения 1С (1с итс) есть специальная обработка, которая называется «УниверсальныеПодборИОбработкаОбъектов. epf». Она располагается в каталоге 1CITSEXEExtRepsUNIREPS81UniversalSelection.
Все, что нужно от пользователя? зайти в вышеуказанный каталог, запустить обработку и подождать пока завершится процесс перенумерации объектов выбранного справочника.
Заполнение шаблона с помощью закладок
ШаблонВорд.Bookmarks(“Закладка1”).Select();
ШаблонВорд.Application.Selection.TypeText(“Текст для закладки №1.”);
Range = ШаблонВорд.Bookmarks(“Закладка1”).Range;
Range.Text = “Текст для закладки №1.”;
Теперь вы знаете почему и, вообще, готовы к статьям из Интернета 🙂
Если же в готовом документе закладки должны остаться, то сразу после вставки текста удаленную закладку можно пересоздать. В варианте с Range для этого достаточно добавить команду:
Вариант с придется немного переделать, т.к. после метода объект будет указывать на точку ввода после последнего добавленного символа. Чтобы выделение не схлопнулось в точку ввода, а соответствовало добавленному тексту, можно воспользоваться обращением к свойству объекта :
ШаблонВорд.Bookmarks(“Закладка1”).Select();
ШаблонВорд.Application.Selection.Text = “Текст для закладки №1.”;
ШаблонВорд.Bookmarks.Add(“Закладка1”, ШаблонВорд.Application.Selection.Range);
На первый взгляд может показаться, что решение с закладками – вариация решения со свойствами документа. Но это совсем не так, закладки позволяют делать то же самое, что и поиск – установить объект на нужный фрагмент в тексте. Далее найденную позицию можно использовать как угодно – заменить текст, вставить в эту точку картинку, удалить большой блок текста между двумя найденными позициями и т.д. Со свойствами, отображаемыми с помощью полей, ничего подобного организовать не получится.
У закладок есть особенность, которой не обладают якоря для поиска и замены – имя закладки уникально. В этом основной смысл закладок – однозначно определить участок текста. Но при заполнении закладок реквизитами из базы это может вызвать некоторое неудобство. Вот, к примеру, статья: //infostart.ru/1c/articles/1122573/
Главная проблема у автора не в закладках, а в сакральности кода движка, осуществляющего заполнение шаблона Ворд. Да, если возможности подправить движок нет, то приходится мириться и с автозапуском макросов в документах и с добавлением в документы полей. Если же контроль над движком у нас есть, то проблема и не проблема вовсе. Вот ключевая фраза из обсуждаемой статьи:
Действительно, для решения проблемы, закладку “Ответственный” не надо создавать вообще. Нужно сразу создавать закладки вида “Ответственный0” или “Ответственный_”. Последний символ не важен, лишь бы требованиям к именам закладок удовлетворял.
При заполнении шаблона, перебираем все закладки, отбрасываем последний символ имени закладки и по оставшейся смысловой части имени ищем значение в заранее подготовленной структуре данных:
Оглавление
Зачем и почему нужны файлы Ворд?
Что значит сформировать файл Ворд?
Способы формирования файла Ворд
Объектная модель Ворд
Запуск Ворд, открытие файла
Закрытие файла, завершение работы с СОМ-Объектом
Заполнение шаблона с помощью именованных полей (свойств документа)
Заполнение шаблона через поиск и замену
Особенности работы с колонтитулами
Заполнение шаблона с помощью закладок
Удаление фрагментов текста
Работа с таблицами
Способы формирования файла Ворд
Работа программы по формированию файла сводится к модификации образца, предоставленного пользователем. К счастью, пользователи приложений, построенных на базе 1С-Предприятия, люди скучные. И их запросы к формированию файлов невелики. Им не требуются информационные буклеты или рекламные плакаты. Им нужны документы. Договоры, акты, письма, исковые заявления, и т.д. Потому обработка файла программой сводится к замене (вставке) текста на полученный из базы данных, удаление каких-то блоков текста и, быть может, вставке небольших картинок, например, логотипа или штрих-кода.
Существует два популярных способа работы с файлами Ворд:
1. Через СОМ-Объект Ворд.
2. Через непосредственную модификацию файлов docx
Главное отличие между ними заключается в том, что первый способ предоставляет разработчику инструмент – полнофункциональный API, позволяющий делать с документом все то же самое, что может делает пользователь, непосредственно работая в редакторе. Второй же способ предполагает собственную разработку инструмента, на основании документации по формату хранения файла. Если функциональность разработанного инструмента перестанет удовлетворять возникающим потребностям – придется разрабатывать (или искать) новый инструмент. В то время как модернизация кода основанного на API СОМ-объектов не представляет сложностей.
Есть еще и третий способ – через API для работы с файлами формата docx (он же формат Open XML) платформы .NET Framework (набор средств для работы с файлами docx Майкрософт продвигает под названием Open XML SDK). Для мира 1С этот путь совсем уж экзотический, нужно создать собственный интерфейсный слой (на другом языке программирования) между приложением 1С и API платформы .NET.
Второй способ основан на том, что любой файл .docx представляет собой архив zip с содержимым документа в виде файлов xml и, в некоторых случаях, графических файлов. Работа с zip, текстовыми и xml файлами штатно поддерживается языком 1С, поэтому, если разбираться в формате файла, то создавать или модифицировать их можно быстро и просто. Ключевое слово, как обычно, “если” 🙂 Этот путь в статье не рассматривается. Всем желающим рекомендую готовое решение, которое перекрывает большую часть потребностей пользователей: //infostart.ru/public/675307/
Первый способ предполагает, что на том компьютере, где будет исполняться код приложения и формироваться файл, установлен Майкрософт Офис. При установке, Офис регистрирует в Виндоус СОМ-объекты для каждого из приложений входящих в пакет. Таким образом, другие приложения, запущенные на компьютере, могут через интерфейс СОМ-объектов выполнять любые действия с документами офисных приложений, возможности предоставленного программного интерфейса, как минимум, не уступают возможностям пользователя, редактирующего документ непосредственно в приложении.
Главная проблема примеров из интернета по рассматриваемой теме – игнорируется тот факт, что за компьютером сидит живой пользователь. Видимо, предполагается, что после нажатия кнопки “сформировать файл”, пользователь должен замереть, не дышать, не дотрагиваться до мыши и клавиатуры в течение всего времени создания файла. А ведь формирование каждого файла может занимать заметное время, в некоторых случаях – больше минуты. И ладно бы вопрос стоял “или так или никак”. Но ведь на самом деле, нет. Можно работать с СОМ-Объектом параллельно с работой пользователя, код чувствительный действиям пользователя не имеет никаких преимуществ перед кодом, не мешающим пользователю. Единственная причина, по которой он используется – нежелание разработчика вникнуть в проблему и рассмотреть альтернативные варианты решения.
Код языка 1С для работы с СОМ-Объектами на сервере и на клиенте ничем не отличается. Единственное, за сервером не работает реальный пользователь, поэтому проблема неудачного кода не выплывает с такой остротой. Повторюсь, преимуществ у такого кода все равно нет. Тем более, что код нужно отлаживать, часто это удобнее делать на клиенте, вот и появился пользователь. А еще, может потребоваться перенос работающего кода с сервера на клиент, например, в рамках рефакторинга и изменения архитектуры приложения. А еще, код может работать в файловой базе, где “сервер” очень условен – программный слой, запускаемый на машине каждого пользователя. Таким образом, лучше всего исходить из того, что пользователь за компьютером есть всегда.
Зачем нужны поля и ссылки в «Word»
Несмотря на свое название, ошибка «Не определена закладка» не имеет никакого отношения к одноименному инструменту, позволяющему создавать невидимые пометки в тексте для быстрого перемещения по большому документу. Дипломной работе, например.
Проблема связана с другим инструментом. Называется он «Поле». Оно нужно для вставки в текстовый документ информации, которая должна постоянно обновляться. Например, нумерация страниц.
Вторым применением полей в «Майкрософт Ворд» служит подключение блоков текста или объектов из другого документа этого же формата. Это позволяет распечатывать однотипные документы, незначительно отличающиеся между собой. Чаще всего это письма или изготовление надписей на конвертах для них.
Вставляются поля и ссылки на них автоматически при использовании определенных команд, но их можно добавить и вручную.
Заполнение шаблона с помощью именованных полей (свойств документа)
Не очень популярный, но иногда встречающийся способ.
Сначала в документ добавляются пользовательские свойства. Для Ворда 2016 это делается так:
– открыть документ
– вкладка “Файл”
– Сведения /Свойства / Дополнительные свойства
– вкладка “Прочие”
– ввести название (имя) свойства и какое-нибудь значение
– нажать “Добавить”
– и т.д. создать все необходимые для заполнения шаблона свойства.
Имя свойства вводим разумное, по нему будем обращаться к свойству из программы, значение – произвольный текст, для того чтобы видеть, как свойство отображается в документе.
Если у файла .doc уже есть хотя бы одно дополнительное свойство, то в свойствах файла появляется соответствующая закладка и работать со свойствами (добавлять, удалять) можно прямо из проводника, не запуская Ворд
Забавно, что для файлов .docx это не работает. Наличие дополнительных свойств никак не отображается в свойствах файла.
Для того чтобы удобнее было работать с текстом документа включим выделение полей:
– Затенение полей установить “Всегда”
В результате поля в тексте документа будут выделены серой заливкой. Серая заливка отображается только при просмотре документа на экране. При печати же никакой заливки не будет.
Для вставки созданных свойств документа в качестве полей необходимо проделать следующие действия:
– Вкладка “Вставка”
– Раздел “Текст”
– Кнопка “Экспресс-блоки”
– выбрать вид поля “DocProperty”
– в списке “Свойства поля” будут все добавленные нами свойства документа. Если имена свойств давались русскими символами, то искать их надо внизу списка:
Получить доступ к свойствам можно через коллекцию документа:
Документ.CustomDocumentProperties(“ЗаказчикДолжностьПодписантаРП”).Value = “директора”;
Важный момент, который стоит учитывать, заключается в том, что присвоение свойствам новых значений никак не отображается в тексте документа. Свойство само по себе, поле, отображающее значение свойства в тексте документа, само по себе. Для того чтобы поле отобразило актуальное значение свойства, поле необходимо обновить. Обновить все поля документа можно командой:
Такой метод заполнения шаблонов обладает рядом недостатков, поэтому используется редко.
Во-первых, возможности метода ограничены заменой небольших фрагментов текста. Ни работу с таблицами, ни вставку рисунков, ни удаление больших блоков текста, реализовать не получится.
Во-вторых, поддержка и сопровождение шаблонов, построенных на свойствах документа очень трудоемка. Нужно сначала создать все требуемые свойства в файле, предоставленном пользователем. Затем вручную каждое свойство вставить в текст документа. Для того чтобы посмотреть или изменить имя свойства требуется множество лишних действий мышью.
Если пользователь возьмет заполненный документ и использует его как основу для создания нового документа вручную, то текст документа не будет соответствовать значениям свойств документа. И если в какой-то момент пользователь по ошибке ли, по подсказке ли Ворда, сам ли Ворд, обновит значения полей, то ручные правки пользователя окажутся потерянными. Хуже того, значения полей могут хранить информацию, разглашение которой нежелательно, а пользователь даже не подозревает об этом.
Если пользователь скопирует фрагмент заполненного документа, содержащего поля, то поля скопируются вместе со значениями, т.е. пользователь не увидит никаких изъянов после копирования. Но свойства документа вслед за текстом не копируются. Если в новом документе по каким-то причинам будут обновлены значения полей, то вместо разумного текста в документе появятся надписи “Ошибка! Неизвестное имя свойства документа”.
Значение поля «Номер» не уникально 1с 8
Программа 1С сообщает пользователю, что номер 0000-0006 уже существует.
Нумерация документов в программе осуществляется автоматически. При этом, каждому новому документу присваивается номер в хронологическом порядке, который состоит из определенного количества цифр.
В 1С:Бухгалтерия предприятия 3.0, номер состоит из двух частей:
В том случае, если пользователь начинает изменять нумерацию вручную или случайно изменил номер, сбив при этом нумерацию документов, программа продолжает нумерацию от номера, содержащего меньшее количество знаков. Изначально, мы видим, что в 1С заложено для номера документа:
Таким образом, сам номер может принимать значение от 0000-000001 до 0000-999999. Если пользователь вручную сокращает длину номера, то она продолжает нумерацию от нового значения. При внесении изменения в префикс, нумерация все равно продолжается от последнего номера, содержащего наименьшее количество знаков. В нашем примере при сбое в нумерации она продолжилась, используя под номер 4 знака: 0000-0005, 0000-0006 и т. д.
В базе уже есть номер 0000-0006, поэтому при попытке ввести его повторно, программа выдаст сообщение о том, что значение поля номер 0000-0006 не уникально.
Рассмотрим ситуацию далее.
Что произойдет, если пользователь сократит числовой резерв для номера до двух или, куда хуже, до одного знака?
Программа 1С будет присваивать номера до тех пор, пока не будет пройден последний максимальный номер. Например, изменив вручную в документе номер на 0000-01, программа сможет автоматически присвоить всего 99 номеров. После номера 0000-99 возможность автоматической нумерации документов закончится и придется каждый раз исправлять номер вручную
После номера 0000-99 при вводе каждого нового документа будет выдаваться сообщение, что значение номера 0000-99 не уникально.
Когда пользователь сокращает длину номера документа (договора и т. п.) — это приводит к сбою нумерации. Поэтому, если возникает необходимость изменить номер документа вручную, надо использовать максимально допустимое число символов.
Как поступить в случае появления такой ошибки? В первую очередь, необходимо просмотреть нумерацию документов. В случае, если исправленных документов было не много, значение номера можно изменить вручную, добавив нужное количество нулей перед значением. При попытке изменить номер, программа выдаст сообщение о редактировании номера, на что мы отвечаем:
После этого добавляем нули перед значением номера.
После приведения в порядок нумерации, ошибка появляться не будет.
Если исправлений в номерах было много, то можно воспользоваться обработкой для автоматической перенумерации объектов.
Если Вы еще не являетесь подписчиком системы БухЭксперт8:
После оформления подписки вам станут доступны все материалы по 1С Бухгалтерия, записи поддерживающих эфиров и вы сможете задавать любые вопросы по 1С.
Получите еще секретный бонус и полный доступ к справочной системе БухЭксперт8 на 14 дней бесплатно
Чаще всего эта ошибка возникает при работе непосредственно со справочниками договоров, контрагентов, номенклатуры и т. д. Пользователь добавляет в любой из справочников новую запись, при этом система 1С: Предприятие 8 автоматически присваивает ему код, но при сохранении записи выдает ошибку «Код не уникален!», а, следовательно, сохранить объект не удается.
Заполнение шаблона через поиск и замену
В основе метода лежит размещение в тексте шаблона специально выделенных с помощью редко встречающихся символов блоков текста:
В данном случае для выделения блоков использованы символы “$(” и “)$”. Затем средствами поиска и замены Ворда каждый такой блок заменяется на соответствующее значение из базы. Эти заменяемые блоки можно называть полями, параметрами, закладками, реквизитами, но все эти термины уже используются в обсуждаемой предметной области. Чтобы не создавать дополнительной путаницы, далее по тексту я буду называть такие блоки якорями.
Внутри метода существуют два подхода. Первый (неправильный и при этом наиболее распространенный) основан на использовании объектов , второй на использовании объектов .
Использовать объекты при обращении к документу – плохая практика. Если пользователь откроет редактируемый документ и кликнет по тексту мышью, текущее выделение сместиться, объект будет соответствовать точке вставки в позиции курсора, это с огромной вероятностью приведет к неверной работе с заполняемым шаблоном. Более того, можно найти множество примеров обращения к объекту , который соответствует выделению в том окне приложения Ворд, которое сейчас активно. В этом случае, для того, чтобы вызвать сбой в работе программы, пользователю достаточно развернуть окно другого документа, открытого в том же экземпляре Ворда, что и обрабатываемый шаблон.
Для редактирования документа без интерактивного взаимодействия с пользователем наиболее удобны объекты . В одном документе может быть сколько угодно объектов . Каждый документ представляет собой ссылку на фрагмент документа, определяемый номерами начального и конечного символов. Свойства (номер первого символа диапазона) и (номер последнего символа диапазона) доступны для записи. Записывая новые значения в эти свойства, можно перемещать объект в документе.
У объектов и есть свойство доступное для записи. Присвоение этому свойству нового значения эквивалентно замене текста в документе.
У объектов и есть объектное свойство , с помощью которого доступен функционал поиска и замены Ворда. Для выполнения поиска нужно вызвать метод объекта . Поиск осуществляется внутри выделения или внутри диапазона . После вызова соответствующий объект или изменяется и соответствует найденному фрагменту:
Документ.Select();
Word.Selection.Find.Execute(“$(ЗаказчикДолжностьПодписантаРП)$”);
Word.Selection.Text = “директора”;
Range = Документ.Content;
Range.Find.Execute(“$(ЗаказчикДолжностьПодписантаРП)$”);
Range.Text = “директора”;
В этих примерах если текст (якорь) “$(ЗаказчикДолжностьПодписантаРП)$” есть в тексте шаблона, он будет заменен на текст “директора”. Если же искомого фрагмента в тексте документа нет, то весь текст документа будет заменен единственным словом, т.к. размеры объектов и не изменятся. Если мы предполагаем, что в шаблоне может и не содержаться какого-то якоря, то нужно проверять значение, возвращаемое функцией . Если поиск успешен, то возвращается , иначе .
Range = Документ.Content;
Если Range.Find.Execute(“$(ЗаказчикДолжностьПодписантаРП)$”) Тогда
Range.Text = “директора”;
КонецЕсли;
Range = Документ.Content;
WdReplaceAll = 2;
Range.Find.Execute(“$(ЗаказчикДолжностьПодписантаРП)$”,,,,,,,,, “директора”, wdReplaceAll);
За кадром остался вопрос, если обращение к выделению через – вселенское зло, то как следует правильно обращаться к объекту ? Конечно, правильно к нему вообще не обращаться и пользоваться только объектами .
Но если все-таки почему-то нужен именно объект , то для минимизации интерактивного взаимодействия с пользователем обращаться нужно именно к объекту нашего документа, а не всего приложения. Но у объекта нет свойства ! Это потому, что активный документ может состоять не из одного окна, а из нескольких. Например, открыли вы окно свойств абзаца у документа, документ тот же, а окна у документа уже два – одно с текстом документа, второе с параметрами абзаца. Так вот, , это свойство именно окна. Поэтому для работы с объектами нужно сразу сохранить ссылку на главное окно документа. Сделать это разумнее всего сразу после открытия документа методами или :
Значение поля не уникально
Ошибка возникает при создании нового документа. При записи программа 1С 8.3 автоматически присваивает элементу новый номер, но сохранить новые данные не может, где-то в журнале документов уже есть объект с таким же номером.
Причиной этой ошибки чаще всего служит ручное исправление номеров документов.
В чем причина появления данной ошибки?
А причина может быть в некорректной нумерации объектов справочника. Как это происходит? Обычно при создании новой записи в каком-то из справочников программа сама генерирует код записи. Если в предыдущих записях пользователь редактировал код вручную, то в последствии есть вероятность того, что при создании последующих записей разрядность кода увеличится на один знак и перестает помещаться в поле, а значит генерация кодов начнется сначала. Только вот хранить объекты с одинаковыми кодами в справочниках 1С нельзя, а, значит, пользователь в такой ситуации будет получать на экран сообщение об ошибке.