Добрый день.
ОФ,8.2.

Стоит следующая задача:
Необходимо реализовать выгрузки номенклатуры из 1с:
1)Номенклатура с свойствами;
2) Номенклатура с ценами;
3) Номенклатураи остатки.
Всё это по трём шаблонам в формате xml. Не смог найти информацию как сделать произвольный шаблон( интересует иеархия).
Далее необходимо настроить автоматический обмен этими данными с сайтом через api http.

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

Мысль следующая:
1) Запросом брать данные. Выгружать три файла в XML по шаблону
2) По регламентному заданию автоматически отправлять по http на сайт api .
Достаточно ли этого ? И делать желательно через обработку в самой конфигурации ?
---
Если конфигурация на БСП, можете попробовать следующий код:
```1c
    СтруктураURI = ОбщегоНазначенияКлиентСервер.СтруктураURI("Полный_адрес_сайта");

    HTTPСоединение = Новый HTTPСоединение(СтруктураURI.Хост, СтруктураURI.Порт,СистемныйПользователь,СистемныйПароль,,,Новый ЗащищенноеСоединениеOpenSSL());

    //Если есть заголовки, то необходим следующий блок
    //*************************************************
    Заголовки = Новый Соответствие();
    Заголовки.Вставить("Имя_Заголовка","Значение_Заголовка");
    Заголовки.Вставить("Имя_Заголовка","Значение_Заголовка");
    //*************************************************

    HTTPЗапрос = Новый HTTPЗапрос(СтруктураURI.ПутьНаСервере,Заголовки);

    //Формирование тела запроса
    ЗаписьXML = Новый ЗаписьXML;
    ЗаписьXML.УстановитьСтроку("UTF-8");
    ЗаписьXML.ЗаписатьОбъявлениеXML();

    ЗаписьXML.ЗаписатьНачалоЭлемента("products");
    ЗаписьXML.ЗаписатьНачалоЭлемента("product");

    ЗаписьXML.ЗаписатьНачалоЭлемента("id");
    ЗаписьXML.ЗаписатьТекст("id товара");
    ЗаписьXML.ЗаписатьКонецЭлемента();

    #Область ОбходЦиклом
    ЗаписьXML.ЗаписатьНачалоЭлемента("price");

    ЗаписьXML.ЗаписатьНачалоЭлемента("type");
    ЗаписьXML.ЗаписатьТекст("Розничная");
    ЗаписьXML.ЗаписатьКонецЭлемента();

    ЗаписьXML.ЗаписатьНачалоЭлемента("price");
    ЗаписьXML.ЗаписатьТекст("479");
    ЗаписьXML.ЗаписатьКонецЭлемента();

    ЗаписьXML.ЗаписатьКонецЭлемента();

    ЗаписьXML.ЗаписатьНачалоЭлемента("price");

    ЗаписьXML.ЗаписатьНачалоЭлемента("type");
    ЗаписьXML.ЗаписатьТекст("Распродажа");
    ЗаписьXML.ЗаписатьКонецЭлемента();

    ЗаписьXML.ЗаписатьНачалоЭлемента("price");
    ЗаписьXML.ЗаписатьТекст("299");
    ЗаписьXML.ЗаписатьКонецЭлемента();

    ЗаписьXML.ЗаписатьКонецЭлемента();
    #КонецОбласти

    ЗаписьXML.ЗаписатьКонецЭлемента();
    ЗаписьXML.ЗаписатьКонецЭлемента();

    СтрокаТело = ЗаписьXML.Закрыть();

    HTTPЗапрос.УстановитьТелоИзСтроки(СтрокаТело);
    HTTPОтвет = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
    РезультатОтвета = HTTPОтвет.ПолучитьТелоКакСтроку(); //РезультатОтвет - строка в формате xml или json - ответ от сервиса
```
---
в каком смысле произвольный шаблон ?
---
Строго по шаблону,пример во вложении.
Такого формата сложно добиться ?
---
можете посмотреть пример выгрузки https://infostart.ru/public/561006/
---
у Вас как раз выгружается массив строковых данных ?
---
там есть ссылка на описание формата
---
```1c
    ЗаписьXML = Новый ЗаписьXML;
    ЗаписьXML.УстановитьСтроку("UTF-8");
    ЗаписьXML.ЗаписатьОбъявлениеXML();

    ЗаписьXML.ЗаписатьНачалоЭлемента("products");
    ЗаписьXML.ЗаписатьНачалоЭлемента("product");

    ЗаписьXML.ЗаписатьНачалоЭлемента("id");
    ЗаписьXML.ЗаписатьТекст("id товара");
    ЗаписьXML.ЗаписатьКонецЭлемента();

    #Область ОбходЦиклом
    ЗаписьXML.ЗаписатьНачалоЭлемента("price");

    ЗаписьXML.ЗаписатьНачалоЭлемента("type");
    ЗаписьXML.ЗаписатьТекст("Розничная");
    ЗаписьXML.ЗаписатьКонецЭлемента();

    ЗаписьXML.ЗаписатьНачалоЭлемента("price");
    ЗаписьXML.ЗаписатьТекст("479");
    ЗаписьXML.ЗаписатьКонецЭлемента();

    ЗаписьXML.ЗаписатьКонецЭлемента();

    ЗаписьXML.ЗаписатьНачалоЭлемента("price");

    ЗаписьXML.ЗаписатьНачалоЭлемента("type");
    ЗаписьXML.ЗаписатьТекст("Распродажа");
    ЗаписьXML.ЗаписатьКонецЭлемента();

    ЗаписьXML.ЗаписатьНачалоЭлемента("price");
    ЗаписьXML.ЗаписатьТекст("299");
    ЗаписьXML.ЗаписатьКонецЭлемента();

    ЗаписьXML.ЗаписатьКонецЭлемента();
    #КонецОбласти

    ЗаписьXML.ЗаписатьКонецЭлемента();
    ЗаписьXML.ЗаписатьКонецЭлемента();

    РезультатЗапроса = ЗаписьXML.Закрыть();
```

Можете такой код использовать, только область заполнения циклом и заполнять циклом.
---
А как результат запроса в формат xml сохранить/открыть программно ?
---
Не совсем понял вопрос. Вам нужно сформированную сроку xml сохранить во внешний файл на компьютере?
---
Да, программно не могу получить формат xml из строки.

Возможно еще знаете ответ из (17)
---
Если планируете его передавать сразу на сервис, то нет необходимости сохранять в файл, а надо передавать сразу в качестве тела POST запроса. Посмотрите в синтакс-помощнике описание метода УстановитьТелоИзСтроки(<ТелоКакСтрока>, <Кодировка>, <ИспользоватьBOM>), где параметр <ТелоКакСтрока> как раз и будет собранная в (8) xml-строка.
---
А есть примеры или ссылка как в post передают ?
---
Если конфигурация на БСП, можете попробовать следующий код:
```1c
    СтруктураURI = ОбщегоНазначенияКлиентСервер.СтруктураURI("Полный_адрес_сайта");

    HTTPСоединение = Новый HTTPСоединение(СтруктураURI.Хост, СтруктураURI.Порт,СистемныйПользователь,СистемныйПароль,,,Новый ЗащищенноеСоединениеOpenSSL());

    //Если есть заголовки, то необходим следующий блок
    //*************************************************
    Заголовки = Новый Соответствие();
    Заголовки.Вставить("Имя_Заголовка","Значение_Заголовка");
    Заголовки.Вставить("Имя_Заголовка","Значение_Заголовка");
    //*************************************************

    HTTPЗапрос = Новый HTTPЗапрос(СтруктураURI.ПутьНаСервере,Заголовки);

    //Формирование тела запроса
    ЗаписьXML = Новый ЗаписьXML;
    ЗаписьXML.УстановитьСтроку("UTF-8");
    ЗаписьXML.ЗаписатьОбъявлениеXML();

    ЗаписьXML.ЗаписатьНачалоЭлемента("products");
    ЗаписьXML.ЗаписатьНачалоЭлемента("product");

    ЗаписьXML.ЗаписатьНачалоЭлемента("id");
    ЗаписьXML.ЗаписатьТекст("id товара");
    ЗаписьXML.ЗаписатьКонецЭлемента();

    #Область ОбходЦиклом
    ЗаписьXML.ЗаписатьНачалоЭлемента("price");

    ЗаписьXML.ЗаписатьНачалоЭлемента("type");
    ЗаписьXML.ЗаписатьТекст("Розничная");
    ЗаписьXML.ЗаписатьКонецЭлемента();

    ЗаписьXML.ЗаписатьНачалоЭлемента("price");
    ЗаписьXML.ЗаписатьТекст("479");
    ЗаписьXML.ЗаписатьКонецЭлемента();

    ЗаписьXML.ЗаписатьКонецЭлемента();

    ЗаписьXML.ЗаписатьНачалоЭлемента("price");

    ЗаписьXML.ЗаписатьНачалоЭлемента("type");
    ЗаписьXML.ЗаписатьТекст("Распродажа");
    ЗаписьXML.ЗаписатьКонецЭлемента();

    ЗаписьXML.ЗаписатьНачалоЭлемента("price");
    ЗаписьXML.ЗаписатьТекст("299");
    ЗаписьXML.ЗаписатьКонецЭлемента();

    ЗаписьXML.ЗаписатьКонецЭлемента();
    #КонецОбласти

    ЗаписьXML.ЗаписатьКонецЭлемента();
    ЗаписьXML.ЗаписатьКонецЭлемента();

    СтрокаТело = ЗаписьXML.Закрыть();

    HTTPЗапрос.УстановитьТелоИзСтроки(СтрокаТело);
    HTTPОтвет = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
    РезультатОтвета = HTTPОтвет.ПолучитьТелоКакСтроку(); //РезультатОтвет - строка в формате xml или json - ответ от сервиса
```
---
Спасибо! А что за заголовки ?
---
Нужно в описании API смотреть, требуются ли какие-то заголовки для передачи на сервис или нет. А если требуются, то какие. В принципе, в интернете можете найти информацию по заголовкам HTTP
---
Блин, у меня платформа 8.2.16...
То есть HTTP Запрос отсутствует.
Остаётся вариант лишь через ftp?
---
А у Вас куда должен передаваться xml файл? Если реализовать выгрузку на ftp, то как-то принимающая сторона должна его получать. Что это вообще за принимающая сторона?
А для работы с HTTPСоединение требуется платформа "1С:Предприятие" версии 8.2.18 и выше или 8.3.3 и выше. Наверно, можно и обновить, хоть до 8.2.18.
---
В идеале на api по указанному адресу. Обновить платформу могу в принципе до 8.2.18.

Ещё вопрос появился, у меня веб-сервер развёрнут на 8.3 - это как то можно использовать в моём случае,либо надо в любом случае обновить платформу?
---
Обновитесь, т.к. методы будут вызываться из конфигурации, соответственно там и должна быть платформа, которая умеет использовать HTTPСоединение. Пример реализации на ИТС https://its.1c.ru/db/metod8dev/content/5574/hdoc
---
Да, спасибо. Как раз после того как увидел эту статью на итс задал Вам вопрос.

Ещё появился вопрос. Стартмани из топика ваши однозначно.

Сейчас механизм такой.
Пользователь выбирает номенклатуру, заполняет все её характеристики.Жмёт записать.
В РС записываются эти все данные и ставится признак у номенклатуры "Выгружать на сайт"( в РС значениесвойствобъектов).

Я в свою очередь беру все позиции с характиретистиками и с этим признаком, формирую xml и шлю на сайт. Признак "Выгружать на сайт" становится ложь.

Собственно вопрос: Как сделать так, чтобы на сайт отсылалась только та номенклатура и та характеристика которую изменил пользователь.
То есть если допустим изменили лишь штрихкод. То на сайт я должен выгрузить номенклатура и измененный штрихкод,а не полностью все данные
---
Однозначно не могу сказать, тут нужно продумывать механизм версионирования (есть в продуктах на БСП). Смысл в том, что Вам при записи нужно где-то фиксировать изменившиеся реквизиты. Причем, контролировать это нужно при записи Номенклатуры. Например, в РС добавить измерение "ИзменившиесяРеквизиты" с типом "ХранилищеДанных" и "ВерсияОбъекта", с типом "Число". При записи Номенклатуры формируется, допустим, массив с изменившимися реквизитами и сохраняется в измерение "ИзменившиесяРеквизиты", а так же проверяет, есть ли уже запись в РС по данной номенклатуре и устанавливает след. номер версии. Ну, или если не нужно хранить историю, то без версии, просто перезаписывает имеющуюся запись.
---
Охо, я думал всё-таки проще возможно как то.

И по поводу текста xml который в РезультатЗапроса.
Всё-таки мне нужно выгрузить его и отправить человеку который занимается сайтом. Для проверки. Как это сделать ?
---
Попробуйте такой код

```1c
    Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
    Диалог.Расширение = "xml";

    Если Диалог.Выбрать() Тогда

    ЗаписьXML = Новый ЗаписьXML;
    ЗаписьXML.ОткрытьФайл(Диалог.ПолноеИмяФайла,"UTF-8");
    ЗаписьXML.ЗаписатьОбъявлениеXML();

    ЗаписьXML.ЗаписатьНачалоЭлемента("products");
    ЗаписьXML.ЗаписатьНачалоЭлемента("product");

    ЗаписьXML.ЗаписатьНачалоЭлемента("id");
    ЗаписьXML.ЗаписатьТекст("id товара");
    ЗаписьXML.ЗаписатьКонецЭлемента();

    #Область ОбходЦиклом
    ЗаписьXML.ЗаписатьНачалоЭлемента("price");

    ЗаписьXML.ЗаписатьНачалоЭлемента("type");
    ЗаписьXML.ЗаписатьТекст("Розничная");
    ЗаписьXML.ЗаписатьКонецЭлемента();

    ЗаписьXML.ЗаписатьНачалоЭлемента("price");
    ЗаписьXML.ЗаписатьТекст("479");
    ЗаписьXML.ЗаписатьКонецЭлемента();

    ЗаписьXML.ЗаписатьКонецЭлемента();

    ЗаписьXML.ЗаписатьНачалоЭлемента("price");

    ЗаписьXML.ЗаписатьНачалоЭлемента("type");
    ЗаписьXML.ЗаписатьТекст("Распродажа");
    ЗаписьXML.ЗаписатьКонецЭлемента();

    ЗаписьXML.ЗаписатьНачалоЭлемента("price");
    ЗаписьXML.ЗаписатьТекст("299");
    ЗаписьXML.ЗаписатьКонецЭлемента();

    ЗаписьXML.ЗаписатьКонецЭлемента();
    #КонецОбласти

    ЗаписьXML.ЗаписатьКонецЭлемента();
    ЗаписьXML.ЗаписатьКонецЭлемента();

    ЗаписьXML.Закрыть();

    КонецЕсли;
```
---
Добрый день. А где то есть коды открытый с примером такого ?
Добрался до этого пункта наконец-то.
Или возможно проще как то можно хранить ?
Просто все мои характеристики и так записываются в регистр.
---
Примеры взял из головы, что первое пришло на ум. Ссылок на подобные решения, к сожалению, нет.
---
Сообщение было скрыто модератором.
---
Добрый вечер.
Подумал а почему нельзя этот код использовать для отправки ?

```1c
    HTTP = Новый HTTPСоединение(Сервер,,,,,Истина);

    // Создаем временный файл, который будет
    // передан в теле POST-запроса
    ФайлЗапроса = ПолучитьИмяВременногоФайла();
    // Записываем в файл текстовое содержимое
    // тела запроса (переменная "ТелоЗапроса")
    ТекстовыйФайл = Новый ТекстовыйДокумент;
    ТекстовыйФайл.УстановитьТекст(ТелоЗапроса);
    ТекстовыйФайл.Записать(ФайлЗапроса, КодировкаТекста.ANSI);
    // Получаем размер отправляемых данных в теле запроса
    ФайлОтправки = Новый Файл(ФайлЗапроса);
    РазмерФайлаОтправки = XMLСтрока(ФайлОтправки.Размер());
    // Подготовим временный файл для получения тела
    // ответа POST-запроса
    ФайлРезультата = ПолучитьИмяВременногоФайла();

    // Для того, чтобы установить заголовки
    // POST-запроса создадим соответствие
    ЗаголовокHTTP = Новый Соответствие();
    // В этом примере устанавливаем в заголовках запроса
    // размер передаваемых данных и их тип
    ЗаголовокHTTP.Вставить("Content-Length", РазмерФайлаОтправки);
    ЗаголовокHTTP.Вставить("Content-Type", "application/json; charset=utf-8");

    // Отправляем POST-запрос для обработки.
    // Параметры:
    // 1. Файл запроса - путь к файлу, содержащего
    // тело запроса
    // 2. Ресурс - ссылка на страницу веб-сервера,
    // к которой выполняется POST-запрос
    // 3. ФайлРезультат - файл, в который будет
    // помещено тело ответа сервера
    // 4. ЗаголовокHTTP - соответствие с заголовками
    // POST-запроса
    HTTP.ОтправитьДляОбработки(ФайлЗапроса, Ресурс,
    ФайлРезультата, ЗаголовокHTTP);

    // Получаем ответ веб-сервера на POST-запрос
    // в виде текста
    ТекстовыйФайлОтвет = Новый ТекстовыйДокумент;
    ТекстовыйФайлОтвет.Прочитать(ФайлРезультата,КодировкаТекста.UTF8);
    СтрокаОтветСервера = ТекстовыйФайлОтвет.ПолучитьТекст();
```

Помнится речь была о том, что у меня платформа не может создавать Http запрос, так как ранняя версия конфы. А тут не используется он.
---
ОтправитьДляОбработки
Согласно СП:
---
Получется в любом случае обновлять релиз ? Надеялся, что может и без этого обойтись.
---
Получается, что да.
---
Так, обновлять релиз нереально..
Если это переделать на ftp, можно ли пример и реализуемо это в моей версии ?
---
По поводу выгрузки xml-файла на фтп можете посмотреть, как это реализовано в любой типовой конфигурации. "Администрирование - Синхронизация". Выбираете в качестве транспорта обмена каталог FTP. В указанный каталог сохраняется файл обмена (xml)
---
А то что у меня база 8.2 на оф не помешает это реализовать ?
---
Ну за основу данный механизм можно взять, а реализовывать самому на ОФ. Вы же просили пример выгрузки данных на фтп.
---
Номенклатура отдельно
Цены и остатки вместе
два регламентных задания по времени определишь сам насколько это актуально для фирмы

по ценам и остаткам примерно так

ВЫБРАТЬ
 ЦеныНоменклатуры.Номенклатура.Ссылка КАК Ссылка,
 ЦеныНоменклатуры.Номенклатура.Код КАК Код,
 ЦеныНоменклатуры.Номенклатура.Наименование КАК Наименование,
 КурсВалют.Курс * ЦеныНоменклатуры.Цена КАК Цена,
 ЕСТЬNULL(ТоварыНаСкладахОстатки.КоличествоОстаток, 0) - ЕСТЬNULL(ТоварыВРезервеНаСкладахОстатки.КоличествоОстаток, 0) КАК Остаток
ИЗ
 РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатуры
  ПОЛНОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют.СрезПоследних КАК КурсВалют
  ПО ЦеныНоменклатуры.Валюта = КурсВалют.Валюта
  ПОЛНОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(, Склад.ТипСклада = ЗНАЧЕНИЕ(Перечисление.ТипыСкладов.ПустаяСсылка)) КАК ТоварыНаСкладахОстатки
  ПО ЦеныНоменклатуры.Номенклатура = ТоварыНаСкладахОстатки.Номенклатура
  ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыВРезервеНаСкладах.Остатки(, Склад.ТипСклада = ЗНАЧЕНИЕ(Перечисление.ТипыСкладов.ПустаяСсылка)) КАК ТоварыВРезервеНаСкладахОстатки
  ПО ЦеныНоменклатуры.Номенклатура = ТоварыВРезервеНаСкладахОстатки.Номенклатура
ГДЕ
 ЦеныНоменклатуры.ТипЦен = &ТипЦен
 И ЦеныНоменклатуры.Номенклатура В ИЕРАРХИИ(&Номенклатура)
---
2 запроса имеете ввиду ? Номенклатура с свойствами и номенклатура цены/остатки.
---
Номенклатура как один запрос
Цены и остатки как второй
Свойства как третий - потому что на сайте парсить разные запросы легче чем делать один громадный в котором запутаешься что к чему связано так как свойства имеют свои особенности
*ЗначенияСвойствОбъектов.Объект КАК Объект,
*ЗначенияСвойствОбъектов.Свойство КАК Свойство,
*ЗначенияСвойствОбъектов.Значение КАК Значение

которые нужно передавать
то есть с спр.Номенклатура левым соединением к ЗначенияСвойствОбъектов Из РегистрСведений.ЗначенияСвойствОбъектов

свойства очень не простые, хотя на первый взгляд всегда кажется наоборот
---
Так а причём тут парсить на сайте ?
Если на выходе я буду формировать три разных файла xml, который в свою очередь уже и будут попадать к сайту.
---
со стороны сайта тоже будет писаться код чтобы обработать твой xml с вложенными параметрами
типа UID - уникальный идентификатор номенклатуры, а Name - Наименование номенклатуры и т.п.
---
Под свойствами имелись ввиду характеристики номенкелатуры.
В итоге 2 запроса 2 рег задания ?
---
Подскажите пожалуйста ещё в итоге готовый файл xml который я получил.
Как правильнее через http отправить по прямому адресу в теле запроса по логину паролю на сайт api ?
Не нашёл статьи подходящей
---
1) Необходимо регистрировать где то в 1С установку цен. Скорее всего есть документ, у документа есть регистр по установке цен. Создаем свой регистр, в который пишем всё что будем отправлять и добавляем в ресурсы поле - результат отправки(0 - не отправлено, 1 - успешно, 2 и далее всякие коды ошибок уже)
2) Создаем регламентное задание которое будет с определенной периодичностью обрабатывать очередь из нового регистра и при успешной отправке будет проставлять статус.
3) изучаем внимательно api сайта - скорее всего номенклатура, так как это ссылочное поле, синхронизируется по ГУИДу сайта, и его тоже нужно где то хранить(доп реквизит в номенклатуре или отдельный регистр - это уже кому как). Сначала убеждаемся что всё ссылочное есть уже на стороне сайта, если нет, используем методы api чтобы создать новую номенклатуру, и только после этого отправляем пакет с ценой.
---
Регистр с новыми записями уже сделан. Так же добавил отметку "Выгружать на сайт".
Так что значит по правильному пути иду :)
---
https://infostart.ru/public/462355/
---
Куда должен передаваться xml файл? Если реализовать выгрузку на ftp, то как-то принимающая сторона должна его получать. Что это вообще за принимающая сторона? А для работы с HTTPСоединение требуется платформа "1С:Предприятие" версии 8.2.18 и выше или 8.3.3 и выше.
---
добрый день. подскажите пожалуйста. Подключила Астрал ЭДО и хочу выгрузить туда акт выполненных работ в формате xml, Файл из 1с сформировала с помощью файла Выгрузка и загрузка данных XML который открыла в рабочей базе 1С, подгрузила его в астрал ЭДО, в астрал файл присоединился как неформализованный, как мне сделать чтоб файл был прочитан программой Астрал правильно и формат xml принимал верно без ошибок, Клиенты не могут прочитать неформализованный документ.