Договор, сделанный в Word, переделать для работы в Writer

Автор Анюта, 28 февраля 2026, 09:38

0 Пользователи и 1 гость просматривают эту тему.

Ципихович Эндрю

утро вечера мудренее...
вспомнил - MRI (UNO Object Inspection Tool) — это инструмент для анализа объектов UNO в LibreOffice. Он позволяет узнать, что представляет собой выделенный элемент: кнопка, поле, текстовый объект и т. д., а также получить доступ к его свойствам и методам
Сервис → Дополнения → MRI selection
для начала речь про первое поле, там в MRI сказано:
(Name)                 (Value Type)  (Value)                       (Info.)   (Attr.)    (Handle) 
Count                  long          1                             Pseud     Read_Only       
ElementType            type          com.sun.star.text.XTextRange  Pseud     Read_Only       
ImplementationId       []byte        -SEQUENCE-                    Pseud     Read_Only       
ImplementationName     string        SwXTextRanges                 Pseud     Read_Only       
SupportedServiceNames  []string      -Sequence-                    Pseud     Read_Only       
Types                  []type        -Sequence-                    Pseud     Read_Only   

пока туман...
в MRI есть вкладка Macros там указано  bundle.py, инет говорит bundle.py — это внутренний файл MRI, ок
пока туман...

Ципихович Эндрю

проверяю макросом бейсика
Sub Field_Field()
    Dim oDoc As Object
    Dim oSel As Object
    Dim oField As Object
    Dim sType As String
    Dim sName As String

    oDoc = ThisComponent
    oSel = oDoc.CurrentController.Selection

    ' Проверяем, есть ли в выделении поля
    If oSel.SupportsService("com.sun.star.text.TextRanges") Then
        ' Берем первое выделение (обычно это одно)
        oField = oSel.getByIndex(0)
       
        ' Проверяем, является ли оно полем
        If oField.SupportsService("com.sun.star.text.textfield.Generic") Then
            sType = "Поле: " & oField.ImplementationName
            sName = "Имя: " & oField.Name ' Имя может быть пустым для простых полей
        Else
            sType = "Это не поле (выделен текст или другой объект)"
            sName = ""
        End If
    Else
        sType = "Ничего не выделено или выделен неверный объект"
        sName = ""
    End If

    MsgBox sType & Chr(13) & sName, 64, "Анализ объекта"
End Sub
Это не поле (выделен текст или другой объект)
 ХЗ, что за зверь...

Ципихович Эндрю

Цитата: Ципихович Эндрю от  4 апреля 2026, 10:00для начала речь про первое поле
второе от первого ничем не отличается..., на всякий случай скажу и покажу, что есть 1 и 2
цифры - 1е
прописью 2-е

Ципихович Эндрю

сорри не приложилось, исправляю

Анюта

Всем здравствуйте.
Что я могу сказать о DDE. Пробовала я эту попытку. Связь осуществляется, но это подходит наверное для больше таблиц и если, вставленную таблицу в Writr не изменять. Вставка из Calc произошла в виде цифровых данных и в виде суммы прописью и всё это в чёрной рамочке. Способ убрать рамочку я не нашла, хотя, кажется на этом сайте, обсуждение было лет 7 назад, ответ ро рамочку был такой  «скройте отображение сетки в Calc и  будет вам счастье». Пробовала этот вариант, рамочка так и осталась. Далее какие ещё проблемы у меня возникли:
- вставка данных осуществляется на одну строчку ниже места, где она должна быть, в нужное место внутри текста наверное не получится.
- при изменении в Writer, имеется ввиду сама вставка, размеров ширины, где числовое значение и  пропись, там посередине есть разделение в виде вертикальной чёрной, скажем так, черты, связь с Calc теряется.
- при переносе папки, где находятся оба файла Calc и Writer, на другой компьютер связь также теряется, но это не самая большая проблема для  меня т,к. Я этого делать не собираюсь.
В чём ещё проблемы с DDE, сразу и не вспомню, хотя бы от этих избавиться.
Что я делала не так? Просьба указать на ошибки.
В приложенном файле результаты моих действий. В данном случае связь с между обеими файлами существует, но т. к. архив будет перемещён на форум, связь меду файлами, я так полагаю, прервется.
По поводу договора в Calc от bsi, приемлемо, всё в одном файле, без макросов, что великолепно, но тоже нужна небольшая правка.
Всем хороших выходных.
 

Ципихович Эндрю

конец света что ли ...
Sub CheckDocumentContent()
    ' Объявление переменных с именами на латинице
    Dim oDoc As Object
    Dim sMsg As String
    Dim oEnum As Object
    Dim oEl As Object
    Dim iCount As Integer
    Dim iFieldCount As Integer

    ' Получаем текущий активный документ
    oDoc = ThisComponent

    ' Инициализация строки сообщения
    sMsg = "Анализ документа: " & oDoc.Title & Chr(13) & Chr(13)

    ' 1. Проверка наличия текста
    If Len(Trim(oDoc.Text.String)) > 0 Then
        sMsg = sMsg & "✅ Text is present." & Chr(13)
        sMsg = sMsg & "Character count (with spaces): " & Len(oDoc.Text.String) & Chr(13)
    Else
        sMsg = sMsg & "❌ No text found." & Chr(13)
    End If

    ' 2. Проверка таблиц
    iCount = oDoc.TextTables.Count
    If iCount > 0 Then
        sMsg = sMsg & "✅ Tables found: " & iCount & Chr(13)
    Else
        sMsg = sMsg & "❌ No tables found." & Chr(13)
    End If

    ' 3. Проверка изображений и OLE-объектов
    iCount = 0
    oEnum = oDoc.getGraphicObjects().createEnumeration()
    Do While oEnum.hasMoreElements()
        oEl = oEnum.nextElement()
        If oEl.supportsService("com.sun.star.drawing.OLE2Shape") Or _
           oEl.supportsService("com.sun.star.drawing.GraphicObjectShape") Then
            iCount = iCount + 1
        End If
    Loop

    If iCount > 0 Then
        sMsg = sMsg & "✅ Images/Objects found: " & iCount & Chr(13)
    Else
        sMsg = sMsg & "❌ No images or objects found." & Chr(13)
    End If

    ' 4. Проверка закладок
    iCount = oDoc.Bookmarks.Count
    If iCount > 0 Then
        sMsg = sMsg & "✅ Bookmarks found: " & iCount & Chr(13)
    Else
        sMsg = sMsg & "❌ No bookmarks found." & Chr(13)
    End If

    ' 5. Проверка ПОЛЕЙ (Корректный метод)
    iFieldCount = 0
    oEnum = oDoc.Text.createEnumeration()
   
    ' Перебираем все элементы текста (абзацы, таблицы, поля и т.д.)
    Do While oEnum.hasMoreElements()
        oEl = oEnum.nextElement()
       
        ' Проверяем, является ли текущий элемент полем (TextField)
        If oEl.supportsService("com.sun.star.text.TextField") Then
            iFieldCount = iFieldCount + 1
        End If
    Loop

    If iFieldCount > 0 Then
        sMsg = sMsg & "✅ Fields found: " & iFieldCount & Chr(13)
    Else
        sMsg = sMsg & "❌ No fields found." & Chr(13)
    End If

    MsgBox sMsg, 64, "Document Content Analysis"
End Sub
✅ Text is present.
Character count (with spaces): 112
❌ No tables found.
❌ No images or objects found.
❌ No bookmarks found.
❌ No fields found.
и не поспоришь
1234567,89 (Один миллион двести тридцать четыре тысячи пятьсот шестьдесят семь рублей восемьдесят девять копеек) - 112 знаков так и не понял, что за звери в документе

Ципихович Эндрю

их - полей три, вау)) ну лучше чем 0
Sub CheckDocumentContentFixed()
    Dim oDoc As Object
    Dim sMsg As String
    Dim oEnum As Object
    Dim oPara As Object
    Dim oPortionEnum As Object
    Dim oPortion As Object
    Dim iCount As Integer
    Dim iFieldCount As Integer
   
    oDoc = ThisComponent
    sMsg = "Анализ документа: " & oDoc.Title & Chr(13) & Chr(13)
   
    ' Счётчики
    iCount = 0
    iFieldCount = 0
   
    ' Перебираем все абзацы
    oEnum = oDoc.getText().createEnumeration()
   
    Do While oEnum.hasMoreElements()
        oPara = oEnum.nextElement()
       
        ' Если параграф — перебираем его части (portions)
        If oPara.supportsService("com.sun.star.text.Paragraph") Then
            oPortionEnum = oPara.createEnumeration()
           
            Do While oPortionEnum.hasMoreElements()
                oPortion = oPortionEnum.nextElement()
               
                ' Проверяем TextField через .TextField
                On Error Resume Next
                If Not IsNull(oPortion.TextField) Then
                    iFieldCount = iFieldCount + 1
                   
                    ' Получаем информацию о поле
                    Dim oField As Object
                    oField = oPortion.TextField
                   
                    ' Определяем тип поля
                    Dim sFieldType As String
                    Select Case oField.Type
                        Case com.sun.star.text.textfield.Type.INPUT
                            sFieldType = "Input Field (ввод)"
                        Case com.sun.star.text.textfield.Type.INPUT_USER
                            sFieldType = "User Input Field"
                        Case com.sun.star.text.textfield.Type.CROSS_REFERENCE
                            sFieldType = "Cross-reference"
                        Case com.sun.star.text.textfield.Type.BOOKMARK
                            sFieldType = "Bookmark reference"
                        Case Else
                            sFieldType = "Other field (Type: " & oField.Type & ")"
                    End Select
                   
                    sMsg = sMsg & "Поле " & iFieldCount & ": " & sFieldType & Chr(13)
                    sMsg = sMsg & "  Подсказка: " & oField.Hint & Chr(13)
                    sMsg = sMsg & "  Содержимое: " & oField.Content & Chr(13) & Chr(13)
                End If
                On Error GoTo 0
               
            Loop
        End If
    Loop
   
    If iFieldCount = 0 Then
        sMsg = sMsg & "❌ Полей не найдено"
    Else
        sMsg = sMsg & "✅ Всего полей: " & iFieldCount
    End If
   
    MsgBox sMsg, 64, "Document Fields Analysis"
End Sub
ответ:
Поле 1:
  Подсказка:
  Содержимое: Сумма руб.коп

Поле 2:
  Подсказка:
  Содержимое: 1234567,89

Поле 3:
  Содержимое: SumN

✅ Всего полей: 3

Ципихович Эндрю

в догонку
Sub SimpleFieldCheck()
    Dim oDoc As Object, oEnum As Object, oPara As Object
    Dim oPortEnum As Object, oPort As Object, oField As Object
    Dim sMsg As String, i As Integer
   
    oDoc = ThisComponent
    sMsg = "Поля в документе:" & Chr(13) & Chr(13)
    i = 0
   
    oEnum = oDoc.getText().createEnumeration()
    Do While oEnum.hasMoreElements()
        oPara = oEnum.nextElement()
        If oPara.supportsService("com.sun.star.text.Paragraph") Then
            oPortEnum = oPara.createEnumeration()
            Do While oPortEnum.hasMoreElements()
                oPort = oPortEnum.nextElement()
                On Error Resume Next
                If Not IsNull(oPort.TextField) Then
                    i = i + 1
                    oField = oPort.TextField
                   
                    ' Определяем тип по свойствам
                    Dim sFieldType As String
                    If oField.Content <> "" And oField.Hint = "" Then
                        sFieldType = "Input Field (поле ввода)"
                    ElseIf oField.Hint <> "" Then
                        sFieldType = "Input Field с подсказкой"
                    Else
                        sFieldType = "Другое поле"
                    End If
                   
                    sMsg = sMsg & i & ". " & sFieldType & Chr(13)
                    sMsg = sMsg & "   Content: " & Left(oField.Content, 20) & Chr(13) & Chr(13)
                End If
                On Error GoTo 0
            Loop
        End If
    Loop
   
    MsgBox sMsg & "Всего: " & i, 64, "Fields"
End Sub
ответ:
Поля в документе:

1. Input Field (поле ввода)
   Content: Сумма руб.коп

2. Input Field (поле ввода)
   Content: 1234567,89

3. Input Field (поле ввода)
   Content: SumN

Всего: 3
теперь бы понять как их создать?

bigor

Цитата: Анюта от  4 апреля 2026, 12:33Пробовала я эту попытку.
если использовать calc  и writer то при массовой печати таких договоров проще использовать инструмент рассылку писем.
Поддержать наш форум можно здесь

bsi

Госпадин  Ципихович Эндрю ,  с удя по вашим картинкам с суммой прописью, вы не не понимаете откуда берётся эта пропись. Наверное ищите кой макрос выполняет эту функцию? Скажу вам совершенно точно, макроса там нет. Сумма прописью получается без макроса. Давайте всё по порядку. На первой странице обсуждения смотрим  третье сообщение (второе от   sokol92 ) далее идёт ваше сообщение. Так вот в этом втором сообщении  он прислал файл сумма прописью. Открываем это файл  и двойной клик по полю где пропись. Откроется форма редактирование полей там в третьем столбце формат опускаемся в самый низ дополнительные форматы, одиночный клик и откроется форма форматы полей, внизу код формата вписан вот такой код # ##0,00 [$₽-419];[RED]-# ##0,00 [$₽-419] вот он и выдаёт сумму прописью, где всё пишется буквами и рубли и копейки. Далее в сообщении на втором листе сообщение от 3 марта, он высылает готовый договор . Там если снять защиту раздела, двойной лик по полю где сумма прописью, откроется такая же форма редактирование полей, выполняем те же операции что и файле сумма прописью.
Оригиналы файлов я выслал. Кажется всё.

bsi

  Ципихович Эндрю, извините не тот договор я выслал. Правильный вариант.

bigor

Цитата: bsi от  5 апреля 2026, 03:00код формата вписан вот такой
мне кажется с форматом вы напутали
Поддержать наш форум можно здесь

economist

#42
Цитата: Анюта от  4 апреля 2026, 12:33...Связь осуществляется, но это подходит наверное для больше таблиц и если, вставленную таблицу в Writr не изменять. Вставка из Calc произошла в виде цифровых данных и в виде суммы прописью и всё это в чёрной рамочке. Способ убрать рамочку я не нашла, хотя, кажется на этом сайте, обсуждение было лет 7 назад, ответ ро рамочку был такой  «скройте отображение сетки в Calc и  будет вам счастье». Пробовала этот вариант, рамочка так и осталась. Далее какие ещё проблемы у меня возникли:
- вставка данных осуществляется на одну строчку ниже места, где она должна быть, в нужное место внутри текста наверное не получится.
- при изменении в Writer, имеется ввиду сама вставка, размеров ширины, где числовое значение и  пропись, там посередине есть разделение в виде вертикальной чёрной, скажем так, черты, связь с Calc теряется.
- при переносе папки, где находятся оба файла Calc и Writer, на другой компьютер связь также теряется, но это не самая большая проблема для  меня т,к. Я этого делать не собираюсь.
В чём ещё проблемы с DDE, сразу и не вспомню, хотя бы от этих избавиться.
Что я делала не так? Просьба указать на ошибки.
В приложенном файле результаты моих действий. В данном случае связь с между обеими файлами существует, но т. к. архив будет перемещён на форум, связь меду файлами, я так полагаю, прервется.

DDE подходит решительно для всего: для чисел и сумм прописью из отдельных ячеек, и таблиц на тысячи страниц, и для абзацев/разделов из отдельных текстовых документов. Она работают так же, как работают ссылки на ячейки в Excel, вот прям точно так же. Вы можете эти связи менять, просто заменяя текст в Ссылке C:\Отчет1.xlsx Лист1.E8 -> Лист1.F10

Как вставлять ОДНУ самообновляемую DDE-ячейку Calc во Writer без рамки, в эту же строку:

- Открыли Calc, в нем открыли ODT и XLSX/ODS. Не открывайте в Excel, если не хотите делать дважды, EXCEL рвет DDE-связи намеренно. 

- Скопировали в Calc нужную ячейку в таблице (на рамки плевать, DDE переносит только ВИДИМЫЙ ТЕКСТ ячейки), перешли во Writer. Ctrl+Shift+V - Динамический... DDE

- Появилось число в рамке - сразу жмем Жмем Ctrl+Z (отмена)- Ctrl+F2 (Поля)

- Variables/Переменные - Выбор (щелкаем нижний элемент, выглядит типа soffice1) - Вставить.

Вот и всё. Повторюсь DDE - это как связи в Excel. Никто их не правит, файлы-источники не переносит и не переименовывает, исходные листы не удаляет. И вы так тоже не делайте, потому что либо связь порвется, либо ваша правка при переоткрытии файла затрется обновлением. Если файл пришлось перенести - кликните по связи, по строке в окне, измените путь в поле Файл. Тут все как в Excel/Calc.

Насчет уведомления - можно показывать себе запрос, а можно папку добавить в Alt+F12 - Безопасность - ...макросов - Надежные источники. Тогда обновление будет безмолвным, как в Excel. 
Пить не буду коньяка - читану Питоньяка!

economist

При вставке во Writer DDE-таблиц из Calc - все то же самое, только нужно четко понимать: ненавистные рамки рисует не источник, а сам Writer (как и жирность, выравнивание итп). Все это настраивается в Стилях таблиц Writer, которые легко создать по образцу и править самому.

Стиль запомнит отличия форматов не только всей таблицы, но и ее крайних строк и столбцов, почти все их нюансы, и далее этот стиль легко загрузить в другой файл ODT и применять.

Профит тут вот в чем: исходные таблицы в Excel/Calc могут быть безобразны, с кривыми побитыми рамками, цветами (как любит 1С и как вообще чаще всего в реальности и есть). Главное чтобы сами числа (циферки) внутри ячеек вас устраивали, потому что DDE переносит только видимые цифры и буквы из ячеек, ничего более. Все остальное дает ваш Стиль таблиц во Writer.
Пить не буду коньяка - читану Питоньяка!

bsi

Думаю вопрос можно закрыть. Договор, представленный  sokol92  Bill_of_Sale.odt , имеет вполне законную силу.  Просьба Анюты о копейках цифрами считаю необоснованной. О  правилах  написания суммы договора читаем тут Ответ Алисы.