#!/usr/bin/env python3
# erf-init v1.1 — Init 1C external report scaffold
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
"""Generates minimal XML source files for a 1C external report."""
import sys, os, argparse, uuid
def esc_xml(s):
return s.replace('&','&').replace('<','<').replace('>','>').replace('"','"')
def new_uuid():
return str(uuid.uuid4())
def write_utf8_bom(path, content):
with open(path, 'w', encoding='utf-8-sig', newline='') as f:
f.write(content)
def main():
sys.stdout.reconfigure(encoding="utf-8")
sys.stderr.reconfigure(encoding="utf-8")
parser = argparse.ArgumentParser(description='Init 1C external report scaffold', allow_abbrev=False)
parser.add_argument('-Name', dest='Name', required=True)
parser.add_argument('-Synonym', dest='Synonym', default=None)
parser.add_argument('-SrcDir', dest='SrcDir', default='src')
parser.add_argument('-WithSKD', dest='WithSKD', action='store_true')
args = parser.parse_args()
name = args.Name
synonym = args.Synonym if args.Synonym else name
src_dir = args.SrcDir
uuid1 = new_uuid()
uuid2 = new_uuid()
uuid3 = new_uuid()
uuid4 = new_uuid()
# --- Properties ---
main_dcs_value = ""
child_objects_content = ""
if args.WithSKD:
main_dcs_value = f"ExternalReport.{name}.Template.ОсновнаяСхемаКомпоновкиДанных"
child_objects_content = f"\n\t\t\tОсновнаяСхемаКомпоновкиДанных\n"
main_dcs_element = f"{main_dcs_value}" if main_dcs_value else ""
child_objects_xml = f"{child_objects_content}\t\t" if child_objects_content else ""
xml = f'''
\t
\t\t
\t\t\t
\t\t\t\te41aff26-25cf-4bb6-b6c1-3f478a75f374
\t\t\t\t{uuid2}
\t\t\t
\t\t\t
\t\t\t\t{uuid3}
\t\t\t\t{uuid4}
\t\t\t
\t\t
\t\t
\t\t\t{esc_xml(name)}
\t\t\t
\t\t\t\t
\t\t\t\t\tru
\t\t\t\t\t{esc_xml(synonym)}
\t\t\t\t
\t\t\t
\t\t\t
\t\t\t
\t\t\t
\t\t\t{main_dcs_element}
\t\t\t
\t\t\t
\t\t\t
\t\t\t
\t\t\t
\t\t
\t\t{child_objects_xml}
\t
'''
root_file = os.path.join(src_dir, f"{name}.xml")
report_dir = os.path.join(src_dir, name)
if os.path.exists(root_file):
print(f"Файл уже существует: {root_file}", file=sys.stderr)
sys.exit(1)
os.makedirs(src_dir, exist_ok=True)
ext_dir = os.path.join(report_dir, "Ext")
os.makedirs(ext_dir, exist_ok=True)
write_utf8_bom(os.path.join(os.path.abspath(src_dir), f"{name}.xml"), xml)
# --- Модуль объекта ---
module_bsl = """\
#Область ОписаниеПеременных
#КонецОбласти
#Область ПрограммныйИнтерфейс
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
#КонецОбласти"""
module_path = os.path.join(ext_dir, "ObjectModule.bsl")
write_utf8_bom(module_path, module_bsl)
print(f"[OK] Создан отчёт: {root_file}")
print(f" Каталог: {report_dir}")
print(f" Модуль: {module_path}")
# --- СКД-макет ---
if args.WithSKD:
templates_dir = os.path.join(report_dir, "Templates")
skd_name = "ОсновнаяСхемаКомпоновкиДанных"
skd_meta_path = os.path.join(templates_dir, f"{skd_name}.xml")
skd_ext_dir = os.path.join(templates_dir, skd_name, "Ext")
os.makedirs(skd_ext_dir, exist_ok=True)
skd_uuid = new_uuid()
skd_meta_xml = f'''
\t
\t\t
\t\t\t{skd_name}
\t\t\t
\t\t\t\t
\t\t\t\t\tru
\t\t\t\t\tОсновная схема компоновки данных
\t\t\t\t
\t\t\t
\t\t\t
\t\t\tDataCompositionSchema
\t\t
\t
'''
write_utf8_bom(skd_meta_path, skd_meta_xml)
skd_content = '''
\t
\t\tИсточникДанных1
\t\tLocal
\t
'''
skd_file_path = os.path.join(skd_ext_dir, "Template.xml")
write_utf8_bom(skd_file_path, skd_content)
print(f" СКД: {skd_meta_path}")
print(f" Тело: {skd_file_path}")
if __name__ == '__main__':
main()