← В блог
📅 8 июля 2026 ⏱ 5 мин чтения #кейс #автоматизация #документооборот

Как мы автоматизировали 22 вида экспертиз: от обуви до сантехники

Генератор договоров и актов v3.0 — кейс внедрения в экспертной компании

Клиент: АНО «ЛэИ «Центр» — независимая экспертная организация
Штат: до 40 сотрудников, 5 офисов
Проблема: менеджеры тратили до 20 минут на ручное заполнение одного договора
Решение: веб-приложение с автоподбором цен, генерацией .docx и синхронизацией с Яндекс.Диском
Результат: договор за 2 минуты вместо 20

О чём эта статья

Если вы руководитель экспертной компании, юрфирмы или любой организации, где ежедневно оформляются десятки однотипных договоров — этот кейс для вас. Расскажу, как мы превратили бумажный ад в удобное веб-приложение, которое само считает цены, создаёт документы и синхронизирует их с облаком.

Исходная ситуация

Представьте: 10 менеджеров, каждый оформляет до 10 договоров в день. 22 категории товаров — от обуви до сантехники. У каждой — своя сетка цен, свои поля, свои шаблоны.

До автоматизации процесс выглядел так:

  1. Менеджер открывал Excel-прайс, искал нужную категорию
  2. Открывал Word-шаблон, вручную перепечатывал ФИО, даты, артикулы
  3. Вбивал стоимость объекта, открывал калькулятор, считал цену исследования
  4. Сохранял файл с кривым именем в папку «Новые договоры»
  5. Повторял всё то же самое для акта

Одна ошибка в цене — и договор переделывается. Опечатки в ФИО клиента — репутационные риски. Потеря файла — скандал.

Что мы построили

Серверное веб-приложение на Node.js

Мы разработали полноценную систему с веб-интерфейсом, базой данных и интеграцией с Яндекс.Диском. Вот ключевые возможности:

Роли:

Технический стек

БэкендNode.js (ES modules), Express
База данныхSQLite (better-sqlite3)
ФронтендSPA на чистом JS + Bootstrap 5
Генерация документовdocxtemplater + PizZip
АутентификацияJWT + bcrypt
ФотоMulter + getUserMedia
ОблакоЯндекс.Диск REST API + yandisk
Шаблоны.docx с плейсхолдерами {{marka}}, {{model}} и т.д.

Архитектура проекта

src/
├── index.js            — точка входа (Express)
├── db/
│   ├── init.js         — создание БД (7 таблиц)
│   └── seed.js         — начальное наполнение
├── routes/
│   ├── auth.js         — логин/регистрация/смена пароля
│   ├── contracts.js    — CRUD договоров + генерация
│   ├── categories.js   — категории товаров
│   ├── products.js     — услуги с ценами
│   ├── stats.js        — статистика по менеджерам
│   └── yadisk.js       — OAuth для Яндекс.Диска
├── services/
│   ├── generator.js    — генерация .docx
│   ├── pricing.js      — расчёт цен
│   ├── numbering.js    — нумерация Т.XXX.MM-YYYY
│   ├── approve.js      — утверждение и папки
│   └── yadisk.js       — синхронизация с Диском
├── middleware/
│   └── auth.js         — JWT + роли
├── public/             — SPA фронтенд
└── tamplate/           — шаблоны .docx
    

Как это работает (пошагово)

  1. Менеджер заходит в приложение через браузер по адресу http://localhost:3000
  2. Нажимает «➕ Новый», выбирает категорию товара (например, 👞 Обувь)
  3. Заполняет 5 полей атрибутов: Марка, Модель, Артикул, Размер, Описание
  4. Вводит стоимость объекта — цена исследования подбирается автоматически
  5. Заполняет данные клиента, вопросы 13.1.1–13.1.4, согласия
  6. Загружает фото (камера или файлы)
  7. Нажимает «Создать договор» — документ готов
  8. Нажимает «Утвердить» — создаётся локальная папка с файлами
  9. Нажимает «Синхронизировать» — всё улетает на Яндекс.Диск

Всё занимает 2–3 минуты вместо 15–20.

Структура папок на диске

Договоры/
└── Т.001.07-2026 Т ВС/
    ├── Т.001.07 ДЗАС/          ← договор.docx + акт.docx
    ├── Т.001.07 Заключение/     ← пустая (для ручного заполнения)
    └── Т.001.07 Материалы/      ← фотографии товара
    

Что было сложно

1. Разбитые плейсхолдеры в XML

Word хранит текст в XML особым образом: если в слове есть ошибка (подчёркивается красным), Word разбивает его на несколько XML-элементов, вставляя между ними маркеры проверки орфографии. Плейсхолдер {{marka}} мог выглядеть в XML так:

<w:t>{{</w:t>
<w:proofErr/>
<w:t>marka</w:t>
<w:proofErr/>
<w:t>}}</w:t>
    

Библиотека docxtemplater видела {{ в одном элементе и marka в другом — и не могла найти цельный плейсхолдер. Решение: предварительно удалять маркеры проверки орфографии из XML регулярным выражением.

2. Невалидный XML после замены

Первые попытки заменять текст в XML через JavaScript-регулярки ломали документ. Проблема: Word — это ZIP-архив с XML-файлами внутри. Малейшее нарушение структуры XML — и Word отказывается открывать файл без внятной ошибки. Решение: использовать специализированную библиотеку docxtemplater вместо ручного regex.

3. Кодировка путей на Windows

Внутренняя библиотека для Яндекс.Диска использовала path.join() из Node.js. На Windows join ставит обратную косую черту \. Яндекс.Диск таких путей не понимает. Решение: отказаться от библиотеки, написать свою реализацию загрузки с явным указанием разделителя /.

4. OAuth-токен Яндекс.Диска

Яндекс требует авторизацию через OAuth. Без указания scope cloud_api:disk полученный токен не работает с API Диска. Пришлось разобраться с OAuth-флоу Яндекса и добавить правильный scope в URL авторизации.

Результаты

Метрика
До
После
Время на один договор
15–20 минут
2–3 минуты
Ошибки в документах
Регулярно
Исключены
Время на обучение нового сотрудника
Неделя
30 минут
Поиск договора за прошлый месяц
10 минут
2 клика
Синхронизация с облаком
Вручную по email
Одна кнопка

Экономия времени: до 3 часов в день на одного менеджера.
Экономия денег: при средней ставке менеджера 500 руб/час — около 300 000 руб/год на пятерых сотрудников.

Выводы

Автоматизация документооборота — это не про «поменять Word на сайт». Это про то, чтобы сотрудник вообще не думал о форматировании, нумерации и поиске файлов. Система должна быть настолько простой, чтобы новый менеджер начинал работать через 30 минут после знакомства.

Мы справились за 2 недели. Клиент получил работающее приложение, которое:

← В блог 📩 Обсудить свой проект