Форматированный документ предназначен для оформление текста. Его можно выделить жирным, подчеркнуть, увеличить/уменьшить шрифт, центрировать и т.д. Также можно добавить картинку. Т.е. в 1С теперь можно отформатировать текст, примерно, как в MS Word и др. подобным программам. Это может быть удобно при оформлении различных договоров или, например, при редактировании электронного письма. Таким образом, у нас есть возможность привести текстовый документ в тот вид, который мы пожелаем.
В синтакс-помощнике есть описание. Объект ФорматированныйДокумент (FormattedDocument) имеет одноименный тип данных, который поддерживает функционирование данного объекта и имеет следующие методы: Вставить (I_nsert)
Добавить (Add)
Записать (Write)
ПолучитьHTML (GetHTML)
ПолучитьЗакладкуКонца (GetEndBookmark)
ПолучитьЗакладкуНачала (GetBeginBookmark)
ПолучитьЗакладкуПоПозиции (GetPositionBookmark)
ПолучитьПозициюПоЗакладке (GetBookmarkPosition)
ПолучитьТекст (GetText)
Удалить (Delete)
УстановитьHTML (SetHTML)
Доступен во всех типах приложения: Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение. Нельзя указать новый тип данных в качестве типа реквизита.
Есть одна важная особенность этого типа. Нельзя задавать тип «Форматированный документ» для реквизита объекта (справочника, документа и др.). Но есть возможность указывать его для реквизитов формы.
Возникает вопрос, как же нам сохранить те изменения при форматировании текста, которые сделал пользователь? Для этого применяется специальный объект «ХранилищеЗначения», который может содержать в себе любой тип данных, в том числе и «форматированный документ». Таким образом, в базе данных сам объект будет храниться как «Хранилище значения», далее при открытии формы необходимо будет извлечь объект из хранилища, отобразить его на форме используя тип «ФорматированныйДокумент». Если пользователь решит сохранить изменения, то при записи объекта нужно снова взять объект «форматированный документ» и записать его в хранилище.
Пример работы
Возьмем за основу каркасную конфигурацию, создадим в ней справочники «Контрагенты» и «Договоры». Установим справочник «Договоры» подчиненным справочнику «Контрагенты» и создадим реквизит «Текст» с типом ХранилищеЗначения.
Создадим форму элемента справочника «Договоры» и добавим на нее новый реквизит, который назовем «ТекстДоговора», укажем тип данных «ФорматированныйДокумент». Обратите внимание, что реквизит «Текст» с типом «ХранилищеЗначения» на форму поместить нельзя.
Создадим также командную панель (меню) содержащую необходимые кнопки для управления форматированным документом. Для этого надо добавить в форму «Группа – Командная панель» и указать в свойстве «Источник команд» реквизит формы «ТекстДоговора» с типом ФорматированныйДокумент.
Запускаем отладчик, проверяем, что у нас получилось…
Все бы хорошо, но есть некоторые проблемы:
Во-первых, если ввести текст и отформатировать его должным образом, то признак модифицированности для формы не возникает. Таким образом, случайно нажав на кнопку закрытия формы, система не задавая вопросов закрывает ее без всякого сохранения.
Для того чтобы подобные неприятности не случались, необходимо установить флаг у свойства «Сохраняемые данные» реквизита формы «ТекстДоговора». В результате, при любом изменении данных в реквизите «ТекстДоговора», будет устанавливаться признак модифицированности формы, а при ее закрытии система спросит: «Сохранить изменения?».
Во-вторых. Попытаемся закрыть форму и сохранить введенные данные. Заново открыв сохраненный договор, видим что текст введенный в форму договора отсутствует. Почему так происходит?
Все дело в том, что мы делаем изменения в реквизите формы, который у нас никак не связан с реквизитом объекта. Давайте настроим связь между реквизитом формы «Текст договора» с типом данных «ФорматированныйДокумент» и реквизитом объекта «Текст» с типом «ХранилищеЗначения».
Пропишем эту связь программно в модуле формы. Опишем алгоритм.
1. При открытии формы, необходимо будет обратиться к реквизиту объекта «Текст», чтобы прочитать из него данные и записать их в форматированный документ «Текст договора».
2. При записи объекта, берем содержимое форматированного документа и помещаем его в реквизит объекта «Текст» с типом «ХранилищеЗначения».
Таким образом у нас будет возникать эффект, что все изменения производимые пользователем, будут сохраняться в базе данных.
Нам понадобятся следующие обработчики событий:
- событие ПриЧтенииНаСервере(ТекущийОбъект)
оно удобно тем, что при ошибочном внесении изменений в данные формы, можно нажать кнопку «Перечитать» и вернутся к исходным данным.
Т.к. реквизит Текст у нас имеет тип «ХранилищеЗначений», надо учесть нюансы работы с ним… В случае чтения объекта используем метод Получить(), а в случае записи используем конструктор объекта Новый ХранилищеЗначения(<Значение>, <АлгоритмСжатияДанных>).
На этом пока всё. В следующий раз попробую рассказать про использование шаблонов для вставки параметров в текст форматированного документа, например, вместо %Контрагент% вставлять наименование контрагента. Сергей (SirYozha)
Иногда возникает необходимость запуска кода в базе 1С из командной строки. Например, надо выполнять те или иные процедуры по расписанию, но при этом нет желания каждый раз менять конфигурацию, а хочется прописать всё в батнике и запускать через шедулер (at). Вижу следующие варианты:
1. изменить один раз конфигурацию, чтобы потом можно было передавать через параметр исполняемый код.
2. прописать выполняемый код во внешней обработке и запускать 1С с параметром /execute
3. написать на vba процедуру выполнения заданных операций через COM.
1. Изменить один раз конфигурацию, чтобы потом можно было передавать через параметр исполняемый код.
В таком варианте необходимо прописать следующий код в модуле приложения процедуре ПриНачалеРаботыСистемы():
После этого для выполнения кода из командной строки достаточно будет запустить 1С с параметром /cВыполнить=[ИсполняемыйКод]. Например:
2. Прописать выполняемый код во внешней обработке и запускать 1С с параметром /execute
1С имеет параметр запуска "/Execute", с помощью которого можно запустить внешнюю обработку после старта системы. Чтобы воспользоваться этой возможностью, необходимо создать внешнюю обработку с исполняемым кодом в модуле формы:
После этого можно запускать данную обработку из командной строки например так:
3. Написать на vba процедуру выполнения заданных операций через COM.
Можно все действия прописать в файле VBS и уже его запускать. Пример содержимого файла VBS:
Надумал когда-то задачу себе: выгрузить содержимое табличного документа в Google Document. Одним из вариантов использования данного функционала может быть выгрузка состояния заказов пользователей из базы в 1с в google spreadsheet. Если клиент знает адрес данного документа, то они могут ознакомиться с состоянием дел не звоня менеджеру. Может кто еще придумает варианты использования – пишите в комментарии, буду рад.
Последовательность выгрузки документа такова: сначала получаем список таблиц, которые есть у пользователя в системе Google Document. Затем после определения таблицы выгрузки пользователю предлагаем выбрать лист, в который будет выгружаться содержимое. Во время выбора всех этих параметров так же предоставляется возможность создания новых элементов (таблиц, листов). Уже после определения листа выгрузки обходим все ячейки документа и их содержимое переносим в таблицу на соответствующее место. Вопрос сохранения форматирования табличного документа в данной задаче не рассматривался.
Для написания функционала использовалась информация про google document API. Для того чтобы получить доступ к данным необходимо чтобы 1с сначала прошла аутентификацию. Про аутентификацию приложений можно почитать в соответствующем документе. Для того чтобы пройти аутентификацию мы должны сначала получить маркер, затем этот маркер прописывать каждый раз при обращении к серверу.
Функция получения маркера следующая:
Функция получения маркера в качестве входного параметра получает вид службы, для которой будет проходить аутентификация. Это очень важный момент. Например, полученный маркер для Календаря не даст возможности работать с документами.
Для получения списка таблиц отправляется GET запрос по адресу «https://spreadsheets.google.com/feeds/spreadsheets/private/full». В запросе параметр «Authorization» определяется значением полученного маркера аутентификации. В результате выполнения запроса в ResponseText мы получаем xml, который для удобство дальнейшего разбора перегоняется в ДеревоЗначений.Функция получения списка таблиц имеет следующий вид:
Теперь остановимся на самой выгрузке значения в ячейку google таблицы. Для определения значения в ячейке выполняется POST запрос по адресу листа таблицы, который пользователь определил до этого. Успешность выполнения обновления контролируется по значению Status, в случае удачного обновления он должен быть равен 201. Функция обновления значения ячейки на листе Google таблицы имеет следующий вид:
Столкнулся с интересной задачей реализации генерации QR-кода в 1С 8.2 ( QR-код — матричный код (двухмерный штрихкод) ) Для генерации было использовано api от google (http://chart.apis.google.com/chart). Вот сайт, который работает с ним. После того, как вы вводите все параметры кода и нажимаете кнопку генерировать, получаем что-то вроде такой ссылки. По сути эта ссылка нам и нужна. Создав необходимый url можно скачать картинку, которая генерируется с помощью api.
И так в чем заключается подход:
1. Генерируем текст, который надо прописать в qr-коде.
2. Используя ссылку «http://chart.apis.google.com/chart?cht=qr&chs=230?230&chl=» +»Наш текст» скачиваем картинку.
3. Размещаем картинку в нашем табличном документе.
Код реализации:
Восстановление документов 1С из архива в рабочую базу (XML обмен)
Не редко требуется восстановить данные испорченного документа 1С из архива базы после не умышленных, а зачастую ошибочных, действий удачливого пользователя. Самым простым способом является выгрузка данных из базы архива 1с в XML, а затем загрузка этого XML файла в рабочую базу. Данное решение целиком и полностью опирается на внутренние XML алгоритмы работы конфигурации 1С. При помощи предлагаемой обработки в рабочую базу загружаются все реквизиты документа и его табличные части в том виде, в котором они существовали в архиве.
Исключение составляют движения документа. Данные о движениях не сохраняются при XML сериализации. Хотя документ и восстанавливается проведенным, но все регистры учета и накопления не трогаются. По этому, после восстановления документа следует его провести, либо воспользоваться обработкой, которая позволяет восстановить утерянный или испорченный документ со всеми его движениями.
Импорт - экспорт данных через XML. Обработка обмена данными.
Начало работы с обработкой по экспорту данных документа 1С в XML начинается с выбора имени XML файла и документа, данные которого необходимо сохранить. Первый этап следует выполнять на архивной копии базы, из которой требуется получить достоверные данные. После указания требуемых данных следует нажать кнопку "Выгрузить". Экспорт данных выбранного документа будет осуществлен в указанный пользователем XML файл.
Импорт данных из XML файла следует осуществлять уже в рабочей базе в режиме "1С Предприятие". Для этого откройте обработку, выберите файл данных и нажмите кнопку восстановить. Документ выбирать не обязательно, так как все его данные уже известны и содержаться в XML файле. Важное замечание - движения документа не изменяются, по этому если нужно их тоже восстановить документ следует провести. Скачать обработку:Скачивать файлы может только зарегистрированный пользователь!
Импорт данных из 1С в XML
Обеспечение возможности импорта данных из 1С в XML осуществляет процедура XML_Импорт. Процедура импорта проверяет пользовательский ввод - имя файла и ссылку на документ, данные которого нужно сохранить в XML файл. Далее создается новый текстовый файл, в который средствами 1С осуществляется выгрузка значений всех реквизитов документа и табличных частей. Исходный код процедуры:
Экспорт данных из XML в 1С
Обратная операция - экспорт данных из XML в 1С реализована в процедуре XML_Экспорт. Данные, сохраненные на предыдущем этапе, читаются из XML файл при помощи механизма XML Reader. Для восстановления данных документа достаточно указать только имя XML файла, так все необходимые данные о том, какой именно документ нужно восстанавливать уже имеются в файле. После успешного чтения данных 1С средствами платформы изменит требуем документ и откроет его в новом окне для проверки. Для восстановления движений документа его необходимо провести. Исходный код процедуры:
Возникла задача отправлять счета почтой. PDFcreator не подошёл поскольку не удалось вместить счёт на одну страницу по ширине. Решил попробовать OpenOffice. Как сохранять в PDF нашёл быстро, а вот как уместить счёт на одну страницу вширь искал долго.
В версии 1С 8.2.232 появилась возможность сохранять табличный документ в xls файл на сервера под линуксом. А вот работать с Опеном офисом из-под линукса пока не получается. Собственно комментари ненужны. Вот весь код. Самое интересное это бодание со стилями страниц в Опене Офисе. Жаль что этот фрагмент работает только на клиенте. На сервере вопрос не решается *08
Автор: Трактор
Функция позволяющая выполнить выгрузку табличного документа в PDF средствами OpenOffice
Столкнулся с вопросом печати счета на оплату сразу в pdf.
Решение: установка виртуального принтера bioPDF скачать можно тут. И прописывание в 1с следующего кода:
Как выяснилось во время печати в pdf есть проблема с передачей прозрачности картинки. Если вставлять прозрачную печать в счет поверх подписи, то в pdf-документе печать будет непрозрачной и затрет все собой. У меня был частный случай, когда печать находилась на одном и том же месте документа и за ней постоянно было одно и то же. Решением в данном случае стала генерация картинки печати с фоном, на котором она должна быть и вставка её в макет.
Обработка демонстрирует простейший пример работы с 2-мя текстовыми процессорами - OpenOffice.org Writer и Microsoft Office Word. Нужно запустить файл обработки, в качестве шаблона она будет использовать файл "Primer.doc", который находится в одном каталоге с обработкой: Скачивать файлы может только зарегистрированный пользователь!
Файл Шаблона - Primer.doc:
От: {Организация}
Кому: {Контрагент}
Ждем акт сверки взаиморасчетов!
Директор /{Директор}/
Необходимо заменить в шаблоне ключевые слова в скобках {}, на указанные значения, вот примерный код обработки:
Конечно метод дубовенький, расчитан тока на русскую версию, но можно и допеределать.
Не стал писать код определения пишущего сидирома и возможности записи (хотя на отсутствие диска или невозможность записать ОС сама укажет)...
Автор: smaharbA