Занимаясь масштабными проектами автоматизации и создавая новые информационные системы, мы каждый раз сталкивались с необходимостью реализации подсистемы ведения справочников, классификаторов, реестров и других подобных объектов, составляющих нормативно-справочную информацию (НСИ) заказчика. За 15 лет работы в ЛАНИТ с системами управления НСИ жизнь подкидывала нам клиентов с самыми различными требованиями. И, конечно, на этих проектах возникали разные ситуации. Я расскажу о нескольких поучительных историях, которые с нами произошли. В статье вы найдете примеры, которые будут полезны многим, кто занимается разработкой программного обеспечения. Ну, а тем, кто работает непосредственно с НСИ, будет еще интереснее – своя рубашка ближе к телу.
За иллюстрации отдельное спасибо замечательному художнику Васе Ложкину.
![](https://habrastorage.org/r/w780q1/webt/8a/os/gb/8aosgbsm9nzkymmqmr-wmntozpu.jpeg)
Создание единой системы управления контрагентами для крупной производственной компании со множеством заводов по всей стране и за рубежом.
Цель проекта – создать единую базу контрагентов для всех подразделений. Ведение контрагентов осуществляется на основе заявок, которым присваиваются приоритеты от низкого до срочного. Срочная заявка должна быть обработана экспертами НСИ за 2 часа вне зависимости от разницы во времени между подразделениями.
Живая история
Проект был согласован со всеми заинтересованными сторонами (в этом нас убедило руководство заказчика) и разработан в заданные сроки в соответствии с утвержденными требованиями.
Презентация созданной системы управления контрагентами проходила гладко, пока не встала одна видная женщина – руководитель сибирского филиала – и весьма энергично, с использованием русских идиоматических выражений, довела до сведения собравшихся, что когда к ней приходит железнодорожный вагон под погрузку готовой продукции, она не будет ждать 2 часа, пока кто-то там в Москве рассмотрит заявку на добавление покупателя.
Она не собирается оплачивать простой вагона, пока происходит утверждение заявки, а заведет данные покупателя в систему как есть и отгрузит товар, а московские товарищи могут разбираться потом с информацией о покупателе сколько угодно.
Это заявление было поддержано еще несколькими руководителями филиалов компании, что практически полностью разрушило централизованную методологию ведения единого справочника контрагентов на основе заявок.
Что мы запомнили: не доверяйте словам руководителей и ответственных лиц со стороны заказчика, что все решения согласованы, все в теме и возражений нет. Выявляйте все заинтересованные стороны проекта и старайтесь выяснить требования к системе и ограничения непосредственно у них.
![](https://habrastorage.org/r/w780q1/webt/wh/sr/ee/whsreejoy3ccgnu42ftgxnpeouq.jpeg)
Создание централизованной системы управления клиентами для страховой компании с большим числом филиалов и агентов по всей стране.
Цель проекта – создание сводной клиентской базы для использования в аналитических приложениях. База данных собиралась со всех филиалов, данные выверялись, дополнялись, дублирующиеся объекты устранялись. Количество клиентов в одном филиале – от тысячи до нескольких миллионов. При этом, пересечений по клиентам между филиалами практически нет.
Живая история
После создания сводной клиентской базы она должна была периодически сравниваться с базами данных филиалов для выявления различий, их последующей обработки и загрузки изменений в сводную базу. Прирост клиентской базы между сверками составлял несколько тысяч записей.
Для выполнения сверки был создан специальный модуль, архитектура которого была спроектирована исходя из того, что он должен быстро сравнивать большое количество записей и формировать относительно небольшой XML-файл с изменениями для загрузки. Формат XML был выбран заказчиком.
После внедрения системы мы получили от заказчика сообщение, что модуль сверки работает крайне медленно и формирует для загрузки в сводную базу файл огромного размера, который они ничем не могут открыть.
Что же выяснилось? Заказчик производил начальную загрузку данных из филиалов в сводный справочник. Экспертам эта работа показалась нудной и трудоемкой, и они просто взяли модуль сверки и подсунули ему полные данные нового филиала, которые еще не разу не загружались в сводный справочник.
Модуль сверки, который в соответствии с ТЗ должен был формировать сведения о различиях в количестве нескольких тысяч записей, получил на вход два миллиона записей, и все они в сводном справочнике отсутствовали.
В результате, за несколько часов нечеловеческих усилий модуль сверки все-таки сформировал файл для загрузки, в который вошли все данные филиала. И, да, этот файл был огромным.
Модуль сверки был использован заказчиком не по назначению, но сам факт, что сверка позволяет выполнять начальную загрузку данных, заказчику понравился, и он собирался и дальше работать именно таким образом, только просил значительно ускорить работу модуля и что-нибудь сделать с создаваемым файлом, чтобы его можно было открывать в текстовом редакторе.
![](https://habrastorage.org/r/w780q1/webt/kh/2c/hh/kh2chhqyhmdhw4tn3xfvxm-sr3a.jpeg)
На наши возражения, что модуль сверки не предназначен для начальной загрузки данных, заказчик радостно показал ТЗ и спросил, а где это тут написано? Как хотим, так и используем!
Что мы запомнили: всегда включайте в ТЗ описание ограничений – что ваша система делать не должна. Ну, или создавайте решения, которые учитывают все возможные сценарии использования, что сильно дороже.
![](https://habrastorage.org/r/w780q1/webt/bu/ai/69/buai69jtm8gxgg-gk9cqh40ohgy.jpeg)
Создание централизованной системы ведения НСИ для финансовой организации.
Цель проекта — создание централизованной системы ведения справочников и классификаторов с рассылкой изменений в заинтересованные системы и базы данных. Предоставление доступа внешним системам к справочникам через веб-сервисы нашей системы.
Обычно у заказчиков среднее количество записей на один справочник составляет от нескольких сотен до нескольких тысяч. Наш недавний рекордсмен – справочник, в котором было 11 млн. записей. Но этот заказчик преподнес нам сюрприз. В его справочнике оказалось свыше 100 млн. записей. Загружали мы его больше суток, т.к. при начальной загрузке выполнялось множество проверок данных. Это не было бы большой проблемой, но заказчик потребовал, чтобы справочник загружался за несколько минут.
Что мы запомнили: в современном мире данных становится все больше, и темпы их роста постоянно увеличиваются. Система должна быть готова к высоким нагрузкам даже там, где они изначально не предполагались. Мы постоянно развиваем наше решение с учетом современных тенденций роста данных и повышения требований к скорости их обработки.
Создание централизованной системы ведения НСИ в крупном банке.
Цель проекта – создание централизованной системы ведения справочников и классификаторов с рассылкой изменений в заинтересованные системы и базы данных. Особенность проекта – весьма непростые процессы распространения изменений, затрагивающие множество систем.
Поскольку в дальнейшем мне придется упомянуть наше собственное решение для управления НСИ, позволю себе небольшое лирическое отступление.
Обычно при создании справочников и процессов распространения изменений заказчик консультируется с нашими аналитиками, какой инструмент или набор инструментов, предоставляемых системой, лучше использовать для конкретной задачи. В этот раз заказчик сказал, что будет создавать справочники и процессы самостоятельно.
Через некоторое время к нам обратился один из специалистов заказчика с жалобой, что у него не загружаются данные в систему. В подтверждение нам прислали пакет импорта данных, исходный файл с загружаемыми записями и сообщение об ошибке, в котором говорилось, что загружаемые данные имеют неверный тип.
Начинаем разбираться. Крутим пакет и так, и этак, пробуем разные варианты представления исходных данных, но ошибку повторить не можем. Обращаемся к заказчику с вопросами, может быть, у пакета импорта есть подключенные программные компоненты, может быть на справочник наложены какие-то дополнительные ограничения, может быть данные не от этого процесса? На все получаем ответ — ничего такого нет, все должно легко загружаться и раньше работало.
![](https://habrastorage.org/r/w780q1/webt/gi/rr/pv/girrpvihscjhkd91em-vnzwk6qs.jpeg)
Оказывается, этот пакет импорта был только вершина айсберга. Если кратко и сильно упрощенно, то происходило следующее. Процедура импорта загружала правильные данные из исходного файла в справочник. Исходный файл удалялся. Затем наша система выполняла распространение изменений в несколько баз данных, в одной из которых производилось сравнение собственных данных с нашими изменениями и формировался файл с расхождениями, который возвращался в нашу систему для загрузки. Причем для загрузки этого файла заказчик использовал ту же процедуру импорта, что и для исходного файла. И вот именно в этом файле, сформированном внешней системой, были данные неверного типа. Очевидно, что при анализе исходного файла мы никаких ошибок найти не могли, а про второй файл и развесистый процесс распространения изменений нам ничего не сообщили.
Что мы запомнили: Всегда проверяйте полученную информацию даже если вам говорят, что у нас тут маленькая проблемка, и она вот именно в этом месте, мамой клянусь! Анализируйте проблему в контексте.
Создание системы управления НСИ в производственной компании.
Цель проекта – создание системы ведения НСИ в управляющей компании со множеством филиалов, заводов и конструкторских подразделений.
В этот раз мы дальше нескольких презентаций не продвинулись. Наша система NORMA очень понравилась технарям. Она закрывала все их существующие проблемы. Дальше пришла очередь показывать систему руководству, и вот тут произошел облом десятилетия. Высокий руководитель посмотрел, послушал и сказал: «Мы тут все работаем на продуктах Apple, у них есть определенный стиль, а ваша система в этот стиль не вписывается. Мы ее даже рассматривать не будем».
![](https://habrastorage.org/r/w780q1/webt/ul/t4/_x/ult4_xrpa_ifdjfk0z4d0fyzzr8.jpeg)
Что мы запомнили: заказчики бывают разные, и некоторым вы просто не подходите. Стиль другой.
Подобные истории случаются в различных проектах. Что интересного было в вашей проектной жизни? Что стало для вас неожиданным уроком? Делитесь в комментариях.
За иллюстрации отдельное спасибо замечательному художнику Васе Ложкину.
![](https://habrastorage.org/webt/8a/os/gb/8aosgbsm9nzkymmqmr-wmntozpu.jpeg)
Случай первый. Как загрузить вагон и маленькую тележку
Создание единой системы управления контрагентами для крупной производственной компании со множеством заводов по всей стране и за рубежом.
Цель проекта – создать единую базу контрагентов для всех подразделений. Ведение контрагентов осуществляется на основе заявок, которым присваиваются приоритеты от низкого до срочного. Срочная заявка должна быть обработана экспертами НСИ за 2 часа вне зависимости от разницы во времени между подразделениями.
Живая история
Проект был согласован со всеми заинтересованными сторонами (в этом нас убедило руководство заказчика) и разработан в заданные сроки в соответствии с утвержденными требованиями.
Презентация созданной системы управления контрагентами проходила гладко, пока не встала одна видная женщина – руководитель сибирского филиала – и весьма энергично, с использованием русских идиоматических выражений, довела до сведения собравшихся, что когда к ней приходит железнодорожный вагон под погрузку готовой продукции, она не будет ждать 2 часа, пока кто-то там в Москве рассмотрит заявку на добавление покупателя.
Она не собирается оплачивать простой вагона, пока происходит утверждение заявки, а заведет данные покупателя в систему как есть и отгрузит товар, а московские товарищи могут разбираться потом с информацией о покупателе сколько угодно.
Это заявление было поддержано еще несколькими руководителями филиалов компании, что практически полностью разрушило централизованную методологию ведения единого справочника контрагентов на основе заявок.
В итоге проект был видоизменен таким образом, чтобы все филиалы имели доступ к базе данных контрагентов и могли вносить в нее изменения напрямую, но при этом выполнялся автоматический поиск схожих записей, которые отображались сотруднику филиала, и он принимал решение о необходимости корректировки данных, которые позднее проверялись экспертной группой.
Что мы запомнили: не доверяйте словам руководителей и ответственных лиц со стороны заказчика, что все решения согласованы, все в теме и возражений нет. Выявляйте все заинтересованные стороны проекта и старайтесь выяснить требования к системе и ограничения непосредственно у них.
![](https://habrastorage.org/webt/wh/sr/ee/whsreejoy3ccgnu42ftgxnpeouq.jpeg)
Случай второй. Как хотим, так и используем
Создание централизованной системы управления клиентами для страховой компании с большим числом филиалов и агентов по всей стране.
Цель проекта – создание сводной клиентской базы для использования в аналитических приложениях. База данных собиралась со всех филиалов, данные выверялись, дополнялись, дублирующиеся объекты устранялись. Количество клиентов в одном филиале – от тысячи до нескольких миллионов. При этом, пересечений по клиентам между филиалами практически нет.
Живая история
После создания сводной клиентской базы она должна была периодически сравниваться с базами данных филиалов для выявления различий, их последующей обработки и загрузки изменений в сводную базу. Прирост клиентской базы между сверками составлял несколько тысяч записей.
Для выполнения сверки был создан специальный модуль, архитектура которого была спроектирована исходя из того, что он должен быстро сравнивать большое количество записей и формировать относительно небольшой XML-файл с изменениями для загрузки. Формат XML был выбран заказчиком.
После внедрения системы мы получили от заказчика сообщение, что модуль сверки работает крайне медленно и формирует для загрузки в сводную базу файл огромного размера, который они ничем не могут открыть.
Что же выяснилось? Заказчик производил начальную загрузку данных из филиалов в сводный справочник. Экспертам эта работа показалась нудной и трудоемкой, и они просто взяли модуль сверки и подсунули ему полные данные нового филиала, которые еще не разу не загружались в сводный справочник.
Модуль сверки, который в соответствии с ТЗ должен был формировать сведения о различиях в количестве нескольких тысяч записей, получил на вход два миллиона записей, и все они в сводном справочнике отсутствовали.
В результате, за несколько часов нечеловеческих усилий модуль сверки все-таки сформировал файл для загрузки, в который вошли все данные филиала. И, да, этот файл был огромным.
Модуль сверки был использован заказчиком не по назначению, но сам факт, что сверка позволяет выполнять начальную загрузку данных, заказчику понравился, и он собирался и дальше работать именно таким образом, только просил значительно ускорить работу модуля и что-нибудь сделать с создаваемым файлом, чтобы его можно было открывать в текстовом редакторе.
![](https://habrastorage.org/webt/kh/2c/hh/kh2chhqyhmdhw4tn3xfvxm-sr3a.jpeg)
На наши возражения, что модуль сверки не предназначен для начальной загрузки данных, заказчик радостно показал ТЗ и спросил, а где это тут написано? Как хотим, так и используем!
В результате нам пришлось вносить изменения в архитектуру модуля сверки с целью обработки больших массивов данных и формирования выходного файла в формате CSV, так как заказчик решительно не захотел отказываться от такого удобного инструмента.
Что мы запомнили: всегда включайте в ТЗ описание ограничений – что ваша система делать не должна. Ну, или создавайте решения, которые учитывают все возможные сценарии использования, что сильно дороже.
![](https://habrastorage.org/webt/bu/ai/69/buai69jtm8gxgg-gk9cqh40ohgy.jpeg)
Случай третий. Не слонёнок, а слон, да еще и должен летать
Создание централизованной системы ведения НСИ для финансовой организации.
Цель проекта — создание централизованной системы ведения справочников и классификаторов с рассылкой изменений в заинтересованные системы и базы данных. Предоставление доступа внешним системам к справочникам через веб-сервисы нашей системы.
Обычно у заказчиков среднее количество записей на один справочник составляет от нескольких сотен до нескольких тысяч. Наш недавний рекордсмен – справочник, в котором было 11 млн. записей. Но этот заказчик преподнес нам сюрприз. В его справочнике оказалось свыше 100 млн. записей. Загружали мы его больше суток, т.к. при начальной загрузке выполнялось множество проверок данных. Это не было бы большой проблемой, но заказчик потребовал, чтобы справочник загружался за несколько минут.
В результате нам пришлось сильно изменить порядок работы системы с этим справочником. Фактически, его ведение осуществляется за пределами системы, а мы только предоставляем интерфейс для его использования. Сейчас мы разрабатываем для нашей системы новые способы работы с очень большими справочниками. Надеемся, что заказчику понравится.
Что мы запомнили: в современном мире данных становится все больше, и темпы их роста постоянно увеличиваются. Система должна быть готова к высоким нагрузкам даже там, где они изначально не предполагались. Мы постоянно развиваем наше решение с учетом современных тенденций роста данных и повышения требований к скорости их обработки.
Случай четвертый. Сложный фокус с файлами
Создание централизованной системы ведения НСИ в крупном банке.
Цель проекта – создание централизованной системы ведения справочников и классификаторов с рассылкой изменений в заинтересованные системы и базы данных. Особенность проекта – весьма непростые процессы распространения изменений, затрагивающие множество систем.
Поскольку в дальнейшем мне придется упомянуть наше собственное решение для управления НСИ, позволю себе небольшое лирическое отступление.
Подробнее о системе NORMA.
Задачи наших заказчиков во многом схожи, и мы решили снизить затраты на программные разработки и сократить время проектов, создав собственную универсальную платформу для ведения НСИ и основных данных (Reference Data Management & Master Data Management). Система существует уже более 10 лет, и все эти годы мы в ЛАНИТ ее активно развиваем.
NORMA поддерживает централизованное и распределенное ведение НСИ. Все данные и метаинформация ведутся с учетом истории изменений и система позволяет просматривать и изменять весь массив НСИ на произвольную дату в прошлом или будущем. Для справочников могут быть настроены процессы согласования и утверждения изменений. В состав системы входит выделенный сервер распространения изменений, который позволяет взаимодействовать с внешними системам через различные интерфейсы и создавать достаточно сложные интеграционные бизнес-процессы (этакий мини BizTalk Server). У нас есть пакеты экспорта/импорта данных, которые умеют выгружать/загружать данные справочников в базы данных и файлы различных форматов. Поддерживается ведение перекодировочных таблиц для внешних систем.
NORMA включает графический построитель запросов и дизайнер отчетов. Кроме работы с собственными справочниками, система позволяет через свой интерфейс просматривать и изменять справочники, которые находятся во внешних, по отношению к ней, базах данных, а также использовать эти справочники в построителе запросов и пакетах экспорта/импорта.
В ответ на возникновение различных событий в системе, например, события внесения изменений в справочник, могут запускаться подключаемые программные компоненты, написанные на C#, которые могут как проверять данные, так и взаимодействовать с внешними системами и, собственно, самой системой NORMA. Практически все функции системы доступны через веб-сервисы.
Система может масштабироваться как вертикально, путем увеличения мощности сервера приложений и базы данных, так и горизонтально за счет использования многоузлового сервера приложений, в котором каждый узел или группа узлов отвечает за выполнение отдельной функции. Для хранения НСИ система может использовать Microsoft SQL Server, Oracle или PostgreSQL.
NORMA поддерживает централизованное и распределенное ведение НСИ. Все данные и метаинформация ведутся с учетом истории изменений и система позволяет просматривать и изменять весь массив НСИ на произвольную дату в прошлом или будущем. Для справочников могут быть настроены процессы согласования и утверждения изменений. В состав системы входит выделенный сервер распространения изменений, который позволяет взаимодействовать с внешними системам через различные интерфейсы и создавать достаточно сложные интеграционные бизнес-процессы (этакий мини BizTalk Server). У нас есть пакеты экспорта/импорта данных, которые умеют выгружать/загружать данные справочников в базы данных и файлы различных форматов. Поддерживается ведение перекодировочных таблиц для внешних систем.
NORMA включает графический построитель запросов и дизайнер отчетов. Кроме работы с собственными справочниками, система позволяет через свой интерфейс просматривать и изменять справочники, которые находятся во внешних, по отношению к ней, базах данных, а также использовать эти справочники в построителе запросов и пакетах экспорта/импорта.
В ответ на возникновение различных событий в системе, например, события внесения изменений в справочник, могут запускаться подключаемые программные компоненты, написанные на C#, которые могут как проверять данные, так и взаимодействовать с внешними системами и, собственно, самой системой NORMA. Практически все функции системы доступны через веб-сервисы.
Система может масштабироваться как вертикально, путем увеличения мощности сервера приложений и базы данных, так и горизонтально за счет использования многоузлового сервера приложений, в котором каждый узел или группа узлов отвечает за выполнение отдельной функции. Для хранения НСИ система может использовать Microsoft SQL Server, Oracle или PostgreSQL.
Обычно при создании справочников и процессов распространения изменений заказчик консультируется с нашими аналитиками, какой инструмент или набор инструментов, предоставляемых системой, лучше использовать для конкретной задачи. В этот раз заказчик сказал, что будет создавать справочники и процессы самостоятельно.
Через некоторое время к нам обратился один из специалистов заказчика с жалобой, что у него не загружаются данные в систему. В подтверждение нам прислали пакет импорта данных, исходный файл с загружаемыми записями и сообщение об ошибке, в котором говорилось, что загружаемые данные имеют неверный тип.
Начинаем разбираться. Крутим пакет и так, и этак, пробуем разные варианты представления исходных данных, но ошибку повторить не можем. Обращаемся к заказчику с вопросами, может быть, у пакета импорта есть подключенные программные компоненты, может быть на справочник наложены какие-то дополнительные ограничения, может быть данные не от этого процесса? На все получаем ответ — ничего такого нет, все должно легко загружаться и раньше работало.
![](https://habrastorage.org/webt/gi/rr/pv/girrpvihscjhkd91em-vnzwk6qs.jpeg)
Оказывается, этот пакет импорта был только вершина айсберга. Если кратко и сильно упрощенно, то происходило следующее. Процедура импорта загружала правильные данные из исходного файла в справочник. Исходный файл удалялся. Затем наша система выполняла распространение изменений в несколько баз данных, в одной из которых производилось сравнение собственных данных с нашими изменениями и формировался файл с расхождениями, который возвращался в нашу систему для загрузки. Причем для загрузки этого файла заказчик использовал ту же процедуру импорта, что и для исходного файла. И вот именно в этом файле, сформированном внешней системой, были данные неверного типа. Очевидно, что при анализе исходного файла мы никаких ошибок найти не могли, а про второй файл и развесистый процесс распространения изменений нам ничего не сообщили.
Что мы запомнили: Всегда проверяйте полученную информацию даже если вам говорят, что у нас тут маленькая проблемка, и она вот именно в этом месте, мамой клянусь! Анализируйте проблему в контексте.
Случай пятый. Я привыкаю к несовпадениям
Создание системы управления НСИ в производственной компании.
Цель проекта – создание системы ведения НСИ в управляющей компании со множеством филиалов, заводов и конструкторских подразделений.
В этот раз мы дальше нескольких презентаций не продвинулись. Наша система NORMA очень понравилась технарям. Она закрывала все их существующие проблемы. Дальше пришла очередь показывать систему руководству, и вот тут произошел облом десятилетия. Высокий руководитель посмотрел, послушал и сказал: «Мы тут все работаем на продуктах Apple, у них есть определенный стиль, а ваша система в этот стиль не вписывается. Мы ее даже рассматривать не будем».
![](https://habrastorage.org/webt/ul/t4/_x/ult4_xrpa_ifdjfk0z4d0fyzzr8.jpeg)
Что мы запомнили: заказчики бывают разные, и некоторым вы просто не подходите. Стиль другой.
Подобные истории случаются в различных проектах. Что интересного было в вашей проектной жизни? Что стало для вас неожиданным уроком? Делитесь в комментариях.
Кстати, мы ищем специалистов в нашу команду