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

23.05.23

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

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование Бесплатно
Схемы XML
.zip 436,04Kb
42
42 Скачать бесплатно
Документация
.docx 405,37Kb
43
43 Скачать бесплатно

Обновлено 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С v8.3 1С:Бухгалтерия 3.0 1С:Управление холдингом Химическая промышленность Государственные, бюджетные структуры Электротехника и микроэлектроника Машиностроение и приборостроение Металлургическая промышленность Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Раздельный учет гособоронзаказа в 1С: Отчеты по исполнению госконтрактов, расчетно-калькуляционные материалы и контроль операций для исполнения в срок в 1С: Бухгалтерия 3.0 и Управление Холдингом 3.2. Простая настройка и полное соответствие законодательству. Профессиональный консалтинг и регулярные обновления продукта.

44000 руб.

28.08.2020    366175    2476    137    

1081

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

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

55200 руб.

16.08.2019    93863    255    87    

149

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

Интеграция для работы 1С с ГИИС ДМДК. Государственная интегрированная информационная система в сфере контроля за оборотом драгоценных металлов, драгоценных камней и изделий из них на всех этапах этого оборота.

65000 руб.

12.04.2022    18353    158    34    

37

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

Автоматизация учета ЕГАИС в 1С для оптовой торговли, производства и импорта. Получение и отправка ТТН, отправка акта о постановке на баланс и акта о списании. Получение остатков. Загрузка и сопоставление номенклатуры и контрагентов. Оправка в ЕГАИС отчетов о производстве и импорте.

828 руб.

15.12.2015    172489    863    370    

406

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

Автоматический обмен данными с системой ФГИС Меркурий из 1С через ВетИС API: загрузка данных по хозяйствующим субъектам, предприятиям; типов, групп, видов, наименований продукции, сопоставление данных и запись их в базу данных; создание на основании расходных документов транспортных партий, отправка на сервер, печать полученных ветеринарных свидетельств, запрос остатков складского журнала, проведение инвентаризаций, оформление производственных партий.

11500 руб.

08.12.2017    105834    291    110    

147

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

Обработка для обмена платежными документами в формате xml для системы Федерального казначейства "Электронный бюджет" из конфигураций 1С. Поставляется для БП 3.0 Работа только с контрагентами. Сайт "Электронного Бюджета": https://www.budget.gov.ru/

19200 руб.

14.10.2020    64262    390    103    

322

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

Внешняя обработка для инвентаризации кодов маркировки в системе "Честный знак". Позволяет быстро определить и списать коды маркировки проданного, испорченного, утраченного (полный перечень причин списания указан ниже)  товара, которые всё ещё числятся за организацией. Привести в соответствие остатки маркированного товара программы 1С и системы "Честного знака".

6540 руб.

09.01.2024    6066    81    21    

81

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

Универсальная конфигурация ХамелеонЗерно для взаимодействия с системой ФГИС Зерно (тестовый+рабочий контур) может использоваться для интеграции в любую конфигурацию на базе 1С, версии ПРОФ и выше. Работа через API 1.0.7 и на API 1.0.8. Для удобства реализован общий интерфейс в виде обработки, схожей с интерфейсом ФГИС Зерно, но возможностей гораздо больше, т.к. при интеграции в Вашу учетную систему, можно на основании Ваших справочников и документов, создавать соответствующие документы и справочники в системе ФГИС Зерно и наоборот.

6000 руб.

27.06.2023    5014    20    2    

17
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
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 29 02.03.23 15:31 Сейчас в теме
(3) Подключаетесь к рабочему контуру или тестовому? На данный момент в тестовом перешли на API 1.0.3
9. kazz0 06.03.23 08:12 Сейчас в теме
(4) На рабочем работает.
Где взять библиотеки на API 1.0.3 ?
17. ktibomail 29 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 29 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 29 03.03.23 08:00 Сейчас в теме
(5) Я реальный использую. На сайт загружается открытый ключ, а подписываются сообщения закрытым ключом, который никуда не передается.
Говорят тут можно тестовый взять, но я не пробовал: https://testgost2012.cryptopro.ru/certsrv/
7. JohnyDeath 302 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 111 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 302 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 29 18.03.23 07:48 Сейчас в теме
(31) спасибо, прикрепил ваш файл к статье
33. janibeg 2 31.03.23 11:54 Сейчас в теме
Есть вообще какие готовые решения для интеграции с УТ 11.3?
34. ktibomail 29 04.04.23 15:16 Сейчас в теме
35. JohnyDeath 302 04.04.23 15:22 Сейчас в теме
(33) Сам вендор еще обещал сделать. Наверное как только устаканится на стороне ФГИС
37. Tarlich 118 14.04.23 17:23 Сейчас в теме
А что с типовыми решениями от 1С? ждем ?
38. Hawk_sib 30 19.04.23 08:00 Сейчас в теме
подскажите, почему
КомпонентаКриптографии.C14N(КонвертXML, "(//. | //@* | //namespace::*)[ancestor-or-self::*[local-name()='MessageData']]")

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

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

то же самое с SignedInfо
39. Hawk_sib 30 19.04.23 10:01 Сейчас в теме
(38) похоже сам нашёл проблему: в текст функции КонвертXML() случайно залетели ненужные кириллические буквы
40. Hawk_sib 30 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 29 22.04.23 15:39 Сейчас в теме
(40) Попробуйте лучше версию 1.0.3, она более актуальна сейчас
42. Hawk_sib 30 23.04.23 09:47 Сейчас в теме
(41) в 1.0.3 история такая же
43. ktibomail 29 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 41 24.05.23 00:33 Сейчас в теме
(38) У меня такое было, когда я передавал на вход методу компоненты строку XML, содержащую пробелы, переносы строк и табуляции.
У компоненты есть свойство "СписокОшибок", в котором в кодировке Win1251 содержится строка с ошибкой.
Попробуйте остановиться на отладке после вызова первого метода, который возвращает Неопределено, и посмотреть, что будет в этом свойстве компоненты.
47. Zalk1962 12.07.23 18:38 Сейчас в теме
Добрый день.

Не поделитесь примером запроса списка входящих СДИЗ и ответа на него?
48. JohnyDeath 302 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 запроса.
55. Mastershi 29.03.24 16:48 Сейчас в теме
В каком контексте должны работать следующие строки:
ПодключитьВнешнююКомпоненту(ПоместитьВоВременноеХранилище(ПолучитьМакет("ExtraCryptoAPI")), "ExtraCryptoAPISymbolicName", ТипВнешнейКомпоненты.Native);
	КомпонентаКриптографии = Новый("AddIn.ExtraCryptoAPISymbolicName.ExtraCryptoAPI");

У меня тупо сообщает, что
{ОбщийМодуль.СГМ_ОбменЗерноКлиент.Модуль(128,3)}: Процедура или функция с указанным именем не определена (ПолучитьМакет)
<<?>>ПолучитьМакет("КомпонентаExtraCryptoAPI")), (Проверка: Сервер)
{ОбщийМодуль.СГМ_ОбменЗерноКлиент.Модуль(128,3)}: Процедура или функция с указанным именем не определена (ПолучитьМакет)
<<?>>ПолучитьМакет("КомпонентаExtraCryptoAPI")), (Проверка: Тонкий клиент)
Оставьте свое сообщение