Ини файл 2

Материал из razgovorov.ru
Перейти к: навигация, поиск

Файлы настроек нужны либо для передачи параметров в код, тогда все параметры будут константами (строками), либо для универсального получения данных из какого-то объекта, тогда на вход расчета передается сам объект.

Расчет осуществляется последовательным перебором элементов в файле и их расчетом. Расчет осуществляется следующим образом: Если указан атрибут "Тип" то запускается обработчик данного типа. Если первый символ значения является " или [ или ^ - то запускается обработчик строки, ссылки или формулы.


В качестве результата должен получиться объект содержащий простые типы данных (строки, числа, структуры, массивы).

Для расчета данных могут используются вспомогательные объекты и данные, чтобы исключить их из результата нужно в имя таких данных добавить префикс "_", после окончания расчета параметры начинающиеся на "_" удаляются из объекта.

Для хранения в репозитории и ручного редактирования используется формат XML, для ускорения обработки в работе XML сериализуется в json или аналогичные ему структуры информационной системы.

Формат json не используется для хранения и редактирования потому что не гарантирует сохранения порядка следования элементов, не позволяет оставлять комментариев, не позволяет штатными средствами показывать отформатированный многострочный текст.

В дальнейших примерах будет приводится исходный текст XML, его сериализуемый вид используемый в расчете а так же результат расчета.


При описании настроек используются следующие синтаксические конструкции:

Структуры

Неупорядоченный список данных типа ключ-значение, применяется в случаях когда порядок элементов не важен. Так же структуры применяются для создания иерархии как в файле настроек, так и в результирующем файле.

Сериализатор XML определяет структуру по отсутствию значения и типа.

<Файл>
   <Документ>
       <ТаблДок>
       </ТаблДок>
   </Документ>
</Файл>

Будет сериализован в

{"Файл": {
   "Значение": {
      "Документ": {
         "Значение": {
            "ТаблДок": {
               "Значение": {

}}}}}

Результат расчета

{"Файл": {
      "Документ": {
            "ТаблДок": {}
}}}


Строка

Самый простой источник данных. Результатом обработки будет указанное в файле значение.

Обработчик определяет строку по начальным и завершающим двойным кавычкам.

<Файл>
   <Документ_Тип>"Накладная"</Документ_Тип>
   <ТаблДок>
   </ТаблДок>
</Файл>

Будет сериализован в

{"Файл": {
   "Значение": {
      "Документ_Тип": { "Значение": "\"Накладная\"" },
      "ТаблДок": { "Значение": {} }    
}}}

Результат

{"Файл": {
      "Документ_Тип": "Накладная",
      "ТаблДок": {}    
}}

Прямое обращение к данным

Чтобы обработчик понимал, из какого объекта ему необходимо получить данные используются ключевые слова. Например для 1С это [тип метаданных].[тип объекта] (Документ.РеализацияТоваровУслуг). В данном примере "Документ" является ключевым словом по которому расчет понимает что на вход подан документ реализация товаров и услуг. Такой подход так же позволяет осуществить проверку корректности файла настроек по метаданным. Для каждой системы и каждого направления (входящие/ исходящие) есть свой набор ключевых слов. Для выгрузки из 1С это "Документ" и "ЗаписьСправочника". Поскольку объект документ является сложным и не может остаться в результате, имя параметра содержащее ссылку на него всегда начинается с "_".

<Файл>
   <_Документ>Документ.РеализацияТоваровУслуг</Документ>
   <Документ_Тип>"Накладная"</Документ_Тип>
</Файл>

Будет сериализован в

{"Файл": {
   "Значение": {
      "_Документ": {"Значение": "Документ.РеализацияТоваровУслуг"},
      "Документ_Тип": {"Значение": "\"Накладная\"" }
      },
}}}}}


Получения свойства объекта

В результате расчета предыдущего пункта в результат (доступный в момент расчета) будет помещен непосредственно какой то объект типа Документм.РеализацияТоваровУслуг у которого много свойств. Некоторые из свойств в свою очередь то же являются объектами со своими свойствами, например Контрагент. В результате расчета нужно получить необходимые нам свойства нужных объектов. Предположим что для документа нам нужны его Дата и Номер. Получить их можно указав путь до объекта в квадратных скобках

<Файл>
   <_Документ>Документ.РеализацияТоваровУслуг</Документ>
   <Документ_Тип>"Накладная"</Документ_Тип>
   <Документ_Дата>[_Документ].Дата</Документ_Тип>
   <Документ_Номер>[_Документ].Номер</Документ_Тип>
</Файл>

Будет сериализован в

{"Файл": {
   "Значение": {
      "_Документ": {"Значение": "Документ.РеализацияТоваровУслуг"},
      "Документ_Тип": { "Значение": "\"Накладная\""},
      "Документ_Дата": { "Значение": "[_Документ].Дата"},
      "Документ_Номер": { "Значение": "[_Документ].Номер"}
}}}

Результат

{"Файл": {
      "Документ_Тип": "Накладная",
      "Документ_Дата": "01.02.2016",
      "Документ_Номер": "1244",
      "ТаблДок": {}    
}}


  1. Именованные массивы / Упорядоченные структуры

Упорядоченный список данных типа ключ-значение, применяется когда в первую очередь важен порядок следования элементов, обращение к элементу по имени как правило не происходит. Применяется для описания полей документа, когда нужно их перебрать по очереди, при этом иметь возможность переопределить любой из них.

Список ключ значениеИмя элемента формируется по шаблону Список[Название элемента]

   <СписокПоказательСcылка>
      <ПоказательСсылка>
         <Имя>Счет-58-03-01<Имя/>
	 <Тип>Счет-58-03-01<Тип/>
      </ПоказательСсылка>
   </СписокПоказательСcылка>
  1. Простые массивы

Применяются только для хранения списка простых данных. Переопределяются целиком. Все аналогично массивам,

<СписокПоказательСcылка> <ПоказательСсылка>Счет-58-03-01</ПоказательСсылка> <ПоказательСсылка>Счет-58-03-02</ПоказательСсылка> </СписокПоказательСcылка>

<Счет-001>
	<ПоказательСсылка Тип="Массив">
		<Счет-97/>
		<Счет-006/>
		<Счет-007/>
		<Счет-008/>
		<Счет-009/>
	</ПоказательСсылка>
	<Показатель>
		<СпособРасчета>"Сальдо"</СпособРасчета>
		<Счет>
			<КодИС>"60.02"</КодИС>
			<ТипИС>"СчетУчета"</ТипИС>
		</Счет>
		<Лицо1><ТипИС>"Контрагент"</ТипИС></Лицо1>
		<Лицо2><ТипИС>"Договор"</ТипИС></Лицо2>
	</Показатель>
	<Расчет Тип="МассивОбъектов">
		<СпособРасчета>Сальдо</СпособРасчета>
		<Сальдо Тип="Шаблон"/>
		<_Счет1С Отбор_КодБыстрогоВыбора = "'001'">ПланыСчетов.Хозрасчетный</_Счет1С>
		<ТаблСальдо Тип="МассивОбъектов">
			<_Выборка Тип = "Запрос" Отбор_Организация1С = "[Организация1С]" Отбор_ДатаОстатков = "[ДатаОстатков]" Отбор_Счет1С = "[_Счет1С]" Выбрать = "все">'ВЫБРАТЬ РАЗРЕШЕННЫЕ
				Остатки.Счет КАК Счет,
				Остатки.СуммаОстаток КАК Сальдо,
				Остатки.Субконто1 КАК Субконто1,
				Остатки.Субконто2 КАК Субконто2
			ИЗ
				РегистрБухгалтерии.Хозрасчетный.Остатки(&amp;ДатаОстатков, (Счет=&amp;Счет1С),,Организация = &amp;Организация1С) КАК Остатки'</_Выборка>
			<Сумма Формат="ЧЦ=17; ЧДЦ=2; ЧРД=.; ЧГ=0; ЧН=0.00">[_Выборка].Сальдо</Сумма>
			<Лицо1>[_Выборка].Субконто2</Лицо1>
			<Лицо2>[_Выборка].Субконто1</Лицо2>
		</ТаблСальдо>
	</Расчет>
</Счет-001>
{
  "Счет-001": {
    "ПоказательСсылка": {
      "Тип": "Массив",
      "Значение": [
        "Счет-97",
        "Счет-006",
        "Счет-007",
        "Счет-008",
        "Счет-009"
      ]
    },
    "Показатель": {
      "СпособРасчета": "Сальдо",
      "Счет": {
        "КодИС": "60.02",
        "ТипИС": "СчетУчета"
      },
      "Лицо1": {
        "ТипИС": "Контрагент"
      },
      "Лицо2": {
        "ТипИС": "Договор"
      }
    },
    "Расчет": {
      "Тип": "МассивОбъектов",
      "Значение": [
        {
          "Имя": "СпособРасчета",
          "Значение": "Сальдо"
        },
        {
          "Имя": "Сальдо",
          "Тип": "Шаблон"
        },
        {
          "Имя": "_Счет1С",
          "Отбор_КодБыстрогоВыбора": "'001'",
          "Значение": "ПланыСчетов.Хозрасчетный"
        },
        {
          "Имя": "ТаблСальдо",
          "Тип": "МассивОбъектов",
          "Значение": [
            {
              "Имя": "_Выборка",
              "Тип": "Запрос",
              "Отбор_Организация1С": "[Организация1С]",
              "Отбор_ДатаОстатков": "[ДатаОстатков]",
              "Отбор_Счет1С": "[_Счет1С]",
              "Выбрать": "все",
              "Значение": "ВЫБРАТЬ РАЗРЕШЕННЫЕ Остатки.Счет КАК Счет,Остатки.СуммаОстаток КАК Сальдо,Остатки.Субконто1 КАК Субконто1,Остатки.Субконто2 КАК Субконто2 ИЗ РегистрБухгалтерии.Хозрасчетный.Остатки(&amp;ДатаОстатков, (Счет:&amp;Счет1С),,Организация : &amp;Организация1С) КАК Остатки"
            },
            {
              "Имя": "Сумма",
              "Формат": "ЧЦ:17; ЧДЦ:2; ЧРД:.; ЧГ:0; ЧН:0.00",
              "Значение": "[_Выборка].Сальдо"
            },
            {
              "Имя": "Лицо1",
              "Значение": "[_Выборка].Субконто2"
            },
            {
              "Имя": "Лицо2",
              "Значение": "[_Выборка].Субконто1"
            }
          ]
        }
      ]
    }
  }