DEPO Firebird: проверка на реальной базе Fancy — генераторы, диалект 1, дата без времени
Обезличенная база Fancy (Firebird 2.5.9, диалект 1, кодировка NONE) с UDF ib_Fansy и штатными триггерами: установка, HANDBOOK, поручения IN/OUT, события до BJ_EXECUTED, операции и проводки, ошибки. - генераторы OD_DOCS_ID_GEN / OD_DOLS_ID_GEN (как в Fancy); - COMMENT без кавычек: в диалекте 1 "..." — строка; - FTV_M2M_DAY: дата без времени (в диалекте 1 CAST AS DATE время не отрезает); - README: установка в WIN1251, что подтвердилось, что проверить у клиента (UDF, кодировщик M2M, оператор). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Q7eREaYwUt1i4fNLZcGnjn
This commit is contained in:
@@ -6,42 +6,61 @@
|
||||
| Файл | Что делает |
|
||||
|---|---|
|
||||
| `00_FTV_M2M_TABLES.sql` | таблицы `FTV_M2M*`, генераторы и триггеры ID, исключение `FTV_M2M_ERROR`, таблица привязок `FTV_M2M_SETTINGS` |
|
||||
| `10_FTV_M2M_PROCS.sql` | процедуры: `FTV_M2M_FAIL/GET/DT` (вспомогательные), `PROCESS_WIRING`, `PROCESS_OPERATION`, `UPDATE_HANDBOOK`, `PROCESS_EVENTS`, `PROCESS_CREATE`, `JOB` |
|
||||
| `10_FTV_M2M_PROCS.sql` | процедуры: `FTV_M2M_FAIL/GET/DT/DAY` (вспомогательные), `PROCESS_WIRING`, `PROCESS_OPERATION`, `UPDATE_HANDBOOK`, `PROCESS_EVENTS`, `PROCESS_CREATE`, `JOB` |
|
||||
| `20_FTV_M2M_GRANTS.sql` | права процедурам на таблицы Fancy и логину bj (`:BJ_USER`) на `FTV_M2M_JOB` и таблицы обмена |
|
||||
| `test/` | заглушки таблиц Fancy (по схеме MSSQL), прогон всех веток на встроенном Firebird 2.5.9 |
|
||||
|
||||
Порядок установки: 00 → заполнить `FTV_M2M_SETTINGS` → 10 → 20 (под SYSDBA или владельцем базы).
|
||||
|
||||
## Проверить и уточнить на базе клиента
|
||||
Файлы — в UTF-8, а база Fancy обычно в кодировке NONE с данными в WIN1251. Ставить в WIN1251, иначе русские
|
||||
тексты процедур попадут в базу в UTF-8:
|
||||
|
||||
Процедуры проверены только на заглушках, собранных по схеме Fancy MSSQL. Fancy на MSSQL — перевод
|
||||
Firebird-версии (`GEN_ID`, `f_*`, триггер `OD_DOCS_BU v4.59`), поэтому имена таблиц и колонок, скорее всего,
|
||||
совпадают. Подтвердить на копии базы клиента:
|
||||
```
|
||||
iconv -f utf-8 -t cp1251 10_FTV_M2M_PROCS.sql > 10.sql
|
||||
isql -ch WIN1251 -user SYSDBA -i 10.sql <сервер>:<путь к базе>
|
||||
```
|
||||
|
||||
1. **Генераторы ID**: `OD_DOC_ID_GEN`, `OD_DOL_ID_GEN`, `OD_STEPS_ID_GEN`, `OD_FACES_ID_GEN` — есть ли с такими
|
||||
именами (`SELECT RDB$GENERATOR_NAME FROM RDB$GENERATORS`).
|
||||
2. **`FU_NEXT_DOC_NUM`**: параметры `(CAT_SYS_NAME, D_DATE, DIRECTION, FOR_DOC)`, возвращает `(NUM, NEW_DATE)`;
|
||||
выполняемая (`EXECUTE PROCEDURE`), а не селективная.
|
||||
3. **`OD_PR_INS_WIRS`**: 31 входной параметр в порядке MSSQL-версии, 4 выходных (`NEW_ID, WIR_LIST, DEB_ID, KRD_ID`).
|
||||
4. **`D_CLISER_M2M.DOC_GUID`**: тип колонки. Процедуры пишут GUID строкой `CHAR(36)` в верхнем регистре; если
|
||||
в Fancy это `CHAR(16) CHARACTER SET OCTETS` или строка с фигурными скобками — менять сравнение и запись.
|
||||
5. **Флаги**: `OD_FACES.LAST_FLAG = 1`, `E_DATE = '9999-01-01'`, `OD_CLIENTS_REC.E_DATE = '9999-01-01'` — те же
|
||||
значения в Firebird-версии (не `'T'`/`'F'`).
|
||||
6. **Оператор**: под каким логином bj подключается к базе и заведён ли он в `OD_OPERATORS` (`USER_ID` = логин).
|
||||
`FU_NEXT_DOC_NUM` берёт `WHOS` и префикс номера из `OD_OPERATORS`/`OD_SETS` по текущему пользователю; триггеры
|
||||
Fancy проверяют права оператора (кроме `UPDATE … ID = 0`). В MSSQL-версии это обходилось `execute as SYSDBA`.
|
||||
7. **Привязки `FTV_M2M_SETTINGS`** — ID из справочников клиента: `WHOS` (депозитарий), `OPER_USER`, `FILER_CAT`
|
||||
(в IBExpert — кодировка подключения WIN1251, файл открыть в UTF-8).
|
||||
|
||||
## Проверено на базе Fancy
|
||||
|
||||
27.10.2026, обезличенная база Fancy: Firebird 2.5.9, ODS 11.2, диалект 1, кодировка NONE, UDF `ib_Fansy` и
|
||||
штатные триггеры Fancy. Прошли установка 00–20, справочник участников (HANDBOOK), поручения IN и OUT, события до
|
||||
`BJ_EXECUTED`: операции зачисления и списания, входящие записи по отчёту НРД, проводки через `OD_PR_INS_WIRS`.
|
||||
Ошибки (неизвестный контрагент, повтор GUID, неизвестное событие, нет строки поручения) — текст в `COMMENT`.
|
||||
|
||||
Подтвердилось: имена и колонки таблиц; `FU_NEXT_DOC_NUM (CAT_SYS_NAME, D_DATE, DIRECTION, FOR_DOC)` — выполняемая,
|
||||
принимает `SYS_NAME` или ID категории; `OD_PR_INS_WIRS` — 31 входной и 4 выходных параметра; `D_CLISER_M2M.DOC_GUID`
|
||||
— `VARCHAR(36)`; флаги `LAST_FLAG = 1`, `E_DATE = '9999-01-01'`; категории `I_CLISER_M2M_ZACH/SPIS`, `OP_INV_ZACH/SPIS`,
|
||||
`D_FILER`; состояние `WAIT_RESP_DECIS`; кодировщик НДЦ; таблицы `D_CLISER_M2M*`, `U_OP_INV_ZACH/SPIS`.
|
||||
|
||||
Исправлено по итогам: генераторы `OD_DOCS_ID_GEN`/`OD_DOLS_ID_GEN`; `COMMENT` без кавычек (в диалекте 1 `"…"` —
|
||||
строка); дата без времени — через `FTV_M2M_DAY` (в диалекте 1 `CAST(… AS DATE)` время не отрезает).
|
||||
|
||||
## Проверить у клиента
|
||||
|
||||
1. **UDF Fancy `ib_Fansy`**: без неё не читаются `OD_DOCS`, `OD_BALANCES` и не ставятся процедуры (вычисляемые
|
||||
поля и триггеры Fancy). На сервере Fancy она есть всегда. Тестовый стенд без Windows — Firebird 2.5 для
|
||||
Windows под wine с `ib_Fansy.dll` той же разрядности.
|
||||
2. **Кодировщик M2M** — юрлицо `OD_FACES` с `MNEM = 'M2M'`. В проверенной базе его не было; без него HANDBOOK и
|
||||
создание поручений падают с понятной ошибкой. Завести в Fancy или так (остальные поля заполнят триггеры Fancy):
|
||||
`INSERT INTO OD_FACES (ID, S_TYPE, NAME, MNEM) VALUES (GEN_ID(OD_FACES_ID_GEN, 1), 1, 'Кодировщик M2M (справочник участников НРД)', 'M2M');`
|
||||
3. **Оператор**: логин, под которым bj вызывает `FTV_M2M_JOB`, должен быть в `OD_OPERATORS` (`USER_ID` = логин,
|
||||
`U_FACE` = `OD_SETS.WHOS`). `FU_NEXT_DOC_NUM` берёт депозитарий и префикс номера по текущему пользователю;
|
||||
триггеры Fancy проверяют права оператора (кроме `UPDATE … ID = 0`). Проверено под SYSDBA.
|
||||
4. **Привязки `FTV_M2M_SETTINGS`** — ID из справочников клиента: `WHOS` (депозитарий), `OPER_USER`, `FILER_CAT`
|
||||
(категория `D_FILER`), `D_NUM`/`K_NUM` (балансовые счета 98010 и 98070), `MARKET` (Мосбиржа), `B_TYPE`
|
||||
(«Отчёт депозитария» в `DEPO96_DCLA`), `CORR_FACE` (НКО АО НРД), `FILER_RUBRICA`.
|
||||
8. **Справочники по имени**: категории `I_CLISER_M2M_ZACH/SPIS`, `OP_INV_ZACH/SPIS`; состояния `WAIT_RESP_DECIS`,
|
||||
`WAIT_OPER`; директива `PROCESS`; кодировщики `OD_FACES.MNEM = 'M2M'` и `'НДЦ'`. Таблицы `D_CLISER_M2M`,
|
||||
`D_CLISER_M2M_DOL`, `U_OP_INV_ZACH/SPIS` — пользовательские (настройка M2M в Fancy), у клиента их может не быть.
|
||||
9. **Кодировка базы**: WIN1251 (`RDB$DATABASE.RDB$CHARACTER_SET_NAME`). Текст ошибки из контекста приводится к
|
||||
WIN1251 — при другой кодировке поменять в `FTV_M2M_JOB`.
|
||||
10. **Числа состояний** в `PROCESS_EVENTS` (`STATE = 1, 2, 3, 8`) — как у Фонтвьель; сверить с `OD_DOC_STATES`.
|
||||
(«Отчёт депозитария» в `DEPO96_DCLA`), `CORR_FACE` (НКО АО НРД), `FILER_RUBRICA`. В проверенной базе счета,
|
||||
категория, биржа и тип основания совпали с Фонтвьель (313, 836, 255, 8106, 31) — справочники поставки Fancy;
|
||||
`WHOS` и `CORR_FACE` — свои (`OD_SETS.WHOS`; НРД — юрлицо с `MNEM = 'НДЦ'`).
|
||||
5. **Кодировка и диалект**: `RDB$DATABASE.RDB$CHARACTER_SET_NAME`, `MON$DATABASE.MON$SQL_DIALECT`. При NONE или
|
||||
WIN1251 — ставить в WIN1251 (см. выше); текст ошибки в `FTV_M2M_JOB` приводится к WIN1251.
|
||||
6. **Числа состояний** в `PROCESS_EVENTS` (`STATE = 1, 2, 3, 8`) — как у Фонтвьель; в проверенной базе поручения
|
||||
дошли до `STATE = 2`, сверить с `OD_DOC_STATES` клиента.
|
||||
|
||||
## Открытые вопросы логики (те же, что в MSSQL-версии)
|
||||
|
||||
- `BJ_ORDER_REJECTED` не обрабатывается — уходит в «неизвестное событие» (вопрос программисту от 16.10.2026).
|
||||
- `BJ_CP_CONFIRM` с направлением OUT перехватывается веткой `BJ_DECISION_CONFIRM` выше.
|
||||
- Депонент не найден — поручение создаётся без депонента, ошибки нет.
|
||||
- Депонент не найден — поручение создаётся без депонента, ошибки нет. Ищется по имени и серии+номеру документа:
|
||||
при пустой серии (`NULL`) не находится.
|
||||
|
||||
Reference in New Issue
Block a user