Собачья жизнь

Николай Петров

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

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

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

Таким образом пришлось делать тройной дубляж систем: данные одного вида, скажем, дипломы собак на испытаниях, однако несовместимые между собой, хранятся в разных структурах. Продумав эти структуры, я снова воспользовался нашей системой переноса контента для импорта данных. Больше ста тысяч записей о собаках, тысячи записей экспертов, документов, справок и так далее были импортированы без особых проблем; ошибки, неизбежно возникающие при прописывании соответствий между старой и новой структурой данных легко обнаруживались и исправлялись при тестовом импорте.

Однако просто перенести данные, разумеется, недостаточно. База данных должна их обрабатывать, при этом для разного функционала базы используются разные наборы данных; где-то все три типа данных объединяются для выдачи информации пользователю, где-то используются только два типа данных, а где-то возможно использовать только последнюю, самую полную структуру. И вот тут показало себя одно из слабых мест Друпала. Удобная и наглядная система Друпала для работы с данными - Views - становится крайне неудобной при попытке работать с данными одного вида, но хранящимися в разных структурах. Пришлось создавать свои собственные системы для обработки таких данных.

Однако и этого заказчику оказалось мало: например, те же данные о дипломах могли у владельца собаки быть в полном виде (современном) или совершенно минимальном (если бумажный документ был в одном из старых форматов), либо же, для случаев иностранных дипломов, в формате не соответствующем российским. Более того, даже идентификационный номер собаки мог быть непредсказуем: это мог быть номер ВПКОС, справки о происхождении, номер родословной FCI/РКФ или номер свидетельства охотничьей собаки. Все это, и многое, многое другое пришлось учитывать.

Правила оценок для испытаний охотничьих собак соответствовали группам пород - но при этом в каждой группе пород существовали какие-то породы для которых в правилах были исключения или особые случаи. Бонитировка охотничьих собак проводится по правилам, в которых заблудился бы Маккиавелли, и исключений в них больше чем собственно правил. Тут уже Друпал не мог помочь абсолютно ничем; эти системы также писались с нуля.

Другой сложностью был контроль за уникальностью введенных сущностей. Пользователи базы вводят в базу содержание бумажных документов; в руках у них может оказаться любой из документов, относящихся к собаке, при отсутствии любого другого документа. Таким образом необходимо было предоставить пользователям возможность начать ввод документации с любого документа, и при этом обеспечить невозможность "потерять" или "забыть" этот документ впоследствии. Если введен "Акт вязки", "Акт обследования помета" или "Справка о происхождении собаки" - то все эти документы сами "находят" друг друга и "присоединяются" к собаке с соответствующим номером "справки о происхождении" - либо же при отсутствии каких-то документов, на страницах "релевантных" к ним генерируются удобные для пользователя ссылки, кликнув на которые можно создать соответствующие "присоединенные" документы с предварительно заполненными полями связей.  Если документ с определенным номером уже существует, создать дубликат невозможно.

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