gifts2017

Обмен документами в формате CommerceML по схеме поставщик-покупатель между 1С 7.7 <=> 7.7 (конфигурация «Торговля + Склад», ред. 9.2) и 1С 7.7 <=> 8.x (конфигурация «Управление торговлей, ред. 10.3»)

Опубликовал Александр (s.nek) в раздел Обработки - Обработка документов

Данная статья посвящена обмену документами в формате CommerceML по схеме поставщик-покупатель между конфигурациями «Торговля + склад, редакция 9.2» 1С 7.7 (далее ТиС) и «Управление торговлей, редакция 10.3» 1С 8.х (далее УТ 10.3).
Рассматривается выгрузка документов «Реализация ТМЦ», «Заказ поставщику» и, соответственно загрузка документов «Поступление ТМЦ» и «Заявка покупателя», сопоставление собственной номенклатуры – номенклатуре поставщиков на стороне покупателей и преобразование между форматами различных версий.

Для кого предназначена данная статья

Данная статья посвящена обмену документами в формате CommerceML по схеме поставщик-покупатель между конфигурациями «Торговля + склад, редакция 9.2» 1С 7.7 (далее ТиС) и «Управление торговлей, редакция 10.3» 1С 8.х (далее УТ 10.3).

Рассматривается выгрузка документов «Реализация ТМЦ», «Заказ поставщику» и, соответственно загрузка документов «Поступление ТМЦ» и «Заявка покупателя», сопоставление собственной номенклатуры – номенклатуре поставщиков на стороне покупателей и преобразование между форматами различных версий.

Материал также будет интересен для тех, кто пытался настроить обмен не только между разными версиями 1С, но и в рамках одинаковых версий.

Сразу оговорюсь про некоторые границы статьи и темы, которые она затрагивает:

  1. Приведенная информация не касается конфигурации «Управление торговлей, версия 11» ­– обмен данными в формате CommerceML в ней на момент написания статьи (декабрь 2012 года) отсутствует
  2. Не рассматривается продажа в валюте, отличной от российского рубля
  3. Не рассматривается ситуация пересчета коэффициентов номенклатуры, т.е. считается, что товары у поставщика и покупателя измеряются в одинаковых единицах
  4. При установке соответствия между номенклатурой поставщика и собственной – следует задавать только взаимно-однозначное соответствие. Т.е. если поставщик разделяет товары «USB-Flash диск 4Gb, зеленый» и «USB-Flash диск 4Gb, красный» − то и на стороне покупателя это тоже должны быть разные товары (ТиС 9.2) или разные пары товар-характеристика (для УТ 10.3 если ведется учет по характеристикам)
  5. Не рассматривается правильная загрузка реквизитов документа, связанных с налоговым учетом, а именно флагов «Учитывать НДС», «НДС в сумме». В стандартных обработках загрузки они устанавливаются автоматически в 1, при этом их значение в загружаемых файлах игнорируется
  6. В обработках отсутствует выгрузка и загрузка информации о государственных таможенных декларациях, странах происхождения и т.п.
  7. Все исправления вносимые в конфигурацию являются необходимыми для корректного обмена, но, возможно, недостаточными для правильной работы всех возможностей обработок. Например, обработка загрузки в «УТ 10.3» при создании номенклатуры некорректно воссоздает иерархию источника
  8. В рамках данной статьи рассматривается только обмен товарами в следующих вариантах:
    • Реализация (поставщика) становится поступлением (у покупателя) для
      • ТиС => ТиС
      • ТиС => УТ
    • Заказ поставщику (покупателя) становится заявкой (у поставщика)
      • ТиС => ТиС
      • УТ => ТиС
  9. Не рассматривается обмен между двумя конфигурациями УТ

Формат обмена «Поставщик»-«Покупатель». Как это работает.

В конфигурациях ТиС 9.2 и УТ 10.3 существует возможность обмениваться документами между поставщиком и покупателем, а именно автоматизировать процесс заказа и внесения поступлений товара в программу.

Сопоставление номенклатуры осуществляется на стороне покупателя на этапе загрузки документов от поставщика. Пример того, как это работает, показан далее.

Версия 7.77.7 от поставщика к покупателю

Подготовительная работа

Для загрузки-выгрузки нам понадобятся – на каждой стороне:

  1. 1С 7.7 конфигурация «Торговля и склад, редакция 9.2»
  2. Внешняя компонента V7Plus для работы с форматом XML
  3. Одинаковые краткие наименования единиц измерения в справочнике «ОКЕИ» с обоих сторон

Также для обмена нам понадобится первоначальная настройка со стороны как поставщика так и покупателя.

Поставщик

У основной фирмы должен быть задан идентификатор – на вкладке «Прочие».

Необходимо также завести элемент справочника «Каталоги номенклатуры», указать владельца – основную фирму, от имени которой будут производиться продажи.

Каталог товаров на стороне поставщика

Покупатель

На стороне покупателя также необходимо создать элемент справочника «Каталоги номенклатуры» с тем же идентификатором, но с владельцем каталога равным контрагенту – поставщику. Идентификаторы каталогов должны совпадать.

Также необходимо у контрагента-поставщика задать такой же идентификатор, как у фирмы продавца в базе поставщика.

Каталог товаров на стороне покупателя

Выгрузка

Выгрузка документа «Реализация» происходит очень просто – достаточно нажать в форме документа на кнопку «Действия» и выбрать «Выгрузить (отправить по электронной почте)».

Выгрузка реализации

Загрузка

Рассмотрим загрузку поступления товара у клиента на типовой конфигурации «Торговля + Склад» 7.70.970.

Для загрузки документа выберем меню «Сервис» - «Обмен данными в формате CommerceML» - «Просмотр и загрузка документа». Выберем файл, выгруженный поставщиком.

Загрузка документа

Сопоставление номенклатуры

Следующий этап – сопоставление номенклатуры.

Для этого выбираем «Просмотр каталога товаров».

На вкладке Фильтры выберем «Только не идентифицированные».

Сопоставление номенклатуры, рис.1

Затем отключим иерархию и перейдем на закладку «Основная».

  • Колонка «Ид.» - код товара в базе поставщика
  • Колонка «Наименование» - наименование товара в базе поставщика

Для сопоставление товара делаем двойной клик на строке.

Сопоставление товаров, рис.2

Есть 2 варианта действий:

  1. создать новый товар (с повторением иерархии источника)
  2. выбрать для номенклатуры поставщика аналогичный товар в собственной базе.

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

Загрузка для версии 8.x, а также выгрузка/загрузка заказа поставщику и заявки покупателя выглядит подобным образом.

Где почитать подробнее

Для 1С версии 7.7 подробнее об этом обмене можно почитать в официальном руководстве «Конфигурация Торговля+Склад, ред 9.2» в главе 7 – сервисные возможности. Также информация об этом обмене есть на дисках ИТС в разделе «Методическая поддержка 1С:Предприятия 7.7» / «Обмен данными в формате XML» / «Обмен коммерческой информацией в формате XML» / «Электронный обмен документами при проведении торговых операций».

По работе с этим форматом в 1С версии 8.1 не так много источников, и большинство из них описывает как с его помощью обновлять информацию на сайте. Однако краткое описание обмена есть в разделе ИТС «Методическая поддержка 1С:Предприятия 8» / «Разработчикам» / «Обмен данными, прикладные технологии» / «Обмен Поставщик-Покупатель».

Ложка дегтя

Однако так все должно работать в теории, но на практике все несколько иначе. Чтобы все работало как написано, необходимо внести изменения в конфигурацию. Начнем с конфигурации «Торговля + Склад, редакция 9.2»

«Торговля + Склад, ред. 9.2»

Исправление 1

При загрузке поступления товара некорректно загружается единица изменения, а именно поле «Единица» загружаемого документа «Поступление ТМЦ» для всех товаров заполняется одним и тем же значением.

Происходит это из-за того, что при поиске единицы для подстановки в документ используется флаг глобального описка, т.е. без учета номенклатуры-владельца.

Поэтому в обработке XMLЗагрузкаДокументовПоСхеме в функции Единица() необходимо в коде

Если СпрЕдиниц.НайтиПоРеквизиту("ОКЕИ",СпрКлассификаторЕдиниц.ТекущийЭлемент(), 1) = 0 Тогда 

поменять последний аргумент вызова функции с 1 на 0

Если СпрЕдиниц.НайтиПоРеквизиту("ОКЕИ",СпрКлассификаторЕдиниц.ТекущийЭлемент(), 0) = 0 Тогда 

Исправление 2

Если мы хотим выгрузить документ «Заказ поставщику», то при выгрузке мы должны выбрать каталог по которому идентифицировать товары. При этом, если какие-то товары из заказа не сопоставлены с товарами поставщика – то выгрузить документ будет невозможно.

Этот недостаток можно обойти – подобные товары на стороне покупателя можно выгружать с уникальным кодом, при этом у поставщика они будут загружаться как «не идентифицированные», но с названиями покупателя.

Однако, поскольку каталог товаров выгружается отдельно, а документ отдельно – надо чтобы идентификаторы товаров в каждой части выгрузки совпадали, иначе 1С при загрузке документа не сможет сопоставить товары и часть товаров будет с пустым наименованием.

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

Для этого необходимо внести следующие изменения в обработку XMLВыгрузкаДокументовПоСхеме:

Добавить в начало текста модуля хэш-функцию вида

Функция Хэш(СтрокаХэш, hash=0, M = 31, TABLE_SIZE = 18446744073709551616)
   
//TABLE_SIZE = 18446744073709551615; 64 бита
    //M = 31; Умножитель
   
ДлинаСтроки = СтрДлина(СтрокаХэш);
    Для
к=1 по ДлинаСтроки Цикл
       
hash = M * hash + КодСимв(Сред(СтрокаХэш,к,1));
    КонецЦикла;
    Возврат
hash%TABLE_SIZE;
КонецФункции

Конечно, это наивный алгоритм подсчета хэша, но для выбранной задачи его вполне достаточно. Можно использовать и просто наименование, но могут возникнуть проблемы для длинных названий номенклатуры.

В коде функции ПолучитьИдТовараПоКаталогу() заменить строки

Если СпрАналоги.НайтиПоРеквизиту("Каталог", Каталог, 0) = 0 Тогда
    Предупреждение(
"Для товара " + Товар + " не задан аналог!");
    Возврат
"";
Иначе

на

Если СпрАналоги.НайтиПоРеквизиту("Каталог", Каталог, 0) = 0 Тогда
    Сообщить(
"Для товара " + Товар + " не задан аналог!");
    Возврат
Хэш(Товар.Наименование);
Иначе

«Управление торговлей, ред.  10.3»

В этой конфигурации с обменом в формате CommerceML все обстоит гораздо хуже.

Во-первых нельзя просто так загрузить документ от поставщика и при этом сразу сопоставить товары, так как по умолчанию при загрузке документа «Поступление ТМЦ» сделанные соответствия не записываются (для их сохранения в выгрузке должен присутствовать каталог) и при повторной загрузке вновь требуют сопоставления.

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

Исправление 1

Возможность загрузить документ, даже если не все позиции сопоставлены.

В обработке ЗагрузкаДанныхCommerceML → Формы → Форма

процедура «ВыполнитьЧтениеДанных» - закомментировать строку

ЭлементыФормы.КоманднаяПанельНижняя.Кнопки.СохранитьДанные.Доступность = РезультатТестирования;

процедура «ОбработкаОповещения» - закомментировать строку

ЭлементыФормы.КоманднаяПанельНижняя.Кнопки.СохранитьДанные.Доступность = НЕ ПриЗакрытииЕстьНесопоставленные;

Исправление 2

Следующее изменение позволяет не затирать все записи регистра сведений «Номенклатура контрагентов», а для каждой строки (не с точностью до контрагента, а с точностью до ключа контрагент-характеристика-номенклатура) в отдельности происходит перезапись данных.

ЗагрузкаДанныхCommerceML => Модуль объекта, в функции СохранитьКаталог()

Код

НаборЗаписей.Отбор.Контрагент.Установить(ИнформацияДокумента.Контрагент);
Для Каждого
СтрокаТаблицы Из СтрокиДокумента Цикл
   
ЗаписьРегистра = НаборЗаписей.Добавить();
   
ЗаписьРегистра.Контрагент = ИнформацияДокумента.Контрагент;
   
ЗаписьРегистра.Номенклатура = СтрокаТаблицы.Номенклатура;
   
ЗаписьРегистра.ХарактеристикаНоменклатуры =
       
СтрокаТаблицы.ХарактеристикаНоменклатуры;
   
ЗаписьРегистра.КодНоменклатурыКонтрагента = СтрокаТаблицы.Ид;
   
ЗаписьРегистра.НаименованиеНоменклатурыКонтрагента =
        ?(
ПустаяСтрока(СтрокаТаблицы.НаименованиеКраткое),
       
СтрокаТаблицы.Наименование,
       
СтрокаТаблицы.НаименованиеКраткое);
   
ЗаписьРегистра.АртикулНоменклатурыКонтрагента =
       
СтрокаТаблицы.Артикул;
   
ЗаписьРегистра.ШтрихКодНоменклатурыКонтрагента =
       
СтрокаТаблицы.ШтрихКод;
   
ЗаписьРегистра.ЕдиницаНоменклатурыКонтрагента =
       
СтрокаТаблицы.БазоваяЕдиницаИзмерения;
КонецЦикла;
Попытка
   
НаборЗаписей.Записать(ИСТИНА);
Исключение
   
ОписаниеОшибкиЗаписи = ОписаниеОшибки();
   
#Если клиент тогда
   
Сообщить("При записи каталога товаров произошла ошибка: " +
       
Символы.ПС + ОписаниеОшибкиЗаписи, СтатусСообщения.Важное);
   
#КонецЕсли
   
Возврат ЛОЖЬ;
КонецПопытки;

заменить на

Для Каждого СтрокаТаблицы Из СтрокиДокумента Цикл
    Если НЕ
ЗначениеЗаполнено(СтрокаТаблицы.Номенклатура)Тогда
        Продолжить;
    КонецЕсли;
   
НаборЗаписей.Очистить();
   
НаборЗаписей.Отбор.Контрагент.Установить(ИнформацияДокумента.Контрагент);
   
НаборЗаписей.Отбор.Номенклатура.Установить(СтрокаТаблицы.Номенклатура);
   
НаборЗаписей.Отбор.ХарактеристикаНоменклатуры.Установить(
       
СтрокаТаблицы.ХарактеристикаНоменклатуры);
   
ЗаписьРегистра = НаборЗаписей.Добавить();
   
ЗаписьРегистра.Контрагент = ИнформацияДокумента.Контрагент;
   
ЗаписьРегистра.Номенклатура = СтрокаТаблицы.Номенклатура;
   
ЗаписьРегистра.ХарактеристикаНоменклатуры =
       
СтрокаТаблицы.ХарактеристикаНоменклатуры;
   
ЗаписьРегистра.КодНоменклатурыКонтрагента = СтрокаТаблицы.Ид;
   
ЗаписьРегистра.НаименованиеНоменклатурыКонтрагента =
        ?(
ПустаяСтрока(СтрокаТаблицы.НаименованиеКраткое),
       
СтрокаТаблицы.Наименование, СтрокаТаблицы.НаименованиеКраткое);
   
ЗаписьРегистра.АртикулНоменклатурыКонтрагента = СтрокаТаблицы.Артикул;
   
ЗаписьРегистра.ШтрихКодНоменклатурыКонтрагента = СтрокаТаблицы.ШтрихКод;
   
ЗаписьРегистра.ЕдиницаНоменклатурыКонтрагента =
       
СтрокаТаблицы.БазоваяЕдиницаИзмерения;
    Попытка
       
НаборЗаписей.Записать(ИСТИНА);
    Исключение
       
ОписаниеОшибкиЗаписи = ОписаниеОшибки();
       
#Если клиент тогда
       
Сообщить("При записи каталога товаров произошла ошибка: " + Символы.ПС +
           
ОписаниеОшибкиЗаписи, СтатусСообщения.Важное);
       
#КонецЕсли
       
Возврат ЛОЖЬ;
    КонецПопытки;
КонецЦикла;

Между строчками

Для Каждого СтрокаТаблицы Из СтрокиДокумента Цикл
  
Ключ = Строка(СтрокаТаблицы.Номенклатура.УникальныйИдентификатор()) + «…»

вставить

Если НЕ ЗначениеЗаполнено(СтрокаТаблицы.Номенклатура)Тогда
    Продолжить;
КонецЕсли;

Это изменение позволяет записывать не весь каталог.

В функции СохранитьДанные() заменить

Если НЕ ТестированиеДанных(СтрокаСообщенияПользователю) Тогда

на

Если НЕ ТестированиеДанных(СтрокаСообщенияПользователю, Ложь) Тогда

в функции ТестированиеДанных() заменить

Функция ТестированиеДанных(СтрокаСообщенияПользователю) Экспорт

на

Функция ТестированиеДанных(СтрокаСообщенияПользователю, ПроверятьНоменклатуру = Истина) Экспорт

и

ЕстьНеопределенныеТовары = ЕстьНеопределенныеТовары ИЛИ НЕ ЗначениеЗаполнено(СтрокаТаблицы.Номенклатура);

заменить на

Если ПроверятьНоменклатуру Тогда
   
ЕстьНеопределенныеТовары = ЕстьНеопределенныеТовары ИЛИ
        НЕ
ЗначениеЗаполнено(СтрокаТаблицы.Номенклатура);
КонецЕсли;

и в тексте

ЕстьНеопределенныеЕдиницы = ЕстьНеопределенныеЕдиницы ИЛИ
   
ЗначениеНеОпределено(СтрокаТаблицы.БазоваяЕдиницаИзмерения);
ЕстьНеопределенныеТовары = ЕстьНеопределенныеТовары ИЛИ
    НЕ
ЗначениеЗаполнено(СтрокаТаблицы.Номенклатура);
ЕстьНеопределенныеКачестваТовара = ЕстьНеопределенныеКачестваТовара ИЛИ
   
ЗначениеНеПустаяСтрока(СтрокаТаблицы.Качество);

Закомментировать вторую строку

ЕстьНеопределенныеЕдиницы = ЕстьНеопределенныеЕдиницы ИЛИ
   
ЗначениеНеОпределено(СтрокаТаблицы.БазоваяЕдиницаИзмерения);
// ЕстьНеопределенныеТовары = ЕстьНеопределенныеТовары ИЛИ НЕ ЗначениеЗаполнено(СтрокаТаблицы.Номенклатура);
ЕстьНеопределенныеКачестваТовара = ЕстьНеопределенныеКачестваТовара ИЛИ
   
ЗначениеНеПустаяСтрока(СтрокаТаблицы.Качество);

Этими изменениями мы отключили проверку на несопоставленную номенклатуру и добавили возможность загружать документ с такой номенклатурой. В этом случае у нас заполнятся все колонки (сумма, количество и т.п.), кроме колонок «Номенклатура», «Характеристика номенклатуры», «Единица» и т.п. 

Форматы обмена CommerceML, взаимодействие 7.7 и 8.x

Если для взаимодействия двух 1С версий 7.7 никаких преобразований не требуется, то, в версии 8.x используется другая версия формата CommerceML, которая не совместима с предыдущей.

Поскольку оба формата являются подмножествами XML, то для преобразования между ними можно использовать преобразования XSLT.

Реализация 7.7 => Поступление 8.x

Выгруженная реализация выглядит следующим образом (указаны только основные поля):

  • Корневой XML-элемент – «КоммерческаяИнформация»
    В нее входят:
  • Каталог
    • Атрибут «Идентификатор» – идентификатор каталога из 1С
    • Атрибут «Наименование» – наименование каталога из 1С
    • Атрибут «Владелец» – идентификатор фирмы-владельца каталога
    • Атрибут «Единица» - единица для товаров каталога по умолчанию
    • Список групп – элементы «Группа»
      • Атрибут «Идентификатор» – собственный формат идентификатора (вида «ID__B___0___0___84___0___0___________24_____») для группы (вручную не задается – внутреннее представление 1С, не требует вмешательства)
      • Атрибут «ИдентификаторВКаталоге» - код группы в справочнике «Номенклатура»
      • Атрибут «Наименование» - наименование в справочнике 1С
      • Атрибут «Родитель» - идентификатор родительской группы в формате идентификатора группы (вида «ID__B___0___0___84___0___0___________24_____»)
  • Список товаров – элементы «Товар»
    • Атрибут «Идентификатор» – собственный формат идентификатора (вида «ID__B___0___0___84___0___0___________24_____») для товара
    • Атрибут «ИдентификаторВКаталоге» - код товара в справочнике «Номенклатура»
    • Атрибут «Наименование» - наименование в справочнике 1С
    • Атрибут «Родитель» - идентификатор родительской группы в формате идентификатора группы (вида «ID__B___0___0___84___0___0___________24_____»)
    • Атрибут «Единица» - краткое наименование единицы измерения товара
    • Документ - элемент
      • Атрибут «Дата» - дата документа вида "2012-12-21"
      • Атрибут «Номер» - номер документа
      • Атрибут «Время» - время документа вида «ЧЧ:ММ:СС»
      • Атрибут «Комментарий» - комментарий документа
      • Атрибут «ХозОпреация» - для реализации – «Sale»
      • Атрибут «Сумма» - сумма документа
      • Атрибут «Валюта» - краткое наименование валюты
      • Атрибут «Курс» - курс валюты документа
      • Атрибут «Кратность» - кратность валюты документа
      • Атрибут «СрокПлатежа» - значение реквизита документа «Оплата до» вида "2012-12-21"
      • Элемент «ПредприятиеВДокументе»
        • Атрибут «Контрагент» -идентификатор фирмы-продавца или контрагента-покупателя в 1С. Контрагент с таким идентификатором должен присутствовать в разделе «Контрагенты»
        • Атрибут «Роль» – Saler - продацец или Buyer – покупатель
  • Элемент «СуммаНалога», для НДС имеет вид (в данном примере ставка равна 0, так как это сумма НДС по документу): <СуммаНалога "AVT" Ставка="0" Сумма="3430.27" ВключенВСумму="1"/>
  • Элементы «ТоварнаяПозиция»
    • Атрибут «Каталог» - Идентификатор каталога
    • Атрибут «Товар» - код товара в справочнике номенклатура
    • Атрибут «Единица» - краткое наименование единицы измерения товара
    • Атрибут «Количество» - количество
    • Атрибут «Цена» - цена
    • Атрибут «Сумма» - сумма
    • Атрибут «Описание» - комментарий коменклатуры
    • Элемент «Сумма налога» вида <СуммаНалога "AVT" Ставка="18" Сумма="60.12" ВключенВСумму="1"/>
  • Элемент «Контрагент»
    • Атрибут «Идентификатор» - идентификатор фирмы/контрагента в 1С
    • Атрибут «Наименование» - официальное наименование в 1С
    • Атрибут «ОтображаемоеНаименование» - краткое наименование в 1С
    • Атрибут «Адрес» - адрес

Для того, чтобы этот документ загрузить в 1С 8.x необходимо преобразовать его к виду:

  • Корневой элемент «КоммерческаяИнформация»
  • Вложенный элемент «Документ»
    • Элемент «Номер» - копия атрибута «Номер» из не преобразованного файла
    • Элемент «Дата» - копия атрибута «Номер» из не преобразованного файла
    • Элемент «ХозОперация» - «Отпуск товара» для поступления
    • Элемент «Роль» - «Продавец»
    • Элемент «Валюта» - валюта документа (без точки – различные классификаторы валют в разных версиях 1С)
    • Элемент «Сумма» - сумма документа
    • Элемент «СрокПлатежа»
    • Элемент «Контрагенты»
      • Элемент – «Контрагент»
        • Элемент «Ид» - не используется, но должен быть уникальным. В приведенном примере копируется идентификатор контрагента из 7-ки.
        • Элемент «Наименование» - наименование контрагента
        • Элементы «ИНН» и «КПП» - по ним будет производится поиск контрагента
        • Элемент «Роль» - «Продавец» или «Покупатель»
  • Элемент «Время» - время документа
  • Элемент «Налоги»
  • Элемент «Товары» - табличная часть документа
    • Элементы «Товар»
      • Элемент «Ид» - код номенклатуры контрагента по регистру сведений. По нему идет поиск.
      • Элемент «ИдКлассификатора» - идентификатор классификатора товаров
      • Элемент «Наименование» - наименование товара
      • Элемент «БазоваяЕдиница» - краткое наименование базовой единицы измерения
      • Элемент «Группы»
        • Элемент «Ид» - идентификатор группы-родителя (по классификатору, в примере – код в 7-ке)
        • Элемент «ЦенаЗаЕдиницу»
        • Элемент «Количество»
        • Элемент «Сумма»
        • Элемент «Единица»
        • Элемент «Коэффициент»
        • Элемент «Налоги»
        • Элемент «Ставки налогов»
        • Элемент «ЗначениеРеквизитов»
        • Элемент «Комментарий»
  • Вложенный элемент «Классификатор» - это иерархия номенклатуры
    • Элемент «Ид» - идентификатор классификатора
    • Элемент «Наименование» - наименование классификатора
    • Элемент «Владелец»
      • Элемент «Ид» - идентификатор владельца классификатора – копируем из выгрузки 7-ки
      • Элемент «Наименование»
      • Элементы «ИНН» и «КПП»
  • Элемент «Группы»
    • Элемент «Группа»
      • Элемент «Ид» - код группы в справочнике номенклатуры 1С 7.7
      • Элемент «Наименование»
      • Элемент «Группы» - вложенные группы, аналогично элементу «Группы»
      • Вложенный элемент «Каталог» - это еще одна часть выгрузки – именно при сопоставлении каталога задаются соответствия между номенклатурой поставщика и собственной номенклатурой.
        • Элемент «Ид» - идентификатор каталога (берем из выгрузки из 1С 7.7)
        • Элемент «ИдКлассификатора» - идентификатор классификатора
        • Элемент «Владелец» - аналогично классификатору
        • Элемент «Товары»
          • Элемент «Товар»
            • Элемент «Ид» - код товара в базе 1С 7.7
            • Элемент «ИдКлассификатора» » - идентификатор классификатора
            • Элемент «Наименование»
            • Элемент «БазоваяЕдиница»
            • Элемент «Группы»
              • Элемент «Ид» - код группы-родителя в базе 1С 7.7
              • Элемент «СтавкиНалогов»
              • Элемент «ЗначенияРеквизитов»

Обратное преобразование в значительной части копирует преобразование из 7.7 в 8.x с точностью до наоборот. Единственное важное отличие – как определить на стороне поставщика по «Ид» товара – сопоставлен ли он на стороне покупателя и чей код числится в графе «Ид»? При выгрузке из УТ 10.3 для товаров, которые сопоставлены по регистру сведений «Номенклатура контрагентов» у товаров внутри элемента «Документ» идентификаторы будут начинаться со знака «*».

Для преобразования можно использовать любые процессоры XSLT, поддерживающие спецификацию 1.0, например xalan (Java) или Microsoft XSL Processor.

К статье прикреплены файлы для преобразования «Реализации» из 7.7 в «Поступление» в 8.x – Sale77to8x.xslt и «Заказа поставщику» из 8.x в «заявку покупателя» 7.7 – Order8xto77.xslt.

В файле Sale77to8x.xslt задаются 5 переменных, которые нужны для загрузки в 1С 8.x и которые отсутствуют в спецификации выгрузки из версии 7.7:

  • client_inn − ИНН покупателя
  • client_kpp − КПП покупателя
  • firm_inn − ИНН поставщика
  • firm_kpp − КПП поставщика
  • firm_vat − НДС в сумме - 1 или сверху – 0

В файле Order8xto77.xslt задаются следующие переменные, которые нужны для загрузки в 1С 7.7 и которые отсутствуют в спецификации выгрузки из версии 8.x:

  • supplier_GUID  – идентификатор поставщика
  • catalog_GUID  – идентификатор каталога поставщика

Я для преобразования использовал небольшую программу-переходник, написанную на C#, привожу пример кода по преобразованию XSLT. На вход преобразованию можно передавать параметры из кода, тогда в файлах XSLT надо поменять переменныена параметры.

Пример использования XSLT на языке C#

//Создаем объект для преобразования XML
var transform = new XslCompiledTransform();
//Загружаем правила из файла
transform.Load("имя файла преобразования");
//Заполняем список параметров для файла преобразования
var transformParams = new XsltArgumentList();
transformParams.AddParam("Параметр", "", "Значение параметра");
//Создаем класс-writer для записи результата в файл
var writer = XmlWriter.Create("имя выходного файла", xml_writer_settings);
//Задаем параметры для объекта, который будет осуществлять запись в XML
var xml_writer_settings = new XmlWriterSettings(){
    Encoding = Encoding.UTF8, //кодировка UTF-8
    Indent = true,              //отступы делать и делать их табуляцией
    IndentChars = "\t"
};
//Собственно преобразовываем
transform.Transform("имя выходного файла", transformParams, writer);
writer.Close();

Дополнительная информация

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

Наименование Файл Версия Размер
Файлы преобразования 42
.zip 3,67Kb
20.12.12
42
.zip 3,67Kb Скачать
Примеры выгрузок 24
.zip 10,98Kb
20.12.12
24
.zip 10,98Kb Скачать
Примеры преобразованных выгрузок 14
.zip 10,18Kb
20.12.12
14
.zip 10,18Kb Скачать

См. также

Подписаться Добавить вознаграждение
Комментарии
1. potap potap (potap@f58.ru) 25.06.15 10:37
2. ивасько богдан (zaliznyj) 26.10.15 01:45
Супер очень благодарен за подсказку переделал свою конфигурацию работает отлично