Счет-фактура в XML

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Аватара пользователя
Admin
Администратор
Сообщения: 3959
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

Счет-фактура в XML

Сообщение Admin »

Возникла необходимость генерить XML со счет-фактурой по стандартам РФ.
Структура такая примерно:

Код: Выделить всё

<?xml version="1.0" encoding="windows-1251"?>
<Файл ИдФайл="ON_SFAKT_2BK-7714902984-807078_2BK-7707083893-780888888-7800000000000_20141022_1899B29A-A185-469F-A663-BAA5142D908B" ВерсПрог="Электронный Курьер 1.0" ВерсФорм="5.01">
  <СвУчДокОбор ИдОтпр="2BK-7707083893-780888888-7800000000000" ИдПок="2BK-7714902984-807078">
    <СвОЭДОтпр ИдЭДО="2BK" ИННЮЛ="7801392271" НаимОрг="Общество с ограниченной ответственностью "КОРУС Консалтинг СНГ"" />
  </СвУчДокОбор>
  <Документ КНД="1115101">
    <СвСчФакт НомерСчФ="1" ДатаСчФ="22.10.2014" КодОКВ="643">
      <СвПрод>
        <ИдСв>
          <СвЮЛ НаимОрг="Сбербанк ТЕСТ Контрагент 1" ИННЮЛ="7707083893" КПП="780888888" />
        </ИдСв>
        <Адрес>
          <АдрРФ Индекс="190000" КодРегион="78" Город="Санкт-Петербург" Улица="Невский пр." Дом="1" Корпус="1" />
        </Адрес>
      </СвПрод>
      <ГрузОт>
        <ОнЖе>он же</ОнЖе>
      </ГрузОт>
      <СвПокуп>
        <ИдСв>
          <СвЮЛ НаимОрг="ООО "Даймонд-Клаб"" ИННЮЛ="7714902984" КПП="771401001" />
        </ИдСв>
        <Адрес>
          <АдрРФ Индекс="127555" КодРегион="77" Улица="Мелиховская ул" Дом="2" Корпус="н" Кварт="н" />
        </Адрес>
      </СвПокуп>
      <ИнфПол />
    </СвСчФакт>
    <ТаблСчФакт>
      <СведТов НомСтр="1" НаимТов="масло" ОКЕИ_Тов="166" КолТов="150" ЦенаТов="150" СтТовБезНДС="22500" СтТовУчНал="26550">
        <Акциз СумАкциз="без акциза" />
        <НалСт НалСтВел="18" НалСтТип="процент" />
        <СумНал СумНДС="4050.00" />
      </СведТов>
      <ВсегоОпл СтТовБезНДСВсего="22500" СтТовУчНалВсего="26550">
        <СумНалВсего СумНДС="4050.00" />
      </ВсегоОпл>
    </ТаблСчФакт>
    <Подписант>
      <ЮЛ ИННЮЛ="7707083893" Должн="Тест должность">
        <ФИО Фамилия="Петров" Имя="Петр" Отчество="Петрович" />
      </ЮЛ>
    </Подписант>
  </Документ>
</Файл>
Вопрос в инструменте. Кто нибудь уже делал? Есть мысли?
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
BOB
Ветеран
Сообщения: 336
Зарегистрирован: 17 Июль 2005, 5:43

Re: Счет-фактура в XML

Сообщение BOB »

http://sbis.ru/ там куча форматов на документы , кроме того они делают
формат под пользователя , ну например в стандартном формате 3 знака точности
в кол-ве , а мне нужно 6 и тд . И там есть проверка Вашего xml на валидность .
kreator
✯ Ветеран ✯
Сообщения: 4982
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 7 раз
Поблагодарили: 20 раз

Re: Счет-фактура в XML

Сообщение kreator »

Если вопрос только в создании XML файла, то связываться со сторонними API незачем. В Clarion есть шаблоны, классы для XML. Я, правда, не стал заморачиваться и для выгрузки в Excel формирую XML файл ручками, он же обычный текстовый.
We are hard at work… for you. :)
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

Re: Счет-фактура в XML

Сообщение Yufil »

А в чём, собственно, проблема? Нужен класс для работы с динамическими строками, функция эскейпинга (преобразования спецсимволов) и, возможно, преобразование ASCII-UTF8. Всё это есть. А дальше конкатенацией собираешь и экспортируешь в файл.
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7372
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Re: Счет-фактура в XML

Сообщение Игорь Столяров »

Согласен, сейчас в Clarion есть все необходимое для создания XML файлов (тем более в windows-1251).
Никакие дополнительные средства не требуются.

Код: Выделить всё

  Include('ABPRXML.INC'),Once
XML      Class(XMLGenerator),Thread    
  Code
   
  XML.Init('C:\MyXMLFile.xml')
  XML.OpenDocument()
  XML.SetEncoding('windows-1251')
  XML.SetUseCRLF(False)

  If Exists('C:\MyXMLFile.xml')

     XML.AddComment('Пример XML файла')
     XML.SetRootTag('Root')

     XML.AddTag('Title','')
     XML.AddAttribute('Comment','Текст комментария','Title')
     XML.AddTag('Адрес','г. Москва ...',False,'Title')
     
     XML.AddTag('ТаблСчФакт','')
     XML.AddTag('СведТов','Масло ...',False,'ТаблСчФакт')
     
     ....

     XML.SetSupportNameSpaces(True)
     XML.CloseDocument()
end     
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Admin
Администратор
Сообщения: 3959
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

Re: Счет-фактура в XML

Сообщение Admin »

Игорь Столяров писал(а):Согласен, сейчас в Clarion есть все необходимое для создания XML файлов (тем более в windows-1251).
Никакие дополнительные средства не требуются.
Вот! Примерно это и хотел услышать. iQXML не хочется использовать. Спасибо.
Описания класса конечно же нигде нету?
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7372
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Re: Счет-фактура в XML

Сообщение Игорь Столяров »

Admin писал(а):iQXML не хочется использовать.
И не надо. Библиотека хорошая, но непредсказуемая. Вроде закрывали проект, но потом передумали.
Но точно - никакого развития сейчас уже нет. Несколько раз нарывались на проблемы с кодировкой после обновления.
К тому же лишний DLL. Мы сейчас все что можно переписали на ClarionXML классы.
Admin писал(а):Описания класса конечно же нигде нету?
В общем-то это штатный ABC классс Clarion.
В разделе справки что-то есть в разделе "Report to XML Procedure Support".
Проще открыть abprxml.inc и abprxml.clw (здесь есть небольшой косяк при записи длинных строк)
и посмотреть, класс небольшой, все и так понятно. Есть значительные в версиях C63 и C91.
Я в примере показал как формируется XML документ ...
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3133
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Re: Счет-фактура в XML

Сообщение Дед Пахом »

Есть ещё свеженький EasyXML, там делается так:

Код: Выделить всё

  ! загружаем шаблон
  xDoc.Load('Счёт-фактура-шаблон.xml')
  
  ! меняем значения полей
  xDoc.SetFieldValue('ВерсПрог', 'Файл', 'Электронный курьер 2.0')
  xDoc.SetFieldValue('Улица', 'Документ/СвСчФакт/СвПокуп/Адрес', 'имени 38-ми бакинских попугаев')
  
  ! сохраняем файл
  xDoc.Save('Счёт-фактура.xml')
С уважением, ДП
Алексей- Софт-Центр
Ветеран
Сообщения: 390
Зарегистрирован: 26 Август 2009, 12:41
Откуда: Moscow
Контактная информация:

Re: Счет-фактура в XML

Сообщение Алексей- Софт-Центр »

Добрый день.
типа дока:
http://www.softvelocity.com/clarion/pdf ... upport.PDF

Алексей
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7372
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Re: Счет-фактура в XML

Сообщение Игорь Столяров »

1. Очень древняя дока, многие описания методов не совпадают даже в C63 ....

2. Это немного о другом, описан XML DOM интерфейс, который используется в шаблонах ClarionXML.
Он тоже рабочий, но с русским текстом работает только в C8/C91 и только в кодировке UTF-8.
Поэтому для данной задачи нэ подходит ... ;)
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Admin
Администратор
Сообщения: 3959
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

Re: Счет-фактура в XML

Сообщение Admin »

Ну что же, попробовал.
Сразу вылазят моменты типа того что нельзя к ROOT элементу добавить теги

Код: Выделить всё

XML.SetRootTag('Файл')
XML.AddAttribute('ИдФайл','какое то значение','Файл') ! просто не работает
в варианте

Код: Выделить всё

XML.SetRootTag('Файл')
XML.AddRootTagAttributes('ИдФайл','какое то значение')
ИдФайл добавляется не в тег Файл а в корень

Код: Выделить всё

<?xml version="1.0" encoding="windows-1251" ИдФайл="какое то значение" ?>
в общем вопрос. как сделать так

Код: Выделить всё

<?xml version="1.0" encoding="windows-1251"?>
<Файл ИдФайл="какое то значение" ВерсПрог="Электронный Курьер 1.0" ВерсФорм="5.01">
...
</Файл>
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
Admin
Администратор
Сообщения: 3959
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

Re: Счет-фактура в XML

Сообщение Admin »

Немного разобрался с классом. Сырой и кривой он.
Метод AddRootTagAttributes добавляет аттрибуты не в root как должно быть а в head
Это видно в оригинальном методе

Код: Выделить всё

XMLGenerator.AddRootTagAttributes    PROCEDURE(STRING pName,STRING pValue)
lIndex  LONG
lFound  BYTE
 CODE
    IF NOT CLIP(pName) THEN RETURN.
    lFound = False
    LOOP lIndex = 1 to RECORDS(SELF.QHeaderAttribute)
         GET(SELF.QHeaderAttribute,lIndex)
         IF ERRORCODE() THEN BREAK.
         IF SELF.QHeaderAttribute.Name = pName THEN
            lFound = True
            SELF.QHeaderAttribute.Value= pValue
            PUT(SELF.QHeaderAttribute)
         END
    END
    IF lFound = False
       SELF.QHeaderAttribute.Name = pName
       SELF.QHeaderAttribute.Value= pValue
       ADD(SELF.QHeaderAttribute)
    END
Ну и т.д.
Исправляю как должно быть, добавляю для старого кода метод AddHeadAttributes и продолжаю.
:cat:
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
Admin
Администратор
Сообщения: 3959
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

Re: Счет-фактура в XML

Сообщение Admin »

В результате:
Исправление для abprxml.clw
abprxml.zip
Исправленный модуль вывода в XML Clarion 6.3
(6.36 КБ) 176 скачиваний
Текст тестовой программы

Код: Выделить всё

                    PROGRAM
                    MAP
                    END

                    INCLUDE('ABPRXML.INC'),ONCE

XML                 CLASS(XMLGenerator) ,THREAD
                    END

  CODE
  XML.Init('test.xml')
  XML.OpenDocument()
  XML.SetEncoding('windows-1251')
  XML.SetUseCRLF(TRUE)
  IF EXISTS('test.xml')
    XML.SetRootTag('Файл')
      XML.AddRootTagAttributes('ИдФайл','ON_SFAKT_2BK-7714902984-807078_2BK-7707083893-780888888-7800000000000_20141022_1899B29A-A185-469F-A663-BAA5142D908B')
      XML.AddRootTagAttributes('ВерсПрог','Электронный Курьер 1.0')
      XML.AddRootTagAttributes('ВерсФорм','5.01')
    XML.AddTag('СвУчДокОбор','')
      XML.AddAttribute('ИдОтпр','2BK-7707083893-780888888-7800000000000','СвУчДокОбор')
      XML.AddAttribute('ИдПок','2BK-7714902984-807078','СвУчДокОбор')
      XML.AddTag('СвОЭДОтпр','',FALSE,'СвУчДокОбор')
        XML.AddAttribute('ИдЭДО','2BK','СвОЭДОтпр')
        XML.AddAttribute('ИННЮЛ','7801392271','СвОЭДОтпр')
        XML.AddAttribute('НаимОрг','Общество с ограниченной ответственностью "КОРУС Консалтинг СНГ"','СвОЭДОтпр')
    XML.AddTag('Документ','')
      XML.AddAttribute('КНД','1115101','Документ')
      XML.AddTag('СвСчФакт','',FALSE,'Документ')
        XML.AddAttribute('НомерСчФ','1','СвСчФакт')
        XML.AddAttribute('ДатаСчФ','22.10.2014','СвСчФакт')
        XML.AddAttribute('КодОКВ','643','СвСчФакт')
        XML.AddTag('СвПрод','',FALSE,'СвСчФакт')
          XML.AddTag('ИдСв','',FALSE,'СвПрод')
            XML.AddTag('СвЮЛ','',FALSE,'ИдСв')
            XML.AddAttribute('НаимОрг','Сбербанк ТЕСТ Контрагент 1','СвЮЛ')
            XML.AddAttribute('ИННЮЛ','7707083893','СвЮЛ')
            XML.AddAttribute('КПП','780888888','СвЮЛ')
          XML.AddTag('Адрес','',FALSE,'СвПрод')
            XML.AddTag('АдрРФ','',FALSE,'Адрес')
            XML.AddAttribute('Индекс','190000','АдрРФ')
            XML.AddAttribute('КодРегион','78','АдрРФ')
            XML.AddAttribute('Город','Санкт-Петербург','АдрРФ')
            XML.AddAttribute('Улица','Невский пр.','АдрРФ')
            XML.AddAttribute('Дом','1','АдрРФ')
            XML.AddAttribute('Корпус','1','АдрРФ')
        XML.AddTag('ГрузОт','',FALSE,'СвСчФакт')
          XML.AddTag('ОнЖе','он же',FALSE,'ГрузОт')
        XML.AddTag('СвПокуп','',FALSE,'СвСчФакт')
          XML.AddTag('ИдСв','',FALSE,'СвПокуп')
            XML.AddTag('СвЮЛ','',FALSE,'ИдСв')
            XML.AddAttribute('НаимОрг','ООО "Даймонд-Клаб"','СвЮЛ')
            XML.AddAttribute('ИННЮЛ','7714902984','СвЮЛ')
            XML.AddAttribute('КПП','771401001','СвЮЛ')
          XML.AddTag('Адрес','',FALSE,'СвПокуп')
            XML.AddTag('АдрРФ','',FALSE,'Адрес')
            XML.AddAttribute('Индекс','127555','АдрРФ')
            XML.AddAttribute('КодРегион','77','АдрРФ')
            XML.AddAttribute('Улица','Мелиховская ул','АдрРФ')
            XML.AddAttribute('Дом','2','АдрРФ')
            XML.AddAttribute('Корпус','н','АдрРФ')
            XML.AddAttribute('Кварт','н','АдрРФ')
        XML.AddTag('ИнфПол','',FALSE,'СвСчФакт')
      XML.AddTag('ТаблСчФакт','',FALSE,'Документ')
        XML.AddTag('СведТов','',FALSE,'ТаблСчФакт')
        XML.AddAttribute('НомСтр','1','СведТов')
        XML.AddAttribute('НаимТов','масло','СведТов')
        XML.AddAttribute('ОКЕИ_Тов','166','СведТов')
        XML.AddAttribute('КолТов','150','СведТов')
        XML.AddAttribute('ЦенаТов','150','СведТов')
        XML.AddAttribute('СтТовБезНДС','22500','СведТов')
        XML.AddAttribute('СтТовУчНал','26550','СведТов')
          XML.AddTag('Акциз','',FALSE,'СведТов')
          XML.AddAttribute('СумАкциз','без акциза','Акциз')
          XML.AddTag('НалСт','',FALSE,'СведТов')
          XML.AddAttribute('НалСтВел','18','НалСт')
          XML.AddAttribute('НалСтТип','процент','НалСт')
          XML.AddTag('СумНал','',FALSE,'СведТов')
          XML.AddAttribute('СумНДС','4050.00','СумНал')
        XML.AddTag('ВсегоОпл','',FALSE,'ТаблСчФакт')
        XML.AddAttribute('СтТовБезНДСВсего','22500','ВсегоОпл')
        XML.AddAttribute('СтТовУчНалВсего','26550','ВсегоОпл')
          XML.AddTag('СумНалВсего','',FALSE,'ВсегоОпл')
          XML.AddAttribute('СумНДС','4050.00','СумНалВсего')
      XML.AddTag('Подписант','',FALSE,'Документ')
        XML.AddTag('ЮЛ','',FALSE,'Подписант')
        XML.AddAttribute('ИННЮЛ','7707083893','ЮЛ')
        XML.AddAttribute('Должн','Тест должность','ЮЛ')
        XML.AddTag('ФИО','',FALSE,'ЮЛ')
        XML.AddAttribute('Фамилия','Петров','ФИО')
        XML.AddAttribute('Имя','Петр','ФИО')
        XML.AddAttribute('Отчество','Петрович','ФИО')
    XML.SetSupportNameSpaces(True)
    XML.CloseDocument()
  END
Не забываем про

Код: Выделить всё

_ABCDllMode_=>0
_ABCLinkMode_=>1
Тест генерирует следующий XML

Код: Выделить всё

<?xml version="1.0" encoding="windows-1251" ?>
<Файл ИдФайл="ON_SFAKT_2BK-7714902984-807078_2BK-7707083893-780888888-7800000000000_20141022_1899B29A-A185-469F-A663-BAA5142D908B" ВерсПрог="Электронный Курьер 1.0" ВерсФорм="5.01">
 <СвУчДокОбор ИдОтпр="2BK-7707083893-780888888-7800000000000" ИдПок="2BK-7714902984-807078">
  <СвОЭДОтпр ИдЭДО="2BK" ИННЮЛ="7801392271" НаимОрг="Общество с ограниченной ответственностью "КОРУС Консалтинг СНГ""/>
 </СвУчДокОбор>
 <Документ КНД="1115101">
  <СвСчФакт НомерСчФ="1" ДатаСчФ="22.10.2014" КодОКВ="643">
   <СвПрод>
    <ИдСв>
     <СвЮЛ НаимОрг="Сбербанк ТЕСТ Контрагент 1" ИННЮЛ="7707083893" КПП="780888888"/>
    </ИдСв>
    <Адрес>
     <АдрРФ Индекс="190000" КодРегион="78" Город="Санкт-Петербург" Улица="Невский пр." Дом="1" Корпус="1"/>
    </Адрес>
   </СвПрод>
   <ГрузОт>
    <ОнЖе>
он же
    </ОнЖе>
   </ГрузОт>
   <СвПокуп>
    <ИдСв>
     <СвЮЛ НаимОрг="ООО "Даймонд-Клаб"" ИННЮЛ="7714902984" КПП="771401001"/>
    </ИдСв>
    <Адрес>
     <АдрРФ Индекс="127555" КодРегион="77" Улица="Мелиховская ул" Дом="2" Корпус="н" Кварт="н"/>
    </Адрес>
   </СвПокуп>
   <ИнфПол/>
  </СвСчФакт>
  <ТаблСчФакт>
   <СведТов НомСтр="1" НаимТов="масло" ОКЕИ_Тов="166" КолТов="150" ЦенаТов="150" СтТовБезНДС="22500" СтТовУчНал="26550">
    <Акциз СумАкциз="без акциза"/>
    <НалСт НалСтВел="18" НалСтТип="процент"/>
    <СумНал СумНДС="4050.00"/>
   </СведТов>
   <ВсегоОпл СтТовБезНДСВсего="22500" СтТовУчНалВсего="26550">
    <СумНалВсего СумНДС="4050.00"/>
   </ВсегоОпл>
  </ТаблСчФакт>
  <Подписант>
   <ЮЛ ИННЮЛ="7707083893" Должн="Тест должность">
    <ФИО Фамилия="Петров" Имя="Петр" Отчество="Петрович"/>
   </ЮЛ>
  </Подписант>
 </Документ>
</Файл>
Всем спасибо.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7372
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Re: Счет-фактура в XML

Сообщение Игорь Столяров »

Класс ! Еще раз подтверждает, что Clarion самодостаточный язык, на котором можно сделать все (ну или почти все). ;)

В методе "XMLWriter.EscapeValues", Routine "ReplaceOneChar"
замени строку "SAux1 &= SAux2[1:lSLen]" на "SAux1 &= SAux2",
иначе будет подрезать строки длиной более 500 символов.
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Admin
Администратор
Сообщения: 3959
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

Re: Счет-фактура в XML

Сообщение Admin »

Игорь Столяров писал(а):Класс ! Еще раз подтверждает, что Clarion самодостаточный язык, на котором можно сделать все (ну или почти все). ;)
Да никто и не сомневается. Написать можно все что угодно.
Просто иногда знаний (английского к примеру) и времени не хватает.
Игорь Столяров писал(а):В методе "XMLWriter.EscapeValues", Routine "ReplaceOneChar"
замени строку "SAux1 &= SAux2[1:lSLen]" на "SAux1 &= SAux2",
иначе будет подрезать строки длиной более 500 символов.
Спасибо за наводку.
Еще там заметил что при таком выводе

Код: Выделить всё

XML.AddTag('ОнЖе','он же',FALSE,'ГрузОт')
и установленном флаге UseCRLF, до и после контента вставляет зачем-то перевод строки. Т.е. выводит отдельной строкой.
Но т.к. на результат не влияет не стал разбираться.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Ответить