Всем привет! Хочу развенчать миф, что в производственных компаниях решение любого вопроса сопряжено с мириадами бумажек, беготней по отделу кадров, и прочими малоприятными вещами. Расскажу о корпоративном портале НЛМК, который для всех нас – сотрудников офиса и производства – единое цифровое окно. Тут все могут решить самые разные вопросы и получить оперативную информацию.

Я как раз стоял у истоков создания портала и участвовал/участвую во всех его жизненных циклах — от идеи и заканчивая принятием на поддержку с дальнейшим развитием. О причинах выбора платформы Битрикс, и неких других технических тонкостях – расскажу под катом.

Понятно, что портал – в первую очередь про почитать - новости, блоги, сообщества, мероприятия, акции и т.д. Но в нашем случае это не всё. Тут собрано более 80 разных сервисов: от заказать кадровую справочку, перенести отпуск и прочее кадровое, выйти в корп. облако и на разные обменные ресурсы, до отправить посылку, заказать услуги переводчика, ну и, конечно, охрана труда и безопасность.

В отличие от многих компаний, в НЛМК доступ к порталу есть не только у офисных сотрудников, находящихся в домене компании, но и у рабочих на производстве. Для этого мы развернули собственную инсталляцию системы аутентификации Blitz IDP – (через неё, например, осуществляется доступ в Госуслуги). Так что воспользоваться порталом можно и без доступа во внутреннюю корпоративную сеть. Но не буду забегать вперед, сначала расскажу историю разработки.

История создания портала

В 2017 году мы начали делать новую версию портала. Краеугольный камень решения – вовлечь в процесс каждого сотрудника НЛМК, от цеха до офиса. Притом в расчет брались и российские точки присутствия, и зарубежные. Это задача не из легких: в компании работает порядка 70 тысяч сотрудников. Так что де-факто мы развернули крупную инсталляцию Битрикс (мы полагаем, что наш портал может претендовать на звание самой крупной инсталляции Битрикс в мире, но это не точно) и построили единое медийное и сервисное пространство для всех.

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

Во-первых, Sharepoint работал только для офисных сотрудников – а это порядка 30-40% всего кадрового состава НЛМК. Изучив рынок, мы пришли к выводу, что самым оптимальным вариантом (с точки зрения функциональности, цены и качества) окажется Битрикс. Почему именно он?

Критерии выбора платформы:

  • Надежность. Несколько лет назад компания запустила «семейство внешних сайтов» на платформе «1С-Битрикс». Решение прошло проверку временем.

  • Доступность. Важным фактором стала стоимость лицензии и внедрения. Она ниже, чем у западных вендоров. В России масса интеграторов и самостоятельных программистов с опытом разработки на платформе «Битрикс24», а зарубежные решения поддерживать, зачастую, дороже.

  • Возможности платформы:

    • Масштабируемость. Благодаря встроенным возможностям кластеризации и балансировки нагрузки портал «разворачивается» на офисы по всей стране и выдерживает высокие нагрузки

    • Адаптивность. Интранет открывается с любых устройств

    • Гибкость. Архитектура продукта позволяет постоянно добавлять в программный код новые функции.

А еще Битрикс – это российское решение. Конечно, на момент создания этот фактор мы не учитывали, но тем не менее рады, что сейчас наш портал работает именно на базе отечественной разработки. В нынешних реалиях это весомый плюс.

Кто и как использует портал НЛМК

Что касается офисных сотрудников – здесь и так всё понятно. Они получили привычный инструментарий, пусть и существенно расширенный. Но всё самое интересное происходило на стороне рабочих цехов: для них фактически открылся целый новый мир.

Через портал можно решить все кадровые вопросы, забронировать командировку, заполнить отпуск, получить справку 2-НДФЛ. Больше не нужно ходить с бумажками к руководителю: на портале ему видны все сотрудники, а согласования «прилетают» автоматически. Если человеку нужно перенести отпуск или взять отгул на следующей неделе, это всего несколько кликов. Можно изучить расчетный лист за месяц/год (сколько и за что было начислено) – компания становится прозрачнее и доступнее для всех сотрудников. Из прочих сервисов можно отметить заказ встречи делегаций, корпоративную почту DHL, сервисы перевода, юридическую поддержку и даже заказ средств индивидуальной защиты.

 Функциональность десктопной версии корпоративного портала НЛМК
Функциональность десктопной версии корпоративного портала НЛМК

Наш портал превосходно закрывает задачи, касающиеся общения, как на уровне «компания-сотрудники», так и на уровне «сотрудник-сотрудник».

У людей есть возможность мгновенно получить важные новости: выплаты, ковидные меры, пункты сдачи тестов. Конкурсы внутри компании (например, «Лучший сотрудник»), значимые события (назначения, ответы на вопросы). По ряду направлений организованы отдельные сообщества – например, у каждого цеха есть своя «группа» для обмена информацией. Там публикуются важные орг. документы – графики работы, движение транспорта, маршруты между субъектами компании (внутри комбината реализована собственная транспортная служба со своим расписанием и остановками).

Что касается непосредственно контента – у нас есть возможность гибко подавать новости целевой аудитории. Можно настраивать фильтры на конкретный регион или, допустим, только на офисных сотрудников. При этом люди имеют возможность подписываться на конкретные рубрики и искать информацию – по новостям, по автору публикации, по упоминаниям. Личные профили тесно интегрированы со сторонними системами (Outlook, Skype for Business). Стоит загрузить аватар, и он обновится везде.

Есть функционал блогов. У нас максимально свободный подход к тому, что пишут и публикуют сотрудники. Блоги практически не модерируются (за исключением случаев, когда контент противоречит законодательству), и сами модераторы преимущественно заняты сбором обратной связи. Преданные пользователи портала тестируют его новые функции — мы ничего не выпускаем без теста. Как только все баги устранены – можно выкатывать обновление для всех.

Пользователям доступны также закрытые сообщества – для общения на внутренние темы. А все изменения, новости, доступ к любой информации — через портал. Можно комментировать, лайкать, репостить.

Кроме того, не стоит забывать, что Битрикс — это решение с рядом административных интерфейсов. Он позволяет реализовывать различные бизнес-процессы, функции, сервисы и при этом неплохо защищен и умеет перехватывать атаки.

Портал НЛМК интегрирован со многими внешними системами: SAP-приложения, ITSM-системы, Blitz, Sharepoint (да, у нас все еще есть сервисы, которые не мигрировали на новый портал). Также это мастер-система в части мобильного приложения, профиля — для Skype, Exchange и т.п.

Что касается непосредственно рабочих задач – у многих отделов, в частности, у ОТПБ (охрана труда и пожарной безопасности) внедрен собственный KPI. Например, карта выявления опасностей. Заявку можно оставить если, к примеру, сломался забор: сотрудники ОТПБ должны обработать задачу и решить ее в кратчайшие сроки.

Также популярен расчетный лист — все любят посмотреть, сколько им пришло зарплаты, за что начислены средства. В НЛМК есть много социальных программ — например, система дотационного питания. За небольшую сумму можно на льготных условиях получать комплексные обеды. В Sharepoint этого функционала в принципе не было.

Наши собственные разработки

Несмотря на то, что Битрикс «из коробки» оснащен богатым набором возможностей, кое-что мы доделывали самостоятельно, в том числе и при поддержке вендора.

Защита от хищных роботов и несанкционированного доступа

Для работы с порталом необходимо авторизоваться, но это правило распространяется на исполняемые файлы, но не статику, которую можно заполучить, для этого достаточно знать путь к файлу (рассматриваю «типовую» настройку LEMP стека необходимую для запуска web приложения). Как защитить от лишних глаз важные документы, видео и изображения, которые должны быть доступны только сотрудникам группы компаний НЛМК? Для того, чтобы лица, не прошедшие процесс аутентификации или идентификации, не могли получить доступ к этим данным, мы реализовали дополнительную авторизацию для статичных файлов.

Дополнительная авторизация происходит автоматически на стороне бэкенда. После идентификации пользователя на портале ему посылается cookie с проверочной информацией. Проверочная информация преобразуется/шифруется для обеспечения ее безопасности. Ключ для шифрования хранится в отдельном хранилище за пределами корневой папки сайта (DOCUMENT_ROOT).

Cookie устанавливается на время жизни текущей сессии пользователя. У cookie выставляется признак HttpOnly, благодаря чему они не могут быть изменены браузерным кодом и будут отправляться только на сервер.

При попытке доступа к информации по прямой ссылке у пользователя проверяется наличие cookie и соответствие дешифрованного сообщения исходному. Если условия будут истинными, то пользователь получит запрашиваемую информацию. В противном случае вернется ошибка или произойдет редирект на систему аутентификации.

Блок схема алгоритма работы дополнительной авторизации:

Офис внутри портала

Мы продолжаем использовать Sharepoint, так как он хорошо работает с документами Word, Excel — онлайн-просмотр, редактирование. С этой системой портал интегрирован через протокол WOPI.

Office Web Apps Server (далее OWA) – веб-версия популярного офисного пакета приложений, включает в себя облегченные браузерные приложения Word, Excel, PowerPoint и OneNote.

OWA ставится на отдельный физический сервер и отвечает только за отображение документов в браузере. Вся логика по организации хранения файлов ложится на WOPI-host.

Взаимодействие между OWA и хранилищем происходит через WOPI API, который необходимо реализовать.

Схема взаимодействия

В схеме взаимодействия представлены три участника:

  • Браузер — фронтенд выполнение JS скриптов;

  • WOPI-host — бэкенд реакция на ajax запросы браузера и API запросы WOPI-client;

  • WOPI-client — запрос информации о файле и формирование страницы просмотра документа.

Рассмотрим подробно схему взаимодействия:

  1. При клике в браузере на элементе, вызывающем просмотр документов, управление передается JS-компоненту, который выполняет ajax-запрос к зарегистрированному BX.ajax.runAction методу, где в одном из параметров передается FILE_ID просматриваемого документа.

  2. В ответ сервер возвращает сформированную особым образом ссылку для передачи управления на WOPI-client.

  3. В зависимости от настроек JS-компонент открывает полученную ссылку либо в Side Panel, либо в новом окне.

  4. WOPI-client начинает процесс формирования страницы просмотра и первым действием посылает запрос к WOPI-host на получение информации о файле (имя файла, размер, ...).

  5. Запрос обрабатывается в REST-методе и при положительном результате формируется ответ в формате JSON с информацией о файле для WOPI-client.

  6. WOPI-client посылает второй запрос к WOPI-host на получение самого файла.

  7. Запрос обрабатывается в REST-методе и при положительном результате формируется ответ с бинарным содержимым файла.

  8. WOPI-client получив всю необходимую информацию формирует страницу просмотра документа и возвращает ее в браузер.

Вынесение конфигурационных параметров

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

Основные конфигурационные данные хранятся в:

  • bitrix/.settings.php

  • /bitrix/.settings_extra.php

  • /bitrix/php_interface/dbconn.php

Так как в этих файлах хранятся глобальные константы, которые зависят от площадки (ландшафта), то:

  • при создании резервной копии эти данные попадут в бэкап;

  • нарушается безопасность, т.к. при получении доступа к корневой папке сайта ($_SERVER["DOCUMENT_ROOT"]) данные становятся доступными в исходном виде;

  • при развертывании бэкапа на новой площадке каждый раз приходится менять значения этих переменных.

Для исключения вышеперечисленных пунктов мы написали свой класс для работы с глобальными параметрами, идею которого позаимствовали из из фреймворка Symfony класс DotEnv. Основная идея заключается в вынесении глобальных параметров (логины/пароли для подключения к БД, к серверу очередей, к шинам данных и т.д.) за пределы сайта.

В итоге конфигурационные файлы становиться похожими на следующее:

  • define("DB_LOGIN", getVar("DB_LOGIN"));

  • define("DB_PASSWORD", getVar("DB_PASSWORD"));

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

Enterprise из коробки? И что пошло не так…

Сразу хотелось бы сказать, что на практике мы не встречали готовых «коробочных» решений, полностью покрывающих потребности Enterprise сегмента бизнеса. Возможно, их и нет, так как зачастую крупные компании сами являются «диктаторами моды», задавая собственные тренды.

Поэтому цель данного раздела — не показать насколько хорош или плох продукт, а донести ряд моментов, с которыми мы столкнулись и как мы это решали. Стоит учитывать, что вендор активно помогал и помогает нам в решении наших потребностей. При таком тесном симбиотическом сотрудничестве наши разработки, исправления, рекомендации находят отражение в обновлениях и новых версиях продукта Битрикс.

Когда мы установили максимальную Enterprise-версию решения с самым широким набором модулей, оказалось, что часть функционала на работает должным образом в масштабах НЛМК: >50000 пользователей с количеством департаментов >4500.

В качестве примера можно рассмотреть:

  • сообщества, которые не создаются на более чем 1000+;

  • мессенджер который зависает при поиске сотрудника по оргуструктуре или при отправке массовых сообщений;

  • календарь который зависает при создании события более чем на 1000+ человек;

  • функционал задач, который тоже отказывается работать с нашими масштабами.

Основная проблема заключается в долгих операциях по вычислении орг. структуры, структуры подчинённости, статусов пользователей и т.д. в режиме хита (браузерной сессии) пользователя. Выражаясь математических языком, необходимо построить топологическое пространство на основе декартового произведения множеств и произвести некие действия над этими элементами.

Исходя из этого, бэкенд часть обрывает соединение по таймауту, т.к. считает, что скрипт завис.

Как мы боролись с восстановлением функционала отправки push уведомлений

Для решения проблемы с отправкой пуш-уведомлений был переписан класс мессенджера, наследованный от стандартного CIMMessenger, который:

  • перехватывает событие OnBeforeMessageNotifyAdd;

  • записывает исходные данные/параметры сообщения в отдельную очередь;

  • выкидывает исключение для остановки работы.

Далее был реализован агент, которые читает эту очередь и выполняет необходимые действия, но уже в режиме cli.

Верхнеуровневый алгоритм работы ниже.

Не работает календарь событий

Проблема заключается в невозможности создания и просмотра событий на 1000+ пользователей. Усугубляется тем, что функционал календаря используется во многих местах, сообщества, различные страницы, профиль и т.д.

Ниже несколько проблемных мест:

  • Функции \CCalendar::GetDestinationUsers(), CCalendarUserSettings::Get().

Файл bitrix/modules/calendar/classes/general/calendar_request.php

\CCalendar::GetDestinationUsers($arAccessCodes) получает ~60-80к строк для нашего числа пользователей, но это не много. После получения данных календарь получает настройки по каждому пользователю не единым запросом, а итерационно в цикле по каждому пользователю через функцию CCalendarUserSettings::Get(). На что, собственно, и уходит много времени.

  • Метод updateSearchIndex, который вызывается на каждого участника (файл bitrix/modules/calendar/classes/general/calendar_event.php). Он обновляет столбец SEARCHABLE_CONTENT таблицы b_calendar_event. При 50000 сотрудников столбец забивается огромным количеством текста. С каждым новым добавленным участником к событию работа скрипта замедляется всё сильнее.

  • Mетод UpdateCounter и получение данных через GetList, в котором есть два места, после которых случается fatal error:

— Большой массив $users, который передается единым запросом к БД, но из-за длины самого запроса БД его не принимает и выдает ошибку.

— Метод Getlist пытается закешировать запрос и падает из-за нехватки памяти.

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

В итоге мы создали свой легковесный календарь, который служит верой и правдой, удовлетворяя всем нашим требованиям.

Заключение

Выше приведены наиболее «важные» доработки и решения, но это далеко не полный перечень кастомизации. Некоторые решения стали «скелетонами» для других проектов.

Битрикс24 включает в себя множество функциональных возможностей, многие из которых «из коробки» готовы для использования организациями различного масштаба. Для проекта НЛМК некоторые возможности нам не подошли, в силу специфичных задач и размера внедрения. Доработок было немало, и мы рады, что нам удалось их реализовать и решить все поставленные перед внедрением задачи.

В заключение хотелось отметить, что нам удалось создать полноценную Enterprise платформу, и коробка «Битрикса» стала хорошей «суповой основой» для приготовления блюда Мишленовского уровня. Нужны только хорошие «повара» :)

Комментарии (10)


  1. Paskin
    01.12.2022 10:20

    "События и сообщества на 1000+ человек" - у вас явно что-то пошло не так с организацией. Пользователей нужно обьединять в группы, и эти группы уже приглашать на события.


    1. tsergei2012 Автор
      01.12.2022 15:46
      +1

      Группы, к сожалению, здесь не спасут:

      1. Например, рассылка пуш уведомлений, проверка занятости пользователя в других календарях/события и т.д. – операции атомарные, которые выполняются в рамках хита пользователя

      2. Стоит учитывать, что «коробочный» функционал Битрикса предоставляет возможность гранулярного добавления пользователей в события, сообщества и т.д. без групп. И рядовой пользователь зачастую не в курсе всех технических особенностей работы платформы.


  1. kns77
    01.12.2022 11:00
    +5

    Битрикс 24 глючное тормозное решение. Сколько не сталкивался с ним у клиентов, я даже знаю как можно работать с такими багами и тормозами.


    1. tsergei2012 Автор
      01.12.2022 15:48
      +2

      Приходите к нам и вы увидите, как оно может работать, если грамотно его допилить.

      В целом, на проблему стоит смотреть шире, не ограничиваясь Битриксом. Мы сталкивались с различными продуктами у которых которых «хромало» качество.

      Основная проблема в низком пороге вхождения в технологию. Как правило, начинающий специалист научившийся выводить «Hello, world» или развернув какое-либо коробочное решение может считать себя высококлассным профессионалом (эффект Даннинга-Крюгера), но базовых знаний ЯП недостаточно для реализации качественного продукта.

      К сожалению, на рынке много таких продуктов, которые практически невозможно поддерживать и развивать без его полной переделки.

      У нас в компании есть свои процессы и в этих процессах задействованы различные направления (архитектура, инфраструктура, аналитика, разработка, тестирование, ИЮ, devops и т.д.). Это позволяет нам создавать качественные продукты и решения для enterprise-сегмента.

      Как написано в статье: «Нужны только хорошие «повара» :)»


      1. SerafimArts
        01.12.2022 18:20

        Хм… И в чём тогда смысл использования Битрикса, если для его использования и поддержки требуется его переписать с нуля?


        1. tsergei2012 Автор
          01.12.2022 18:54
          +1

          Для создания хорошего продукта нужны хорошие специалисты. При их отсутствии и хороший продукт можно испортить.

          Мы Битрикс с нуля не переписывали, а использовали его в качестве некой основы. Как и писал:

          Битрикс24 включает в себя множество функциональных возможностей, многие из которых «из коробки» готовы для использования организациями различного масштаба. Для проекта НЛМК некоторые возможности нам не подошли, в силу специфичных задач и размера внедрения.


          1. SerafimArts
            01.12.2022 21:00
            +2

            Допустим, это довольно популярный и логичный кейс для MVP. Но ведь вы говорите:


            Для создания хорошего продукта нужны хорошие специалисты. При их отсутствии и хороший продукт можно испортить.

            Однако есть проблема, что любой хороший специалист, когда слышит слово "битрикс" — сразу же отказывается, это прям константа в современном мире. И не важно какие условия или деньги ему предлагают (ну в рамках разумного, конечно. Т.к. в полтора-два раза выше рынка я бы подумал уже). Как у вас получилось так завлечь людей на подобное?


            1. Jon7
              02.12.2022 16:07

              Вообще то, существует 2 разных продукта от совершенно разных команд разработчиков, с разной архитектурой и разными целями, это 1С-Битрикс и Битрикс24. Часть функционала пересекается. Очень, очень легко запутаться. В статье шла речь о Битрикс24. Нелюбимая очень многими архитектура это другой продукт - 1С-Битрикс. Вы о какой продукт имели ввиду говоря о "константа в современном мире" ?
              И, пользуясь случаем, хотел выразить респект и благодарность за статью лексическом анализе, очень ясно, прозрачно раскрыта тема, изложено легким языком, содержание отлично ложиться в качестве основы для написания своих небольших лексеров.


              1. SerafimArts
                03.12.2022 13:36
                -1

                Ну я смотрел код Битрикс24, там код по-ощущениям вообще ничем не отличается. Такой же трешак. Так что тот факт что я называю его просто "Битриксом" — роли не играет особо.


                Да и не думаю, что для других тоже будет какая-то разница.


  1. Maccimo
    03.12.2022 00:01

    >50000 пользователей с количеством департаментов >4500.
    По отдельному департаменту на каждые 11 пользователей?