knowledge(경쟁사): 변환·수량산출·식 언어 — 남은 모듈 훑기

식 언어의 변수 선언이 드러남
- 「금액변수 대상:M, 저장:S, %」「소계변수 대상:M, 저장:L, %」
- 변수마다 어느 비목에서 가져와 어느 비목에 넣을지와 비율 여부를 함께 지정.
  단가 식은 숫자 계산이 아니라 비목 사이의 값 이동임
- 금액변수/소계변수가 갈리고 「금액을 계산후 제외처리」가 따로 있음
- ⚠ 중기공식(Q식)을 사용자가 등록·수정·삭제함. 10꼴은 고정 목록이 아님

STmateQty8 — 수량산출서가 별도 파일이고 엑셀 셀에 별명을 붙여 변수로 씀
- 기본수량변수(내역에 붙음) ↔ 확장수량변수(셀별명, 중간값)
- 수량산출서 → 단가산출 전송 경로. Aislo B08 과 직접 겹침
- 표본 QCODE 가 전부 빈 표라 파일 형식은 못 봄

ST_U_Convert — 조달청·XML 양방향 변환이 프로그램 안에 있음
- Conv_Jodal_ST8 / Conv_ST8_Jodal / Conv_ST8_XML / Conv_XML_ST8
- MK_K_FLD·CHK_K_FLD 호환규정 필드 생성·검사
- XML 스키마는 실행 중 조립이라 정적으로 못 얻음
-  같은 모듈에 노임 직종 사전 106종이 평문으로 있음. CONLD·COND_ 의
  직종 코드가 가리키는 이름표

식 문법 오류 메시지에서 규칙 여섯 (줄 단위 검사·거듭제곱·강제금액·
그림코드 제약·집계제외·비목별 군별단가)

⚠ EQSYNC.DBF 도 암호화. 암호화 파일이 셋으로 늘었음
(BDQTY·SYSINFO·EQSYNC)

문서 28 신규, 문자열 훑기 스크립트 추가.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Prk9BCHG1EMAywk9k8wegA
This commit is contained in:
2026-09-13 14:35:11 +09:00
co-authored by Claude Opus 5
parent 1fd8edc7e0
commit be2b77fe7a
4 changed files with 192 additions and 0 deletions
@@ -34,6 +34,7 @@
| 25 설정키 전수와 식템플릿 | **설정 사슬 닫기**`PRJLST.SMT` 키 241종, 간접비 식 26개 | (저장소 파일) | | 25 설정키 전수와 식템플릿 | **설정 사슬 닫기**`PRJLST.SMT` 키 241종, 간접비 식 26개 | (저장소 파일) |
| 26 편집기와 사이클식 | **`Cm` 54꼴·품셈 인자·식 편집기·낙찰율** — 계약/실행/기성 단계 발견 | (저장소 파일) | | 26 편집기와 사이클식 | **`Cm` 54꼴·품셈 인자·식 편집기·낙찰율** — 계약/실행/기성 단계 발견 | (저장소 파일) |
| 27 계약·실행·기성 단계 | **설계 뒤 네 단계** — 낙찰율 3갈래, 기성은 계약제잡비율, 실행 차액보정 | (저장소 파일) | | 27 계약·실행·기성 단계 | **설계 뒤 네 단계** — 낙찰율 3갈래, 기성은 계약제잡비율, 실행 차액보정 | (저장소 파일) |
| 28 변환·수량산출·식언어 | **식 변수의 대상/저장 비목** · 수량산출서 셀별명 · 조달청 변환 · 직종 106종 | (저장소 파일) |
> **정본은 저장소 파일이다** — `resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/`. > **정본은 저장소 파일이다** — `resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/`.
> 위 Orca 링크는 보기용이며, 문서를 지식DB 자리로 옮기면서 주소가 한 번 바뀌었다. > 위 Orca 링크는 보기용이며, 문서를 지식DB 자리로 옮기면서 주소가 한 번 바뀌었다.
@@ -117,6 +118,12 @@
| 기성 간접비 | 몰랐음 | **금회직접공사비 × 계약제잡비율** — 설계와 다름 | 27번 §3.1 | | 기성 간접비 | 몰랐음 | **금회직접공사비 × 계약제잡비율** — 설계와 다름 | 27번 §3.1 |
| 부가세 축 | 단계 무관 | ⚠ **단계마다 선택지가 다름** | 27번 §3.3 | | 부가세 축 | 단계 무관 | ⚠ **단계마다 선택지가 다름** | 27번 §3.3 |
| 실행예산 | 서식명만 | **중기 실행단가 + 차액 보정 순서** | 27번 §4 | | 실행예산 | 서식명만 | **중기 실행단가 + 차액 보정 순서** | 27번 §4 |
| 식 변수 | 참조·조건까지 | **변수 선언에 「대상비목·저장비목·%」** | 28번 §1 |
| `Q`식 목록 | 10꼴 관측 | ⚠ **사용자가 등록·수정** — 고정 목록 아님 | 28번 §1.1 |
| 수량산출 | `QCODE` 빈 표 | **수량산출서 별도 파일 + 셀별명 변수** | 28번 §2 |
| 조달청 호환 | 몰랐음 | **`Conv_Jodal_ST8`·`Conv_ST8_XML` 양방향** | 28번 §3 |
| 노임 직종 | 코드만 | **직종 사전 106종** 평문 | 28번 §3.1 |
| 암호화 파일 | 2개 | ⚠ **3개**`EQSYNC.DBF` 추가 | 28번 §5 |
분석일: 2026-09-13 분석일: 2026-09-13
대상: `C:\경영정보(주)` 대상: `C:\경영정보(주)`
@@ -0,0 +1,171 @@
# 변환·수량산출·식 언어 — 남은 모듈 훑기
점검일: 2026-09-13
대상: `ST_U_Convert` · `STmateQty8` · `ST_EdSan` · `EQSYNC.DBF`
재현 스크립트: `40_스크립트/module_string_probe.py`
## 1. ⭐ 식 언어의 변수 선언 — 「대상」과 「저장」
`ST_EdSan.CPM`(단가산출 편집기)의 화면 문자열에서 식 언어의 핵심이 드러난다.
```text
특수코드(&PA01&) / 변수 -------------
금액변수 대상:M, 저장:S, %】
소계변수 대상:M, 저장:L, %】
금액변수 대상:M, 저장:S 】
소계변수 대상:M, 저장:L 】
금액변수로 지정 】
소계변수로 지정 】
금액을 계산후 제외처리】
```
⇒ 변수를 선언할 때 **세 가지를 함께 지정**한다.
| 항목 | 뜻 |
|---|---|
| **대상** | 어느 비목에서 값을 **가져올지** (`M` 재료 · `L` 노무 · `S` 경비) |
| **저장** | 어느 비목에 **넣을지** |
| **%** | 비율 적용 여부 |
23번 §2에서 본 `&X00006L&`(중기 X코드의 노무 성분)이 **참조**라면, 이것은 **중간 변수 선언**이다. `DP_Common``GET_VARI_VAL`·`SET_VARI_VAL`(24번 §2.1)이 이 변수를 다룬다.
`금액변수`(단일 금액)와 `소계변수`(누적 소계)가 갈리고, **`금액을 계산후 제외처리`** 는 계산은 하되 합계에서 빼는 자리다.
**재구현 필수** — 단가 식은 「숫자 계산」이 아니라 **비목 사이의 값 이동**이다. 변수마다 `(대상비목, 저장비목, 비율여부)`를 함께 저장해야 한다.
### 1.1 중기공식은 사용자가 등록한다
```text
수정된 중기공식을 저장하시겠습니까? 선택된 중기공식을 삭제하시겠습니까?
신규공식 추가 새로운 중기공식을 추가하시겠습니까? 공식+코드
```
⇒ 23번 §3의 **`Q`식 10꼴은 고정 목록이 아니라 사용자가 늘릴 수 있는 등록부**다. 하드코딩이 더 확실히 금지된다.
## 2. `STmateQty8.CPM` — 수량산출서와 수량변수
```text
기본수량변수 ↔ 확장수량변수(셀별명)
확장수량변수 읽어오기 실패
셀참조 에러가 있는 수량변수(셀별명)를 포함하고
기본수량변수값을 확장수량변수값으로 할당
방금 저장된 수량산출서의 확장수량변수의 값으로
전송될 기본수량 변수 *
단가산출에 수량변수를 전송하려면..
수량산출서 파일 저장하기 / 불러오기
수량산출서로 저장하려는 파일이 손상되었거나 … 호환되지 않는 파일형식
```
**수량산출서가 별도 파일**이고, 그 안의 **셀에 별명(변수)을 붙여** 단가산출로 전송한다.
| 갈래 | 뜻 |
|---|---|
| **기본수량변수** | 내역에 바로 붙는 수량 |
| **확장수량변수(셀별명)** | 엑셀 셀을 가리키는 이름 — 산출 과정의 중간값 |
`내역코드`·`내역수량`·`내역단위`가 함께 나오므로 **수량산출서 → 내역**이 코드로 이어진다.
⚠ 표본 STC의 `QCODE.DBF`는 모두 비어 있다(02번). **수량산출서를 쓰지 않은 프로젝트**라 그렇고, 기능은 실재한다.
Aislo의 B08 수량 산출과 직접 겹치는 자리다.
## 3. `ST_U_Convert.CPM` — 조달청·XML 양방향 변환
export 20개가 변환 경로를 그린다.
```text
Conv_Jodal_ST8 ↔ Conv_ST8_Jodal 조달청 ↔ ST8
Conv_ST8_XML ↔ Conv_XML_ST8 ST8 ↔ XML
Conv_BOQ · Conv_Equip 내역·장비 변환
MK_K_FLD · CHK_K_FLD · MK_ADD_K_REP 호환규정 필드 생성·검사
MK_SET_REP · Appn_Tag_REP 보고서 서식·태그
ST_ConvToWin8 · ST_BlankWin8 구버전 → Win8판
ST_Conv_Mode1/2/3 · ST_Conv_Data · ST_Copy_Data
```
**납품 호환 경로가 프로그램 안에 있다.** `호환규정코드``wM_Mrg_BSC`의 매칭 키 1순위였던 것(20번 §2)과 이어진다.
XML **스키마는 문자열로 안 남는다** — 실행 중에 조립한다. 태그 이름을 정적으로는 못 얻는다.
### 3.1 노임 직종 사전 106종
같은 모듈에 **직종 목록이 통째로** 들어 있다.
```text
보통인부 · 특별인부 · 조력공 · 비계공 · 특수비계공 · 형틀목공 · 철근공
용접공(일반/철도) · 콘크리트공 · 보링공(지질조사) · 조적공 · 치장벽돌공
창호공 · 샷시공 · 창호목공 · 함석공 · 덕트공 · 노즐공 · 인력운반공
건설기계운전기사 · 건설기계운전사 · 화물차운전사 · 일반기계운전사
건설기계조장 · 건설기계운전조수 · 중기운전사 · 중기조장 · 중기운전조수
기계공 · 기계설비공 · 기계설치공
준설선기관장 · 준설선기관사 · 준설선전기사 · 고급선원 · 보통선원 · 선장 · 선부 · 갱부
플랜트 계열 7 (배관·제관·특별인부·케이블전공·계장·덕트·보온)
원자력 계열 8 (배관·제관·특별인부·케이블전공·계장·덕트·보온·비파괴시험)
품질관리원 3등급 · 시험관련 기사/산업기사/기능사 · 조림인부 …
```
**`CONLD`·`COND_`의 직종 코드(`L00007`·`L00008`·`L00010`…)가 가리키는 이름표**다(18번 §2.1, 20번 §2.5). 노임 환산식을 어느 직종에 걸지 고를 때 쓰는 목록이다.
공종 계열 문자열도 함께 있다 — `토공 · 배수공 · 구조물공 · 포장공 · 조경공 · 부대공 · 기타공`, 그리고 집계 레벨 `총합계 · 총대계 · 광역계 · 광역총계 · 광역대계`(26번 §5의 `+=` 레벨과 짝).
## 4. 식 문법 오류 메시지 — 규칙이 드러난다
```text
번째줄에 수량코드 문법오류입니다
번째줄에 단가코드 앞,뒤에 거듭제(곱) …
번째줄에 그림코드는 1개이상 사용 …
… 는 등록된 수량코드가 아닙니다.
… 코드에서 입력된 강제금액을 "
… 코드는 항목집계되지 않았습니다.
변수를 코드로 변환
중기비사용료의 코드를 B코드("B00…")로 …
… 코드는 실적단가 사용으로 …
연결코드 계산오류 · 계산코드 집계를 위한 파일을 열지 못했습니다.
해당코드의 [비목별/군별단가]를 확인/입력하십시오
```
드러나는 규칙.
| 규칙 | 근거 |
|---|---|
| 식은 **줄 단위**로 검사된다 | `번째줄에 … 문법오류` |
| **단가코드에 거듭제곱을 붙일 수 있다** | `단가코드 앞,뒤에 거듭제…` |
| **그림코드는 호표당 1개 이상** 제약 | `그림코드는 1개이상 사용` |
| **강제금액**을 코드에 직접 넣을 수 있다 | `입력된 강제금액을` |
| **항목집계에서 빠지는 코드**가 있다 | `항목집계되지 않았습니다` |
| 단가는 **비목별·군별**로 나뉜다 | `[비목별/군별단가]` |
## 5. `EQSYNC.DBF` — 세 번째 암호화 파일
```text
EQSYNC.DBF 54행 × 3열 (2.9 KB)
NAME(C40) · SYNC(M10 메모) · INS_X(L1)
본문 난독화 — 읽히지 않음
```
`ST_EdSan.CPM``Edit_EQ_SYNC` 가 다루며 **중기(장비) 동기화 표**로 보인다. `EQSYNC.SMT`가 짝으로 있다.
**암호화 목록이 셋으로 늘었다**`BDQTY.DBF` · `SYSINFO.DBF` · **`EQSYNC.DBF`**. 앞 둘은 STC 안, 이것은 설치 폴더에 있다.
## 6. 이번 점검이 바꾸는 것
| 항목 | 이전 | 지금 |
|---|---|---|
| 식 언어 | 참조·사칙·조건까지 | ✅ **변수 선언에 「대상비목·저장비목·%」** |
| `Q`식 목록 | 10꼴 관측 | ⚠ **사용자가 등록·수정·삭제** — 고정 목록 아님 |
| 수량산출 | `QCODE` 빈 표로만 | ✅ **수량산출서 별도 파일 + 셀별명 변수** |
| 조달청 호환 | 몰랐음 | ✅ **`Conv_Jodal_ST8`·`Conv_ST8_XML` 양방향** |
| 노임 직종 | 코드만 | ✅ **직종 사전 106종** |
| 식 문법 | 몰랐음 | ✅ 줄 단위 검사·거듭제곱·강제금액·집계제외 |
| 암호화 파일 | 2개 | ⚠ **3개**`EQSYNC.DBF` 추가 |
## 7. 남은 것
| 무엇 | 상태 |
|---|---|
| XML 스키마 태그 | 실행 중 조립 — 정적으로 못 얻음 |
| `EQSYNC` 내용 | 암호화 |
| 수량산출서 파일 형식 | 표본 0건 (`QCODE` 전부 빈 표) |
| 조달청 변환 결과물 | 표본 0건 |
**설치 폴더·프로젝트 파일·출력물에서 얻을 수 있는 것은 사실상 다 얻었다.** 남은 넷은 전부 **표본 부재** 또는 **암호화**다.
@@ -0,0 +1,13 @@
# -*- coding: utf-8 -*-
"""모듈 한글 문자열 훑기 — 사전·오류메시지에서 규칙을 캔다."""
import sys, io, re, pathlib
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8", errors="replace")
R=pathlib.Path(r"C:\경영정보(주)\System")
for n in sys.argv[1:] or ["ST_U_Convert.CPM","STmateQty8.CPM","ST_EdSan.CPM"]:
b=next(R.rglob(n)).read_bytes(); ko=[]
for m in re.finditer(rb"[\xb0-\xc8][\xa1-\xfe](?:[\x20-\x7e\xa1-\xfe]){1,44}", b):
try: s=m.group().decode("cp949").strip()
except Exception: continue
if sum(1 for c in s if 0xAC00<=ord(c)<=0xD7A3)>=2 and s not in ko: ko.append(s)
print("\n### %s — 한글 문자열 %d" % (n, len(ko)))
for s in ko: print(" %s" % s[:76])
@@ -66,6 +66,7 @@
| 25 | **설정키 전수와 식템플릿** — 저장키 241종, 간접비 식 26개, 설정 사슬 닫힘 | | 25 | **설정키 전수와 식템플릿** — 저장키 241종, 간접비 식 26개, 설정 사슬 닫힘 |
| 26 | **편집기와 사이클식**`Cm` 54꼴, 품셈 인자, 식 편집기, 낙찰율 | | 26 | **편집기와 사이클식**`Cm` 54꼴, 품셈 인자, 식 편집기, 낙찰율 |
| 27 | **계약·실행·기성 단계** — 설계 뒤 네 단계의 계산 구조 | | 27 | **계약·실행·기성 단계** — 설계 뒤 네 단계의 계산 구조 |
| 28 | **변환·수량산출·식언어** — 식 변수 대상/저장, 조달청 변환, 직종 106종 |
## 확정된 굵직한 것 ## 확정된 굵직한 것