Бережливе виробництво в рекламному агентстві: роботизируем повсякденну рутинну роботу співробітників за допомогою AutoIt

image

Все почалося з завдання створення звіту по взаєморозрахунках з клієнтами і постачальниками. Маячила перспектива збирати дані руками. Цілий відділ з 7 дівчаток не знав, як підступитися до цього, враховуючи, що база складалася більш ніж з 180 тис. рядків і велася в MS Access.

Про що мова
В одному великому рекламному агентстві є «зоопарк». У сенсі «зоопарк» різних інформаційних систем, які створювались роками силами самих співробітників, які намагалися хоч якось автоматизувати ручну роботу. У цій статті мова піде про автоматизації роботи відділу контролю медиазакупок (скорочено «КЗ»). Це такий підрозділ, який контролює майданчику скільки заплачено грошей і немає переплат/недоплат. Важливі люди для бізнесу, простіше кажучи. Так склалося, що в цьому відділі з 2010 року ведеться своя база цих транзакцій, закривають документів, контрактів. Базу створював просунутий менеджер, тому вона спочатку створювалася на Access 2007, з купою макросів, але без форм. Зберігання даних зрозуміло в самому файлі бази.

Все почалося з завдання, яку бухгалтерія поставила КЗ: вивантажити інформацію по всім закриває документів у межах певного періоду. Грубо кажучи, потрібна була табличка з 20 колонок в числі яких були номер і дата контракту з постачальником, статус оплат за проектом, наявність актів тощо. Пересічний звіт, який міг перетворити на пекло життя 7 співробітниць відділу КЗ. А вся справа в тому, що при спробі завантажити потрібну інформацію база безнадійно вісла. Таблички Access були не розраховані на висновок десятків тисяч записів. Движок не припускав запити з десятком LEFT JOIN. Індекси не допомагали. Керівник відділу щодня приходила на роботу, відкривала базу і не могла навіть підступитися до ручного відома таблички з пари десятків тисяч рядків. Бухгалтерія, між тим, поставила досить жорсткий дедлайн і чекала даних. Співробітниці, кинувши дітей і чоловіків, готувалися ночувати в офісі.

Lean
Після такого безрадісного введення, давайте поговоримо трохи про теорію і управлінні. Отже, рекламне агентство продає сервіс. Не рекламу. Реклама — це лише предмет для розмови, те що ми вміємо робити добре. Але платять нам за те, що ми швидко і в рамках комісії зробимо за клієнта всю брудну роботу, і навіть краще, ніж він очікує. Клієнт чекає від нас також раціональних пропозицій з удосконаленням своїх кампаній, за оптимальним способам досягнення своїх показників. Тих показників, якими він сам звітує своєму керівництву. Само собою зрозуміло, що клієнт очікує ідеальний документообіг, бездоганні закриття і феноменальну точність дотримання дедлайнів за ним. Повертаючись до нашим дівчаткам, я досі не розумію, як вони за допомогою звичайної бази на звичайному аксессе все це забезпечували. Але суть не в цьому. Коротше кажучи, для якісного сервісу потрібно час. І тут ми трохи торкнемося концепції бережливого виробництва, оскільки воно на практиці має пряме відношення до аналізованій тут завданню.

Бережливе виробництво (по-англійськи «lean»), якщо говорити простими словами, це такий спосіб виробництва продукту, при якому частка втрат прагне до нуля. Ця концепція є творчою переробкою досвіду компанії Toyota. Основна ідея, у виявленні втрат за типовим напрямами начебто бракованої продукції, невиправдані затримки на складах, надлишкової обробки, простоях, усушці/утруска і так далі. За даними деяких джерел, економія від впровадження концепції lean на великих підприємствах, обчислюється мільярдами карбованців. Ви мене запитаєте, яке це має відношення до сервісної компанії, такий як рекламне агентство? Саме пряме.

Ми продаємо сервіс. Для якісного сервісу потрібно час. Час і люди – ось наш ресурс. А якщо люди цілодобово сидять і копіпастять в эксельках, то це втрати. Втрати часу і, з часом, – людей. Неефективність виробництва сервісу, якщо хочете. Обчислюється методом множення погодинної ставки окладу на кількість надміру витрачених годин. Припустимо співробітник відділу контролю закупівель отримує умовних 40 тисяч рублів на місяць через 160 годин роботи. Або 250 рублів у годину. Вона замість того, щоб натиснути на одну кнопочку і отримати потрібний звіт за 1 хвилину, копипастит протягом пари тижнів. Причому не одна співробітниця, а весь відділ: 250 (ставка) x 8 (годин в день) x 10 (робочих днів) x 7 (дівчаток). Отримуємо 140 тисяч рублів, витрачених на копіпаст. Втрати для якісного сервісу взагалі важко порахувати, тому, що, коли збирається звіт методом копіпаста, інша робота або стоїть, або робиться незрозуміло як.

Половинчасте рішення, що прискорює ручну роботу
Давайте перейдемо від теорії до практики. Отже, є не здійсненне стандартними засобами завдання: вивантажити звіт. Крім того, у перспективі є необхідність поставити процес створення звіту на потік, причому бажано силами самого відділу контролю закупівель. Нижче опис рішення, однак, не хотілося б, щоб воно було сприйняте як готовий рецепт з «Тостера», але швидше як концепцію для роботи з усіма подібними завданнями. Навіть більше. В ідеалі, треба було б проаналізувати всі процеси компанії та виявити етапи, які можна автоматизувати за зразком, запропонованим нижче.

Для вирішення зазначених вище задач нам потрібні: MS SQL Server 2012 Express, AutoIt, PowerQuery.

Оскільки Access не дозволяє робити складні запити з таблиць, що містять сотні тисяч рядків, було прийнято рішення скористатися важкою артилерією, а саме MS SQL Server 2012 Express. Установка бази описана досить докладно вендором, тому не буду на цьому зупинятися. З Access експортували вручну відповідні таблиці (в яких дані для звіту) через попередньо створене з'єднання ODBC:


Далі повісили індекси на всі експортовані нами таблиці, що дозволило збільшити швидкість відробітку запиту в 4-6 разів:


Далі написали багаторядковий запит з купою LEFT JOIN GROUP BY та WHERE. Деталі його тут приводити не буду, але вони і не значущі. Важливий принцип. Після відпрацювання запиту робимо Ctrl+a (виділити всі результати). Далі йдемо в заздалегідь підготовлену эксельку і вставляємо туди дані Ctrl+v). Наводимо в порядок формати, зберігаємо, відправляємо в бухгалтерію Процес зайняв не два тижні, а 10 хвилин. Але одні проблема: виконати його під силу тільки дуже добре прокаченному фахівця. І будь-які проблеми (наприклад, помилка експорту таблиці з-за дати в неправильному форматі) перетворюються в ті танці з бубном (будь-які помилки формату вирішуються через експорт в Excel та імпорт його вже в MS SQL). Одним словом, ці милиці було необхідно автоматизувати.

Правильне рішення з допомогою AutoIt
І тут на сцену виходить всесильний AutoIt. Це вкрай потенційна річ, якщо в компанії працюють хоча б десятки співробітників. Є ряд дій, які виконує певний відсоток людей: відкрити таймшиту вчасно, запустити середовище розробки/налагодження (IDE+базу+вікно з git+зробити бекап), відкрити систему обліку за потрібною списком проектів і тому подібні дрібниці, які начебто незначні, але від'їдає десятки хвилин робочого часу сотень людей. В сумі це виходить гігантська марна робота, яку цілком можна доручити програмного роботу. Але повернемось до нашого завдання.

Отже, необхідно автоматизувати описаний вище процес, причому дій повинно бути лише два: запуск процесу, отримання готового звіту. Можна було б написати якусь прогу, яка підключається спочатку Access, вивантажує з нього дані, потім заливає їх в MS SQL і запускає потрібний запит, результати якого потім вивантажує у списку Excel. На це пішли б тижня розробки, лову помилок. Було вирішено скористатися готовою інфраструктурою додатків, якою буде керувати скрипт на AutoIt. Вивантаження готового звіту доручили PowerQuery, оскільки він заточений під такі завдання.

Для того, щоб всі відпрацювало, необхідно було заздалегідь зробити у вихідному файлі Access макрос, який експортує дані в MS SQL:

Public Function TransferKz()
'Макрос експортує таблиці в локальну базу MSSQL
'Для вивантаження звіту
Dim Tables(1 To 11) As String
Dim i As Integer

Tables(1) = "table1"
Tables(2) = " table2"
Tables(3) = " table3"
'...

For i = 1 To 11
DoCmd.TransferDatabase acExport, "ODBC Database", "ODBC;DSN=kz;", acTable, Tables(i), Tables(i)
Next i
MsgBox "Tables exported"
End Function


Крім того, заздалегідь підготовлений файл Excel, який містить модель PowerQuery, выгружающую необхідні дані з бази. Тут дана модель розглядатися не буде. Але ознайомитися з принципами роботи PowerQuery можна тут і тут.

При запуску скриптів AutoIt відбувається наступне:

  1. Висвічується віконце з попередженням про те, що під час роботи скрипта не можна чіпати клавіатуру і мишку:

    MsgBox(0, «Ми починаємо», «Під час роботи скрипта можна натискати ніякі кнопки і відкривати вікна. Краще просто відійти від комп'ютера на 1-2 хвилини».

  2. Копіюється файл MS Access, що містить потрібні нам дані:

    FileCopy($file_path_from, $file_path_to, $FC_OVERWRITE + $FC_CREATEPATH)
    

  3. Запускається MS SQL Management Studio:

    Run($ssms_path)
    WinWaitActive("З'єднання з сервером")
    Send($sql_server_address & "{ENTER}")
    WinWaitActive("Microsoft SQL Server Management Studio")
    

  4. Видаляються всі таблиці в базі КЗ. $small_sleep – змінна що містить час паузи перед командами. Необхідно т. к. в іншому випадку додатки іноді не встигають остаточно відпрацювати команду перед запуском наступного:

    Send("^{o}")
    Sleep($small_sleep)
    Send($sql_dir & $sql_file_Query_drop_tables)
    Sleep($small_sleep)
    Send("{ENTER}")
    Sleep($small_sleep)
    Send("{F5}")
    Sleep($small_sleep)
    ;Закриття вікна без збереження
    Send("^{F4}{TAB}{ENTER}")
    

  5. Запускається файл Access отриманий в ході кроку №2:

    ;Запускаємо базу Access і відразу ж макрос для експорту таблиць
    Run( $db_path & " /x TransferKz" )
    ;Чекаємо вікно: «Tables exported»
    WinWaitActive("[CLASS:#32770]")
    ;Закриваємо вікно Access
    Send("!+{F4}",0)
    

  6. Створюємо індекси на тільки що експортовані таблиці:

    ;Відкриваємо вікно з скриптом, який належить запускати
    WinActivate("Solution1 - Microsoft SQL Server Management Studio")
    Send("^{o}")
    Sleep($small_sleep)
    Send($sql_file_indexes)
    Sleep($small_sleep)
    Send("{ENTER}")
    Sleep($small_sleep)
    Send("{F5}")
    Sleep($small_sleep)
    ;Закриваємо вікно ms sql Management Studio
    Send("!+{F4}",0)
    

  7. Запускається Excel містить необхідну нам модель вивантаження даних з MS SQl:

    ShellExecute($file_ excel)
Робота скрипта AutoIt закінчена. Тепер необхідно просто натиснути на кнопку «Оновити» у відкритому файлі Excel і дочекатися отримання необхідного звіту. Час відпрацювання скрипта від клацання мишкою до вивантаження звіту – 3,5 хвилини з яких 2 це паузи між кроками.

Висновки
Як побіжно згадано вище, ми опрацьовували питання вирішення проблеми наступними способами: радикально переписавши базу відділу контролю закупівель практично з нуля, або перемістивши таблиці в MS SQL і продовживши використовувати MS Access в якості «фронтенду». Основна перешкода для реалізації цих планів – час. Так, можна зробити базу на 1С, витративши на це два-три місяці, гроші на розробника. 1С не підходить для цілісного вирішення обліку і документообігу в нашому агентстві. Була обрана інша система, тому так чи інакше нам доведеться незабаром перетворюватися все з нуля вже на новій платформі. Реалізація вказаного вище набору методів зайняла 3 дні. 2 з яких були витрачені на тестування вже працюючої системи і налагодження запиту в MS SQL. Жоден професійний розробник не доклав руку до зазначеного вище кодом. Все робилося своїми силами, у вільний від решти проектів час. Компанія залишилася при своїх грошах. Час збережено на щось більш корисне, ніж копіпаст. Бережливе виробництво в дії.
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.