Реализация обмена с ФГИС "Зерно"

23.05.23

Интеграция - Обмен с ГосИС

Реализация обмена с ФГИС "Зерно": формирование и подписание запросов.

Скачать файлы

Наименование Файл Версия Размер
Схемы XML
.zip 436,04Kb
29
.zip 436,04Kb 29 Скачать бесплатно
Документация
.docx 405,37Kb
26
.docx 405,37Kb 26 Скачать бесплатно

Обновлено 23.05.2023: Актуализировал процедуру формирования запроса (добавлена канонизация СМЭВ, форматирование XML и прочее)

В статье по шагам рассмотрена процедура обмена с ФГИС "Зерно" через API. Для примера получим справочник "ОКПД 2" и создадим пробную партию зерна. Предметная область, интеграция с рабочей конфигурацией и прочие связанные вещи рассматриваться не будут.

Итак, у нас есть официальный сайт https://specagro.ru/fgis, на котором можно скачать файл с документацией по API, попасть в личный кабинет (в т. ч. тестовый), ну и вообще посмотреть на картинки. Внутри файла лежат непосредственно документация, XSD-схемы, которые нам очень понадобятся. Перед началом рекомендую ознакомиться с документацией, многие подробности можно найти в ней. На момент написания статьи актуальная версия API 1.0.3. Схемы прикреплены файлом к статье.

Для обмена с "Зерном" необходимы сертификат безопасности, с помощью которого мы будем подписывать наши сообщения, и установленный криптопровайдер. Предварительно сертификат (открытый ключ) необходимо загрузить в личный кабинет (через меню "Моя организация" -> "Информационная безопасность").

Также нужна будет компонента ExtraCryptoAPI (входит в состав БСП).

Для формирования и обработки запроса на XML будем использовать фабрику XDTO.

Приступим. Для начала попробуем получить из системы справочник "ОКПД 2". Для этого нам нужно:

  1. Создать фабрику XDTO
  2. Сформировать запрос
  3. Подписать сообщение с запросом ЭЦП
  4. Отправить запрос и получить ответ

 

1. Создание фабрики XDTO

Для создания фабрики нам будут нужны XSD-схемы, которые можно взять из архива с документацией (на скриншоте старая версия, но суть та же):

Как видно, в основном схемы представлены попарно: с префиксом "api" и без него. В первом случае в файле описаны схемы запросов для работы с объектами, во втором случае - структуры самих объектов.

Для начального примера будут нужны три файла: "fgis-zerno-api-dictionaries-1.0.3.xsd", "fgis-zerno-dictionary-1.0.3.xsd" и "fgis-zerno-api-types-1.0.3.xsd". Первые два необходимы для работы справочников, третий описывает служебные объекты.

Загрузим файлы в макет и создадим нашу фабрику:

	МассивПутей = Новый Массив;
	КаталогВременныхФайлов = КаталогВременныхФайлов();

	ИмяФайла = КаталогВременныхФайлов + "fgis-zerno-api-types-1.0.3.xsd";
	Макет = ПолучитьМакет("fgis_zerno_api_types"); // Макет с файлом "fgis-zerno-api-types-1.0.3.xsd"
	Макет.Записать(ИмяФайла);
	МассивПутей.Добавить(ИмяФайла);
		
	ИмяФайла = КаталогВременныхФайлов + "fgis-zerno-api-dictionaries-1.0.3.xsd";
	Макет = ПолучитьМакет("fgis_zerno_api_dictionaries"); // Макет с файлом "fgis-zerno-api-dictionaries-1.0.3.xsd"
	Макет.Записать(ИмяФайла);
	МассивПутей.Добавить(ИмяФайла);

	ИмяФайла = КаталогВременныхФайлов + "fgis-zerno-dictionary-1.0.3.xsd";
	Макет = ПолучитьМакет("fgis_zerno_dictionary"); // Макет с файлом "fgis-zerno-dictionary-1.0.3.xsd"
	Макет.Записать(ИмяФайла);
	МассивПутей.Добавить(ИмяФайла);
		
	Фабрика = СоздатьФабрикуXDTO(МассивПутей);

 

2. Формирование запроса

Ниже код формирования запроса XML на получение справочника "ОКПД 2":

	// Создаем объект XDTO, в параметрах указываем пространство имен и имя типа
	// Оба значения можно найти в файле XSD-схемы, либо посмотреть отладкой в объекте Фабрика
	ОбъектRequest = Фабрика.Создать(Фабрика.Тип("urn://x-artefacts-mcx-gov-ru/fgiz-zerno/api/ws/dictionaries/1.0.3",
		"DictionaryRequestType"));

	// Указываем название справочника - "OKPD2". Список справочников можно найти в файле "fgis-zerno-dictionary-1.0.3.xsd"
	ОбъектRequest.Dictionary = "OKPD2";
		
	МойXML = Новый ЗаписьXML;
	МойXML.УстановитьСтроку(Новый ПараметрыЗаписиXML("UTF-8", "1.0", Истина));

	// Записываем наш объект в виде XML. Имя элемента "Request" можно узнать из документации или отладкой
	Фабрика.ЗаписатьXML(МойXML, ОбъектRequest, "Request");
	Request = МойXML.Закрыть();

В переменной Request после выполнения кода будет содержаться следующий текст:

<Request xmlns="urn://x-artefacts-mcx-gov-ru/fgiz-zerno/api/ws/dictionaries/1.0.3" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
	<Dictionary>OKPD2</Dictionary>
</Request>

Это и есть наш запрос, который мы отправим в систему. Теперь его необходимо "обернуть" и подписать с помощью сертификата.

 

3. Подписание сообщения

Получившийся запрос поместим в еще один XML, "конверт", соответствующий формату протокола SOAP.

 
 Функция КонвертXML()

 

В шаблоне конверта между знаками "%" заключены параметры, вместо которых мы будем подставлять нужные значения:

	КонвертXML = КонвертXML(); // Шаблон итогового текста запроса

	MessageID = Строка(Новый УникальныйИдентификатор); // Уникальный идентификатор сообщения
	ReferenceMessageID = MessageID; // Идентификатор сообщения, на которое ссылаемся. В случае отправки запроса совпадает с MessageID
	
	// Необходимо заключить запрос в специальные теги
	MessagePrimaryContent = 
	"<ns:MessagePrimaryContent>
	|	%Request%
	|</ns:MessagePrimaryContent>";
	MessagePrimaryContent = СтрЗаменить(MessagePrimaryContent, "%Request%", Request);	
	
	// Заполняем параметры
	КонвертXML = СтрЗаменить(КонвертXML, "%MessagePrimaryContent%", MessagePrimaryContent); // Собственно запрос
	КонвертXML = СтрЗаменить(КонвертXML, "%ТипЗапроса%", "SendRequestRequest"); // Признак отправки запроса
	КонвертXML = СтрЗаменить(КонвертXML, "%MessageID%", MessageID);
	КонвертXML = СтрЗаменить(КонвертXML, "%ReferenceMessageID%", ReferenceMessageID);
	
	// Обязательно форматируем XML (убираем лишние символы: пробелы, переносы строк)
	ФорматироватьXML(КонвертXML);
 
 Процедура ФорматироватьXML

 

Указываем идентификатор сообщения (MessageID и ReferenceMessageID), название тега запроса (ТипЗапроса) и сам запрос, дополнительно заключенный в теги <MessagePrimaryContent>. Также не забываем отформатировать полученный XML.

В типе запроса "SendRequestRequest" первое слово "Request" означает запрос с точки зрения бизнес-логики, т.е. мы хотим получить что-то от системы. Второй "Request" несет технический смысл и соответствует SOAP-запросу.

Следующий шаг - непосредственно подписание:

	// Создаем менеджер с указанием установленного модуля криптографии
	МенеджерКриптографии = Новый МенеджерКриптографии("Crypto-Pro GOST R 34.10-2012 Cryptographic Service Provider", "", 80);
	
	// Получаем сертификат, кодируем по base64 и помещаем значение в %BinarySecurityToken% из шаблона конверта
	ОтпечатокСертификата = "1ec8a2794610199helloworldf8459ae4125d2ddbfd0";
	Сертификат = МенеджерКриптографии.ПолучитьХранилищеСертификатов().НайтиПоОтпечатку(ПолучитьДвоичныеДанныеИзHEXСтроки(ОтпечатокСертификата));
	
	СертификатКриптографииBase64 = Base64Строка(Сертификат.Выгрузить());
	СертификатКриптографииBase64 = СтрЗаменить(СертификатКриптографииBase64, Символы.Таб, "");
	СертификатКриптографииBase64 = СтрЗаменить(СертификатКриптографииBase64, Символы.ПС, "");
	СертификатКриптографииBase64 = СтрЗаменить(СертификатКриптографииBase64, Символы.ВК, "");
	
	
	КонвертXML = СтрЗаменить(КонвертXML, "%BinarySecurityToken%", СертификатКриптографииBase64);
	
	// Подключаем компоненту из макета
	ПодключитьВнешнююКомпоненту(ПоместитьВоВременноеХранилище(ПолучитьМакет("ExtraCryptoAPI")), "ExtraCryptoAPISymbolicName", ТипВнешнейКомпоненты.Native);
	КомпонентаКриптографии = Новый("AddIn.ExtraCryptoAPISymbolicName.ExtraCryptoAPI");
	
	// Приводим текст запроса, заключенный в тегах <MessageData> к единой нормальной форме (канонизируем) по двум алгоритмам (C14N и СМЭВ)
	КанонизированныйТекстXMLMessageData = КомпонентаКриптографии.C14N(КонвертXML, "(//. | //@* | //namespace::*)[ancestor-or-self::*[local-name()='MessageData']]");
	КанонизированныйТекстXMLMessageData = КомпонентаКриптографии.TransformSMEV(КанонизированныйТекстXMLMessageData);
	
	// Хешируем наш запрос и помещаем значение в %DigestValue%
	АтрибутDigestValue = КомпонентаКриптографии.Hash(КанонизированныйТекстXMLMessageData, "1.2.643.7.1.1.2.2", 80);
	КонвертXML = СтрЗаменить(КонвертXML, "%DigestValue%", АтрибутDigestValue);
	
	// Канонизируем и подписываем блок <SignedInfo>. Значение помещаем в %SignatureValue%
	КанонизированныйТекстXMLSignedInfo = КомпонентаКриптографии.C14N(КонвертXML, "(//. | //@* | //namespace::*)[ancestor-or-self::*[local-name()='SignedInfo']]");
	АтрибутSignatureValue = КомпонентаКриптографии.Sign(КанонизированныйТекстXMLSignedInfo, СертификатКриптографииBase64, МенеджерКриптографии.ПарольДоступаКЗакрытомуКлючу);
	КонвертXML = СтрЗаменить(КонвертXML, "%SignatureValue%", АтрибутSignatureValue);

Таким образом наш конверт будет выглядеть примерно так:

 
 Итоговый текст запроса

 

Информацию об использовании алгоритмов шифрования, хеширования и прочего теоретически можно взять из документации.

 

4. Отправка запроса и получение ответа

Отправим запрос на тестовый сервер (адрес рабочего "zerno.mcx.gov.ru"):

	HTTP = Новый HTTPСоединение("demo-zerno.fors.ru", , , , , 60, Новый ЗащищенноеСоединениеOpenSSL());
	
	// Создаем HTTP запрос
	Заголовки = Новый Соответствие;
	Заголовки.Вставить("Content-Type", "text/xml;charset=UTF-8");
	HTTPЗапрос = Новый HTTPЗапрос("/ws/api/fgiz", Заголовки); // Не fgis, а fgiz :)
	HTTPЗапрос.УстановитьТелоИзСтроки(КонвертXML, КодировкаТекста.UTF8);
	
	// Отправляем запрос
	HTTPОтвет = HTTP.ОтправитьДляОбработки(HTTPЗапрос).ПолучитьТелоКакСтроку();

Если все сделано правильно, то в переменной HTTPОтвет будет содержаться сообщение об успешном принятии запроса (внимание на слово "accepted"):

<soap:Envelope
	xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
	<soap:Body>
		<SendRequestResponse
			xmlns:ns2="urn://x-artefacts-mcx-gov-ru/fgiz-zerno/api/ws/faults/1.0.3"
			xmlns="urn://x-artefacts-mcx-gov-ru/fgiz-zerno/api/ws/types/1.0.3">
			<ResponseCode>accepted</ResponseCode>
		</SendRequestResponse>
	</soap:Body>
</soap:Envelope>

Данный ответ означает, что запрос успешно помещен в очередь. Теперь мы можем попытаться получить ответ (обычно он формируется не сразу, а через некоторое время). Для этого мы должны сформировать аналогичный предыдущему КонвертXML, но с некоторыми отличиями: у него будет пустое поле запроса, а ссылаться он будет на предыдущее сообщение:

	// Получаем шаблон конверта
	КонвертXML = КонвертXML();
	
	// Формируем новый идентификатор сообщения
	MessageID = Строка(Новый УникальныйИдентификатор); 
	
	КонвертXML = СтрЗаменить(КонвертXML, "%ТипЗапроса%", "SendResponseRequest"); // Тип запроса теперь другой: получение ответа
	КонвертXML = СтрЗаменить(КонвертXML, "%MessagePrimaryContent%", ""); // Оставляем пустым
	КонвертXML = СтрЗаменить(КонвертXML, "%MessageID%", MessageID); // Уникальный идентификатор текущего сообщения
	КонвертXML = СтрЗаменить(КонвертXML, "%ReferenceMessageID%", ReferenceMessageID); // Ссылка на предыдущее сообщение
	КонвертXML = СтрЗаменить(КонвертXML, "%BinarySecurityToken%", СертификатКриптографииBase64); // Сертификат не меняется
	
	ФорматироватьXML(КонвертXML);
	
	// Подписываем аналогично
	КанонизированныйТекстXMLMessageData = КомпонентаКриптографии.C14N(КонвертXML, "(//. | //@* | //namespace::*)[ancestor-or-self::*[local-name()='MessageData']]");
	КанонизированныйТекстXMLMessageData = КомпонентаКриптографии.TransformSMEV(КанонизированныйТекстXMLMessageData);
	
	АтрибутDigestValue = КомпонентаКриптографии.Hash(КанонизированныйТекстXMLMessageData, "1.2.643.7.1.1.2.2", 80);
	КонвертXML = СтрЗаменить(КонвертXML, "%DigestValue%", АтрибутDigestValue);
	
	КанонизированныйТекстXMLSignedInfo = КомпонентаКриптографии.C14N(КонвертXML, "(//. | //@* | //namespace::*)[ancestor-or-self::*[local-name()='SignedInfo']]");
	АтрибутSignatureValue = КомпонентаКриптографии.Sign(КанонизированныйТекстXMLSignedInfo, СертификатКриптографииBase64, МенеджерКриптографии.ПарольДоступаКЗакрытомуКлючу);
	КонвертXML = СтрЗаменить(КонвертXML, "%SignatureValue%", АтрибутSignatureValue);	
	
	HTTPЗапрос.УстановитьТелоИзСтроки(КонвертXML, КодировкаТекста.UTF8);
	
	// Пытаемся получить ответ
	HTTPОтвет = HTTP.ОтправитьДляОбработки(HTTPЗапрос).ПолучитьТелоКакСтроку();

Если система успела отработать наш запрос, то в результате получим искомый справочник "ОКПД 2":

 
 ОКПД 2
<soap:Envelope
	xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
	<soap:Body>
		<SendResponseResponse
			xmlns:ns2="urn://x-artefacts-mcx-gov-ru/fgiz-zerno/api/ws/faults/1.0.3"
			xmlns="urn://x-artefacts-mcx-gov-ru/fgiz-zerno/api/ws/types/1.0.3">
			<ResponseCode>success</ResponseCode>
			<MessageData>
				<MessageID>3da6904b-f971-11ed-bb9c-56e09cf3b2cb</MessageID>
				<ReferenceMessageID>e9faca53-f4ed-4792-84e1-d6b7650d951d</ReferenceMessageID>
				<MessagePrimaryContent>
					<dicts:Response
						xmlns:dict="urn://x-artefacts-mcx-gov-ru/fgiz-zerno/api/dictionary/1.0.3"
						xmlns:dicts="urn://x-artefacts-mcx-gov-ru/fgiz-zerno/api/ws/dictionaries/1.0.3" hasMore="false">
						<dicts:Items>
							<dict:OKPD2 code="01" isGrain="false" isProduct="false" name="Продукция и услуги сельского хозяйства и охоты" startDate="2022-09-02T00:00:00"/>
							...Тут много элементов...
							<dict:OKPD2 code="10.62.11.169" isGrain="false" isProduct="true" name="Глютен прочий" startDate="2022-09-02T00:00:00"/>
						</dicts:Items>
					</dicts:Response>
				</MessagePrimaryContent>
			</MessageData>
		</SendResponseResponse>
	</soap:Body>
</soap:Envelope>

Обработаем ответ через фабрику XDTO:

	ЧтениеXML = Новый ЧтениеXML;
	ЧтениеXML.УстановитьСтроку(HTTPОтвет);
	
	ОбъектXDTO = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML);
	
	MessagePrimaryContent = ОбъектXDTO.Body.SendResponseResponse.MessageData.MessagePrimaryContent;
	
	Сообщить(MessagePrimaryContent.Response.Items.OKPD2[0].name); // Выведет "Продукция и услуги сельского хозяйства и охоты"

 

Создание партии

Напоследок для примера попробуем создать какую-нибудь партию зерна из остатков. Это делается аналогично, только текст запроса будет другим.

Добавляем в фабрику дополнительные схемы для работы с партиями:

 
 Новый код создания фабрики

 

Формируем запрос:

	ОбъектRequest = Фабрика.Создать(Фабрика.Тип("urn://x-artefacts-mcx-gov-ru/fgiz-zerno/api/ws/lots/1.0.3",
		"RequestCreateLotType"));
	
	ОбъектLotFromResidues = Фабрика.Создать(Фабрика.Тип("urn://x-artefacts-mcx-gov-ru/fgiz-zerno/api/lots/1.0.3",
		"CreateLotFromResiduesType"));
	ОбъектLotFromResidues.amount = 1000; // Масса, кг
	ОбъектRequest.LotFromResidues 	= ОбъектLotFromResidues;
	
	ОбъектGrainProduct = Фабрика.Создать(Фабрика.Тип("urn://x-artefacts-mcx-gov-ru/fgiz-zerno/api/common/1.0.3",
		"GrainProductType"));
	ОбъектGrainProduct.OKPD2 = "01.11.49.110"; // Код ОКПД 2
	ОбъектRequest.Crop = ОбъектGrainProduct;
	
	ОбъектRequest.Target 		= 1; // Цель использования: "Пищевые"
	ОбъектRequest.Purpose 		= 1; // Назначение: "Хранение и (или) обработка"
	ОбъектRequest.HarvestYear 	= 2022; // Год урожая
	
	ОбъектAddressRF = Фабрика.Создать(Фабрика.Тип("urn://x-artefacts-mcx-gov-ru/fgiz-zerno/api/organizations/1.0.3",
		"AddressRFType"));
	ОбъектAddressRF.Address = "Москва, Орликов переулок";
	ОбъектRequest.StoragePlace = ОбъектAddressRF; // Местоположение
	
	ОбъектListValueQualityIndicator = Фабрика.Создать(Фабрика.Тип("urn://x-artefacts-mcx-gov-ru/fgiz-zerno/api/common/1.0.3",
		"ListValueQualityIndicatorType"));
	ОбъектRequest.ListValueQualityIndicator = ОбъектListValueQualityIndicator; // Потребительские свойства можем не заполнять
	
	МойXML = Новый ЗаписьXML;
	МойXML.УстановитьСтроку(Новый ПараметрыЗаписиXML("UTF-8", "1.0", Истина));

	Фабрика.ЗаписатьXML(МойXML, ОбъектRequest, "RequestCreateLot");
	Request = МойXML.Закрыть();

В итоге получаем следующий текст запроса:

<RequestCreateLot
	xmlns="urn://x-artefacts-mcx-gov-ru/fgiz-zerno/api/ws/lots/1.0.3"
	xmlns:xs="http://www.w3.org/2001/XMLSchema"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
	<LotFromResidues
		xmlns="urn://x-artefacts-mcx-gov-ru/fgiz-zerno/api/lots/1.0.3" amount="1000"/>
		<Crop
			xmlns="urn://x-artefacts-mcx-gov-ru/fgiz-zerno/api/lots/1.0.3"
			xmlns:d2p1="urn://x-artefacts-mcx-gov-ru/fgiz-zerno/api/common/1.0.3">
			<d2p1:OKPD2>01.11.49.110</d2p1:OKPD2>
		</Crop>
		<Target
			xmlns="urn://x-artefacts-mcx-gov-ru/fgiz-zerno/api/lots/1.0.3">1
		</Target>
		<Purpose
			xmlns="urn://x-artefacts-mcx-gov-ru/fgiz-zerno/api/lots/1.0.3">1
		</Purpose>
		<HarvestYear
			xmlns="urn://x-artefacts-mcx-gov-ru/fgiz-zerno/api/lots/1.0.3">2022
		</HarvestYear>
		<StoragePlace
			xmlns="urn://x-artefacts-mcx-gov-ru/fgiz-zerno/api/lots/1.0.3"
			xmlns:d2p1="urn://x-artefacts-mcx-gov-ru/fgiz-zerno/api/organizations/1.0.3">
			<d2p1:Address>Москва, Орликов переулок</d2p1:Address>
		</StoragePlace>
		<ListValueQualityIndicator
			xmlns="urn://x-artefacts-mcx-gov-ru/fgiz-zerno/api/lots/1.0.3"
			xmlns:d2p1="urn://x-artefacts-mcx-gov-ru/fgiz-zerno/api/common/1.0.3"/>
		</RequestCreateLot>

Подписываем его, заворачиваем в конверт и, если все прошло успешно, получаем ответ:

<soap:Envelope
	xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
	<soap:Body>
		<SendResponseResponse
			xmlns:ns2="urn://x-artefacts-mcx-gov-ru/fgiz-zerno/api/ws/faults/1.0.3"
			xmlns="urn://x-artefacts-mcx-gov-ru/fgiz-zerno/api/ws/types/1.0.3">
			<ResponseCode>success</ResponseCode>
			<MessageData>
				<MessageID>2a89b8c0-f972-11ed-bb9c-56e09cf3b2cb</MessageID>
				<ReferenceMessageID>f77cdb09-2a90-4f8c-8af6-7c0c12f62642</ReferenceMessageID>
				<MessagePrimaryContent>
					<ns4:ResponseCreateLot
						xmlns:ns6="urn://x-artefacts-mcx-gov-ru/fgiz-zerno/api/ws/types/1.0.3"
						xmlns:ns5="urn://x-artefacts-mcx-gov-ru/fgiz-zerno/api/ws/faults/1.0.3"
						xmlns:ns3="urn://x-artefacts-mcx-gov-ru/fgiz-zerno/api/common/1.0.3"
						xmlns:ns2="urn://x-artefacts-mcx-gov-ru/fgiz-zerno/api/organizations/1.0.3"
						xmlns="urn://x-artefacts-mcx-gov-ru/fgiz-zerno/api/lots/1.0.3"
						xmlns:ns4="urn://x-artefacts-mcx-gov-ru/fgiz-zerno/api/ws/lots/1.0.3" amountAvailable="1000" amountOriginal="1000" dateRegistration="2023-05-23Z" id="50999" lastModified="2023-05-23T17:00:25.312Z" number="011149110/23/0091" status="SUBSCRIBED">
						<LotFromResidues amount="1000"/>
						<Crop>
							<ns3:OKPD2>01.11.49.110</ns3:OKPD2>
						</Crop>
						<Target>1</Target>
						<Purpose>1</Purpose>
						<HarvestYear>2022</HarvestYear>
						<StoragePlace>
							<ns2:Address>Москва, Орликов переулок</ns2:Address>
						</StoragePlace>
						<ListValueQualityIndicator/>
						<Owner>
							<ns2:LegalEntity>
								<ns2:Name>ООО «Ромашка»</ns2:Name>
								<ns2:ShortName>ООО «Ромашка»</ns2:ShortName>
								<ns2:INN>2723092376</ns2:INN>
								<ns2:OGRN>1072723048896</ns2:OGRN>
								<ns2:KPP>272301501</ns2:KPP>
								<ns2:OPF>12100</ns2:OPF>
								<ns2:Address>
									<ns2:PostalCode>385202</ns2:PostalCode>
									<ns2:Address>Адыгея Респ, г Адыгейск, ул Гагарина, д. 120</ns2:Address>
								</ns2:Address>
							</ns2:LegalEntity>
						</Owner>
					</ns4:ResponseCreateLot>
				</MessagePrimaryContent>
			</MessageData>
		</SendResponseResponse>
	</soap:Body>
</soap:Envelope>

Отлично! Партия была успешно создана. Далее ее можно куда-нибудь послать (оформить СДИЗ - сопроводительный документ), разделить, аннулировать и т.д.

На данный момент имеется ограничение на частоту запросов: 14 в минуту. Если превысить, отправитель будет заблокирован на несколько минут.

P.S.: После получения ответа от сервера подразумевается, исходя из официальной документации, что нужно отправлять третий запрос, AckRequest, в качестве подтверждения ответа. В статье этот момент пропущен, т.к. все работает и без него, но имейте ввиду.

зерно обмен подписание

См. также

Раздельный учет по гособоронзаказу (ГОЗ) - Подсистема для 1С:Бухгалтерии 3.0 ПРОФ и КОРП

Бюджетный учет Обмен с ГосИС Бухгалтерский учет 1С:Управление производственным предприятием 1С:Бухгалтерия 3.0 1С:Управление холдингом Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Управляйте учетной политикой раздельного ведения затрат по контракту ГОЗ с подсистемой для 1С:Бухгалтерия. Отчеты по контрактам и контроль операций для исполнения в срок по 275-ФЗ. Минимальные требования: Версия платформы 1С: Предприятие 8.3 – 8.3.23 Версия конфигурации 1С: Бухгалтерия – 3.0.149.28 или выше.

28.08.2020    182458    1545    vvmanannikov    131    

811

Гособоронзаказ: учет и отчетность БП3.0 КОРП + ПРОФ + БИТ.ФИНАНС

Бюджетный учет Обмен с ГосИС Платформа 1С v8.3 Бухгалтерский учет 1С:Бухгалтерия 3.0 Государственные, бюджетные структуры Россия Бухгалтерский учет Платные (руб)

Доработка конфигурации 1С: Бухгалтерия предприятия, редакция 3.0. Предназначена для ведения раздельного учета и автоматизации заполнения отчетности исполнения контрактов ГОЗ в конфигурациях 1С БП КОРП, ПРОФ, БИТ.ФИНАНС.

30000 руб.

16.08.2019    87895    207    85    

125

ЕГАИС++. Опт, производство, импорт

Оптовая торговля Розничная торговля Обмен с ГосИС Платформа 1С v8.3 1С:Управление торговлей 10 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 Розничная и сетевая торговля (FMCG) Оптовая торговля, дистрибуция, логистика Рестораны, кафе и фаст-фуд Россия Бухгалтерский учет Управленческий учет Акцизы Платные (руб)

Полнофункциональное расширение (ранее известное как Модуль 1С-ЕГАИС) для взаимодействия типовых конфигураций 1С и ЕГАИС, предоставляющее максимум возможностей по работе с УТМ. Получение и отправка ТТН, отправка акта о постановке на баланс и акта о списании. Получение остатков. Загрузка и сопоставление номенклатуры и контрагентов. Оправка в ЕГАИС отчетов о производстве и импорте.

8970 руб.

15.12.2015    165983    677    362    

386

SALE! 45%

Обмен 1С с Честным Знаком для УТ11, УНФ, КА2, ERP, Розница: Расширение для работы с СУЗ, ГИС МТ, ЦРПТ

Обмен с ГосИС Платформа 1С v8.3 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Платные (руб)

Полноценное интеграционное решение которое манипулирует сотнями задач по ведению учета в системе мониторинга честный знак, особенности: такие как полная поддержка учета карточек в национальном каталоге (модерация, редактирование, подписание, получение информации), получение кодов маркировок в станции управления заказами "СУЗ Облако", удобная отправка и получение "УПД" через систему "ЭДОЛайт" из документов реализации или корректировки, так же существует механизм приема через ЭДОЛайт, отправка и получения таких документов как перемаркировка , списание, отгрузка и еще более 40 типов документов в ГИСМТ которые описаны ниже, моментальное сопоставление и внедрение в типовую конфигурацию которое обеспечивает ракетную мега скорость ...

18000 9900 руб.

28.03.2023    9733    31    8    

34

Обмен с системой ЦРПТ (Универсальная конфигурация ХамелеонЦРПТ + маркировка табака, обуви, одежды, лекарств, фото, молока, духов(парфюма), питьевой воды, велосипедов и шин)

Оптовая торговля Розничная торговля Обмен с ГосИС Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Розничная и сетевая торговля (FMCG) Оптовая торговля, дистрибуция, логистика Россия Бухгалтерский учет Управленческий учет Платные (руб)

Данная публикация создана для помощи разработчикам, интеграторам и другим заинтересованным лицам по настройке системы маркировки обуви, одежды, лекарств, табака, фото, молока, духов(парфюма), питьевой воды, велосипедов и шин. Смело задавайте нам вопросы по работе с ЦРПТ, GS1, ЭДО, Национальным каталогом, мы накопили достаточно большую базу знаний по данным темам и готовы ответить на все Ваши вопросы.

104000 руб.

18.03.2019    110335    34    114    

178

SALE! 30%

Обмен с системами Казначейства: Электронный бюджет

Обмен с ГосИС Платформа 1С v8.3 Бухгалтерский учет 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Платные (руб)

Обработка для обмена платежными документами в формате xml для системы Федерального казначейства "Электронный бюджет" из конфигураций 1С. Поставляется в двух вариантах для БП 3.0 и КА 2.х/ERP 2.х

15000 10500 руб.

14.10.2020    58518    344    101    

273

Гособоронзаказ в 1С: УПП 1.3

Бюджетный учет Обмен с ГосИС Бухгалтерский учет 1С:Управление производственным предприятием Государственные, бюджетные структуры Россия Бухгалтерский учет Платные (руб)

Для 1С: УПП 1.3 предлагаем Вашему вниманию подсистему "Раздельный учет результатов финансово-хозяйственной деятельности организаций, выполняющих государственный оборонный заказ (раздельный учет ГОЗ)". Ключевые возможности подсистемы: - Автоматическое заполнение регламентированного отчета "Исполнение контрактов ГОЗ"; - Расшифровка показателей отчета об исполнении контрактов ГОЗ с детализацией до документов; - Контроль хозяйственных операций на соответствие требованиям Постановления Правительства № 47; - Автоматизированный ввод начальных данных по контрактам, заключенным ранее даты начала использования подсистемы.

90000 руб.

25.09.2020    28756    33    9    

36

Печать кассовых чеков на одну ККМ с нескольких рабочих мест для 1С:УТ11.х, КА2.х, Розница 2.х, УНФ, ERP 2.х, БП 3, БГУ2

ККМ Кассовые операции Розничная торговля Обмен с ГосИС Бухгалтерский учет Оперативный учет Управляемые формы 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Платные (руб)

Расширение конфигурации для УТ 11.4, 11.5, КА 2.4, 2.5, Розница 3.0, 2.3 и 2.2, УНФ 1.6, УНФ 3x, ERP 2.4, 2.5, БП 3, БГУ2 (Управляемые формы) позволяет выполнять печать кассовых чеков на одну ККМ 54-ФЗ с нескольких рабочих мест. НИКАКИХ НАСТРОЕК В РАЗРАБОТКЕ - ПОДКЛЮЧИЛ И ПЕЧАТАЙ. Если у вас несколько отделов и одна ККМ - печатайте на одной ККМ! Если у вас две ККМ и одна поломалась - печатайте на одной ККМ, пока ремонтируете другую!

4000 руб.

27.08.2018    116015    980    564    

827
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. AlexGrecha 22.02.23 19:08 Сейчас в теме
Наконец-то начали появляться материалы по этой больной теме.
Спасибо автору) Опробую на выходных.
user1776020; +1 Ответить
2. AlexGrecha 24.02.23 12:22 Сейчас в теме
Обнаружил, что на 8.2 нет функции ПолучитьДвоичныеДанныеИзHEXСтроки().

Нашёл такое решение в интернете:

Функция СтрокуКакДвоичныеДанные(Параметр) Экспорт
    Перем Результат;
    
    ТипДвоичныеДанные = ФабрикаXDTO.Тип("http://www.w3.org/2001/XMLSchema", "hexBinary");
    Результат = ФабрикаXDTO.Создать(ТипДвоичныеДанные,Параметр);
    
    Возврат Результат.Значение;
КонецФункции 
user1776020; viktor3d; ktibomail; +3 Ответить
3. kazz0 02.03.23 13:13 Сейчас в теме
Спасибо за публикацию.
Подскажите, При получении справочника OKPD2 получаю ответ
"<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><soap:Fault><faultcode>soap:Client</faultcode><faultstring>Message part {urn://x-artefacts-mcx-gov-ru/fgiz-zerno/api/ws/types/1.0.2}SendRequestRequest was not recognized. (Does it exist in service WSDL?)</faultstring></soap:Fault></soap:Body></soap:Envelope>"
4. ktibomail 26 02.03.23 15:31 Сейчас в теме
(3) Подключаетесь к рабочему контуру или тестовому? На данный момент в тестовом перешли на API 1.0.3
9. kazz0 06.03.23 08:12 Сейчас в теме
(4) На рабочем работает.
Где взять библиотеки на API 1.0.3 ?
17. ktibomail 26 08.03.23 03:46 Сейчас в теме
(9) добавил в файлы. А вообще в телеграм канале по апи фгис зерно, но вроде бы он закрытый
21. Mikeware 9 10.03.23 13:42 Сейчас в теме
(17) Меня заставили писать обращение в техподдержку через горячую линию.(https://specagro.ru/hotline_grain?sut_voprosa=2.)
23. Mikeware 9 10.03.23 13:50 Сейчас в теме
(4) вопросик - а разве конверт не должен как-то фабрикой тоже делаться?
24. ktibomail 26 11.03.23 03:15 Сейчас в теме
(23) Можно и фабрикой я думаю, но я не стал, потому что мне проще использовать текстовый шаблон, т.к. он не меняется почти, в отличие от самих запросов
8. druid99999 03.03.23 22:47 Сейчас в теме
(3) Такой же ответ получаю, кто-нибудь сталкивался?
36. GrafB 10 06.04.23 13:09 Сейчас в теме
(8) вот и я сегодня получил такой ответ на рабочем контуре, хотя ранее получал нормально список окпд, пока возился с партией сдиз, перестал работать запрос окпд, в отдельных процедурах код, старый точно не менял
5. user1364680 03.03.23 04:32 Сейчас в теме
коллеги, добрый день)
а для подписания сообщения надо использовать реальный сертификат или можно получить какой то тестовый, из фгиса?
а если реальный серт - то это не опасно его использовать на тестовом контуре?
6. ktibomail 26 03.03.23 08:00 Сейчас в теме
(5) Я реальный использую. На сайт загружается открытый ключ, а подписываются сообщения закрытым ключом, который никуда не передается.
Говорят тут можно тестовый взять, но я не пробовал: https://testgost2012.cryptopro.ru/certsrv/
7. JohnyDeath 301 03.03.23 14:14 Сейчас в теме
(5) а что может быть опасного в использовании реальной подписи на тестовом контуре?
22. Mikeware 9 10.03.23 13:48 Сейчас в теме
(5)Тестовый получается спокойно на страничке криптопро https://www.cryptopro.ru/certsrv/
10. user1364680 06.03.23 08:52 Сейчас в теме
хм, при попытке создать фабрику с "fgis-zerno-api-dictionaries-1.0.3" (из нового набора схем апи) выдает постоянную ошибку: Файл не найден, хотя он есть, на клиенте...
11. GrafB 10 06.03.23 10:55 Сейчас в теме
Доброе время суток, что-то застопорился на этой строке

ПодключитьВнешнююКомпоненту(ПоместитьВоВременноеХранилище(ПолучитьМакет("КомпонентаXMLDSig")), "XMLDSignAddInSymbolicName", ТипВнешнейКомпоненты.Native);


не могу найти такую компоненту, нашёл в БСП ExtraCryptoAPI, но ею пользоваться не умею
12. GrafB 10 06.03.23 11:22 Сейчас в теме
какую-то компоненту нашёл(XMLDSig), но с ней пишет:
Тип не определен (AddIn.XMLDSignAddInSymbolicName.XMLDSignAddIn)
18. atdonya 95 09.03.23 09:30 Сейчас в теме
(12) ее надо установить, вероятно. В целом можете просто распаковать куда-то архив и подключить компоненту из dll
СисИнфо = Новый СистемнаяИнформация;
Если СисИнфо.ТипПлатформы = ТипПлатформы.Windows_x86 Тогда
	ПодключитьВнешнююКомпоненту("некийпуть\XMLDSignAddInWin32_2_0_5_2.dll", "XMLDSignAddInSymbolicName", ТипВнешнейКомпоненты.Native);
ИначеЕсли СисИнфо.ТипПлатформы = ТипПлатформы.Windows_x86_64 Тогда
	ПодключитьВнешнююКомпоненту("некийпуть\XMLDSignAddInWin64_2_0_5_2.dll", "XMLDSignAddInSymbolicName", ТипВнешнейКомпоненты.Native);
КонецЕсли;
ОбъектКомпоненты = Новый ("AddIn.XMLDSignAddInSymbolicName.XMLDSignAddIn");

Показать

версию только свою, какая у вас стоит
19. GrafB 10 09.03.23 12:43 Сейчас в теме
(18) подцепил компоненту, выложенную kazz0 здесь в обсуждениях, заработало
13. kazz0 07.03.23 08:50 Сейчас в теме
День добрый! Подскажите.
При получении партий переработки получаю ответ.

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><soap:Fault><faultcode>soap:Server</faultcode><faultstring>org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 349; cvc-elt.1.a: Cannot find the declaration of element 'RequestGetListGpb'.</faultstring></soap:Fault></soap:Body></soap:Envelope>

хотя партии зерна получаю без ошибки.. ( все на рабочем контуре.)
14. kazz0 07.03.23 09:41 Сейчас в теме
(13) Похоже , получение партии переработки (RequestGetListGpb) в версии 1.0.2 не работает, в версии 1.0.3 на тестовом контуре работает.
15. GrafB 10 07.03.23 11:05 Сейчас в теме
(13) вы через компоненту XMLDSig делаете? подскажите пожалуйста где взять.
20. Mikeware 9 10.03.23 13:38 Сейчас в теме
(13) На тестовом контуре при запросе списка запрос на список проходит, accepted. Но при получении данных вместо пустого списка получаю "Непредвиденная ошибка на стороне ФГИС: сервер вернул пустой ответ. Повторите запрос."
А на боевом контуре, даже запрос списка не отрабатывает - org.xml.sax.SAXParseException;
lineNumber: 1; columnNumber: 465; cvc-elt.1.a: Cannot find the declaration of
element 'RequestGetListGpbSDIZ
Версии API соответствуют.
Написал в техпод.
Техподдержка ответила "Ваша проблема передана в разработку. Ожидайте обратной связи в рамках обращения."
Похоже, оно там всё сырое напрочь, и неработающее от слова совсем...
вот как-то так. Только справочники работают.
А ведь уже 10 дней, как мы должны все регистрировать.
16. kazz0 07.03.23 11:46 Сейчас в теме
(15) В последних версиях ExtraCryptoAPI . В предыдущих версиях XMLDSig можно найти
Прикрепленные файлы:
XMLDSig.zip
atdonya; GrafB; +2 Ответить
25. dencheg_crimea 14.03.23 12:24 Сейчас в теме
Платформа 8.2.19.130
{ВнешняяОбработка.ФГИС_Зерно.МодульОбъекта(117)}: Ошибка при вызове метода контекста (ОтправитьДляОбработки)
HTTPОтвет = HTTP.ОтправитьДляОбработки(HTTPЗапрос).ПолучитьТелоКакСтроку();
по причине:
Ошибка работы с Интернет: SSL connect error
Проблема в платформе или что-то с сертификатами?
26. dencheg_crimea 14.03.23 12:32 Сейчас в теме
(25)
Ошибка работы с Интернет: SSL connect error

в Канале API подсказали. при работе с тестовыми или демо сервером SSL не нужен
27. Mikeware 9 17.03.23 11:37 Сейчас в теме
Не прошло и недели, как техпод зерна ответила.. в ответе - выслали новый АПИ, и написали:
"Для решения проблемы рекомендуем в соответствии с новой версией апи направить новый запрос."
28. JohnyDeath 301 17.03.23 11:57 Сейчас в теме
(27) Новый API - это какая версия? Старше 1.0.3?

На офф сайте у них вообще лежит только 1.0.2 https://specagro.ru/fgis
29. Mikeware 9 17.03.23 12:15 Сейчас в теме
(28) не, 1.0.3. вроде то, что автор публикации выложил, только с доком вордовским.
30. Mikeware 9 17.03.23 12:18 Сейчас в теме
а нет же, наврал. в публикации от 20.02.2023, а прислали от 07.03.2023. и файлики чуть побольше - описание ссылки на 177 байт, ну и т.д.
31. Mikeware 9 17.03.23 16:40 Сейчас в теме
вроде с новым API тестовый сервер начал осмысленно откликаться.
К сожалению, сегодня не проверил до конца. Но файл от техподдержки прикрепляю
Прикрепленные файлы:
ФГИС ЗЕРНО - API 1.0.3.zip
ktibomail; +1 Ответить
32. ktibomail 26 18.03.23 07:48 Сейчас в теме
(31) спасибо, прикрепил ваш файл к статье
33. janibeg 2 31.03.23 11:54 Сейчас в теме
Есть вообще какие готовые решения для интеграции с УТ 11.3?
34. ktibomail 26 04.04.23 15:16 Сейчас в теме
35. JohnyDeath 301 04.04.23 15:22 Сейчас в теме
(33) Сам вендор еще обещал сделать. Наверное как только устаканится на стороне ФГИС
37. Tarlich 115 14.04.23 17:23 Сейчас в теме
А что с типовыми решениями от 1С? ждем ?
38. Hawk_sib 29 19.04.23 08:00 Сейчас в теме
подскажите, почему
КомпонентаКриптографии.C14N(КонвертXML, "(//. | //@* | //namespace::*)[ancestor-or-self::*[local-name()='MessageData']]")

возвращает неопредлено?

компонента подключена, текст конверта не пустой и содержит MessageDate

то же самое с SignedInfо
39. Hawk_sib 29 19.04.23 10:01 Сейчас в теме
(38) похоже сам нашёл проблему: в текст функции КонвертXML() случайно залетели ненужные кириллические буквы
40. Hawk_sib 29 19.04.23 10:31 Сейчас в теме
подскажите:
Описания самих справочников ("fgis-zerno-dictionary-1.0.2.xsd") нам в данном примере не нужны.

но при попытке собрать схему, указанную в первом пункте возникает ошибка
Ошибка разыменования схемы XML: Файл не обнаружен 'C:\Users\stepan.shushakov\AppData\Local\Temp\98\fgis-zerno-dictionary-1.0.2.xsd'
по причине:
Файл не обнаружен 'C:\Users\userName\AppData\Local\Temp\98\fgis-zerno-dictionary-1.0.2.xsd'

а если файл fgis-zerno-dictionary-1.0.2.xsd добавить в массив путей, то ошибки нет, с чем это связано?
41. ktibomail 26 22.04.23 15:39 Сейчас в теме
(40) Попробуйте лучше версию 1.0.3, она более актуальна сейчас
42. Hawk_sib 29 23.04.23 09:47 Сейчас в теме
(41) в 1.0.3 история такая же
43. ktibomail 26 23.04.23 11:47 Сейчас в теме
(42) да действительно, нужен еще и fgis-zerno-dictionary. Исправил в статье, спасибо
44. AlexGrecha 21.05.23 10:41 Сейчас в теме
Начиная с 18 мая пример из статьи не проходит проверку ЭЦП.
45. AlexGrecha 22.05.23 16:53 Сейчас в теме
(44) Пришлось исправить несколько моментов:

1. Нужно использовать ExtraCryptoAPI вместо XMLDSig.

2. Потому что для получения DigestValue перед вычислением хеша обязательна трансформация СМЭВ:

КомпонентаКриптографии.TransformSMEV(КанонизированныйТекстXMLMessageData)

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

4. Собственно из сертификата тоже убираем все переносы:

СертификатКриптографииBase64 = Base64Строка(Сертификат.Выгрузить()); 
СертификатКриптографииBase64 = СтрЗаменить(СертификатКриптографииBase64, Символы.ВК, "");
СертификатКриптографииBase64 = СтрЗаменить(СертификатКриптографииBase64, Символы.ПС, "");

Всё это помогло мне пройти проверку ЭЦП. Надеюсь автор когда-нибудь дополнит статью.
ktibomail; +1 Ответить
46. demon_infernal 40 24.05.23 00:33 Сейчас в теме
(38) У меня такое было, когда я передавал на вход методу компоненты строку XML, содержащую пробелы, переносы строк и табуляции.
У компоненты есть свойство "СписокОшибок", в котором в кодировке Win1251 содержится строка с ошибкой.
Попробуйте остановиться на отладке после вызова первого метода, который возвращает Неопределено, и посмотреть, что будет в этом свойстве компоненты.
47. Zalk1962 12.07.23 18:38 Сейчас в теме
Добрый день.

Не поделитесь примером запроса списка входящих СДИЗ и ответа на него?
48. JohnyDeath 301 12.07.23 22:02 Сейчас в теме
(47) завезли во все типовые обмен с ФГИС Зерно от вендора. По крайней мере есть в бухгалтерии и ЕРП (УТ, КА)
49. Zalk1962 13.07.23 11:25 Сейчас в теме
(48) Добрый день. У меня не 1С, потому и прошу именно примеры.
50. user1576160 31.08.23 08:38 Сейчас в теме
Кто-то сталкивался с такой ошибкой:
Сообщение не принято ФГИС "Зерно":
Текст ошибки: Message part {urn://x-artefacts-mcx-gov-ru/fgiz-zerno/api/ws/types/1.0.3}SendRequestRequest was not recognized. (Does it exist in service WSDL?) (Client)
51. user1576160 31.08.23 09:40 Сейчас в теме
(50)
Разобрался. Надо было в настройка выставить версию API 1.0.5
52. SmAlex 1 05.12.23 15:17 Сейчас в теме
Добрый день. Помогите найти Схемы XML для поздних версий API.
53. SmAlex 1 05.12.23 15:25 Сейчас в теме
(52)
Нашел. В архиве с описанием API.
54. user1261529 06.02.24 11:02 Сейчас в теме
Добрый день! Дайте кто нибудь пожалуйста пример AckRequest запроса.
Оставьте свое сообщение