Спорите об учётной, складской или отраслевой системе, которую написали на Delphi. Такие программы работают на предприятиях пятнадцать и двадцать лет, и спор о них редко начинается с чистого листа: чаще всего система давно эксплуатируется, а разногласия появились при доработке, передаче на сопровождение другому исполнителю или при попытке заменить её на новую. Экспертиза исходного кода на Delphi — специализированное направление экспертизы процесса разработки программного обеспечения. В итоге вы получаете заключение с описанием объектов, применённых методов и ограничений; какое доказательственное значение оно получит, оценивает суд.
Если спор уже начался, снимите копию раньше, чем систему тронут. Delphi-программы обычно живут на конкретном сервере вместе со своей базой, и обновление или переустановка стирают ровно то, по чему потом восстанавливают картину. Что именно копировать, разобрано ниже, в разделе «Что сохранить, пока система работает».
Знать язык своей программы вам не нужно, и выяснять его самостоятельно тем более: в договоре двадцатилетней давности он обычно не назван, а спрашивать подрядчика, с которым вы спорите, не стоит. Язык определяется по самим файлам программы за несколько минут, и мы делаем это на бесплатном разборе. Если окажется, что система написана не на Delphi, скажем сразу и назовём подходящее направление.
Дешевле всего начать с разговора: назовите систему, год, когда её поставили, и то, что осталось у вас на руках: назовите систему, год, когда её поставили, и то, что осталось у вас на руках — дистрибутив, база, договор. Уже по этому видно, какие вопросы по вашей системе решаются, а какие нет. Присылать файлы на этом шаге не нужно.
С какими спорами приходят по программам на Delphi
Сюда приходят с объектом, который старше обычного: спорят не о том, что сделали в прошлом квартале, а о системе, которая работает давно и которую нужно либо доработать, либо заменить. До начала работы определите, о какой версии, площадке и периоде идёт речь, — без этого у исследования нет предмета.
Типичные ситуации выглядят так:
- заказчик много лет пользуется системой, а исходный текст ему так и не передали, и теперь доработка невозможна без прежнего исполнителя;
- исходники передали, но собрать из них работающую программу не получается: нет нужной версии среды, недостаёт сторонних компонентов или файлов проекта;
- новый подрядчик взялся сопровождать чужую систему, сломал часть функций, и стороны спорят, что было до него;
- система перестала работать после обновления Windows или переноса на новый сервер, и спорят, дефект это или условия эксплуатации;
- заказчик считает, что вместо разработки ему передали переименованную типовую программу того же исполнителя;
- исполнитель ликвидирован или недоступен, а системой продолжают пользоваться — нужно установить, что вообще было передано и на что заказчик вправе рассчитывать;
- спорят о выгрузке накопленных данных при переходе на другую систему.
Если разногласия касаются обмена с бухгалтерским контуром предприятия, начните со страницы экспертизы 1С: там объекты и следы другие.
Почему из готовой программы код не восстановить, а форму — можно
Delphi переводит исходный текст сразу в машинный код процессора, и обратного пути к тексту у эксперта нет: получить из исполняемого файла программу на Object Pascal, сопоставимую с исходной, невозможно. В этом Delphi ближе к C++, чем к платформам, где программа хранится в промежуточном виде.
Но одна особенность отличает Delphi от всех остальных языков, и в спорах она решает многое. Внешний вид окон программы описывается отдельными файлами форм, и при сборке они целиком попадают внутрь исполняемого файла как ресурсы. Оттуда их извлекают и читают: видны все элементы каждого окна, их названия, надписи, размеры, привязка к полям данных, названия обработчиков событий. Вместе с этим из файла обычно извлекается и перечень классов с их свойствами — язык сохраняет такие сведения для собственной работы.
Что это даёт спору. Даже когда исходного текста нет ни у кого, по одной работающей программе устанавливают состав экранных форм и полей, названия модулей и классов, тексты сообщений и надписей, обращения к таблицам базы, состав использованных сторонних наборов компонентов. Логику расчёта так не прочитать: алгоритм остаётся в машинном коде. Он не становится от этого недостижимым — машинный код разбирают отдельными средствами, и по несложным расчётам вывод получить удаётся, — но это другая по трудоёмкости работа, результат которой приблизителен, и заказывают её отдельно, взвесив цену. Объём же и устройство интерфейсной части восстанавливаются надёжно и быстро. Разница между «что программа умеет» и «как она это считает» здесь проходит резко, и в заключении её обозначают прямо.
У такого чтения есть пределы, и эксперт называет их вместе с результатом. В описании формы сохраняются только те свойства, которые разработчик изменил: заданное по умолчанию там не хранится, и по описанию нельзя судить о том, каким элемент выглядел на экране. Описание есть у каждой формы, нарисованной в среде разработки, независимо от того, когда программа её открывает; а вот окна и поля, которые программа строит кодом, в ресурсах не появляются вовсе — их видно только при запуске. Наличие формы в файле не означает, что до неё можно дойти из меню: описание отражает замысел на момент разработки, а не работающую функцию. Наконец, если программа собрана с внешними пакетами, часть форм и классов лежит не в исполняемом файле, а в отдельных файлах рядом с ним, и разбор одного исполняемого файла даст неполную картину — поэтому и просят каталог программы целиком.
Что сделать сегодня, пока следы не стёрлись
Главное о таких системах: доказательство исчезает само, без чьего-либо умысла, и быстрее, чем принято думать. Прежние версии записей, по которым потом отвечают на вопрос «не удаляли ли строки задним числом», живут в базе часами: сервер вычищает их в фоне постоянно, а ночное резервное копирование доделывает остальное. Журнал событий Windows пишется по кольцу и держит несколько дней. Собственный журнал программы часто обрезается при каждом запуске. Поэтому счёт идёт на дни, и начинать надо с копии базы, а не с переписки.
Копию файла базы снимают правильным способом, и это важнее скорости. Копировать файл работающей базы обычными средствами нельзя: производитель запрещает это прямо, потому что копия получится негодной, а сама база может пострадать. У Firebird для этой задачи есть штатный механизм: командой nbackup -L базу переводят в состояние, при котором файл можно безопасно скопировать, копируют, а затем командой nbackup -N возвращают в обычный режим. Работу пользователей это почти не прерывает и занимает столько, сколько идёт копирование файла. Если версия базы такого механизма не поддерживает, систему останавливают штатно — останавливают службу базы данных, — копируют файл и запускают службу снова.
Чего делать не нужно: принудительно выключать базу командой отключения с ключом force. Она откатывает начатые операции у всех, кто в этот момент работает, а состояние «выключено» записывается внутрь файла базы и переживает перезагрузку сервера — если забыть вернуть базу в рабочий режим, утром в неё не войдёт никто.
Окно планируйте честно. На базе в несколько десятков гигабайт вывод людей, копирование, возврат и разбор жалоб «у меня не открывается» занимают от получаса до полутора часов, и делать это лучше до начала рабочего дня или после его окончания. Если остановить систему нельзя вовсе, приостановите на эту ночь автоматическое резервное копирование и фоновую чистку базы — так следы доживут до ближайшего окна.
Порядок действий такой:
- снимите копию файла базы описанным выше способом — это главный объект, и снимать её нужно первой;
- сразу посчитайте контрольную сумму полученного файла, пока система ещё не вернулась в работу;
- верните систему в работу и убедитесь, что рабочие места подключаются;
- уже спокойно сделайте обычную резервную копию штатным средством — она удобна для работы и прикладывается к первой, но не заменяет её: штатное средство пересобирает содержимое заново и прежних версий записей в него не переносит;
- выгрузите журналы сегодня же — журнал приложения, журнал событий Windows и журнал сервера базы данных. Именно выгрузите в файлы, а не «настройте, чтобы не перетирались»: запрет перезаписи в журнале Windows приводит к потере уже новых событий, а на сервере с включённым аудитом безопасности способен остановить его целиком;
- приостановите автоматическое удаление старых резервных копий по расписанию — по ним датируют изменения, — предварительно проверив, что места на диске хватит;
- напишите служебную записку на полстраницы: какие копии сняты, с какого сервера, в какой день, кем и кто при этом присутствовал.
Что собрать, кроме базы:
- каталог установленной программы целиком — с исполняемым файлом, всеми библиотеками рядом с ним, файлами настроек и шаблонами печатных форм; если программа собрана с внешними пакетами, часть кода и форм лежит в отдельных файлах рядом, и без них объект неполон;
- дистрибутив, которым программу устанавливали, и все сохранившиеся обновления — по ним восстанавливают историю версий;
- если исходный текст у вас есть, копию всего каталога проекта, включая файлы форм и файл проекта, а не только файлы с кодом;
- сведения о самой базе: производитель, версия и разрядность сервера. Копия, снятая старой версией, на новой не открывается вовсе, и без этих сведений эксперт не соберёт стенд;
- сведения об аппаратном ключе защиты, если программа его требует. Сам ключ с работающего сервера не снимайте — без него остановится предприятие; для стенда согласуют отдельный порядок;
- контрольные суммы всех архивов, посчитанные сразу и сохранённые отдельно от них — например, в письме самому себе. Это короткая строка, вычисленная из содержимого файла: изменится хоть один знак — изменится и она. На современной Windows её считают в PowerShell командой
Get-FileHash архив.zip -Algorithm SHA256, на Windows начиная с Vista — командойcertutil -hashfile архив.zip SHA256, на сервере под Linux —sha256sum архив.zip. На более старых системах файл переносят на современный компьютер и считают сумму там, записав, когда и как он был перенесён.
Копируйте и передавайте только то, что принадлежит вам или к чему у вас есть законное право доступа; чужие системы исследуют по определению суда или иного уполномоченного органа. Если исходный текст есть только у исполнителя, с которым вы спорите, действовать самостоятельно не нужно: письменно потребуйте передать материалы по договору и зафиксируйте отказ или молчание. Чужое получают через суд по возбуждённому делу — ходатайством об истребовании доказательства, в котором называют, что именно требуется, какие обстоятельства этим подтверждаются и почему получить его самостоятельно нельзя.
Выполнять всё перечисленное должен тот, у кого есть доступ к серверу и базе, — ваш системный администратор или подрядчик по инфраструктуре, и пользователей нужно предупредить заранее. Если такого человека нет, позвоните по номеру 8 (800) 333-24-09: подскажем порядок под вашу ситуацию, это бесплатно.
Отдельно о доступе посторонних. У систем такого возраста удалённый доступ прежнего исполнителя обычно остаётся включённым спустя годы после окончания работ, и пока он есть, любая ваша копия уязвима для возражения «файлы могли изменить». Доступ закрывают до снятия копий, а факт закрытия фиксируют в записке. Но взвесьте и обратное: если система ломается, чинить её сегодня умеет только он, и отключение стоит планировать вместе с тем, кто подхватит сопровождение.
Пока копии не сняты, не обновляйте программу, не переустанавливайте её и не переносите базу на другой сервер. Ограничение не бессрочное: оно действует до снятия копий и подсчёта контрольных сумм, то есть день-два, а не весь процесс. Если за это время произойдёт сбой и систему придётся восстанавливать — восстанавливайте, но запишите в ту же записку, что именно, когда и почему пришлось сделать.
Копия, снятая своими силами, доказывает меньше, чем кажется: другая сторона вправе сказать, что архив собран уже после начала спора. Усиливают её посчитанные сразу контрольные суммы и обеспечение доказательств. Путей три, и они не взаимозаменяемы: до обращения в суд доказательство закрепляет нотариус; в арбитражном процессе суд вправе обеспечить доказательство и до предъявления иска — по заявлению, которое рассматривается по правилам о предварительных обеспечительных мерах; по уже возбуждённому делу подают ходатайство об обеспечении доказательств.
Версия среды и набор компонентов: почему исходники не собираются
Самый частый спор по этому языку звучит так: исходный текст передали, а работающую программу из него получить не удаётся. По Delphi это почти никогда не признак подделки — гораздо чаще дело в окружении, которое вместе с текстом не передали.
Чтобы собрать программу, нужны три вещи одновременно: та же версия среды разработки, тот же набор сторонних компонентов тех же версий и полный комплект файлов проекта. Версий среды за тридцать лет вышло много, и они несовместимы между собой: проект, написанный в одной, в другой не открывается без правок, а обещание «соберём в новой версии» на практике означает переписывание части кода. Сторонние компоненты — отдельная проблема: их устанавливают в среду, а не кладут рядом с проектом, поэтому при передаче исходников о них забывают чаще всего.
Эксперт разбирает такую ситуацию по шагам: устанавливает, какой версией среды собиралась спорная программа, какие сторонние наборы компонентов в ней использованы, какие из них есть в переданном комплекте, а каких недостаёт, и что именно мешает сборке — отсутствие компонента, отсутствие файла проекта или ошибка в самом коде. Ответ «не собирается» без такого разбора не значит ничего: суду нужно знать, чего не хватило и у кого оно должно было быть.
Сторонние компоненты и их условия использования
Разработка на Delphi почти всегда опирается на готовые наборы компонентов — таблицы, генераторы отчётов, диаграммы, работа с базой. Наиболее известные наборы платные, и их состав в спорной программе устанавливается: часть компонентов оставляет в исполняемом файле узнаваемые следы, а при наличии исходного текста они видны прямо в файле проекта.
Для спора это важно с двух сторон. Первая — объём работ: чужой компонент трудом подрядчика не является, и при подсчёте его вычитают, хотя подбор компонентов и их согласование между собой — тоже труд, который оценивают отдельно от числа строк. Вторая — условия использования: у каждого набора свой лицензионный документ, и встречаются условия, привязанные к числу разработчиков или запрещающие распространение исходного текста вместе с компонентом.
Эксперт устанавливает факты: какой набор какой версии использован, каким документом он сопровождается и что в этом документе написано; текст приводится в заключении. Толкование условий и вывод о том, нарушены ли они, — вопрос права, и решает его суд.
База данных: где живёт половина логики
Системы на Delphi почти всегда работают с базой данных, и по этому языку доля логики, вынесенной из программы в базу, выше, чем в любом другом языке. Расчёты, проверки и правила часто реализованы хранимыми процедурами и триггерами, а не кодом приложения, — и тогда исследование только по программе не отвечает на вопрос, ради которого его затевали.
Стороне, оставшейся без исходного текста, это на руку: база хранит собственное описание и читается независимо от программы. Из файла базы Firebird или InterBase извлекается вся её структура: таблицы, поля, связи, индексы, а обычно и тексты хранимых процедур и триггеров — база хранит их рядом со скомпилированным представлением. То есть часть логики системы бывает доступна для чтения даже тогда, когда сама программа закрыта машинным кодом. Но: работать базе тексты не нужны, и вычистить их при поставке — известный приём защиты, которым тиражные отраслевые разработчики пользуются постоянно; в новых версиях Firebird содержимое базы к тому же может быть зашифровано. Тогда остаётся только скомпилированное представление, читать которое сложнее и не всегда возможно. Поэтому наличие текстов эксперт проверяет первым делом, а не обещает заранее.
Отдельный случай — системы девяностых и начала двухтысячных, работающие с файловыми таблицами через промежуточный слой доступа к данным, который ставился вместе с программой. Он не был частью Windows и никуда не делся: его до сих пор можно установить, но поддержка прекращена, работает он только с 32-разрядными программами, требует прав администратора и общего сетевого каталога для служебных файлов — а в современной сети такой каталог обычно закрыт. Поэтому запуск подобной системы на новом оборудовании превращается в отдельную работу, которую закладывают в расчёт заранее. Данные при этом читаются и без запуска программы, отдельными средствами.
Сборка не повторяема побайтово: как связывают код и программу
Вопрос «получается ли из переданного текста именно эта программа» по Delphi решается иначе, чем на платформах с повторяемой сборкой. Две сборки одного и того же текста дают разные файлы: в исполняемый файл попадают время сборки и другие переменные сведения, а результат зависит ещё и от того, какие версии компонентов установлены в среде. Побайтовое сравнение здесь не работает, и эксперт, который на него опирается, выходит за пределы обоснованного вывода.
Сравнение ведут по содержанию, и объекты для него выбирают такие, которые сборка сохраняет:
- ресурсы форм: состав окон, элементов и их свойств в собранной программе сопоставляют с файлами форм из переданного комплекта — это самое надёжное сопоставление по Delphi;
- перечень классов и их свойств, извлекаемый из исполняемого файла, — с перечнем, который следует из исходного текста;
- текстовые строки: надписи, сообщения об ошибках, названия таблиц и полей, тексты запросов к базе;
- состав использованных сторонних наборов компонентов и версия среды сборки;
- поведение на стенде: одинаково ли ведут себя собранная из переданного текста программа и спорная в одних и тех же сценариях.
Критерий вывода задают до сравнения, а не подгоняют под его итог, и вместе с ним — предел самого сравнения. Первые четыре признака описывают оболочку программы: формы, классы, строки, состав компонентов. Они хорошо показывают, что перед экспертом та же самая программа, и почти ничего не говорят о содержимом обработчиков — то есть о самих расчётах. Поэтому переданный текст, из которого вырезали или упростили расчётную часть, по одним этим признакам от полного не отличить, и вывод на них не строят. Работает только пятый признак — сравнение поведения, и для него заранее согласуют перечень проверяемых сценариев с исходными данными и ожидаемым результатом по каждому.
Дальше решение принимают по трём исходам, и каждый назван до начала работы. Совпадение по оболочке и совпадение поведения на всех согласованных сценариях делают вывод о происхождении программы обоснованным. Расхождение поведения хотя бы на одном сценарии при совпавшей оболочке — основание для вывода, что переданный текст спорной программе не соответствует; такое расхождение эксперт описывает и показывает, а не объясняет задним числом. Если собрать переданный текст не удалось вовсе или сценарии согласовать не получилось, вывод о соответствии не делается, и это тоже итог работы.
Как устанавливают возраст спорной версии
У современных систем на этот вопрос отвечает история хранилища исходных текстов. У систем, о которых идёт речь здесь, хранилища обычно не было вовсе: код лежал в каталоге на компьютере разработчика, а до заказчика доезжали только готовые дистрибутивы. Поэтому датируют не по одному источнику, а по нескольким слабым сразу, и слабость каждого называют вместе с ним.
Опираются на такие следы:
- дистрибутивы и обновления, сохранившиеся у заказчика, вместе с письмами о поставке и актами — самый содержательный источник по этому направлению именно потому, что он двусторонний;
- сведения о версии внутри исполняемого файла: их заполняет разработчик вручную, поэтому они показывают намерение, а не момент сборки;
- структура базы: появление таблицы или поля почти всегда связано с конкретной доработкой. Порядок появления виден по служебным сведениям внутри базы, но только в точной копии файла — восстановление из обычной резервной копии перестраивает их заново и признак уничтожает;
- резервные копии базы за прошлые периоды: сравнение двух копий показывает, что изменилось между ними и, значит, когда именно доработка попала в эксплуатацию;
- журналы установки и обновления на сервере, если они велись, и переписка сторон с вложениями.
Файловые метки в этот перечень входят с оговоркой: копирование и переустановка их переписывают, поэтому сами по себе они не доказывают почти ничего. Совпадение нескольких независимых следов позволяет говорить о периоде обоснованно, а расхождение эксперт показывает, а не сглаживает: в спорах о старых системах расхождение источников само по себе бывает значимым обстоятельством. Окончательный вывод о сроках делает суд. Если спор целиком о сроках и хронологии работ, его разбирает экспертиза сроков и хронологии разработки.
Следы миграции: что ломается при переносе старой системы
Отдельный класс споров по Delphi возникает при попытке перевести систему на современную версию среды или на новую операционную систему. Ошибки при переводе повторяются от системы к системе.
Смотреть нужно как минимум сюда:
- обработка текста: в старых версиях среды строка хранилась побайтно, в новых — иначе, и после перевода в программе появляются искажённые буквы, обрезанные значения и неверные сравнения;
- работа с файлами и путями: программа, написанная под старую Windows, пишет настройки и данные в каталог собственной установки. Современная система такую запись обычно не запрещает, а незаметно уводит в личный каталог пользователя, и на экране ничего не ломается — зато у каждого сотрудника оказывается своя копия данных, а общие настройки перестают меняться для всех. Отказ в записи появляется как раз наоборот, после модернизации программы под современные правила;
- обращение к базе через прежний механизм доступа, отсутствующий в современной системе;
- сторонние компоненты, у которых нет версии под новую среду, — их заменяют, и вместе с заменой меняется поведение;
- печатные формы и отчёты: они чаще всего ломаются первыми и заметны пользователю раньше остального.
Установив дефект, эксперт отвечает и на второй вопрос: возник он при переносе или существовал раньше. Ответ дают предыдущие версии программы и резервные копии базы, поэтому их и просят сохранить. Была ли работа по переносу предусмотрена договором и приняты ли её результаты — вопрос права, и решает его суд.
Отказы, зависания и рост потребления памяти
Программа на Delphi — обычное приложение Windows, и следы её отказов ищут там же, где следы отказа любой другой программы этой системы. Материал для таких вопросов специфический: программа должна оставить след, и если ничего не сохранилось, эксперт говорит об этом прямо.
При аварийном завершении в журнал событий Windows попадает запись с именем модуля и смещением, по которым место отказа определяется — но только при наличии файла с отладочными сведениями, который создаётся при сборке и обычно не передаётся вместе с программой. Без него из записи извлекается лишь то, какая библиотека отказала. Многие системы на Delphi ведут собственный журнал ошибок, и он информативнее системного, потому что содержит цепочку вызовов с именами методов.
Зависание исследуют иначе, чем отказ: пока программа не отвечает, снимают снимок её состояния и смотрят, чем заняты потоки — ждут ли ответа базы, встали ли на общей блокировке. По системам с базой типичная причина зависаний лежит не в программе, а в блокировке в базе, и проверяют это со стороны базы, а не со стороны кода. Рост потребления памяти в таких приложениях чаще всего связан с объектами, которые создают и не освобождают, и воспроизводят его на стенде — отдельном компьютере, настроенном как рабочий, с копией базы. Исходов здесь тоже три, и их называют заранее. Причину считают установленной, если дефект воспроизведён на стенде и альтернативные объяснения проверены и отклонены. Если воспроизвести не удалось, но следы указывают на конкретное место, вывод формулируют как предположительный и помечают его таковым. Если журналов и отладочных сведений не сохранилось, причину не устанавливают вовсе — по машинному коду без них место отказа определяется до модуля, но не до строки. Вывод о дефекте сопровождают указанием, при каком сценарии он воспроизведён; наступают ли при этом последствия, предусмотренные заданием, оценивает суд.
Сравнение двух программ на Delphi
Спор о заимствовании здесь решается не так, как в языках с восстановимым кодом. Сравнивать машинный код двух программ бессмысленно: одинаковый исходный текст, собранный разными версиями среды, даёт разный результат, а разный текст может дать похожий. Поэтому объектами сравнения выбирают то, что сборка сохраняет в узнаваемом виде.
Сопоставляют состав и устройство экранных форм — совпадение расположения элементов, их названий и свойств у двух независимо написанных программ практически исключено; перечень классов и модулей; текстовые строки и сообщения; структуру базы данных вместе с текстами хранимых процедур — по ней совпадения видны нагляднее всего. Когда исходный текст есть у обеих сторон, сравнивают и его — теми же способами, что и в других языках: развёрнуто эта задача разобрана на странице экспертизы плагиата исходного кода.
Из сравнения сначала вычитают общее основание, и по этому направлению оно шире привычного: код сторонних компонентов, заготовки, которые среда создаёт сама при добавлении формы или модуля, стандартные конструкции языка, а вдобавок — типовые для отрасли решения. Две складские программы неизбежно похожи составом справочников и схемой данных просто потому, что учёт устроен одинаково, и это не заимствование. Отдельно проверяют версионное родство: обе программы могут восходить к общей ранней версии, и тогда совпадения объясняются происхождением, а не копированием.
Критерии вывода формулируют до сравнения. Значимыми считают совпадения, которые общим основанием не объясняются; каждое проверяют вручную и описывают в заключении поимённо — вывод строится на перечне таких совпадений, а не на проценте сходства. Если после вычитания значимых совпадений не осталось, вывод отрицательный, и его формулируют так же прямо, как положительный. Если общее основание выделить не удалось — не сохранились версии компонентов, неизвестна отраслевая типовая часть, — вопрос остаётся без ответа: это третий законный исход, и он лучше натянутого вывода. Само по себе совпадение направления заимствования не показывает: кто у кого, устанавливают по датам и по истории изменений, а вывод о нарушении прав делает суд.
Когда исполнителя уже нет
Ситуация, невозможная в современных проектах: система работает, а разработчика не найти — организация ликвидирована, автор сменил занятие, договор двадцатилетней давности утрачен. Заказчик остаётся один на один с работающей программой, которую нельзя ни доработать, ни безопасно заменить.
Исследование здесь решает три практические задачи: описать систему настолько подробно, чтобы её можно было воспроизвести или заменить; установить состав данных и способ их выгрузки; зафиксировать, что именно передавалось заказчику по сохранившимся документам. Первую решают по формам, структуре базы и наблюдению за работой; вторую — по самой базе; третью — по документам, и здесь вывод эксперта ограничен тем, что сохранилось.
Что при этом сделать нельзя, эксперт говорит сразу: восстановить исходный текст программы по исполняемому файлу невозможно, и заключение не заменяет ни разработку заново, ни право на код. Кому принадлежат права на систему и вправе ли заказчик её дорабатывать — вопросы правовые, и на них отвечает суд по документам, а не эксперт по программе.
Какие обстоятельства устанавливают по программе на Delphi
Что именно устанавливать, определяет поставленный вопрос. Но перечень возможного по этому языку своеобразен: часть того, что легко даётся в других языках, здесь невозможна, зато возможно другое, и знать это полезно заранее. По программам на Delphi обычно устанавливают следующее:
- состав и устройство экранных форм спорной программы — вплоть до отдельного поля и его свойств;
- перечень модулей и классов, а также использованных сторонних наборов компонентов и их версий;
- структура базы данных со всеми связями, а также содержание хранимых процедур и триггеров;
- какой версией среды собрана программа и собирается ли из переданного текста работающая копия;
- чего недостаёт в переданном комплекте для сборки и что именно мешает ей завершиться;
- совпадает ли спорная программа с переданным исходным текстом по формам, классам и строкам;
- из-за чего программа отказывает, зависает или занимает всё больше памяти — при сценарии, который удалось воспроизвести;
- что изменилось между сохранившимися версиями — в формах, в структуре базы, в наборе модулей;
- какие данные накоплены в базе и в каком виде их можно выгрузить;
- объём собственного кода за вычетом компонентов и заготовок среды — величина техническая, стоимость по ней не выводится. Опознать по готовой программе все компоненты нельзя: часть следов не оставляет, поэтому вычитают не всё чужое, и полученная величина завышена в пользу подрядчика. Эту границу указывают вместе с числом.
За пределами перечня остаётся то, что решает суд: толкование договора, принадлежность прав, существенность недостатка, размер убытков. Технический вывод даёт для этого основание, но не заменяет его. Спор о деньгах выделяют в самостоятельный вопрос — им занимается экспертиза объёма и стоимости работ, при необходимости вместе с экономистом.
Как проверяют соответствие заданию
Проверка каждого требования начинается с выбора объекта, на котором оно вообще проверяемо. По Delphi объектов обычно три — работающая система, база и, если повезло, исходный текст, — и они отвечают на разные вопросы. Выбранный объект указывают в заключении рядом с результатом.
Требования о наличии функции и о её поведении проверяют запуском на стенде: та же версия Windows, копия базы, при необходимости заглушки вместо внешних систем. Требования о составе интерфейса читают по ресурсам форм — это работает и без исходного текста, но подтверждается запуском, потому что описание формы отражает замысел разработчика, а не работающую функцию. Требования о расчётах и правилах ищут сначала в базе: по системам этого класса они чаще реализованы хранимыми процедурами, чем кодом программы. И только требования об устройстве самой программы — «модуль расчёта должен быть выделен» — без исходного текста не проверяются вовсе; подменять их наблюдением за поведением эксперт не вправе и говорит об этом прямо.
Требования, завязанные на данные заказчика или на обмен с другими системами предприятия, выполняют на его площадке — по сценарию, согласованному заранее, и в согласованное время. Работают при этом на копии базы, а не на рабочей: сценарий, выполненный в боевом учёте, создаёт настоящие документы и меняет остатки, и такую проверку потом справедливо оспорят. Если скопировать базу нельзя, ограничиваются действиями, которые ничего не записывают, и это оговаривают в задании. Односторонней проверка быть не должна: по судебной экспертизе лица, участвующие в деле, вправе присутствовать при её производстве, а порядок и время работ на площадке определяет назначивший орган. Возражение другой стороны само по себе результат не отменяет — допустимость и вес эксперимента оценивает суд, но проверка, поставленная без извещения этой стороны, такой оценки почти наверняка не выдержит.
Итог по каждому требованию записывают в одной из четырёх форм: реализовано, реализовано частично, не реализовано, не проверяется на представленных объектах — с указанием объекта, способа и полученного результата. Четвёртая форма по Delphi встречается чаще, чем в языках с восстановимым кодом, и это свойство объекта, а не качество работы эксперта. Существенность недостатка и его влияние на приёмку оценивает суд. Если спор целиком о соответствии заданию и язык значения не имеет, задачу закрывает экспертиза соответствия работ техническому заданию.
Что просят прислать по спору о системе на Delphi
Набор материалов здесь отличается от современных стеков: хранилища исходных текстов у старых систем обычно нет, зато есть дистрибутивы, накопленная база и люди, которые помнят историю доработок.
Программа: дистрибутив, исполняемый файл, исходный текст
Первая часть — то, что было передано заказчику и что у него работает:
- каталог установленной программы целиком, вместе с библиотеками и файлами настроек;
- дистрибутивы всех сохранившихся версий и обновлений, с датами получения;
- исходный текст с файлами форм и файлом проекта, если он передавался;
- перечень сторонних наборов компонентов, если он известен, и документы на их приобретение;
- файлы с отладочными сведениями, если они сохранились рядом со сборкой;
- сведения о версии среды разработки, если исполнитель их сообщал.
База и площадка: где система хранит накопленное
Вторая часть — то, без чего первая объясняет не всё:
- резервная копия базы данных, сделанная штатным средством самой базы;
- описание площадки: версия операционной системы, где стоит база, как подключаются рабочие места;
- журналы приложения и журнал событий Windows за спорный период;
- печатные формы и шаблоны отчётов, если они лежат отдельными файлами;
- техническое задание с приложениями, договор, акты, переписка сторон, инструкции пользователей.
Чего не хватает по вашему спору, скажем после первичного разбора: набор зависит от вопросов, и присылать всё подряд не нужно.
Пароли внутри программы: как отдать материалы и не открыть систему
Порядок передачи такой. До разговора не отправляют ничего: сперва по описанию спора определяют, какие материалы вообще нужны, и лишь затем договариваются о передаче. Идёт она по защищённому каналу и ограниченному кругу лиц — архив шифруют, пароль сообщают отдельно от архива, состав переданного и его контрольные суммы записывают в акт приёмки. Копию рабочей базы не отправляют почтой и не выкладывают в мессенджер.
Дальше начинается то, из-за чего этот раздел вообще есть. У систем такого возраста доступы лежат прямо в файле настроек рядом с программой, а нередко зашиты внутрь самого исполняемого файла. Файлы программы и настроек передают в том виде, в каком они работают: убирать из них пароли нельзя, это изменит исследуемый объект, и другая сторона справедливо на это укажет. Значит, вместе с материалами уезжает и рабочий пароль к базе.
Здесь легко сделать хуже, чем было. Совет «после передачи смените пароль к базе» для современных систем разумен, а для этой — разрушителен: пароль зашит в программу, менять его придётся вместе с новой сборкой, а собрать её, если исходного текста нет и автора не найти, попросту некому. Смена пароля к базе в такой системе означает, что назавтра в неё не войдёт ни одно рабочее место. Поэтому поступают иначе: пароль оставляют, а доступ к базе закрывают снаружи — ограничивают подключение к её сетевому порту рабочими местами предприятия, убирают её из общедоступного сегмента сети, отключают удалённый доступ посторонних к серверу. Меняют только то, что действительно меняется без переделки программы: пароли администраторов сервера, учётные записи Windows, доступ к резервным копиям. Что именно из этого выполнимо, решает ваш системный администратор, и решать это лучше до передачи, а не после.
Объём выгрузки базы — вопрос не изменения объекта, а выбора объектов: таблицы, к спору не относящиеся, в исследование просто не включают, и это согласуют заранее. Если в базе есть персональные данные клиентов, объём определяют по поставленным вопросам, а лишнее обезличивают там, где это не мешает исследованию.
Основание передачи персональных данных зависит от формата работы, и его определяют до отправки, а не после. По судебной экспертизе материалы идут через назначивший орган в рамках производства по делу — это самостоятельное законное основание. Вне судебного производства такого основания само по себе не возникает: одного письменного поручения обработки эксперту, даже с перечнем разрешённых действий, целями и обязанностью соблюдать конфиденциальность, недостаточно — поручение описывает, как обрабатывать, но не заменяет основания, по которому данные вообще передаются. Годится ли для вашего случая согласие субъектов, иное предусмотренное законом основание или передача только обезличенных данных — вопрос к вашему юристу, и решить его нужно до выгрузки.
Возврат или уничтожение переданного и срок хранения фиксируют в договоре до начала работы — не после. Отдельно о разглашении: соглашение о конфиденциальности связывает эксперта, но не участников дела. Материалы, поступившие в суд, доступны сторонам, и закрытое заседание этого не меняет — оно закрывает зал от посторонних, а не дело от оппонента. Если раскрытие для вас неприемлемо, обсудите со своим юристом другие пути: ограничить объём передаваемого поставленными вопросами, просить об исследовании на вашей территории без вывоза носителей, поставить вопрос о неразглашении перед судом до передачи.
Как идёт работа: от приёмки материалов до выводов
Последовательность важна сама по себе: по старым системам многое выясняется только на стенде, и шаги выстроены так, чтобы к дорогой части не переходить, пока не установлено, из чего вообще состоит объект. Каждый шаг должен повторить другой специалист. Порядок такой:
- Приёмка: пересчитывают контрольные суммы, записывают, откуда взята каждая копия и кто её снимал.
- Опознание объектов: что перед экспертом — дистрибутив, установленная программа, исходный текст, база; какой версией среды собрана программа и какие компоненты в ней использованы.
- Извлечение ресурсов форм и перечня классов из исполняемого файла, чтение структуры базы вместе с хранимыми процедурами.
- Подъём стенда: та же версия Windows, копия базы, рабочее место с программой — и проверка, что система вообще запускается.
- Попытка сборки из переданного текста, если он есть, с фиксацией того, чего для неё недостало.
- Проверка требований — каждое тем способом, который для него применим, с записью условий, при которых получен результат.
- Проверка альтернативных объяснений: настройки, данные, версия Windows, действия пользователей.
- Выводы строго в пределах поставленных вопросов, с отдельным перечнем того, что установить не удалось и почему.
Ограничения по Delphi называют всегда, даже когда они не помешали: невозможность восстановить исходный текст, отсутствие отладочных сведений, недостающие компоненты, невозможность запустить систему на современном оборудовании. Читатель заключения должен видеть не только то, что установлено, но и то, на чём это установлено.
Как формулируют вопросы по программе на Delphi
Одна ошибка портит здесь больше вопросов, чем все остальные вместе: у эксперта просят прочитать в готовой программе то, что из неё не читается. «Каким алгоритмом начисляется надбавка» — при отсутствии исходного текста ответа не будет. «Какие поля содержит форма начисления надбавки, к каким таблицам базы она обращается и какой результат даёт при исходных данных, приведённых в приложении» — тот же спор, тот же материал, но вопрос решаемый.
Поэтому сначала выясняют, какие объекты уцелели, и только потом пишут вопросы. Объект называют поимённо — архив с контрольной суммой, дистрибутив с указанием происхождения, файл базы, — а рядом ставят проверяемый критерий: пункт задания, требование договора, инструкцию пользователя. Свои вопросы и кандидатуру эксперта сторона вправе представить суду до назначения, и отклонение предложенных вопросов суд обязан мотивировать — поэтому формулировки готовят заранее, а не после определения. Окончательный круг вопросов при судебной экспертизе определяет суд, а в иных предусмотренных законом процедурах — орган или лицо, назначившие экспертизу; эксперт отвечает в пределах специальных знаний и представленных материалов и при неясности вопроса сообщает об этом назначившему органу. Помощь с формулировками возможна до назначения; перечни под смежные задачи собраны на страницах экспертизы качества исходного кода и экспертизы плагиата исходного кода. По спорам о системах на Delphi чаще всего ставят такие вопросы:
- Возможно ли из содержимого архива с контрольной суммой SHA-256 … собрать работающую программу, представленную файлом …; если нет, каких файлов проекта, наборов компонентов или версий среды разработки для этого недостаёт?
- Какие экранные формы и поля содержит программа, представленная файлом …, и к каким объектам базы данных, представленной файлом …, она обращается?
- Соответствует ли программа, представленная файлом …, требованиям пунктов … технического задания (приложение № … к договору от …); проверка каждого требования выполняется на объекте, для него применимом, с указанием такого объекта?
- Содержит ли база данных, представленная файлом …, тексты хранимых процедур и триггеров; если да, какие расчёты и проверки в них реализованы?
- Совпадают ли программы, представленные файлами … и …, по составу экранных форм, перечню классов и структуре базы данных; какие совпадения не объясняются использованием общих наборов компонентов и заготовок среды разработки?
- Чем вызван отказ программы …, запись о котором содержится в журнале … , при выполнении действий, описанных в … ?
- Какие сведения, накопленные в базе данных …, и в каком виде могут быть выгружены для переноса в иную информационную систему?
Форматы работы: что выбирают по старым системам
От стадии спора зависит и цена, и то, какой объект вообще доступен. По системам этого возраста разница между «до иска» и «после назначения» больше, чем в любом другом направлении: пока спор не начался, у заказчика на руках вся система целиком, а после назначения половина материалов оказывается у другой стороны.
Поэтому первым форматом чаще берут не исследование, а письменную консультацию по материалам. Она отвечает на единственный вопрос — что удастся установить по тому, что уцелело, — и по Delphi этот вопрос решающий: часть спорных обстоятельств по готовой программе не устанавливается в принципе, и узнавать об этом после оплаты экспертизы поздно. Консультацию не путают с бесплатным разбором: разбор устный, по описанию спора, без изучения файлов и без документа на руки; консультация даёт письменный ответ эксперта, на который можно ссылаться в ходатайстве.
Внесудебное исследование по договору идёт следующим шагом и полезно ровно тем, что его материалы собирает сам заказчик — на своей площадке, в своём темпе, включая точную копию базы, которую после назначения экспертизы получить будет уже сложнее. Судебную экспертизу назначают определением суда или постановлением органа расследования: эксперт предупреждается об уголовной ответственности за заведомо ложное заключение, а материалы поступают через назначивший орган.
Если по делу уже есть чужое заключение, его разбирают рецензированием — подробнее на странице рецензии на заключение о процессе разработки. Сама по себе рецензия ничего не отменяет, она обосновывает ходатайство: о вызове эксперта для пояснений, о дополнительной экспертизе при неполноте или неясности заключения, о повторной — при сомнениях в обоснованности заключения или противоречиях в выводах. Заранее установленной силы у заключения нет, суд оценивает его наряду с остальными доказательствами.
После назначения экспертизы прямое общение со стороной прекращается: назначенный эксперт не берёт материалы из её рук, не высказывает частных оценок по существу поручения, а доступ к серверу с работающей системой запрашивает через суд. Если специалист раньше работал на одну из сторон, это раскрывают при рассмотрении его кандидатуры; назначает и отводит эксперта назначивший орган.
Из чего складываются стоимость и срок
Расчёт здесь задаёт не размер программы, а подготовка: сколько времени уйдёт, прежде чем эксперт увидит объект в работе.
Первое обстоятельство — есть ли исходный текст. С ним разбор предсказуем: эксперт читает код и сверяет его с программой. Без него исследование строится на ресурсах форм, структуре базы и наблюдении за поведением; это дольше, а часть вопросов остаётся без ответа, и предупредить об этом честнее до начала, чем после.
Второе — возраст системы, и по Delphi он решает больше всего. Программе двадцатилетней давности нужно окружение той же эпохи: старая версия Windows в виртуальной машине, промежуточный слой доступа к данным, иногда аппаратный ключ защиты, без которого программа просто не запускается. Собрать такой стенд дольше, чем разобрать саму программу, и это отдельная позиция сметы.
Третье — нужен ли выезд на площадку. Проверки на работающей системе согласуются по времени, порядку и участникам, выполняются на копии базы и без ваших людей не проходят; это отдельная позиция сметы, как и участие специалиста в заседании.
Ориентир для судебной экспертизы — от 100 000 ₽, ориентировочный срок — 10 рабочих дней. По судебной экспертизе порядок оплаты другой, чем по договору: размер вознаграждения определяет суд, а деньги вносятся на депозитный счёт суда стороной, заявившей ходатайство, до назначения. Оговорка по срокам обязательна: ориентир рассчитан на систему, которую удаётся поднять на обычном оборудовании. Если под неё нужно собирать отдельное окружение со старой операционной системой, срок сдвигается, и насколько — говорят после разбора, до подписания договора, а не по ходу работы.
Отдельно об исходе «на представленных материалах не проверяется». По Delphi он вероятнее, чем в других языках, и это тоже результат работы: эксперт указывает, какого объекта или условия не хватило, вывод оплачивается наравне с любым другим и показывает суду, где именно оборвалась цепочка. Чтобы такого исхода было меньше, состав материалов и определяют на бесплатном разборе, а не по телефону в день обращения.
На руки вы получаете заключение — сшитый документ с описанием объектов, применённых методов, хода исследования и выводов по каждому поставленному вопросу, с приложениями: перечнем материалов, контрольными суммами, снимками экранов и распечатками. Число экземпляров и способ передачи оговаривают в договоре: по судебной экспертизе заключение направляется назначившему органу, по внесудебному исследованию — заказчику.
Чтобы получить расчёт, архивы собирать не надо. Хватит описания спора, названия системы и перечня того, что у вас на руках: договор, задание, переписка, дистрибутивы. Позвоните по номеру 8 (800) 333-24-09 или оставьте заявку — скажем, относится ли задача к нашей компетенции, какое направление её закрывает, что стоит сохранить сегодня и каких данных не хватает для расчёта.
Проведение экспертизы по уголовному делу
Судебная экспертиза по уголовному делу производится государственными судебными экспертами и иными экспертами из числа лиц, обладающих специальными знаниями.
Негосударственными судебно-экспертными учреждениями постановление Пленума Верховного Суда Российской Федерации от 21 декабря 2010 г. № 28 «О судебной экспертизе по уголовным делам» признаёт некоммерческие организации, созданные в соответствии с Гражданским кодексом Российской Федерации и Федеральным законом «О некоммерческих организациях» и осуществляющие судебно-экспертную деятельность в соответствии с принятыми ими уставами.
По сведениям организации, проведение судебных экспертиз предусмотрено её уставом (см. действующую редакцию в разделе «Документы организации»). Это само по себе не означает автоматического поручения любой экспертизы. Возможность поручить конкретное исследование определяет назначающий орган с учётом предмета дела, квалификации эксперта, оснований для отвода и действующего перечня экспертиз, выполняемых только государственными судебно-экспертными организациями.