⟨/⟩ 50_Domain/Export/AbisSampleAnalysis.cs

269 строк · в начало

using Ban.Sdaid.Notation.Documents;
using Ban.Sdaid.Icd.Domain.Cards;
using Ban.Sdaid.Icd.Domain.Cards.Template.Vocabularies;

namespace Ban.Sdaid.Icd.Domain.Export
{
    /// <summary>
    /// Разбор образца, переданного заказчиком: три карты, файл для АБИС по ним и макет.
    /// Правило перевода «поле карты → поле АБИС», восстановленное сверкой трёх источников.
    /// </summary>
    public class AbisSampleAnalysis : ISdaidDocument, IHasStructuralLinks
    {
        public static string _refName = "разбор образца выгрузки в АБИС";

        public string Name => "Разбор образца выгрузки в АБИС";

        public string Description =>
            @"Подполе за подполем: что стоит в файле заказчика, что должно стоять по кадрам карт, какое правило из этого следует и где источники расходятся.";

        public string Version => "0.1";
        public string Status => "draft";

        public string[] Comments => new[]
        {
            "2026-09-04. Заведён по материалам заказчика: кадры трёх карт, файл для АБИС на них же, макет с пометками полей.",
        };

        public SdaidLink[] Links => new[]
        {
            Rel.Uses<CardExportSpec>(),
            Rel.Uses<InformationCardSpec>(),
            Rel.Uses<VocabularyCatalog>(),
        };

        public static string S1_Purpose = $"""
            ## Зачем этот разбор

            Заказчик передал три вещи разом: кадры трёх карт на книги, один файл для АБИС,
            сделанный по этим же трём картам, и макет бланка с пометками полей. Ценность — в связи:
            по ней проверяется, какое правило превращает карту в текст.

            Макет спецификацией не является. Он описывает бланк и в нескольких местах расходится
            с тем, что в файле; где расходится — верен файл, потому что его принимает АБИС.

            Разбор — материал для спецификации конвертера, а не сама спецификация: у них разный срок
            жизни. Разбор останется как есть, спецификация будет меняться.

            Карта на входе — {SdaidAnchors.RefTo<InformationCardSpec>()}, коды значений —
            {SdaidAnchors.RefTo<VocabularyCatalog>()}. Файлы — в `Export/Source/`.
            """;

        public static string S2_Material = """
            ## Материал

            | Карта | Кадры | Запись в файле | Что за издание |
            |---|---|---|---|
            | **531** | `Cards/260531/` | 1-я, `#920: SPEC` | Perrault, «Paralelle des anciens et des modernes», т. 1, Париж, 1692 |
            | **532** | `Cards/260532/` | 2-я, `#920: SPEC` | то же издание, т. 2, 1693 |
            | **048** | `Cards/26048/` | 3-я, `#920: PAZK` | Sweertius, «Selectae christiani orbis deliciae», Кёльн, 1608 |

            Файл `AbisFile/260531_260532_26048.TXT` — UTF-8 с BOM, CRLF, три записи, разделитель
            `*****`. Строка — одно поле: `#` + номер + `:` + пробел + значение; подполя — `^` + буква
            + текст до следующего `^`. Порядок полей в записи не значим: в трёх записях он разный.

            **Файл на три карты — АБИС принимает пачку.** Имя файла — инвентарные номера через `_`.

            Карты 531 и 532 — два тома одного издания: инвентарный номер один (`26053`), тома
            различает `910^N`. Имена папок с кадрами — склейка номера и тома, а не инвентарный номер.
            """;

        public static string S3_Table = """
            ## Подполе за подполем

            Ряд — подполе. «Файл» — что стоит в переданном файле; **«По правилу» — что получится,
            если применить правило к кадру карты**, а не то, что на кадре написано. Значения помечены
            картой: **531**, **532**, **048**; «то же» означает, что правило даёт ровно файл.

            Пустая клетка «Файл» — правило даёт значение, а в файле его нет. Пустая клетка
            «По правилу» — правило не установлено либо оно не даёт ничего, а в файле значение есть.

            | Поле | Подполе | Значения (файл) | Значения (ожидаемые по правилу) | Правило | Расхождения |
            |---|---|---|---|---|---|
            | `920` | — | 531 `SPEC` · 532 `SPEC` · 048 `PAZK` | то же | заполнена графа «номер алл./тома» → `SPEC`, пуста → `PAZK` | — |
            | `101` | — | 531 `fre` · 532 `fre` · 048 `lat` | то же | код языка из `jz.mnu` по графе «Язык издания» («франц.», «латин.») | — |
            | `910` | `^A` | всюду `0` | то же | всегда заполняется константой `0` | на бланке источника нет, способ заполнения не указан |
            | `910` | `^D` | всюду `RADZIF_ОФО` | то же | код места хранения экземпляра | на бланке источника нет, способ заполнения не указан |
            | `910` | `^B` | 531 `26053` · 532 `26053` · 048 `26048` | то же | графа «Инв. номер» | — |
            | `910` | `^R` | 531 `IDa/XIII` · 532 `IDa/XIII` · 048 `IDa/XI` | то же | строка из графы «Шифр»: кириллица преобразуется к латинице, пробелы удаляются | рукописную строку 531 `I Да /XIII` · 532 `I Да /XIII` · 048 `I Да /XI` надо преобразовывать: шифр записан с использованием кириллицы и содержит пробелы, в файле ожидается латиница без пробелов |
            | `910` | `^N` | 531 `1` · 532 `2` | то же | графа «номер алл./тома»; графа пуста — подполе не пишется, поэтому у однотомника его нет | — |
            | `907` | `^C` | всюду `КОН` | то же | всегда заполняется константой `КОН` | на бланке источника нет, способ заполнения не указан |
            | `907` | `^A` | 531 `20101122` · 532 `20101122` · 048 `20101101` | 531, 532 — то же · 048 `20101201` | графа «Дата», приведённая к `ГГГГММДД` | **048: на карте `1.XII.10`, в файле ноябрь** |
            | `961` | `^Z` | 531 `ДА` · 532 `ДА` | то же | всегда заполняется константой `ДА` в первом повторении поля | на бланке источника нет, способ заполнения не указан |
            | `961` | `^A` | 531 два поля: `Perrault`; `Coignard` · 532 `Perrault` | 531 `Perrault` · 532 `Perrault` | первую подстроку или первую строку до `,` в графе «Автор» считаем фамилией | не понятно, как получить ожидаемое значение из строки `Perrault [Charles] de l'Académie Françoise`. Второе повторение поля с издателем правилом не предусмотрено |
            | `961` | `^B` | 531 два поля: `C.`; `J. B.` · 532 `C.` | пустая строка | остаётся пустым: всё, что не фамилия, пишется в `961^G` | способ заполнения не известен |
            | `961` | `^G` | 531 два поля: `Charles`; `Jean Baptist` · 532 `Charles` | 531 `[Charles] de l'Académie Françoise` · 532 то же | остаток графы «Автор» после фамилии | в файле стоит `Charles`: скобки сняты, хвост `de l'Académie Françoise` отброшен — способ заполнения не известен |
            | `961` | `^4` | 531 `570 изд.` | — | способ заполнения не известен | на бланке источника нет, способ заполнения не указан |
            | `200` | `^F` | 048 `Per Franciscvm Sweertivm E Antverpiensem` | — | способ заполнения не известен | в карте этого текста нет, способ заполнения не указан |
            | `200` | `^V` | 531 `T.1` · 532 `T.2` | то же | графа «номер алл./тома» у многотомника | — |
            | `200` | `^A` | 048 `Selectae christiani orbis deliciae ex Vrbibus, Templis, Bibliothecis, et aliunde` | 048 `Selectae christiani orbis deliciae ex Urbibus, …` | графа «Заглавие» однотомника | на карте строка оборвана многоточием, в файле заглавие полное: чем оно дописано, не установлено |
            | `461` | `^C` | 531 `Paralelle des anciens et des modernes… Et une Epistre en Vers sur le Genie` · 532 `Paralelle des anciens et des modernes en ce qui regarde l'eloquence` | то же | графа «Заглавие» многотомника | — |
            | `461` | `^D` | 532 `A Paris [Paris]` | 531 `Paris` · 532 `Paris` | графа «Место издания» | **531: подполя нет**, хотя графа заполнена. У 532 в файле `A Paris [Paris]` — откуда предлог и повтор в скобках, не установлено |
            | `461` | `^F` | 532 `Par M. Perrault, de l'Académie Françoise` | — | способ заполнения не известен | в карте этого текста нет, способ заполнения не указан |
            | `461` | `^G` | 532 `Chez la Veuve de Jean Baptiste Coignard… ruё S. Jacques á la Bible d'or` | 531, 532 — текст графы «Издатель» | графа «Издатель» | **531: подполя нет**, хотя графа заполнена. У 532 в файле к издателю добавлена графа «Типография» и слова `Chez`, `Et` — способ не установлен |
            | `461` | `^H` | 532 `1692` | 531 `1692` · 532 `1693` | графа «Год издания» | **531: подполя нет**, хотя графа заполнена. У 532 в файле стоит год первого тома |
            | `461` | `^Z` | 532 `1697` | — | способ заполнения не известен | в карте этого года нет, способ заполнения не указан |
            | `461` | `^P` | 532 `seconde edition` | 531, 532 — то же | приписка справа от графы «Заглавие» | **531: подполя нет**, хотя приписка на карте есть |
            | `461` | `^R` | 532 `16 см` | 531, 532 `16 (8°)` | графа «Формат» | **531: подполя нет**, хотя графа заполнена. У 532 в файле `16 см`: единица дописана, `(8°)` отброшено |
            | `461` | `^X` | 532 `Perrault, Charles` | 531, 532 `Perrault, [Charles] de l'Académie Françoise` | графа «Автор» в форме «фамилия, имя» | **531: подполя нет**, хотя графа заполнена. У 532 скобки сняты и хвост отброшен — то же, что в `961^G` |
            | `210` | `^A` | 048 `Köln` | то же | графа «Место издания»; нет города — `Б.м.` | у 532 место ушло в `461^D`, у 531 его нет ни в одном поле |
            | `210` | `^C` | 048 `Gvalteri Bernardi` | то же | графа «Издатель»; нет издательства — `Б.и.` | у 532 издатель ушёл в `461^G`, у 531 — во второе повторение `961`: три способа на три записи |
            | `210` | `^G` | 048 `Agrippinae Sumptivus` | то же | графа «Типография» | у 532 типография слита с издателем в `461^G`, у 531 её нет ни в одном поле |
            | `210` | `^D` | 531 `1692` · 532 `1693` · 048 `1608` | то же | графа «Год издания» — единственное, что у многотомника остаётся в `210` | — |
            | `215` | `^A` | 531 `[40], 252, 34` · 532 `[20], 399, [1]` · 048 `[32], 673, [23]` | то же | графа «Количество страниц» | почерк неразборчив, числа требуют сверки |
            | `215` | `^1` | всюду `c.` | то же | всегда заполняется константой `c.` | на бланке источника нет, способ заполнения не указан |
            | `215` | `^D` | 048 `16 см` | 048 `16 см (8°)` | графа «Формат» у однотомника | в файле отброшено `(8°)` — способ не установлен. **Макет говорит `215^F`** |
            | `398` | `^A` | 531 `Ex Bibliotheca Ducali Radivilliani Nesvisiensi (60×45 мм)` | 531, 532 `Ex Bibliotheca Ducali Radivilliana Nesvisiensi (6×4 см)` | графа «Описание экслибриса» | **532: подполя нет**, хотя графа заполнена. У 531 размер пересчитан в миллиметры (и `6×4 см` дало `60×45`, а не `60×40`), окончание `Radivilliana` заменено на `Radivilliani` |
            | `396` | — | 048 `Adscriptus Bibliothecae Arcis Nesvisiensis Cathalogo` | — | не установлено: графа «Др. свидетельства принадлежности» — только клетка, текста на бланке нет | отметка стоит на всех трёх картах, а поле есть лишь у 048, и с текстом неизвестного происхождения. В образце поле без подполя `^A` |
            | `316` | `^A` | 531 — 11 строк · 532 — 6 · 048 — 1 | 048 — то же · 531 — 5 строк · 532 — 2 | каждый комментарий графы «Комментарии» — отдельное повторение поля | **в файле больше, чем на карте:** переплёт, каптал, обрез, следы пожара — этого в графе нет, данные пришли не с бланка |
            | `316` | `^G` | 048 `1` | 048 — то же · 531, 532 `1` | отметка наличия элемента данных → `1`; может стоять в строке комментария | **531, 532: потеряно** |
            | `316` | `^D^E^F^H` | — | — | «Первонач. акад. штамп», «Камерный каталог», «Маргиналии», «Рукописные листы»: клетки не отмечены — подполя не пишутся | — |
            | `140`/`141` | — | — | — | «Иллюстрации», «Отд. листы», «Конволют»: клетки не отмечены — поля не пишутся | — |
            | `318` | `^A` | всюду `0` | то же | всегда заполняется константой `0` | на бланке источника нет, способ заполнения не указан; по макету `^A` — «Реконструкция», но эта клетка не отмечена ни на одной карте |
            | `318` | `^D` | 531 `1` · 532 `1` | 531, 532 — то же · 048 `1` | «Реставрация» книги, задано | **048: потеряно** |
            | `318` | `^E` | 531 `1` | 531 — то же · 532 `1` | «Ремонт» книги, задано | **532: потеряно** |
            | `318` | `^I` `^J` | всюду `2` | то же | «Гигиенич. обработка», «Помещение в контейнер» | — |
            | `318` | `^L` | всюду `1` | то же | переплёт, «Реставрация», задано | — |
            | `318` | `^N` | всюду `2` | то же | переплёт, «Чистка» | — |
            | `318` | `^O` | 531 `2` · 532 `2` | то же | переплёт, «Умягчение» | — |
            | `318` | `^P` | 048 `1` | то же | блок, «Реставрация», задано | — |
            | `318` | `^R` | 531 `1` · 532 `1` | то же | блок, «Ремонт», задано | — |
            | `318` | `^T` | всюду `a` | то же | условия хранения, «выполнено»; значение — код условия (`a` вертикальное) | `^S` («задано») не пишется, когда отмечены обе клетки |
            | `393` | `^A^B^C` | 531 и 532 `162` `100` `61` · 048 `163` `108` `62` | то же | размеры переплёта, мм | на бланке перед ними ещё число (`12548`, `5460`) — в файл не идёт |
            | `393` | `^D` | всюду `b` | то же | состояние переплёта, `sost1.mnu` | — |
            | `393` | `^E` | всюду `b` | то же | состав, `sostav.mnu` | — |
            | `393` | `^F` | 531 и 532 `a` · 048 `b` | то же | материалы покрытия, `matpok.mnu` | графа «Переплет» на 1-м листе — свободный текст («Радзивиллов»), материал берётся со 2-го листа; на 048 туда вписали материал |
            | `393` | `^G` | всюду `b` | то же | материалы основы, `matosn.mnu` | — |
            | `393` | `^I` | 531 `b` · 532 `b` | то же | декор, тиснение, `dekor1.mnu` | **макет говорит `^H`** |
            | `393` | `^K` | 048 `b` | то же | декор, украшения, `dekor2.mnu` | **макет говорит `^J`** |
            | `393` | `^N` | всюду `b` | то же | декор, обрез, `dekor3.mnu` | **макет говорит `^M`** |
            | `393` | `^P`…`^X` | 531 `b c d e g h i` · 532 то же · 048 `b c d e f g i h i` | всюду `b c d e f g h i` | **множественная отметка раскладывается по подполям подряд от `^P` к `^X`, значение — код из `fismat1.mnu`.** Буква — позиция, смысла не несёт | **531, 532: потеряно «Затеки» (`f`), раскладка начата с `^Q`.** 048: `i` дважды и лишнее `b` — похоже, так записали «Карбонизирован» |
            | `393` | `^Y` | всюду `3` | то же | степень физ.-мех. повреждения, `stpov.mnu` | — |
            | `393` | `^4` | 531 `a` · 532 `a` | то же | энтомологические, `enm.mnu` | — |
            | `393` | `^8` | 531 `1` · 532 `1` | то же | степень энтомологических, `stpov.mnu` | — |
            | `393` | `^Z` `^3` | — | — | микробиологические и их степень: клетки не отмечены — подполя не пишутся | — |
            | `394` | `^A` | 048 `b` | 048 — то же · 531, 532 `b` | состояние блока, `sost2.mnu` | **531, 532: потеряно** |
            | `394` | `^B` | 531 `c` | 531 — то же · 532, 048 `c` | тетради, `tet.mnu` («Нарушено шитьё») | **532, 048: потеряно** |
            | `394` | `^E` | 531 `a` · 532 `a` | то же | листы, `list.mnu` («Выпадают») | — |
            | `394` | `^D` `^F` `^G` | 531 `c` `c` · 532 `c` `c` `c` · 048 `c` `c` | — | способ заполнения не установлен | на бланке нет отметки, которая давала бы эти подполя; число подполей у трёх карт разное |
            | `394` | `^J^K^L^O` | всюду `d f g e` | всюду `d e f g` | физ.-мех. повреждения блока, `fismat2.mnu`, раскладка по подполям подряд | буквы идут `J K L O` — `M` и `N` пропущены |
            | `394` | `^R` | 531 `1` · 532 `2` · 048 `1` | то же | степень физ.-мех. повреждения блока, `stpov.mnu` | — |
            | `392` | `^A` | 531 `6.95` · 532 `7.01` (без подполя) · 048 `7.19` и `7.30` | то же | величина pH; каждый замер — отдельное повторение поля | **532: подполе `^A` опущено** |
            | `399` | `^f^g^h` | всюду `Консерватор` `20101207` `Ефимова Ю.А.` | то же | строка экспертизы: эксперт, дата, ФИО | эксперт записан текстом, хотя `exp.mnu` даёт код `К`; ФИО текстом, хотя `isp.mnu` даёт код |
            | `399` | `^i` | 531 `без изменений` | — | графа «Результат» строки экспертизы; графа пуста — подполе не пишется | значение есть в файле, а на бланке источника нет: способ заполнения не указан |
            | `399` | `^j` | 531 `выпадают отдельные листы - ремонт` | то же | комментарий | — |
            | `399` | `^C^D^E` | всюду `20101208` `ЛЕЮ` `отр.` | то же | строка мониторинга: дата, исполнитель, результат | **исполнитель здесь кодом `isp.mnu`, а в строке экспертизы — текстом** |
            | — | — | — | — | правила нет: «Карбонизирован» приписано от руки вне клеток бланка | приписка стоит на всех трёх картах, дважды на каждой, и не выгружается совсем |
            | — | — | — | — | правила нет: число перед длиной, шириной и высотой («12548», «5460») | графа заполнена на всех трёх картах и не выгружается совсем; назначение её не установлено |
            """;

        public static string S4_Rules = """
            ## Что из этого следует

            **Множественная отметка раскладывается по подполям подряд.** Внутри поля подполе
            не повторяется, поэтому каждая отмеченная клетка занимает свою букву: физ.-мех.
            повреждения переплёта — от `^P` к `^X`, блока — от `^J`. Буква не значит ничего,
            значение — код справочника. Это ровно то место, где макет описывает другое устройство
            (одно подполе `^P` со значениями), и он неверен.

            **Одиночная отметка даёт признак `1`, групповая — код своей группы.** «Записи есть» —
            `316^G1`; «переплёт повреждён» — `393^Db`. Неотмеченное не выгружается: пустых подполей
            в файле нет.

            **Пара «задано / выполнено» сворачивается в одно подполе.** Отмечено «задано» — значение
            `1`, отмечены обе — `2`; «выполнено» без «задано» в образце не встретилось. Условия
            хранения устроены иначе: два подполя, `^S` задано и `^T` выполнено, значение — код условия.

            **Выходные данные зависят от вида записи.** У однотомника место, издатель, типография
            и год — в `210`, формат — в `215^D`. У многотомника в `210` остаётся только год, всё
            остальное собирается в `461`, а формат уходит в `461^R`.

            **Пять подполей заполняются константой:** `910^A` = `0`, `318^A` = `0`, `907^C` = `КОН`,
            `961^Z` = `ДА`, `215^1` = `c.`. Источника на бланке нет ни у одного, и во всех трёх
            записях образца значение одно и то же, но способ заполнения нигде не указан. Правило
            снято с образца и подлежит подтверждению.

            **Строка «Автор» делится надвое.** Фамилия — первая подстрока либо первая строка
            до запятой; всё остальное идёт в `^G` целиком, `^B` остаётся пустым. Разбирать остаток
            на личные имена, отчества и звания правило не пытается: признака, по которому одно
            отделяется от другого, в материале нет.

            ```csharp
            /// <summary>Разбор графы «Автор» на подполя 961 (700, 702).</summary>
            public static AuthorSubfields Parse(string source)
            {
                // Графа пуста — поле не пишется вовсе (карта 048).
                if (string.IsNullOrWhiteSpace(source))
                    return AuthorSubfields.None;

                // ^A: первая подстрока либо первая строка до запятой.
                // «Perrault [Charles] de l'Académie Françoise» → «Perrault»
                var surname = source.Split(',')[0].Split(' ')[0];

                // ^G: остаток строки целиком. ^B: пусто.
                var rest = source[surname.Length..].Trim();

                return new AuthorSubfields(surname, initials: string.Empty, expanded: rest);
            }
            ```

            Образцу это правило не соответствует: в файле `^B` = `C.`, а `^G` = `Charles` — то есть
            скобки сняты, хвост `de l'Académie Françoise` отброшен, имя сокращено до инициала.
            Каким способом, неизвестно, и из трёх записей не выводится. То же с издателем: как из
            фразы `La veuve de Jean Baptiste Coignard, Imprimeur du Roy…` получаются `Coignard`
            и `Jean Baptist`, правило не объясняет.

            **Даты приводятся к восьми цифрам.** На бланке они написаны как угодно: `8.12.2010`,
            `07.12.10`, `22.XI.10`.

            **Справочное значение выгружается кодом.** Язык — `fre`, исполнитель — `ЛЕЮ`, материал —
            `a`. Исключение — эксперт и его ФИО в строке экспертизы: там текст, хотя справочники есть.
            """;

        public static string S5_Quality = """
            ## Насколько образцу можно верить

            Правило восстановилось почти везде, и это само по себе результат: большинство подполей
            сошлось с кадрами точно, включая всю консервацию и все справочные коды. Отсутствие поля
            там, где графа на бланке пуста, — тоже совпадение: у карты 048 нет автора, и поля `961`
            в записи нет.

            Но **в файле не хватает двенадцати отметок, которые на картах стоят**: состояние блока
            у двух карт, «Затеки» у двух, «Нарушено шитьё» у двух, экслибрис, свидетельства
            принадлежности, отметка «Записи», формат первого тома, две отметки консервации.
            Плюс дата карты 048 сдвинута на месяц, а издатель записан двумя способами: у 531 —
            персоной во втором повторении `961`, у 532 — текстом в `461^G`.

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

            Обратное тоже верно: в файле есть то, чего на карте нет — одиннадцать комментариев
            против пяти у карты 531, результат экспертизы «без изменений», `961^Z`, `907^C`.
            Часть данных пришла не с бланка, а из записи АБИС.

            **Отсюда главный вопрос к заказчику: считается ли этот файл эталоном?** Если да, наши
            расхождения — ошибки конвертера, которых мы не должны допустить. Если нет — эталон нужен
            другой, и сверять правило не с чем.
            """;

        public static string S6_Questions = """
            ## Открытые вопросы

            | № | Вопрос | Почему важно |
            |---|---|---|
            | OQ-EX-1 | Считается ли переданный файл эталоном? Двенадцать отметок с карт в него не попали | иначе не с чем сверять готовый конвертер |
            | OQ-EX-2 | Сколько подполей отведено под множественную отметку и что делать, когда отмечено больше, чем есть букв? | у переплёта их девять, у блока — неизвестно |
            | OQ-EX-3 | `910^A`, `318^A`, `907^C`, `961^Z`, `215^1` — всегда константы или зависят от чего-то, чего нет в образце? Чем заполняется `961^4` | сейчас конвертер будет писать первые пять константой, а `961^4` — нечем |
            | OQ-EX-4 | Что значат `394^D`, `^F`, `^G` со значением `c`? | на бланке нет отметки, которая их порождает |
            | OQ-EX-5 | Эксперт и ФИО — код справочника или текст? В соседних строках по-разному | от этого зависит, нужен ли справочник экспертов при выгрузке |
            | OQ-EX-6 | Обязательно ли подполе `^A`, если оно в поле единственное? В образце `392` и `396` встречаются без него | принимающая сторона может быть строже |
            | OQ-EX-7 | Куда девать написанное вне клеток? «Карбонизирован» стоит на всех трёх картах | существенное свойство, а места ему нет |
            | OQ-EX-8 | Что такое число перед размерами («12548», «5460»)? | графа заполнена на всех картах и никуда не выгружается |
            | OQ-EX-9 | Задан ли формат шифра — латиница, римская цифра, разделитель? | по нему строится преобразование рукописной строки и проверка результата |
            | OQ-EX-10 | Что писать в `^B` и `^G`: остаток строки целиком или разобранные имя и инициалы? В образце — второе, но способ разбора не известен. И как из фразы графы «Издатель» получается персона, а у второго тома та же фраза уходит текстом в `461^G`? | от ответа зависит, нужен ли справочник личных имён |
            | OQ-EX-11 | Какого объёма пачка и по какому признаку карты в неё собираются? | это устройство расписания выгрузки |
            """;
    }
}