Как мы создали универсальную систему управления бизнесом
ПредисловиеДля тех, кто сталкивался с вопросом организации работы фирмы из более чем пары офисов и десятка сотрудников, не секрет, что готовые решения для контроля бизнеса создают огромное количество головной боли как сисадминам, так и владельцам.
Будь то 1С, Битрикс, Мегаплан или тем более самостоятельные решения — они требуют установки специфического софта, налаживания удаленного доступа к серверу через VPN или другие решения, не работают с плохими каналами связи — какие часто встречаются в торговых центрах или удаленных офисах, и уж точно требуют недюжинного умения работников для доступа из дома или командировки.
Отдельно можно сказать о производительности: для меня, как разработчика высоконагруженных систем БД, всегда было странным формирование отчетов не за секунды, а десятками минут, проведение документов занимающее в 1С минуты, и вообще постоянно требующие обновления железа новые версии тех же систем, с баснословными требованиями к серверам. Очевидно было, что такие простейшие операции как посчитать остатки на складе за весь период работы из миллиона документов даже в MySQL займут секунды…
Постановка вопроса
В общем, когда передо мной встала задача поставить систему учета на 5 удаленных магазинов, склад и офис, варианты готовых решений выглядели бледновато. После мыслей об обучении продавцов (хороших продавцов, но не пользователей компьютера) — первый раз видевших мышку, как пользоваться 1С и бесконечных поездках для настройки сети, стало понятно что это не наш вариант…
Хотелось следующего: • Полностью удаленное пользование с любой операционной системы, с планшета, смартфона• Нетребовательность к качеству канала связи• Дружелюбный интерфейс и юзабилити• Скорость — любые отчеты и документы в течение секунды• Возможность встраивания продвинутой аналитики
Понятно, что одним из решений, чтобы не изобретать велосипед с нуля, было сделать online систему базирующуюся на наших же серверах, работающую на максимально простых механизмах и структурах. Бесконечные таблицы, описывающие номенклатуру, тоже казались избыточными — десяток полей с табличкой названий для каждого параметра до сих пор работает отлично.Разработка
Мощностей на серверах хватало, поэтому за три вечера на первом бутстрапе, PHP и MySQL был создан опытный образец который умел вести номенклатуру, считать остатки на складах и имел простейшие документы первичной бухгалтерии с печатными формами.
Конечно, самое интересное было в процессе проведения документов — на нем базируется вся бухгалтерия. Поскольку, за исключением косметических отличий, любой документ перемещает товар со склада источника на склад приемник (в каких то случаях это не совсем склад, но структура данных не меняется), то достаточно было создать структуру удобную для пересчета и хранения таких единичных перемещений.
Для непосвященных, вкратце, проведение документов — это такой процесс, в котором проверяется есть ли нужное количество товара или услуги на соответствующем складе, и собственно вычитает товар или услуги с одного, и зачисляет на другой. В процессе хорошо бы проверить резервы товара, чтобы случайно не списать зарезервированный, корректность цен, права пользователей на данные операции, кредитный лимит клиента и тд… Когда это сформулировано таким образом и есть хорошая структура данных, то остается лишь дело техники.Другая связанная задача, это как высчитать состояние складов в произвольный момент времени. Посидев над картинками промежуточных индексов, я просто прикинул, сколько операций будет необходимо, чтобы каждый раз считать все с нуля? — и вуаля, три запроса к базе данных решают эту проблему. По сути, дешевле каждый раз считать все товары и склады заново, чем хранить бесконечные индексы, которые регулярно устаревают и все равно не отвечают требованиям актуальности…
Так что каждый раз, когда мы проводим документ, мы просто берем все остатки указанных в документе товаров, считаем их с нуля, и если все OK, то делаем саму операцию списания-зачисления. Как понятно, выборка по обычному количеству в 10–20 товаров из правильно структурированной таблицы даже из сотен тысяч строк — дело долей секунды. До сих пор даже на высоконагруженных применениях это работает отлично.
В дальнейшем мы научили систему учитывать в этом процессе партии (когда и как был поставлен данный товар, чтобы точно вычислять маржу по сделке, а не в среднем по больнице), разные типы цен и дополнительную информацию типа ГТД.
Все эти размышления, кстати, убили во мне всю последнюю веру в решения типа 1С. Если база данных устроена хотя бы просто «подходяще», то все данные по фирме можно пересчитывать в секунды. Подчеркиваю ВСЕ, и сразу одновременно. Чем занимается этот монстр при перепроведении документов или формировании отчетов вообще неясно. Даже сильно медленный PHP скрипт, без php-cgi, простая MySQL без оптимизации под конкретную БД и загруженная другими проектами под завязку обсчитывали складские остатки «с нуля», без промежуточных данных за 3 года работы в течение долей секунды.
Та же задача, на 1С, на той же фирме, за те же 3 года занимала 15–20 минут, хотя в базе было всего несколько тысяч документов по 5–10 товаров в каждом…30 тысяч записей за 15 минут… Кому-то, наверное, это кажется быстрым.
Внедрение
Процесс внедрения оказался прост, и после обучения пользованию mail.ru он прошел незаметно. Даже продавцы в возрасте, за неделю, уже могли бодро смотреть остатки по складам, оформлять продажи, контролировать соответствие товара фактическому наличию. Первый месяц выявил достаточно много потребностей: необходимые отчеты были дописаны, документы сильно расширены, ввели множество различий в правах доступа.Самое главное — любые отчеты формировались за доли секунды, и сидя в метро в другом городе или за рулем в машине я открывал отчет со смартфона с диагональю 3,5» (да, на тот момент это был нормальный экран) и видел все цифры по бизнесу, которые меня интересовали.
В результате получилась система, которая полностью находилась на наших серверах, имела бекап раз в два часа, продвинутый контроль доступа и логирование. Система была доступна через любой браузер с iPhone, смартфона или планшета под Android, работала под Opera, Firefox, Chrome одинаково. В практически неизменном виде она проработала несколько лет.
Мы могли открывать доступ к выбранным складам нашим отдельным контрагентам и дилерам, все необходимые бухгалтерские отчеты получать на лету, магазинам было достаточно дешевого 3G интернета, а главный бухгалтер выгружал данные одним кликом в свою версию 1С для своей работы.
Партнеры
Довольно быстро наши партнеры и знакомые стали подхватывать идею, но до первого крупного коммерческого внедрения прошел солидный срок. Шанс по-настоящему проверить систему на надежность на критических задачах представился в лице крупной компании по продаже запчастей, имеющей большое число филиалов в разных городах и сложную номенклатуру в сотни тысяч связанных позиций. Готовых решений в этой области нельзя было и представить, поэтому всю деятельность вели на самописных решениях, которые были далеки от идеала. Отчеты как класс отсутствовали вообще, база данных была очень запутанной…
Пропуская лирику, на перевод всех филиалов на нашу систему ушло меньше 3 месяцев вместе с обучением, импортированием данных, правами доступа и подстраиванием бизнес-модели. Годы были потрачены на разработку решений, которые не давали результата, месяцы на внедрение у нас вместе с разработкой аналитики специфической под конкретные задачи компании.
Под запросы партнеров мы встроили сначала CRM модуль, чуть позже постановку и контроль задач с делегированием. Для управленческой работы — возможности анализа и планирования логистики с контролем стоимости; для руководства — бюджетное планирование, и мощные аналитические отчеты, на составление которых вручную уходили недели.
На данный момент 300 тысяч позиций на складах, номенклатурный справочник более 100 тысяч наименований, в привязке к каталогам и прайсам, сотни новых документов в день не представляют для нас сложности в обработке.
Сейчас система находится по адресу bmsys.org — там же можно прочитать про список возможностей и модулей работающих на данный момент.