# -*- coding: utf-8 -*-
"""Генератор XML-выгрузки обработки ИсправлениеСчетаРасчетовАгентскихУслуг."""
import os, shutil

NAME = "ИсправлениеСчетаРасчетовАгентскихУслуг"
SYN  = "Исправление счета расчетов агентских услуг"
ROOT = "/tmp/israsch/build"

# --- UUIDs (свежие, uuidgen) ---
U = dict(
    edp="122dec58-4f28-4c3e-b985-04f663d84513",
    obj="9fa592d9-18ff-4f0b-a4c8-984112ea79b2",
    gt_tid="5729d7fc-0227-4a7a-bc73-8fe03c6dc14d",
    gt_vid="35a051dd-0c79-4d56-9d63-90c6c12c5206",
    a_datac="0f8ea5ad-0936-403b-809f-699c876540f7",
    a_datapo="ba0488f9-3790-4e73-8cc0-68f81d187e7e",
    ts="23e119b8-b8b7-4560-9020-f6e29aff4181",
    ts_tid="c53a1f37-092f-4f64-9a9b-59d05a5caa51",
    ts_vid="edad460e-3643-4e9d-a877-ea5425fdbaab",
    tsr_tid="31cb66dc-eea4-49e8-95d8-a361032463e6",
    tsr_vid="573d7315-0926-4833-ac18-7220f1c9d8a1",
    c_metka="94c74096-cac9-4e1c-84fa-0447221b17f6",
    c_post="69edbc1b-e12f-444e-a167-5e9807d20c80",
    c_schp="809f11c4-fe08-42bb-9f71-9e78907a637a",
    c_real="981af566-bcf5-4053-bffc-95bebd7a58de",
    c_schr="f872385b-9185-4e22-a1b8-a40c2934b133",
    c_contr="e5e89bf2-3032-40a6-bed6-414effbe277a",
    c_org="88ca260f-1e6d-481f-ac2b-315098c38fce",
    form="0861c750-bd5e-4b83-bb64-48a8632e2fa7",
)

NS_MD = ('xmlns="http://v8.1c.ru/8.3/MDClasses" xmlns:app="http://v8.1c.ru/8.2/managed-application/core" '
    'xmlns:cfg="http://v8.1c.ru/8.1/data/enterprise/current-config" xmlns:cmi="http://v8.1c.ru/8.2/managed-application/cmi" '
    'xmlns:ent="http://v8.1c.ru/8.1/data/enterprise" xmlns:lf="http://v8.1c.ru/8.2/managed-application/logform" '
    'xmlns:style="http://v8.1c.ru/8.1/data/ui/style" xmlns:sys="http://v8.1c.ru/8.1/data/ui/fonts/system" '
    'xmlns:v8="http://v8.1c.ru/8.1/data/core" xmlns:v8ui="http://v8.1c.ru/8.1/data/ui" '
    'xmlns:web="http://v8.1c.ru/8.1/data/ui/colors/web" xmlns:win="http://v8.1c.ru/8.1/data/ui/colors/windows" '
    'xmlns:xen="http://v8.1c.ru/8.3/xcf/enums" xmlns:xpr="http://v8.1c.ru/8.3/xcf/predef" '
    'xmlns:xr="http://v8.1c.ru/8.3/xcf/readable" xmlns:xs="http://www.w3.org/2001/XMLSchema" '
    'xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.20"')

NS_FORM = ('xmlns="http://v8.1c.ru/8.3/xcf/logform" xmlns:app="http://v8.1c.ru/8.2/managed-application/core" '
    'xmlns:cfg="http://v8.1c.ru/8.1/data/enterprise/current-config" '
    'xmlns:dcscor="http://v8.1c.ru/8.1/data-composition-system/core" '
    'xmlns:dcssch="http://v8.1c.ru/8.1/data-composition-system/schema" '
    'xmlns:dcsset="http://v8.1c.ru/8.1/data-composition-system/settings" '
    'xmlns:ent="http://v8.1c.ru/8.1/data/enterprise" xmlns:lf="http://v8.1c.ru/8.2/managed-application/logform" '
    'xmlns:style="http://v8.1c.ru/8.1/data/ui/style" xmlns:sys="http://v8.1c.ru/8.1/data/ui/fonts/system" '
    'xmlns:v8="http://v8.1c.ru/8.1/data/core" xmlns:v8ui="http://v8.1c.ru/8.1/data/ui" '
    'xmlns:web="http://v8.1c.ru/8.1/data/ui/colors/web" xmlns:win="http://v8.1c.ru/8.1/data/ui/colors/windows" '
    'xmlns:xr="http://v8.1c.ru/8.3/xcf/readable" xmlns:xs="http://www.w3.org/2001/XMLSchema" '
    'xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.20"')


def syn(text):
    return (f"<Synonym><v8:item><v8:lang>ru</v8:lang>"
            f"<v8:content>{text}</v8:content></v8:item></Synonym>")


def obj_attr(uuid, name, synonym, type_xml):
    """Реквизит объекта (верхнего уровня)."""
    return f"""\t\t\t<Attribute uuid="{uuid}">
\t\t\t\t<Properties>
\t\t\t\t\t<Name>{name}</Name>
\t\t\t\t\t{syn(synonym)}
\t\t\t\t\t<Comment/>
\t\t\t\t\t<Type>{type_xml}</Type>
\t\t\t\t\t<PasswordMode>false</PasswordMode>
\t\t\t\t\t<Format/>
\t\t\t\t\t<EditFormat/>
\t\t\t\t\t<ToolTip/>
\t\t\t\t\t<MarkNegatives>false</MarkNegatives>
\t\t\t\t\t<Mask/>
\t\t\t\t\t<MultiLine>false</MultiLine>
\t\t\t\t\t<ExtendedEdit>false</ExtendedEdit>
\t\t\t\t\t<MinValue xsi:nil="true"/>
\t\t\t\t\t<MaxValue xsi:nil="true"/>
\t\t\t\t\t<FillChecking>DontCheck</FillChecking>
\t\t\t\t\t<ChoiceFoldersAndItems>Items</ChoiceFoldersAndItems>
\t\t\t\t\t<ChoiceParameterLinks/>
\t\t\t\t\t<ChoiceParameters/>
\t\t\t\t\t<QuickChoice>Auto</QuickChoice>
\t\t\t\t\t<CreateOnInput>Auto</CreateOnInput>
\t\t\t\t\t<ChoiceForm/>
\t\t\t\t\t<LinkByType/>
\t\t\t\t\t<ChoiceHistoryOnInput>Auto</ChoiceHistoryOnInput>
\t\t\t\t</Properties>
\t\t\t</Attribute>"""


def ts_attr(uuid, name, synonym, type_xml):
    """Реквизит табличной части."""
    return f"""\t\t\t\t\t<Attribute uuid="{uuid}">
\t\t\t\t\t\t<Properties>
\t\t\t\t\t\t\t<Name>{name}</Name>
\t\t\t\t\t\t\t{syn(synonym)}
\t\t\t\t\t\t\t<Comment/>
\t\t\t\t\t\t\t<Type>{type_xml}</Type>
\t\t\t\t\t\t\t<PasswordMode>false</PasswordMode>
\t\t\t\t\t\t\t<Format/>
\t\t\t\t\t\t\t<EditFormat/>
\t\t\t\t\t\t\t<ToolTip/>
\t\t\t\t\t\t\t<MarkNegatives>false</MarkNegatives>
\t\t\t\t\t\t\t<Mask/>
\t\t\t\t\t\t\t<MultiLine>false</MultiLine>
\t\t\t\t\t\t\t<ExtendedEdit>false</ExtendedEdit>
\t\t\t\t\t\t\t<MinValue xsi:nil="true"/>
\t\t\t\t\t\t\t<MaxValue xsi:nil="true"/>
\t\t\t\t\t\t\t<FillFromFillingValue>false</FillFromFillingValue>
\t\t\t\t\t\t\t<FillValue xsi:nil="true"/>
\t\t\t\t\t\t\t<FillChecking>DontCheck</FillChecking>
\t\t\t\t\t\t\t<ChoiceFoldersAndItems>Items</ChoiceFoldersAndItems>
\t\t\t\t\t\t\t<ChoiceParameterLinks/>
\t\t\t\t\t\t\t<ChoiceParameters/>
\t\t\t\t\t\t\t<QuickChoice>Auto</QuickChoice>
\t\t\t\t\t\t\t<CreateOnInput>Auto</CreateOnInput>
\t\t\t\t\t\t\t<ChoiceForm/>
\t\t\t\t\t\t\t<LinkByType/>
\t\t\t\t\t\t\t<ChoiceHistoryOnInput>Auto</ChoiceHistoryOnInput>
\t\t\t\t\t\t</Properties>
\t\t\t\t\t</Attribute>"""

T_DATE = "<v8:Type>xs:dateTime</v8:Type><v8:DateQualifiers><v8:DateFractions>Date</v8:DateFractions></v8:DateQualifiers>"
T_BOOL = "<v8:Type>xs:boolean</v8:Type>"
T_POST = "<v8:Type>cfg:DocumentRef.ПоступлениеТоваровУслуг</v8:Type>"
T_REAL = "<v8:Type>cfg:DocumentRef.РеализацияТоваровУслуг</v8:Type>"
T_SCH  = "<v8:Type>cfg:ChartOfAccountsRef.Хозрасчетный</v8:Type>"
T_CONTR= "<v8:Type>cfg:CatalogRef.Контрагенты</v8:Type>"
T_ORG  = "<v8:Type>cfg:CatalogRef.Организации</v8:Type>"

# ---------- root XML ----------
ts_attrs = "\n".join([
    ts_attr(U["c_metka"], "Метка", "Метка", T_BOOL),
    ts_attr(U["c_post"], "Поступление", "Поступление", T_POST),
    ts_attr(U["c_schp"], "СчетРасчетовПоступления", "Счет расчетов (Поступление)", T_SCH),
    ts_attr(U["c_real"], "Реализация", "Реализация", T_REAL),
    ts_attr(U["c_schr"], "СчетРасчетовРеализации", "Счет расчетов (Реализация)", T_SCH),
    ts_attr(U["c_contr"], "Контрагент", "Контрагент", T_CONTR),
    ts_attr(U["c_org"], "Организация", "Организация", T_ORG),
])

ROOT_XML = f"""<?xml version="1.0" encoding="UTF-8"?>
<MetaDataObject {NS_MD}>
\t<ExternalDataProcessor uuid="{U['edp']}">
\t\t<InternalInfo>
\t\t\t<xr:ContainedObject>
\t\t\t\t<xr:ClassId>c3831ec8-d8d5-4f93-8a22-f9bfae07327f</xr:ClassId>
\t\t\t\t<xr:ObjectId>{U['obj']}</xr:ObjectId>
\t\t\t</xr:ContainedObject>
\t\t\t<xr:GeneratedType name="ExternalDataProcessorObject.{NAME}" category="Object">
\t\t\t\t<xr:TypeId>{U['gt_tid']}</xr:TypeId>
\t\t\t\t<xr:ValueId>{U['gt_vid']}</xr:ValueId>
\t\t\t</xr:GeneratedType>
\t\t</InternalInfo>
\t\t<Properties>
\t\t\t<Name>{NAME}</Name>
\t\t\t{syn(SYN)}
\t\t\t<Comment/>
\t\t\t<DefaultForm>ExternalDataProcessor.{NAME}.Form.Форма</DefaultForm>
\t\t\t<AuxiliaryForm/>
\t\t</Properties>
\t\t<ChildObjects>
{obj_attr(U['a_datac'], 'ДатаС', 'Дата начала', T_DATE)}
{obj_attr(U['a_datapo'], 'ДатаПо', 'Дата окончания', T_DATE)}
\t\t\t<TabularSection uuid="{U['ts']}">
\t\t\t\t<InternalInfo>
\t\t\t\t\t<xr:GeneratedType name="DataProcessorTabularSection.{NAME}.ТаблицаДокументов" category="TabularSection">
\t\t\t\t\t\t<xr:TypeId>{U['ts_tid']}</xr:TypeId>
\t\t\t\t\t\t<xr:ValueId>{U['ts_vid']}</xr:ValueId>
\t\t\t\t\t</xr:GeneratedType>
\t\t\t\t\t<xr:GeneratedType name="DataProcessorTabularSectionRow.{NAME}.ТаблицаДокументов" category="TabularSectionRow">
\t\t\t\t\t\t<xr:TypeId>{U['tsr_tid']}</xr:TypeId>
\t\t\t\t\t\t<xr:ValueId>{U['tsr_vid']}</xr:ValueId>
\t\t\t\t\t</xr:GeneratedType>
\t\t\t\t</InternalInfo>
\t\t\t\t<Properties>
\t\t\t\t\t<Name>ТаблицаДокументов</Name>
\t\t\t\t\t{syn('Документы')}
\t\t\t\t\t<Comment/>
\t\t\t\t\t<ToolTip/>
\t\t\t\t\t<FillChecking>DontCheck</FillChecking>
\t\t\t\t\t<StandardAttributes>
\t\t\t\t\t\t<xr:StandardAttribute name="LineNumber">
\t\t\t\t\t\t\t<xr:LinkByType/>
\t\t\t\t\t\t\t<xr:FillChecking>DontCheck</xr:FillChecking>
\t\t\t\t\t\t\t<xr:MultiLine>false</xr:MultiLine>
\t\t\t\t\t\t\t<xr:FillFromFillingValue>false</xr:FillFromFillingValue>
\t\t\t\t\t\t\t<xr:CreateOnInput>Auto</xr:CreateOnInput>
\t\t\t\t\t\t\t<xr:TypeReductionMode>TransformValues</xr:TypeReductionMode>
\t\t\t\t\t\t\t<xr:MaxValue xsi:nil="true"/>
\t\t\t\t\t\t\t<xr:ToolTip/>
\t\t\t\t\t\t\t<xr:ExtendedEdit>false</xr:ExtendedEdit>
\t\t\t\t\t\t\t<xr:Format/>
\t\t\t\t\t\t\t<xr:ChoiceForm/>
\t\t\t\t\t\t\t<xr:QuickChoice>Auto</xr:QuickChoice>
\t\t\t\t\t\t\t<xr:ChoiceHistoryOnInput>Auto</xr:ChoiceHistoryOnInput>
\t\t\t\t\t\t\t<xr:EditFormat/>
\t\t\t\t\t\t\t<xr:PasswordMode>false</xr:PasswordMode>
\t\t\t\t\t\t\t<xr:DataHistory>Use</xr:DataHistory>
\t\t\t\t\t\t\t<xr:MarkNegatives>false</xr:MarkNegatives>
\t\t\t\t\t\t\t<xr:MinValue xsi:nil="true"/>
\t\t\t\t\t\t\t<xr:Synonym/>
\t\t\t\t\t\t\t<xr:Comment/>
\t\t\t\t\t\t\t<xr:FullTextSearch>Use</xr:FullTextSearch>
\t\t\t\t\t\t\t<xr:ChoiceParameterLinks/>
\t\t\t\t\t\t\t<xr:FillValue xsi:nil="true"/>
\t\t\t\t\t\t\t<xr:Mask/>
\t\t\t\t\t\t\t<xr:ChoiceParameters/>
\t\t\t\t\t\t</xr:StandardAttribute>
\t\t\t\t\t</StandardAttributes>
\t\t\t\t</Properties>
\t\t\t\t<ChildObjects>
{ts_attrs}
\t\t\t\t</ChildObjects>
\t\t\t</TabularSection>
\t\t\t<Form>Форма</Form>
\t\t</ChildObjects>
\t</ExternalDataProcessor>
</MetaDataObject>
"""

# ---------- Form descriptor ----------
FORM_DESC = f"""<?xml version="1.0" encoding="UTF-8"?>
<MetaDataObject {NS_MD}>
\t<Form uuid="{U['form']}">
\t\t<Properties>
\t\t\t<Name>Форма</Name>
\t\t\t{syn('Форма')}
\t\t\t<Comment/>
\t\t\t<FormType>Managed</FormType>
\t\t\t<IncludeHelpInContents>false</IncludeHelpInContents>
\t\t\t<UsePurposes>
\t\t\t\t<v8:Value xsi:type="app:ApplicationUsePurpose">PlatformApplication</v8:Value>
\t\t\t\t<v8:Value xsi:type="app:ApplicationUsePurpose">MobilePlatformApplication</v8:Value>
\t\t\t</UsePurposes>
\t\t\t<ExtendedPresentation/>
\t\t</Properties>
\t</Form>
</MetaDataObject>
"""


def title(text):
    return (f"<Title><v8:item><v8:lang>ru</v8:lang>"
            f"<v8:content>{text}</v8:content></v8:item></Title>")


def col(name, eid, datapath, caption, readonly=False):
    # ПРАВИЛО юзера: все поля таблицы по умолчанию РЕДАКТИРУЕМЫЕ (readonly=False).
    ro = "\n\t\t\t\t\t\t<ReadOnly>true</ReadOnly>" if readonly else ""
    return f"""\t\t\t\t\t<InputField name="{name}" id="{eid}">
\t\t\t\t\t\t<DataPath>{datapath}</DataPath>
\t\t\t\t\t\t{title(caption)}{ro}
\t\t\t\t\t\t<EditMode>EnterOnInput</EditMode>
\t\t\t\t\t</InputField>"""

cols = "\n".join([
    col("кМетка", 30, "Объект.ТаблицаДокументов.Метка", "Метка", readonly=False),
    col("кПоступление", 31, "Объект.ТаблицаДокументов.Поступление", "Поступление", readonly=False),
    col("кСчетРасчетовПоступления", 32, "Объект.ТаблицаДокументов.СчетРасчетовПоступления", "Счёт расчётов (Пост.) 76.06", readonly=False),
    col("кРеализация", 33, "Объект.ТаблицаДокументов.Реализация", "Реализация", readonly=False),
    col("кСчетРасчетовРеализации", 34, "Объект.ТаблицаДокументов.СчетРасчетовРеализации", "Счёт расчётов (Реал.) 76.09", readonly=False),
    col("кКонтрагент", 35, "Объект.ТаблицаДокументов.Контрагент", "Контрагент", readonly=False),
    col("кОрганизация", 36, "Объект.ТаблицаДокументов.Организация", "Организация", readonly=False),
])

FORM_XML = f"""<?xml version="1.0" encoding="UTF-8"?>
<Form {NS_FORM}>
\t<AutoCommandBar name="ФормаКоманднаяПанель" id="-1"/>
\t<Events>
\t\t<Event name="OnCreateAtServer">ПриСозданииНаСервере</Event>
\t</Events>
\t<ChildItems>
\t\t<UsualGroup name="ГруппаОтборы" id="1">
\t\t\t{title('Отборы')}
\t\t\t<Group>Vertical</Group>
\t\t\t<Behavior>Collapsible</Behavior>
\t\t\t<CollapsedRepresentationTitle><v8:item><v8:lang>ru</v8:lang><v8:content>Показать отборы</v8:content></v8:item></CollapsedRepresentationTitle>
\t\t\t<ControlRepresentation>Picture</ControlRepresentation>
\t\t\t<ChildItems>
\t\t\t\t<InputField name="Организации" id="3">
\t\t\t\t\t<DataPath>Организации</DataPath>
\t\t\t\t\t{title('Организация')}
\t\t\t\t\t<ExtendedEditMultipleValues>true</ExtendedEditMultipleValues>
\t\t\t\t\t<EditMode>EnterOnInput</EditMode>
\t\t\t\t</InputField>
\t\t\t\t<InputField name="Контрагенты" id="4">
\t\t\t\t\t<DataPath>Контрагенты</DataPath>
\t\t\t\t\t{title('Контрагент')}
\t\t\t\t\t<ExtendedEditMultipleValues>true</ExtendedEditMultipleValues>
\t\t\t\t\t<EditMode>EnterOnInput</EditMode>
\t\t\t\t</InputField>
\t\t\t\t<UsualGroup name="ГруппаДата" id="6">
\t\t\t\t\t{title('Группа дата')}
\t\t\t\t\t<Group>Horizontal</Group>
\t\t\t\t\t<Behavior>Usual</Behavior>
\t\t\t\t\t<Representation>None</Representation>
\t\t\t\t\t<ShowTitle>false</ShowTitle>
\t\t\t\t\t<ChildItems>
\t\t\t\t\t\t<InputField name="ДатаС" id="7">
\t\t\t\t\t\t\t<DataPath>Объект.ДатаС</DataPath>
\t\t\t\t\t\t\t{title('Период с')}
\t\t\t\t\t\t\t<EditMode>EnterOnInput</EditMode>
\t\t\t\t\t\t</InputField>
\t\t\t\t\t\t<LabelDecoration name="ДекорацияТире" id="10">
\t\t\t\t\t\t\t<Title formatted="false"><v8:item><v8:lang>ru</v8:lang><v8:content>–</v8:content></v8:item></Title>
\t\t\t\t\t\t\t<HorizontalAlign>Center</HorizontalAlign>
\t\t\t\t\t\t</LabelDecoration>
\t\t\t\t\t\t<InputField name="ДатаПо" id="8">
\t\t\t\t\t\t\t<DataPath>Объект.ДатаПо</DataPath>
\t\t\t\t\t\t\t<TitleLocation>None</TitleLocation>
\t\t\t\t\t\t\t<EditMode>EnterOnInput</EditMode>
\t\t\t\t\t\t</InputField>
\t\t\t\t\t</ChildItems>
\t\t\t\t</UsualGroup>
\t\t\t</ChildItems>
\t\t</UsualGroup>
\t\t<Table name="ТаблицаДокументов" id="20">
\t\t\t<Representation>List</Representation>
\t\t\t<AutoInsertNewRow>false</AutoInsertNewRow>
\t\t\t<DataPath>Объект.ТаблицаДокументов</DataPath>
\t\t\t<RowFilter xsi:nil="true"/>
\t\t\t<AutoCommandBar name="ТаблицаДокументовКоманднаяПанель" id="21">
\t\t\t\t<ChildItems>
\t\t\t\t\t<Button name="кнЗаполнить" id="22">
\t\t\t\t\t\t<Type>CommandBarButton</Type>
\t\t\t\t\t\t<CommandName>Form.Command.КомандаЗаполнить</CommandName>
\t\t\t\t\t\t<BackColor>#FFE100</BackColor>
\t\t\t\t\t</Button>
\t\t\t\t\t<Button name="кнВыбратьВыделенные" id="23">
\t\t\t\t\t\t<Type>CommandBarButton</Type>
\t\t\t\t\t\t<CommandName>Form.Command.ВыбратьВыделенные</CommandName>
\t\t\t\t\t</Button>
\t\t\t\t\t<Button name="кнПоставитьМетку" id="24">
\t\t\t\t\t\t<Type>CommandBarButton</Type>
\t\t\t\t\t\t<Representation>Picture</Representation>
\t\t\t\t\t\t<CommandName>Form.Command.ПоставитьМетку</CommandName>
\t\t\t\t\t\t<Picture>
\t\t\t\t\t\t\t<xr:Ref>StdPicture.AppearanceCheckIcon</xr:Ref>
\t\t\t\t\t\t</Picture>
\t\t\t\t\t</Button>
\t\t\t\t\t<Button name="кнСнятьМетку" id="25">
\t\t\t\t\t\t<Type>CommandBarButton</Type>
\t\t\t\t\t\t<Representation>Picture</Representation>
\t\t\t\t\t\t<CommandName>Form.Command.СнятьМетку</CommandName>
\t\t\t\t\t\t<Picture>
\t\t\t\t\t\t\t<xr:Ref>StdPicture.AppearanceCircleEmpty</xr:Ref>
\t\t\t\t\t\t</Picture>
\t\t\t\t\t</Button>
\t\t\t\t\t<Button name="кнИсправитьСчетРасчетов" id="26">
\t\t\t\t\t\t<Type>CommandBarButton</Type>
\t\t\t\t\t\t<CommandName>Form.Command.ИсправитьСчетРасчетов</CommandName>
\t\t\t\t\t\t<BackColor>#70AD47</BackColor>
\t\t\t\t\t</Button>
\t\t\t\t</ChildItems>
\t\t\t</AutoCommandBar>
\t\t\t<ChildItems>
{cols}
\t\t\t</ChildItems>
\t\t</Table>
\t</ChildItems>
\t<Attributes>
\t\t<Attribute name="Объект" id="100">
\t\t\t<Type><v8:Type>cfg:ExternalDataProcessorObject.{NAME}</v8:Type></Type>
\t\t\t<MainAttribute>true</MainAttribute>
\t\t\t<Save>
\t\t\t\t<Field>Объект.ДатаС</Field>
\t\t\t\t<Field>Объект.ДатаПо</Field>
\t\t\t</Save>
\t\t</Attribute>
\t\t<Attribute name="Организации" id="3">
\t\t\t{title('Организации')}
\t\t\t<Type><v8:Type>v8:ValueListType</v8:Type></Type>
\t\t\t<Settings xsi:type="v8:TypeDescription"><v8:Type>cfg:CatalogRef.Организации</v8:Type></Settings>
\t\t</Attribute>
\t\t<Attribute name="Контрагенты" id="4">
\t\t\t{title('Контрагенты')}
\t\t\t<Type><v8:Type>v8:ValueListType</v8:Type></Type>
\t\t\t<Settings xsi:type="v8:TypeDescription"><v8:Type>cfg:CatalogRef.Контрагенты</v8:Type></Settings>
\t\t</Attribute>
\t</Attributes>
\t<Commands>
\t\t<Command name="КомандаЗаполнить" id="1">
\t\t\t{title('Заполнить')}
\t\t\t<Action>КомандаЗаполнить</Action>
\t\t</Command>
\t\t<Command name="ВыбратьВыделенные" id="2">
\t\t\t{title('Выбрать выделенное')}
\t\t\t<Action>ВыбратьВыделенные</Action>
\t\t</Command>
\t\t<Command name="ПоставитьМетку" id="3">
\t\t\t{title('Поставить метку')}
\t\t\t<Action>ПоставитьМетку</Action>
\t\t</Command>
\t\t<Command name="СнятьМетку" id="4">
\t\t\t{title('Снять метку')}
\t\t\t<Action>СнятьМетку</Action>
\t\t</Command>
\t\t<Command name="ИсправитьСчетРасчетов" id="5">
\t\t\t{title('Исправить счёт расчётов')}
\t\t\t<Action>ИсправитьСчетРасчетов</Action>
\t\t</Command>
\t</Commands>
</Form>
"""

# ---------- Form module ----------
FORM_MODULE = r'''&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) //+ Бурдуков С.Ю 11.06.2026

	ИнициализироватьОтборыНаСервере();
	Объект.ТаблицаДокументов.Очистить();

КонецПроцедуры

&НаСервере
Процедура ИнициализироватьОтборыНаСервере() //+ Бурдуков С.Ю 11.06.2026

	Если ТипЗнч(Организации) <> Тип("СписокЗначений") Тогда
		Организации = Новый СписокЗначений;
	КонецЕсли;
	Если ТипЗнч(Контрагенты) <> Тип("СписокЗначений") Тогда
		Контрагенты = Новый СписокЗначений;
	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура КомандаЗаполнить(Команда) //+ Бурдуков С.Ю 11.06.2026

	ЗаполнитьНаСервере();
	Если Объект.ТаблицаДокументов.Количество() = 0 Тогда
		Сообщить("Не найдено поступлений с агентскими услугами по счёту 76.06 за период.");
	КонецЕсли;

КонецПроцедуры

&НаСервере
Процедура ЗаполнитьНаСервере() //+ Бурдуков С.Ю 11.06.2026

	МассивОрганизаций = Организации.ВыгрузитьЗначения();
	МассивКонтрагентов = Контрагенты.ВыгрузитьЗначения();
	ДатаНач = ?(ЗначениеЗаполнено(Объект.ДатаС), НачалоДня(Объект.ДатаС), Дата(1, 1, 1));
	ДатаКон = ?(ЗначениеЗаполнено(Объект.ДатаПо), КонецДня(Объект.ДатаПо), Дата(3999, 12, 31, 23, 59, 59));

	Запрос = Новый Запрос;
	Запрос.Текст =
	"ВЫБРАТЬ
	|	Пост.Ссылка КАК Поступление,
	|	ПостАг.СчетРасчетов КАК СчетРасчетовПоступления,
	|	Пост.Сделка КАК Заказ,
	|	Пост.Организация КАК Организация,
	|	Пост.Контрагент КАК Контрагент
	|ПОМЕСТИТЬ ВтПоступления
	|ИЗ
	|	Документ.ПоступлениеТоваровУслуг КАК Пост
	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваровУслуг.АгентскиеУслуги КАК ПостАг
	|		ПО Пост.Ссылка = ПостАг.Ссылка
	|ГДЕ
	|	Пост.Дата МЕЖДУ &ДатаНач И &ДатаКон
	|	И ПостАг.СчетРасчетов.Код = ""76.06""
	|	И Пост.Проведен
	|	И НЕ Пост.ПометкаУдаления
	|	И (&БезОтбораОрганизаций ИЛИ Пост.Организация В (&Организации))
	|	И (&БезОтбораКонтрагентов ИЛИ Пост.Контрагент В (&Контрагенты))
	|;
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	Реал.Ссылка КАК Реализация,
	|	РеалАг.СчетРасчетов КАК СчетРасчетовРеализации,
	|	СчетНаОплату.ЗаказПокупателя КАК Заказ
	|ПОМЕСТИТЬ ВтРеализации
	|ИЗ
	|	Документ.РеализацияТоваровУслуг КАК Реал
	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг.АгентскиеУслуги КАК РеалАг
	|		ПО Реал.Ссылка = РеалАг.Ссылка
	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг.Услуги КАК РеалУсл
	|		ПО Реал.Ссылка = РеалУсл.Ссылка
	|		ЛЕВОЕ СОЕДИНЕНИЕ Документ.СчетНаОплатуПокупателю2 КАК СчетНаОплату
	|		ПО РеалУсл.СчетНаОплатуПокупателю = СчетНаОплату.Ссылка
	|ГДЕ
	|	РеалАг.СчетРасчетов.Код = ""76.09""
	|	И Реал.Проведен
	|	И НЕ Реал.ПометкаУдаления
	|;
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ РАЗЛИЧНЫЕ
	|	П.Поступление КАК Поступление,
	|	П.СчетРасчетовПоступления КАК СчетРасчетовПоступления,
	|	Р.Реализация КАК Реализация,
	|	Р.СчетРасчетовРеализации КАК СчетРасчетовРеализации,
	|	П.Контрагент КАК Контрагент,
	|	П.Организация КАК Организация
	|ИЗ
	|	ВтПоступления КАК П
	|		ЛЕВОЕ СОЕДИНЕНИЕ ВтРеализации КАК Р
	|		ПО П.Заказ = Р.Заказ
	|			И П.Заказ <> ЗНАЧЕНИЕ(Документ.ЗаказПокупателя2.ПустаяСсылка)
	|
	|УПОРЯДОЧИТЬ ПО
	|	Поступление";

	Запрос.УстановитьПараметр("ДатаНач", ДатаНач);
	Запрос.УстановитьПараметр("ДатаКон", ДатаКон);
	Запрос.УстановитьПараметр("Организации", МассивОрганизаций);
	Запрос.УстановитьПараметр("Контрагенты", МассивКонтрагентов);
	Запрос.УстановитьПараметр("БезОтбораОрганизаций", МассивОрганизаций.Количество() = 0);
	Запрос.УстановитьПараметр("БезОтбораКонтрагентов", МассивКонтрагентов.Количество() = 0);

	Объект.ТаблицаДокументов.Очистить();
	Выборка = Запрос.Выполнить().Выбрать();
	Пока Выборка.Следующий() Цикл
		НоваяСтрока = Объект.ТаблицаДокументов.Добавить();
		НоваяСтрока.Метка = Ложь;
		НоваяСтрока.Поступление = Выборка.Поступление;
		НоваяСтрока.СчетРасчетовПоступления = Выборка.СчетРасчетовПоступления;
		НоваяСтрока.Реализация = Выборка.Реализация;
		НоваяСтрока.СчетРасчетовРеализации = Выборка.СчетРасчетовРеализации;
		НоваяСтрока.Контрагент = Выборка.Контрагент;
		НоваяСтрока.Организация = Выборка.Организация;
	КонецЦикла;

КонецПроцедуры

&НаКлиенте
Процедура ВыбратьВыделенные(Команда) //+ Бурдуков С.Ю 11.06.2026

	Для Каждого ИдСтроки Из Элементы.ТаблицаДокументов.ВыделенныеСтроки Цикл
		Строка = Объект.ТаблицаДокументов.НайтиПоИдентификатору(ИдСтроки);
		Если Строка <> Неопределено Тогда
			Строка.Метка = Истина;
		КонецЕсли;
	КонецЦикла;

КонецПроцедуры

&НаКлиенте
Процедура ПоставитьМетку(Команда) //+ Бурдуков С.Ю 11.06.2026

	Для Каждого Строка Из Объект.ТаблицаДокументов Цикл
		Строка.Метка = Истина;
	КонецЦикла;

КонецПроцедуры

&НаКлиенте
Процедура СнятьМетку(Команда) //+ Бурдуков С.Ю 11.06.2026

	Для Каждого Строка Из Объект.ТаблицаДокументов Цикл
		Строка.Метка = Ложь;
	КонецЦикла;

КонецПроцедуры

&НаКлиенте
Процедура ИсправитьСчетРасчетов(Команда) //+ Бурдуков С.Ю 11.06.2026

	ЕстьОтмеченные = Ложь;
	Для Каждого Строка Из Объект.ТаблицаДокументов Цикл
		Если Строка.Метка Тогда
			ЕстьОтмеченные = Истина;
			Прервать;
		КонецЕсли;
	КонецЦикла;

	Если НЕ ЕстьОтмеченные Тогда
		Сообщить("Отметьте строки, в которых нужно исправить счёт расчётов (колонка Метка).");
		Возврат;
	КонецЕсли;

	Оповещение = Новый ОписаниеОповещения("ИсправитьСчетРасчетовЗавершение", ЭтотОбъект);
	ПоказатьВводЗначения(Оповещение, Неопределено, "Выберите новый счёт расчётов для поступлений", Тип("ПланСчетовСсылка.Хозрасчетный"));

КонецПроцедуры

&НаКлиенте
Процедура ИсправитьСчетРасчетовЗавершение(ВыбранныйСчет, ДопПараметры) Экспорт //+ Бурдуков С.Ю 11.06.2026

	Если ВыбранныйСчет = Неопределено ИЛИ НЕ ЗначениеЗаполнено(ВыбранныйСчет) Тогда
		Возврат;
	КонецЕсли;

	Сообщить(ИсправитьСчетРасчетовНаСервере(ВыбранныйСчет));

КонецПроцедуры

&НаСервере
Функция ИсправитьСчетРасчетовНаСервере(ВыбранныйСчет) //+ Бурдуков С.Ю 11.06.2026

	Обработано = 0;
	Ошибок = 0;

	Для Каждого Строка Из Объект.ТаблицаДокументов Цикл
		Если НЕ Строка.Метка Тогда
			Продолжить;
		КонецЕсли;
		Если НЕ ЗначениеЗаполнено(Строка.Поступление) Тогда
			Продолжить;
		КонецЕсли;

		Попытка
			ДокОбъект = Строка.Поступление.ПолучитьОбъект();
			Изменено = Ложь;
			Для Каждого СтрАг Из ДокОбъект.АгентскиеУслуги Цикл
				Если СокрЛП(СтрАг.СчетРасчетов.Код) = "76.06" Тогда
					СтрАг.СчетРасчетов = ВыбранныйСчет;
					Изменено = Истина;
				КонецЕсли;
			КонецЦикла;

			Если Изменено Тогда
				ДокОбъект.Записать(РежимЗаписиДокумента.Проведение);
				Строка.СчетРасчетовПоступления = ВыбранныйСчет;
				Обработано = Обработано + 1;
			КонецЕсли;
		Исключение
			Ошибок = Ошибок + 1;
			Сообщить("Ошибка по документу " + Строка(Строка.Поступление) + ": " + ОписаниеОшибки());
		КонецПопытки;
	КонецЦикла;

	Возврат "Исправлено поступлений: " + Обработано + ?(Ошибок > 0, ", с ошибками: " + Ошибок, "");

КонецФункции
'''

OBJECT_MODULE = "// Внешняя обработка ИсправлениеСчетаРасчетовАгентскихУслуг.\n// Вся логика — в модуле формы. //+ Бурдуков С.Ю 11.06.2026\n"

# ---------- write tree ----------
shutil.rmtree(ROOT, ignore_errors=True)
base = os.path.join(ROOT, NAME)
os.makedirs(os.path.join(base, "Forms", "Форма", "Ext", "Form"), exist_ok=True)
os.makedirs(os.path.join(base, "Ext"), exist_ok=True)

def w(path, content):
    with open(path, "w", encoding="utf-8") as f:
        f.write(content)

w(os.path.join(ROOT, NAME + ".xml"), ROOT_XML)
w(os.path.join(base, "Forms", "Форма.xml"), FORM_DESC)
w(os.path.join(base, "Forms", "Форма", "Ext", "Form.xml"), FORM_XML)
w(os.path.join(base, "Forms", "Форма", "Ext", "Form", "Module.bsl"), FORM_MODULE)
w(os.path.join(base, "Ext", "ObjectModule.bsl"), OBJECT_MODULE)

print("OK -> ", ROOT)
for dp, dn, fn in os.walk(ROOT):
    for f in fn:
        p = os.path.join(dp, f)
        print(f"  {os.path.relpath(p, ROOT)}  ({os.path.getsize(p)} b)")
