Проблема ручного заполнения анкет

Для компаний, активно участвующих в тендерах и закупках, процесс заполнения реквизитов в документах заказчиков становится настоящим испытанием:

  • Каждый заказчик предоставляет свой уникальный шаблон;
  • Требуется многократно вводить одни и те же реквизиты;
  • Высокий риск ошибок при ручном вводе;
  • Значительные временные затраты.

Наше решение

Как компания, специализирующаяся на разработке программного обеспечения, мы создали простое, но эффективное решение для автоматизации этого процесса с помощью макроса для OpenOffice Writer.

Техническое задание (ТЗ) для макроса OpenOffice Writer

1. Назначение

Макрос предназначен для автоматического добавления реквизитов компании к определенным текстовым фрагментам в документе OpenOffice Writer.

2. Требования к функционалу

  • Поиск и добавление текста:
    • Поиск заданных фраз в документе (без учета регистра);
    • Добавление соответствующего текста после найденных фраз;
    • Добавление должно выполняться только один раз для каждой строки/абзаца.
  • Условия поиска:
    • Искомый текст должен находиться в начале строки/абзаца;
    • Поиск должен быть регистронезависимым.
  • Обработка документа:
    • Каждая строка/абзац должна обрабатываться только один раз;
    • При обнаружении совпадения по одному из условий, другие условия для этой строки не проверяются.

3. Список замен

Искомый текст Добавляемый текст
"Полное наименование с указанием организационно-правовой формы" "Общество с ограниченной ответственностью «БиномТех»"
"Наименование" "Общество с ограниченной ответственностью «БиномТех»"
"Контрагент" "Общество с ограниченной ответственностью «БиномТех»"
"ОГРН/ОГРНИП" "1156658070975"
"ОГРН" "1156658070975"
"ИНН" "6671023261"
"Телефон" "83433824436 84952466088"

4. Особые условия

  • Добавление текста должно происходить:
    • Только если искомый текст находится в самом начале строки/абзаца;
    • Только один раз для каждой строки/абзаца;
    • В конец строки/абзаца (а не непосредственно после найденного текста).
  • Макрос не должен:
    • Добавлять текст повторно в уже обработанные строки;
    • Обрабатывать строки, где искомый текст находится в середине или конце.

5. Требования к реализации

  • Использование стандартного API OpenOffice;
  • Поддержка OpenOffice Writer;
  • Обработка всего документа;
  • Учет возможных ошибок при выполнении.

6. Примеры работы

Корректное срабатывание:
Было: "ОГРН/ОГРНИП _____"
Стало: "ОГРН/ОГРНИП _____ 1156658070975"

Некорректное срабатывание (не должно происходить):
Было: "Приложение № 3 к Регламенту..."
Стало: Без изменений (текст не в начале строки)

Недопустимое поведение:
Было: "ОГРН/ОГРНИП _____"
Стало: "ОГРН/ОГРНИП _____ 1156658070975 1156658070975" (повторное добавление)

7. Дополнительные требования

  • Возможность простого добавления новых пар "искомый текст → добавляемый текст" без изменения кода;
  • Информационное сообщение по завершении работы;
  • Устойчивость к ошибкам (не должно быть "падений" макроса).

8. Ожидаемый результат

Макрос, который:

  1. Находит все вхождения заданных фраз в начале строк/абзацев;
  2. Добавляет соответствующий текст в конец этих строк/абзацев;
  3. Гарантирует однократную обработку каждой строки;
  4. Корректно работает с документами любого объема;
  5. Прост в поддержке и расширении.

Как использовать макрос

1. Подготовка

  1. Убедитесь, что у вас установлен OpenOffice или LibreOffice;
  2. Откройте документ с анкетой заказчика в Writer.

2. Установка макроса

  1. Нажмите Alt + F11 чтобы открыть редактор макросов;
  2. В дереве слева выберите "Мои макросы" > "Standard" > "Module1";
  3. Вставьте код макроса (приведен ниже);
  4. Сохраните изменения.

3. Запуск макроса

  1. В открытом документе перейдите в меню Инструменты > Макросы > Выполнить макрос...;
  2. Выберите созданный макрос AppendCompanyInfoStrict;
  3. Нажмите "Выполнить".

4. Результат

  • Макрос автоматически найдет все указанные реквизиты в начале строк;
  • Добавит соответствующие значения в конец этих строк;
  • Покажет сообщение об успешном завершении.

Код макроса

Sub AppendCompanyInfoStrict()
    Dim oDoc As Object, oSearch As Object, oFound As Object
    Dim aSearchPairs() As String
    Dim i As Integer, aPair() As String
   
    ' Все пары поиска-добавления в одной строке
    Dim sPairs As String
    sPairs = "Полное наименование с указанием организационно-правовой формы|Общество с ограниченной ответственностью «БиномТех»;"
    sPairs = sPairs & "Наименование|Общество с ограниченной ответственностью «БиномТех»;"
    sPairs = sPairs & "Контрагент|Общество с ограниченной ответственностью «БиномТех»;"
    sPairs = sPairs & "ОГРН/ОГРНИП|1156658070975;"
    sPairs = sPairs & "ОГРН|1156658070975;"
    sPairs = sPairs & "ИНН|6671023261;"
    sPairs = sPairs & "Телефон|83433824436 84952466088"
   
    ' Разбиваем строку на массив
    aSearchPairs = Split(sPairs, ";")
   
    oDoc = ThisComponent
    oSearch = oDoc.createSearchDescriptor()
    oSearch.SearchCaseSensitive = False
   
    ' Создаем коллекцию для хранения обработанных абзацев
    Dim aProcessedParagraphs As Object
    Set aProcessedParagraphs = CreateObject("Scripting.Dictionary")
   
    ' Получаем все текстовые элементы документа
    Dim oTextElements As Object, oElement As Object
    oTextElements = oDoc.getText().createEnumeration()
   
    While oTextElements.hasMoreElements()
        Set oElement = oTextElements.nextElement()
       
        ' Работаем только с абзацами
        If oElement.supportsService("com.sun.star.text.Paragraph") Then
            Dim oText As Object, oCursor As Object
            Dim sParaText As String
           
            oText = oElement.getText()
            Set oCursor = oText.createTextCursorByRange(oElement)
            sParaText = oCursor.getString()
           
            ' Пропускаем уже обработанные абзацы
            If Not aProcessedParagraphs.Exists(sParaText) Then
                ' Проверяем каждый поисковый шаблон
                For i = 0 To UBound(aSearchPairs)
                    aPair = Split(aSearchPairs(i), "|")
                    If UBound(aPair) = 1 Then
                        Dim sSearch As String, sAdd As String
                        sSearch = Trim(aPair(0))
                        sAdd = Trim(aPair(1))
                       
                        ' Проверяем, начинается ли абзац с искомого текста
                        If StrComp(Left(sParaText, Len(sSearch)), sSearch, vbTextCompare) = 0 Then
                            ' Добавляем текст в конец абзаца
                            oCursor.gotoEndOfParagraph(False)
                            oCursor.String = " " & sAdd
                           
                            ' Помечаем абзац как обработанный
                            aProcessedParagraphs.Add oCursor.getString(), True
                            Exit For ' Прекращаем проверку других шаблонов
                        End If
                    End If
                Next i
            End If
        End If
    Wend
   
    MsgBox "Данные успешно добавлены!", 0, "Готово"
End Sub

Преимущества нашего решения

  1. Экономия времени - обработка документа за секунды;
  2. Точность - исключение человеческих ошибок;
  3. Гибкость - легко добавлять новые реквизиты;
  4. Универсальность - работает с любыми шаблонами заказчиков;
  5. Бесплатность - используем стандартные средства OpenOffice.

Как мы создавали решение

С помощью чата с искусственным интеллектом мы:

  1. Сформулировали задачу;
  2. Получили первоначальную версию кода;
  3. Постепенно уточняли требования;
  4. Исправляли возникающие ошибки;
  5. Оптимизировали работу макроса.

Весь процесс занял значительно меньше времени, чем самостоятельная разработка "с нуля".

Дальнейшее развитие

Вы можете:

  1. Добавлять новые пары реквизитов в макрос;
  2. Адаптировать его под свои нужды;
  3. Создавать специализированные версии для разных типов документов.

Это решение - пример того, как даже сложные рутинные задачи можно эффективно автоматизировать с помощью современных инструментов и искусственного интеллекта.

Оставить заявку на разработку макроса можно на форме обратной связи.