Files
zuevav da12a9ec1c feat(bj): модуль ЛК на PostgreSQL, обмен с DEPO, боевой ЛК с имитатором НРД, QUIK, НПР
- bj_exchange и «кран» Fancy убраны: данные модуля ЛК в PostgreSQL (схема lk)
- трансферные таблицы FTV_M2M: создание при установке, события, справочник участников
- сверка с DEPO: счёт, ФИО, дата рождения, ИИС по договору, квал-инвестор из опции DEPO
- боевой ЛК ЕСИА Финанс при тестовом ИШ: журнал, отказ через DEPO, статусы в ЛК
- онлайн-лицензирование в bj, план тестирования M2M для контрагента (интерактивный HTML)
- модули QUIK МНП, экспорт QUIK, НПР/УДС; документы и тестовые материалы

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-15 19:41:12 +03:00
..

internal/nsdxml — сериализация и парсинг XML по правилам НРД

Что реализовано

  • Marshal(v) ([]byte, error) / Unmarshal(data, v) error — сериализация и разбор XML с прологом <?xml version="1.0" encoding="windows-1251"?>. Unmarshal понимает как windows-1251, так и UTF-8 на входе через CharsetReader.
  • Кодек windows-1251 (собственный, без внешних зависимостей): EncodeWindows1251, DecodeWindows1251. Таблица соответствия CP1251 ↔ Unicode для байтов 0x80..0xFF. Руны, не выразимые в CP1251, приводят к ошибке ErrUnmappable.
  • CharsetReader(charset, input) — пригодно к использованию в xml.Decoder.CharsetReader. Поддерживает windows-1251, cp1251, utf-8, отсутствие charset; на другие — ошибка.
  • NSDDateTime — отметка времени НРД формата YYYY-MM-DDThh:mm:ss(МСК[+-N]), regex из XSD: [0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])T([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]\(МСК([+-][0-9]{1,2})?\). Реализованы MarshalXML, UnmarshalXML, MarshalText, UnmarshalText, String, Now. Сохраняет различие между «(МСК)» без сдвига и «(МСК+0)» через OffsetSpecified.

Кодек windows-1251

Реализован через штатный golang.org/x/text/encoding/charmap.Windows1251. Изначально (PR-1) была собственная таблица CP1251 — обход блокировки zetit-прокси на proxy.golang.org; после открытия доступа (через NO_PROXY=*.golang.org и пр.) заменено на штатную реализацию.

Тесты

  • Round-trip на ASCII и кириллице, включая cp1251-пунктуацию (№, ©, «», „").
  • Негативный кейс — недостижимая руна (эмодзи) даёт ErrUnmappable.
  • NSDDateTime на всех вариантах смещения: (МСК), (МСК+2), (МСК-1), (МСК+12).
  • Покрытие — 92.5%.