Для кого предназначена данная статья
Данная статья посвящена обмену документами в формате CommerceML по схеме поставщик-покупатель между конфигурациями «Торговля + склад, редакция 9.2» 1С 7.7 (далее ТиС) и «Управление торговлей, редакция 10.3» 1С 8.х (далее УТ 10.3).
Рассматривается выгрузка документов «Реализация ТМЦ», «Заказ поставщику» и, соответственно загрузка документов «Поступление ТМЦ» и «Заявка покупателя», сопоставление собственной номенклатуры – номенклатуре поставщиков на стороне покупателей и преобразование между форматами различных версий.
Материал также будет интересен для тех, кто пытался настроить обмен не только между разными версиями 1С, но и в рамках одинаковых версий.
Сразу оговорюсь про некоторые границы статьи и темы, которые она затрагивает:
- Приведенная информация не касается конфигурации «Управление торговлей, версия 11» – обмен данными в формате CommerceML в ней на момент написания статьи (декабрь 2012 года) отсутствует
- Не рассматривается продажа в валюте, отличной от российского рубля
- Не рассматривается ситуация пересчета коэффициентов номенклатуры, т.е. считается, что товары у поставщика и покупателя измеряются в одинаковых единицах
- При установке соответствия между номенклатурой поставщика и собственной – следует задавать только взаимно-однозначное соответствие. Т.е. если поставщик разделяет товары «USB-Flash диск 4Gb, зеленый» и «USB-Flash диск 4Gb, красный» − то и на стороне покупателя это тоже должны быть разные товары (ТиС 9.2) или разные пары товар-характеристика (для УТ 10.3 если ведется учет по характеристикам)
- Не рассматривается правильная загрузка реквизитов документа, связанных с налоговым учетом, а именно флагов «Учитывать НДС», «НДС в сумме». В стандартных обработках загрузки они устанавливаются автоматически в 1, при этом их значение в загружаемых файлах игнорируется
- В обработках отсутствует выгрузка и загрузка информации о государственных таможенных декларациях, странах происхождения и т.п.
- Все исправления вносимые в конфигурацию являются необходимыми для корректного обмена, но, возможно, недостаточными для правильной работы всех возможностей обработок. Например, обработка загрузки в «УТ 10.3» при создании номенклатуры некорректно воссоздает иерархию источника
- В рамках данной статьи рассматривается только обмен товарами в следующих вариантах:
- Реализация (поставщика) становится поступлением (у покупателя) для
- ТиС => ТиС
- ТиС => УТ
- Заказ поставщику (покупателя) становится заявкой (у поставщика)
- ТиС => ТиС
- УТ => ТиС
- Не рассматривается обмен между двумя конфигурациями УТ
Формат обмена «Поставщик»-«Покупатель». Как это работает.
В конфигурациях ТиС 9.2 и УТ 10.3 существует возможность обмениваться документами между поставщиком и покупателем, а именно автоматизировать процесс заказа и внесения поступлений товара в программу.
Сопоставление номенклатуры осуществляется на стороне покупателя на этапе загрузки документов от поставщика. Пример того, как это работает, показан далее.
Версия 7.77.7 от поставщика к покупателю
Подготовительная работа
Для загрузки-выгрузки нам понадобятся – на каждой стороне:
- 1С 7.7 конфигурация «Торговля и склад, редакция 9.2»
- Внешняя компонента V7Plus для работы с форматом XML
- Одинаковые краткие наименования единиц измерения в справочнике «ОКЕИ» с обоих сторон
Также для обмена нам понадобится первоначальная настройка со стороны как поставщика так и покупателя.
Поставщик
У основной фирмы должен быть задан идентификатор – на вкладке «Прочие».
Необходимо также завести элемент справочника «Каталоги номенклатуры», указать владельца – основную фирму, от имени которой будут производиться продажи.
Покупатель
На стороне покупателя также необходимо создать элемент справочника «Каталоги номенклатуры» с тем же идентификатором, но с владельцем каталога равным контрагенту – поставщику. Идентификаторы каталогов должны совпадать.
Также необходимо у контрагента-поставщика задать такой же идентификатор, как у фирмы продавца в базе поставщика.
Выгрузка
Выгрузка документа «Реализация» происходит очень просто – достаточно нажать в форме документа на кнопку «Действия» и выбрать «Выгрузить (отправить по электронной почте)».
Загрузка
Рассмотрим загрузку поступления товара у клиента на типовой конфигурации «Торговля + Склад» 7.70.970.
Для загрузки документа выберем меню «Сервис» - «Обмен данными в формате CommerceML» - «Просмотр и загрузка документа». Выберем файл, выгруженный поставщиком.
Сопоставление номенклатуры
Следующий этап – сопоставление номенклатуры.
Для этого выбираем «Просмотр каталога товаров».
На вкладке Фильтры выберем «Только не идентифицированные».
Затем отключим иерархию и перейдем на закладку «Основная».
- Колонка «Ид.» - код товара в базе поставщика
- Колонка «Наименование» - наименование товара в базе поставщика
Для сопоставление товара делаем двойной клик на строке.
Есть 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();
Дополнительная информация
- Стандарты электронного обмена коммерческой информацией CommerceML
- Обмен коммерческой информацией по стандарту CommerceML, первая редакция
- Электронный обмен данными по стандарту CommerceML, вторая редакция
- Язык преобразования XSLT (wiki)
- XSLT в примерах
- Описание стандартов XSLT (англ)