Передача кириллицы в http запросе через curl

Clarion, Clarion 7

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

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 8066
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 28 раз
Поблагодарили: 96 раз

Передача кириллицы в http запросе через curl

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

Конкретно в этом случае, проблема в том, что кодировать для Diadoc нужно только одно значение параметра с русскими буквами.
А применение Urlencode (ну или printf('%u',ParamStr)) ко всей строке параметров закодирует и другие спецсимволы. :shock:
Тут мало того, что у всех участников этого действия тараканы, так они ещё и разные. :D
Последний раз редактировалось Игорь Столяров 28 Июнь 2025, 19:13, всего редактировалось 1 раз.
Make Clarion Great Again ! 😎
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 8066
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 28 раз
Поблагодарили: 96 раз

Передача кириллицы в http запросе через curl

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

finsoftrz писал(а): 28 Июнь 2025, 18:23 Мне кажется, я сильно модней
Даже не сомневаюсь в этом. И ещё покупаете современные сервера для использование технологий.
Но потом стартуете на нём десятки раз внешний EXE, c новой авторизацией на REST сервисе для каждой
операции и записью результата в текстовые файлы, с их последующей загрузкой для парса ... 🤦‍♀️

Невольно напрашивается мой любимый вопрос. А нафига ? :D
Make Clarion Great Again ! 😎
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 5285
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 12 раз
Поблагодарили: 65 раз

Передача кириллицы в http запросе через curl

Сообщение finsoftrz »

Дед Пахом писал(а): 28 Июнь 2025, 18:45 Надо --data-urlencode value1=ЙЦУКЕНГ без кодировки.
Проверял, не работает. Ни в ansi, ни в utf8. Почему, хз. На выходе все равно получается стандартный urlencode, который почему-то некорректно передается в сервис. К слову, в postmen есть возможность конвертации запросов в синтаксис curl. И он тоже дает аналогичный код с параметром в urlencode вида function=%D0%A1%D0%A7%D0%A4%D0%94%D0%9E%D0%9F
C6/C12, ШВС, tps/btrieve.
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 5285
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 12 раз
Поблагодарили: 65 раз

Передача кириллицы в http запросе через curl

Сообщение finsoftrz »

Игорь Столяров писал(а): 28 Июнь 2025, 19:02 Конкретно в этом случае, проблема в том, что кодировать для Diadoc нужно только одно значение параметра с русскими буквами.
А применение Urlencode (ну или printf('%u',ParamStr)) ко всей строке параметров закодирует и другие спецсимволы. :shock:
Тут мало того, что у всех участников этого действия тараканы, так они ещё и разные. :D
Разумеется, кодируется только значение (слово СЧФДОП).
C6/C12, ШВС, tps/btrieve.
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 5285
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 12 раз
Поблагодарили: 65 раз

Передача кириллицы в http запросе через curl

Сообщение finsoftrz »

Игорь Столяров писал(а): 28 Июнь 2025, 19:11
finsoftrz писал(а): 28 Июнь 2025, 18:23 Мне кажется, я сильно модней
Даже не сомневаюсь в этом. И ещё покупаете современные сервера для использование технологий.
Но потом стартуете на нём десятки раз внешний EXE, c новой авторизацией на REST сервисе для каждой
операции и записью результата в текстовые файлы, с их последующей загрузкой для парса ... 🤦‍♀️

Невольно напрашивается мой любимый вопрос. А нафига ? :D
Авторизация в любом случае выполняется при каждом запросе к сервису. Стартовать внешний exe в виде процесса не такая затратная операция, дернуть 500кб из кеша. Создание временных файлов тоже, они маленькие. Сколько временных файлов создает винда, не задумывались? Я понимаю, что без файлов более экономично. Нафига - это проще и быстрее при отладке и сопровождении. Не надо думать, что пользователи только и делают, что обращаются к внешним серверам. У них это занимает, может, долю процента рабочего времени. Если это была бы не вспомогательная задача, то я бы подумал об оптимизации и использовании библиотеки.
C6/C12, ШВС, tps/btrieve.
PavelNK
Старожил
Сообщения: 280
Зарегистрирован: 15 Март 2011, 8:02

Передача кириллицы в http запросе через curl

Сообщение PavelNK »

А если Fiddler'ом посмотреть, что реально улетает на портал
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 8066
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 28 раз
Поблагодарили: 96 раз

Передача кириллицы в http запросе через curl

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

finsoftrz писал(а): 28 Июнь 2025, 19:30 Авторизация в любом случае выполняется при каждом запросе к сервису.
Не хотелось бы Вас огорчать в день такого великого достижения ... но нет.
Авторизация выполняется разово и далее уже идёт обмена GET / PUT и т.д.

Тут даже не вопрос о том, что это ресурсозатратно, купите ещё один сервер.
Когда Вы с одного IP адреса инициируете долбёжку REST авторизациями - он
начинает отвечать через time-out избегая перегрузки DOS атакой.
finsoftrz писал(а): 28 Июнь 2025, 19:30 Нафига - это проще и быстрее при отладке и сопровождении.
В чём проще ? Я сегодня за два часа получил список параметров и ответ сервиса,
с которым неработал несколько лет. Половина времени ушла на поиск и чтение справки.
А сопровождение текстовых строк запуска c параметрами будет через год супер-квестом. 🤦‍♀️
Make Clarion Great Again ! 😎
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 5285
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 12 раз
Поблагодарили: 65 раз

Передача кириллицы в http запросе через curl

Сообщение finsoftrz »

Игорь Столяров писал(а): 28 Июнь 2025, 20:34
finsoftrz писал(а): 28 Июнь 2025, 19:30 Авторизация в любом случае выполняется при каждом запросе к сервису.
Не хотелось бы Вас огорчать в день такого великого достижения ... но нет.
Авторизация выполняется разово и далее уже идёт обмена GET / PUT и т.д.

Тут даже не вопрос о том, что это ресурсозатратно, купите ещё один сервер.
Когда Вы с одного IP адреса инициируете долбёжку REST авторизациями - он
начинает отвечать через time-out избегая перегрузки DOS атакой.
finsoftrz писал(а): 28 Июнь 2025, 19:30 Нафига - это проще и быстрее при отладке и сопровождении.
В чём проще ? Я сегодня за два часа получил список параметров и ответ сервиса,
с которым неработал несколько лет. Половина времени ушла на поиск и чтение справки.
А сопровождение текстовых строк запуска c параметрами будет через год супер-квестом. 🤦‍♀️
Не хочу дискутировать, так как плохо понимаю, про что Вы пишите. :shock:
Два часа это очень много. Я все не мог понять, что Вы так упорно не хотите провести простой тест, думал, минут 10-15 от силы займет. В таком случае, вдвойне спасибо за приложенные усилия, не хотел так напрягать.
C6/C12, ШВС, tps/btrieve.
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 5285
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 12 раз
Поблагодарили: 65 раз

Передача кириллицы в http запросе через curl

Сообщение finsoftrz »

Подумал, что, возможно, влияет какая-то установка в header. Поскольку странно, что задокументированная опция --data-urlencode не срабатывает.
C6/C12, ШВС, tps/btrieve.
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3297
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 15 раз
Поблагодарили: 50 раз
Контактная информация:

Передача кириллицы в http запросе через curl

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

Проверил на тестовом сервере, всё работает.
Запрос:
curl -X POST -G "https://echo.free.beeceptor.com" --data-urlencode "param1=value 1" --data-urlencode "param2=ЙЦУКЕНГ"
Ответ:
{
"method": "POST",
"protocol": "https",
"host": "echo.free.beeceptor.com",
"path": "/?param1=value+1&param2=%d0%99%d0%a6%d0%a3%d0%9a%d0%95%d0%9d%d0%93",
"ip": "86.122.441.8:00877",
"headers": {
"Host": "echo.free.beeceptor.com",
"User-Agent": "curl/8.13.0",
"Content-Length": "0",
"Accept": "*/*",
"Accept-Encoding": "gzip"
},
"parsedQueryParams": {
"param1": "value 1",
"param2": "ЙЦУКЕНГ"
},
"rawBody": "",
"warnings": [
"Missing Content-Type header for the POST request."
]
}
С уважением, ДП
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 5285
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 12 раз
Поблагодарили: 65 раз

Передача кириллицы в http запросе через curl

Сообщение finsoftrz »

Мне где-то попадалось, что не работало именно на get. Буду за компьютером, перепроверю на всякий случай.
C6/C12, ШВС, tps/btrieve.
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 5285
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 12 раз
Поблагодарили: 65 раз

Передача кириллицы в http запросе через curl

Сообщение finsoftrz »

Тесты на актуальной версии curl на всякий случай.

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

curl.exe -X GET "https://diadoc-api.kontur.ru/GetContent?typeNamedId=UniversalTransferDocument&function=СЧФДОП&version=utd970_05_03_01&titleIndex=1&contentType=SignerUserContractXsd"  -H "Connection: Keep-Alive" -H "Authorization: DiadocAuth ddauth_api_client_id=api-d7...,ddauth_token=ObqDEqh...=" -o edo_diad_in.xml
Ничего не возвращает.

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

curl.exe -X GET -G "https://diadoc-api.kontur.ru/GetContent" --data-urlencode "typeNamedId=UniversalTransferDocument" --data-urlencode "function=СЧФДОП" --data-urlencode "version=utd970_05_03_01" --data-urlencode "titleIndex=1" --data-urlencode "contentType=SignerUserContractXsd"  -H "Connection: Keep-Alive"  -H "Authorization: DiadocAuth ddauth_api_client_id=api-d7...,ddauth_token=ObqDEqh...=" -o edo_diad_in.xml
Возвращает:

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

Cannot find sign content at coordinates TypeNamedId=UniversalTransferDocument, Function=╤╫╘─╬╧, Version=utd970_05_03_01, TitleIndex=1

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

curl.exe -X GET "https://diadoc-api.kontur.ru/GetContent?typeNamedId=UniversalTransferDocument&function=%D0%A1%D0%A7%D0%A4%D0%94%D0%9E%D0%9F&version=utd970_05_03_01&titleIndex=1&contentType=SignerUserContractXsd" -H "Authorization: DiadocAuth ddauth_api_client_id=api-d7...,ddauth_token=ObqDEqh...=" -o edo_diad_in.xml
Возвращает:

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

Cannot find sign content at coordinates TypeNamedId=UniversalTransferDocument, Function=A1A7A4949E9F, Version=utd970_05_03_01, TitleIndex=1

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

curl.exe -X GET "https://diadoc-api.kontur.ru/GetContent?typeNamedId=UniversalTransferDocument&function=%%D0%%A1%%D0%%A7%%D0%%A4%%D0%%94%%D0%%9E%%D0%%9F&version=utd970_05_03_01&titleIndex=1&contentType=SignerUserContractXsd" -H "Authorization: DiadocAuth ddauth_api_client_id=api-d7...,ddauth_token=ObqDEqh...=" -o edo_diad_in.xml
Возвращает корректный результат.

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

<?xml version="1.0" encoding="windows-1251"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="Signers">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="Signer" type="Signer" />
      </xs:sequence>
      <xs:attribute name="BoxId" type="guid">
        <xs:annotation>
          <xs:documentation>Идентификатор ящика организации</xs:documentation>
        </xs:annotation>
      </xs:attribute>
    </xs:complexType>
  </xs:element>
  <xs:complexType name="Signers">
    <xs:sequence>
      <xs:element maxOccurs="unbounded" name="Signer" type="Signer" />
    </xs:sequence>
    <xs:attribute name="BoxId" type="guid">
      <xs:annotation>
        <xs:documentation>Идентификатор ящика организации</xs:documentation>
      </xs:annotation>
    </xs:attribute>
  </xs:complexType>
  <xs:complexType name="Signer">
    <xs:sequence>
      <xs:element minOccurs="0" name="Certificate" type="Certificate" />
      <xs:element minOccurs="0" name="Fio" type="Fio" />
      <xs:element minOccurs="0" name="Position">
        <xs:annotation>
          <xs:documentation>Должность</xs:documentation>
          <xs:documentation>Один из элементов является обязательным</xs:documentation>
        </xs:annotation>
        <xs:complexType>
          <xs:simpleContent>
            <xs:extension base="string255z">
              <xs:attribute name="PositionSource" use="required">
                <xs:annotation>
                  <xs:documentation>Автоматическое заполнение должности из настроек сотрудника указанных в сервисе</xs:documentation>
                </xs:annotation>
                <xs:simpleType>
                  <xs:restriction base="xs:string">
                    <xs:enumeration value="Employee">
                      <xs:annotation>
                        <xs:documentation>
                          <xs:annotation xmlns:xs="http://www.w3.org/2001/XMLSchema">
                            <xs:documentation>Первым шагом пытается сформировать должность из данных по сотруднику в сервисе</xs:documentation>
                            <xs:documentation>Если данные в сервисе не найдены, то значение будет взято из значения в элементе Position</xs:documentation>
                            <xs:documentation>Если данные в сервисе не найдены и в элементе Position пустое значение, то атрибут в конечном файле не сформируется</xs:documentation>
                          </xs:annotation>
                        </xs:documentation>
                      </xs:annotation>
                    </xs:enumeration>
                    <xs:enumeration value="Certificate">
                      <xs:annotation>
                        <xs:documentation>
                          <xs:annotation xmlns:xs="http://www.w3.org/2001/XMLSchema">
                            <xs:documentation>Первым шагом пытается сформировать должность из данных по сотруднику из сертификата</xs:documentation>
                            <xs:documentation>Если данные в сертификате не найдены, то значение будет взято из значения в элементе Position</xs:documentation>
                            <xs:documentation>Если данные в сертификате не найдены и в элементе Position пустое значение, то атрибут в конечном файле не сформируется</xs:documentation>
                          </xs:annotation>
                        </xs:documentation>
                      </xs:annotation>
                    </xs:enumeration>
                    <xs:enumeration value="StorageByTitleTypeId">
                      <xs:annotation>
                        <xs:documentation>
                          <xs:annotation xmlns:xs="http://www.w3.org/2001/XMLSchema">
                            <xs:documentation>Используется для типов @970 формата. Для остальных - игнорируется</xs:documentation>
                            <xs:documentation>Для использования данного варианта формирования должности необходимо заполнить элемент Certificate</xs:documentation>
                            <xs:documentation>Первым шагом пытается сформировать должность из данных, сохраненных с помощью метода ExtendedSignerDetails для указанного сертификата и documentTitleType</xs:documentation>
                            <xs:documentation>Если данные в сервисе не найдены, то значение будет взято из значения в элементе Position</xs:documentation>
                            <xs:documentation>Если данные в сервисе не найдены и в элементе Position пустое значение, то атрибут в конечном файле не сформируется</xs:documentation>
                          </xs:annotation>
                        </xs:documentation>
                      </xs:annotation>
                    </xs:enumeration>
                    <xs:enumeration value="Manual">
                      <xs:annotation>
                        <xs:documentation>Используется для ручного заполнения должности</xs:documentation>
                      </xs:annotation>
                    </xs:enumeration>
                  </xs:restriction>
                </xs:simpleType>
              </xs:attribute>
            </xs:extension>
          </xs:simpleContent>
        </xs:complexType>
      </xs:element>
      <xs:element minOccurs="0" name="SignerAdditionalInfo">
        <xs:annotation>
          <xs:documentation>
            <xs:annotation xmlns:xs="http://www.w3.org/2001/XMLSchema">
              <xs:documentation>Используется для типов @970 и @405 форматов. Для остальных - игнорируется</xs:documentation>
              <xs:documentation>ДопСведПодп - Дополнительные сведения о подписанте</xs:documentation>
            </xs:annotation>
          </xs:documentation>
        </xs:annotation>
        <xs:complexType>
          <xs:simpleContent>
            <xs:extension base="string255z">
              <xs:attribute name="SignerAdditionalInfoSource" use="required">
                <xs:annotation>
                  <xs:documentation>Автоматическое заполнение дополнительных сведений из настроек указанных в сервисе</xs:documentation>
                </xs:annotation>
                <xs:simpleType>
                  <xs:restriction base="xs:string">
                    <xs:enumeration value="StorageByTitleTypeId">
                      <xs:annotation>
                        <xs:documentation>
                          <xs:annotation xmlns:xs="http://www.w3.org/2001/XMLSchema">
                            <xs:documentation>Используется для типов @970 формата. Для остальных - игнорируется</xs:documentation>
                            <xs:documentation>Для использования данного варианта формирования дополнительных сведений необходимо заполнить элемент Certificate</xs:documentation>
                            <xs:documentation>Первым шагом пытается сформировать дополнительные сведения из данных, сохраненных с помощью метода ExtendedSignerDetails для указанного сертификата и documentTitleType</xs:documentation>
                            <xs:documentation>Если данные в сервисе не найдены, то значение будет взято из значения в элементе SignerAdditionalInfo</xs:documentation>
                            <xs:documentation>Если данные в сервисе не найдены и в элементе пустое значение SignerAdditionalInfo, то атрибут в конечном файле не сформируется</xs:documentation>
                          </xs:annotation>
                        </xs:documentation>
                      </xs:annotation>
                    </xs:enumeration>
                    <xs:enumeration value="Manual">
                      <xs:annotation>
                        <xs:documentation>Используется для ручного заполнения дополнительных сведений</xs:documentation>
                      </xs:annotation>
                    </xs:enumeration>
                  </xs:restriction>
                </xs:simpleType>
              </xs:attribute>
            </xs:extension>
          </xs:simpleContent>
        </xs:complexType>
      </xs:element>
      <xs:element minOccurs="0" name="PowerOfAttorney" type="PowerOfAttorney" />
    </xs:sequence>
    <xs:attribute name="SignerStatus">
      <xs:annotation>
        <xs:documentation>
          <xs:annotation xmlns:xs="http://www.w3.org/2001/XMLSchema">
            <xs:documentation>Используется для типов @405 и @691 форматов. Для остальных - игнорируется</xs:documentation>
            <xs:documentation>СтатПодп - Статус подписанта</xs:documentation>
          </xs:annotation>
        </xs:documentation>
      </xs:annotation>
      <xs:simpleType>
        <xs:restriction base="xs:string">
          <xs:length value="1" />
          <xs:enumeration value="1">
            <xs:annotation>
              <xs:documentation>Лицо, имеющее полномочия на подписание документа без доверенности</xs:documentation>
            </xs:annotation>
          </xs:enumeration>
          <xs:enumeration value="2">
            <xs:annotation>
              <xs:documentation>Лицо, имеющее полномочия на подписание документа на основании доверенности в электронной форме</xs:documentation>
            </xs:annotation>
          </xs:enumeration>
          <xs:enumeration value="3">
            <xs:annotation>
              <xs:documentation>Лицо, имеющее полномочия на подписание документа на основании доверенности в бумажном виде</xs:documentation>
            </xs:annotation>
          </xs:enumeration>
        </xs:restriction>
      </xs:simpleType>
    </xs:attribute>
    <xs:attribute name="SignatureType">
      <xs:annotation>
        <xs:documentation>ТипПодпис - Тип подписи</xs:documentation>
      </xs:annotation>
      <xs:simpleType>
        <xs:restriction base="xs:string">
          <xs:length value="1" />
          <xs:enumeration value="1">
            <xs:annotation>
              <xs:documentation>Усиленная квалифицированная электронная подпись</xs:documentation>
            </xs:annotation>
          </xs:enumeration>
          <xs:enumeration value="2">
            <xs:annotation>
              <xs:documentation>Простая электронная подпись</xs:documentation>
            </xs:annotation>
          </xs:enumeration>
          <xs:enumeration value="3">
            <xs:annotation>
              <xs:documentation>Усиленная неквалифицированная электронная подпись</xs:documentation>
            </xs:annotation>
          </xs:enumeration>
        </xs:restriction>
      </xs:simpleType>
    </xs:attribute>
    <xs:attribute name="SigningDate" type="date">
      <xs:annotation>
        <xs:documentation>
          <xs:annotation xmlns:xs="http://www.w3.org/2001/XMLSchema">
            <xs:documentation>Используется для типов @970 формата. Для остальных - игнорируется</xs:documentation>
            <xs:documentation>ДатаПодДок - Дата подписания документа</xs:documentation>
          </xs:annotation>
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="SignerPowersConfirmationMethod">
      <xs:annotation>
        <xs:documentation>
          <xs:annotation xmlns:xs="http://www.w3.org/2001/XMLSchema">
            <xs:documentation>Используется для типов @970 и @405 форматов. Для остальных - игнорируется</xs:documentation>
            <xs:documentation>СпосПодтПолном - Способ подтверждения полномочий представителя на подписание документа</xs:documentation>
          </xs:annotation>
        </xs:documentation>
      </xs:annotation>
      <xs:simpleType>
        <xs:restriction base="xs:string">
          <xs:length value="1" />
          <xs:enumeration value="1">
            <xs:annotation>
              <xs:documentation>В соответствии с данными, содержащимися в электронной подписи</xs:documentation>
            </xs:annotation>
          </xs:enumeration>
          <xs:enumeration value="2">
            <xs:annotation>
              <xs:documentation>В соответствии с доверенностью в электронной форме в машиночитаемом виде, если представление доверенности осуществляется посредством включения в каждый пакет электронных документов, подписываемых представителем</xs:documentation>
            </xs:annotation>
          </xs:enumeration>
          <xs:enumeration value="3">
            <xs:annotation>
              <xs:documentation>В соответствии с доверенностью в электронной форме в машиночитаемом виде, если представление доверенности осуществляется из информационной системы. При этом необходимая информация для запроса доверенности из информационной системы, указана в электронном документе</xs:documentation>
            </xs:annotation>
          </xs:enumeration>
          <xs:enumeration value="4">
            <xs:annotation>
              <xs:documentation>В соответствии с доверенностью в электронной форме в машиночитаемом виде, если представление доверенности осуществляется из информационной системы. При этом необходимая информация для запроса доверенности из информационной системы, представляется способом, отличным от указания в электронном документе</xs:documentation>
            </xs:annotation>
          </xs:enumeration>
          <xs:enumeration value="5">
            <xs:annotation>
              <xs:documentation>В соответствии с доверенностью в форме документа на бумажном носителе</xs:documentation>
            </xs:annotation>
          </xs:enumeration>
          <xs:enumeration value="6">
            <xs:annotation>
              <xs:documentation>Иное</xs:documentation>
            </xs:annotation>
          </xs:enumeration>
        </xs:restriction>
      </xs:simpleType>
    </xs:attribute>
  </xs:complexType>
  <xs:complexType name="Certificate">
    <xs:attribute name="CertificateThumbprint" type="string100" />
    <xs:attribute name="CertificateBytes" type="xs:base64Binary" />
  </xs:complexType>
  <xs:complexType name="PowerOfAttorney">
    <xs:sequence>
      <xs:element minOccurs="0" name="Electronic" type="Electronic">
        <xs:annotation>
          <xs:documentation>Электронная доверенность</xs:documentation>
        </xs:annotation>
      </xs:element>
      <xs:element minOccurs="0" name="Paper" type="Paper">
        <xs:annotation>
          <xs:documentation>Бумажная доверенности</xs:documentation>
        </xs:annotation>
      </xs:element>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="Electronic">
    <xs:sequence>
      <xs:choice>
        <xs:element name="Storage" type="Storage">
          <xs:annotation>
            <xs:documentation>Автоматическое заполнение информации по доверенности на основе номера и ИНН</xs:documentation>
          </xs:annotation>
        </xs:element>
        <xs:element name="Manual" type="Manual">
          <xs:annotation>
            <xs:documentation>Ручное заполнение данных доверенности</xs:documentation>
          </xs:annotation>
        </xs:element>
      </xs:choice>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="Storage">
    <xs:sequence>
      <xs:element minOccurs="0" name="FullId">
        <xs:complexType>
          <xs:attribute name="RegistrationNumber" type="guid" use="required">
            <xs:annotation>
              <xs:documentation>Номер доверенности</xs:documentation>
            </xs:annotation>
          </xs:attribute>
          <xs:attribute name="IssuerInn" type="inn" use="required">
            <xs:annotation>
              <xs:documentation>ИНН организации, выдавшей доверенность</xs:documentation>
            </xs:annotation>
          </xs:attribute>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
    <xs:attribute name="UseDefault" use="required">
      <xs:annotation>
        <xs:documentation>Автоматическое заполнение информации на основе доверенности, используемой сотрудником по умолчанию</xs:documentation>
      </xs:annotation>
      <xs:simpleType>
        <xs:restriction base="xs:string">
          <xs:enumeration value="true" />
          <xs:enumeration value="false" />
        </xs:restriction>
      </xs:simpleType>
    </xs:attribute>
  </xs:complexType>
  <xs:complexType name="Manual">
    <xs:attribute name="RegistrationNumber" type="guid">
      <xs:annotation>
        <xs:documentation>Номер доверенности</xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="RegistrationDate" type="date">
      <xs:annotation>
        <xs:documentation>Дата совершения (выдачи) доверенности</xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="InternalNumber" type="string50">
      <xs:annotation>
        <xs:documentation>Внутренний регистрационный номер доверенности</xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="InternalDate" type="date">
      <xs:annotation>
        <xs:documentation>Дата внутренней регистрации доверенности</xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="SystemId" type="string500">
      <xs:annotation>
        <xs:documentation>Идентифицирующая информация об информационной системе, в которой осуществляется хранение доверенности</xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="SystemUrl" type="string500">
      <xs:annotation>
        <xs:documentation>
          <xs:annotation xmlns:xs="http://www.w3.org/2001/XMLSchema">
            <xs:documentation>Используется для типов @970 формата. Для остальных - игнорируется</xs:documentation>
            <xs:documentation>Сведения в формате URL об информационной системе, которая предоставляет техническую возможность получения информации о доверенности</xs:documentation>
          </xs:annotation>
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
  </xs:complexType>
  <xs:complexType name="Paper">
    <xs:annotation>
      <xs:documentation>Сведения о доверенности, используемой для подтверждения полномочий на бумажном носителе</xs:documentation>
    </xs:annotation>
    <xs:sequence>
      <xs:element minOccurs="0" name="Person" type="Fio">
        <xs:annotation>
          <xs:documentation>Фамилия, имя, отчество (при наличии) лица, подписавшего доверенность</xs:documentation>
        </xs:annotation>
      </xs:element>
    </xs:sequence>
    <xs:attribute name="InternalNumber" type="string50">
      <xs:annotation>
        <xs:documentation>Внутренний регистрационный номер доверенности</xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="RegistrationDate" type="date">
      <xs:annotation>
        <xs:documentation>Дата совершения (выдачи) доверенности</xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="IssuerInfo" type="string1000">
      <xs:annotation>
        <xs:documentation>Сведения о доверителе</xs:documentation>
      </xs:annotation>
    </xs:attribute>
  </xs:complexType>
  <xs:complexType name="Fio">
    <xs:attribute name="LastName" type="string60" use="required">
      <xs:annotation>
        <xs:documentation>Фамилия</xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="FirstName" type="string60" use="required">
      <xs:annotation>
        <xs:documentation>Имя</xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="MiddleName" type="string60">
      <xs:annotation>
        <xs:documentation>Отчество</xs:documentation>
      </xs:annotation>
    </xs:attribute>
  </xs:complexType>
  <xs:simpleType name="string1f">
    <xs:restriction base="xs:string">
      <xs:length value="1" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="string2">
    <xs:restriction base="xs:string">
      <xs:minLength value="1" />
      <xs:maxLength value="2" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="string3f">
    <xs:restriction base="xs:string">
      <xs:length value="3" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="string3">
    <xs:restriction base="xs:string">
      <xs:minLength value="1" />
      <xs:maxLength value="3" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="string4f">
    <xs:restriction base="xs:string">
      <xs:length value="4" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="string4">
    <xs:restriction base="xs:string">
      <xs:minLength value="1" />
      <xs:maxLength value="4" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="string5f">
    <xs:restriction base="xs:string">
      <xs:length value="5" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="string8">
    <xs:restriction base="xs:string">
      <xs:minLength value="1" />
      <xs:maxLength value="8" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="string9f">
    <xs:restriction base="xs:string">
      <xs:length value="9" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="string10">
    <xs:restriction base="xs:string">
      <xs:minLength value="1" />
      <xs:maxLength value="10" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="string11f">
    <xs:restriction base="xs:string">
      <xs:length value="11" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="string13f">
    <xs:restriction base="xs:string">
      <xs:length value="13" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="string13z">
    <xs:restriction base="xs:string">
      <xs:minLength value="0" />
      <xs:maxLength value="13" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="string14f">
    <xs:restriction base="xs:string">
      <xs:length value="14" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="string15z">
    <xs:restriction base="xs:string">
      <xs:minLength value="0" />
      <xs:maxLength value="15" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="string16">
    <xs:restriction base="xs:string">
      <xs:minLength value="1" />
      <xs:maxLength value="16" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="string20">
    <xs:restriction base="xs:string">
      <xs:minLength value="1" />
      <xs:maxLength value="20" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="string20f">
    <xs:restriction base="xs:string">
      <xs:length value="20" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="string24">
    <xs:restriction base="xs:string">
      <xs:minLength value="1" />
      <xs:maxLength value="24" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="string27f">
    <xs:restriction base="xs:string">
      <xs:length value="27" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="string29">
    <xs:restriction base="xs:string">
      <xs:maxLength value="29" />
      <xs:minLength value="1" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="string30">
    <xs:restriction base="xs:string">
      <xs:minLength value="1" />
      <xs:maxLength value="30" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="string36">
    <xs:restriction base="xs:string">
      <xs:minLength value="1" />
      <xs:maxLength value="36" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="string40">
    <xs:restriction base="xs:string">
      <xs:minLength value="1" />
      <xs:maxLength value="40" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="string50">
    <xs:restriction base="xs:string">
      <xs:minLength value="1" />
      <xs:maxLength value="50" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="string55">
    <xs:restriction base="xs:string">
      <xs:minLength value="1" />
      <xs:maxLength value="55" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="string60">
    <xs:restriction base="xs:string">
      <xs:minLength value="1" />
      <xs:maxLength value="60" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="string100">
    <xs:restriction base="xs:string">
      <xs:maxLength value="100" />
      <xs:minLength value="1" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="string100z">
    <xs:restriction base="xs:string">
      <xs:maxLength value="100" />
      <xs:minLength value="0" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="string120">
    <xs:restriction base="xs:string">
      <xs:minLength value="1" />
      <xs:maxLength value="120" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="string128">
    <xs:restriction base="xs:string">
      <xs:maxLength value="128" />
      <xs:minLength value="1" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="string140z">
    <xs:restriction base="xs:string">
      <xs:minLength value="0" />
      <xs:maxLength value="140" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="string128z">
    <xs:restriction base="xs:string">
      <xs:maxLength value="128" />
      <xs:minLength value="0" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="string200">
    <xs:restriction base="xs:string">
      <xs:minLength value="1" />
      <xs:maxLength value="200" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="string255z">
    <xs:restriction base="xs:string">
      <xs:minLength value="0" />
      <xs:maxLength value="255" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="string255">
    <xs:restriction base="xs:string">
      <xs:minLength value="1" />
      <xs:maxLength value="255" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="string256">
    <xs:restriction base="xs:string">
      <xs:minLength value="1" />
      <xs:maxLength value="256" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="string275z">
    <xs:restriction base="xs:string">
      <xs:minLength value="0" />
      <xs:maxLength value="275" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="string500">
    <xs:restriction base="xs:string">
      <xs:minLength value="1" />
      <xs:maxLength value="500" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="string510">
    <xs:restriction base="xs:string">
      <xs:minLength value="1" />
      <xs:maxLength value="510" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="string1000">
    <xs:restriction base="xs:string">
      <xs:minLength value="1" />
      <xs:maxLength value="1000" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="string1000z">
    <xs:restriction base="xs:string">
      <xs:minLength value="0" />
      <xs:maxLength value="1000" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="string2000">
    <xs:restriction base="xs:string">
      <xs:minLength value="1" />
      <xs:maxLength value="2000" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="string2000z">
    <xs:restriction base="xs:string">
      <xs:minLength value="0" />
      <xs:maxLength value="2000" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="string10000">
    <xs:restriction base="xs:string">
      <xs:minLength value="1" />
      <xs:maxLength value="10000" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="inn">
    <xs:restriction base="xs:string">
      <xs:minLength value="10" />
      <xs:maxLength value="12" />
      <xs:pattern value="([0-9]{1}[1-9]{1}|[1-9]{1}[0-9]{1})([0-9]{10}|[0-9]{8})" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="guid">
    <xs:restriction base="xs:string">
      <xs:pattern value="([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})|(\{[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}\})" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="okei">
    <xs:annotation>
      <xs:documentation>Код из Общероссийского классификатора единиц измерения</xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:string">
      <xs:minLength value="3" />
      <xs:maxLength value="4" />
      <xs:pattern value="[0-9]{3}" />
      <xs:pattern value="[0-9]{4}" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="okv">
    <xs:annotation>
      <xs:documentation>Код из Общероссийского классификатора валют</xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:string">
      <xs:length value="3" />
      <xs:pattern value="[0-9]{3}" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="okpd">
    <xs:annotation>
      <xs:documentation>Код товара по ОКДП 2</xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:string">
      <xs:minLength value="2" />
      <xs:maxLength value="12" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="ogrn">
    <xs:annotation>
      <xs:documentation>ОГРН - ОГРНИП</xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:string">
      <xs:minLength value="13" />
      <xs:maxLength value="15" />
      <xs:pattern value="[0-9]{13,15}" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="kpp">
    <xs:annotation>
      <xs:documentation>Код причины постановки на учет (КПП) - 5 и 6 знаки от 0-9 и A-Z</xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:string">
      <xs:length value="9" />
      <xs:pattern value="([0-9]{1}[1-9]{1}|[1-9]{1}[0-9]{1})([0-9]{2})([0-9A-Z]{2})([0-9]{3})" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="date">
    <xs:annotation>
      <xs:documentation>Дата в формате ДД.ММ.ГГГГ (01.01.1800 - 31.12.2099)</xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:string">
      <xs:length value="10" />
      <xs:pattern value="(((0[1-9]{1}|[1-2]{1}[0-9]{1})\.(0[1-9]{1}|1[0-2]{1}))|((30)\.(01|0[3-9]{1}|1[0-2]{1}))|((31)\.(01|03|05|07|08|10|12)))\.(18[0-9]{2}|19[0-9]{2}|20[0-9]{2})" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="time">
    <xs:annotation>
      <xs:documentation>Время в формате ЧЧ.ММ.СС</xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:string">
      <xs:length value="8" />
      <xs:pattern value="([0-1]{1}[0-9]{1}|2[0-3]{1})\.([0-5]{1}[0-9]{1})\.([0-5]{1}[0-9]{1})" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="datetime">
    <xs:annotation>
      <xs:documentation>Дата и время в формате ДД.ММ.ГГГГ ЧЧ.ММ.СС (01.01.1800 - 31.12.2099)</xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:string">
      <xs:length value="19" />
      <xs:pattern value="(((0[1-9]{1}|[1-2]{1}[0-9]{1})\.(0[1-9]{1}|1[0-2]{1}))|((30)\.(01|0[3-9]{1}|1[0-2]{1}))|((31)\.(01|03|05|07|08|10|12)))\.(18[0-9]{2}|19[0-9]{2}|20[0-9]{2})\s([0-1]{1}[0-9]{1}|2[0-3]{1})\.([0-5]{1}[0-9]{1})\.([0-5]{1}[0-9]{1})" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="innindividual">
    <xs:annotation>
      <xs:documentation>Идентификационный номер налогоплательщика - физического лица</xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:string">
      <xs:length value="12" />
      <xs:pattern value="([0-9]{1}[1-9]{1}|[1-9]{1}[0-9]{1})[0-9]{10}" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="innlegalentity">
    <xs:annotation>
      <xs:documentation>Идентификационный номер налогоплательщика - юридического лица</xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:string">
      <xs:length value="10" />
      <xs:pattern value="([0-9]{1}[1-9]{1}|[1-9]{1}[0-9]{1})[0-9]{8}" />
    </xs:restriction>
  </xs:simpleType>
</xs:schema>
C6/C12, ШВС, tps/btrieve.
Ответить