Задание:

Сделать выгрузку в битрикс стандартными файлами offers.xml и import.xml из измененной до неузнаваемости УТ 11.2.

Изменения:

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

Вся эта информация содержится в регистре сведений. Цены и остатки как ресурсы.

Разработка:

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

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

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

Вот структура:

Вот так выглядят записи:

И как это можно выгрузить???

Программисты битрикс не хотели сделать свою структуру xml чтобы ее использовать для загрузки.

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

Я тут опишу создание import.xml, offers.xml делается также.

1 Получаем структуру папок с иерархией запросом и выгружаем в дерево

 
&НаСервере
функция получитьДеревоКаталога()
	// получаем дерево через запрос
Запрос = Новый Запрос;
Запрос.Текст = "
|ВЫБРАТЬ
|    Номенклатура.Ссылка КАК ГруппаНоменклатуры
|ИЗ
|    Справочник.Номенклатура КАК Номенклатура
|ГДЕ
|    НЕ Номенклатура.ЭтоГруппа
|УПОРЯДОЧИТЬ ПО
|    Номенклатура.ЭтоГруппа,
|    Ссылка
|ИТОГИ ПО
|    Ссылка ИЕРАРХИЯ
|АВТОУПОРЯДОЧИВАНИЕ";

Дерево=Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
возврат дерево;
// обходим дерево

конецФункции

Создаем xml и пишем наше дерево туда.

В offers.xml вначале описываем папки, а потом уже товары

2 Создаем xml

 
ЗаписьXML = Новый ЗаписьXML;
    //ЗаписьXML.ОткрытьФайл(ПутьКФайлуДляЗаписи);
	ЗаписьXML.ОткрытьФайл("d:\xmlBitrix.xml");
    ЗаписьXML.ЗаписатьОбъявлениеXML();    
// а тут пишем всю структуру xml

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

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

 
процедура выгрузкаКаталогов2()
	ЗаписьXML = Новый ЗаписьXML;
    //ЗаписьXML.ОткрытьФайл(ПутьКФайлуДляЗаписи);
	ЗаписьXML.ОткрытьФайл("d:\xmlBitrix.xml");
    ЗаписьXML.ЗаписатьОбъявлениеXML();    
	
	//шапка
	ЗаписьXML.ЗаписатьНачалоЭлемента("КоммерческаяИнформация"); 
	ЗаписьXML.ЗаписатьАтрибут("ВерсияСхемы", "2.05");
	ЗаписьXML.ЗаписатьАтрибут("ДатаФормирования", формат(ТекущаяДата(),"ДФ=yyyy-MM-ddTHH:mm:00"));
	ЗаписьXML.ЗаписатьНачалоЭлемента("Классификатор"); // классификатор
	ЗаписьXML.ЗаписатьНачалоЭлемента("Ид"); // ид классификатора
	ЗаписьXML.ЗаписатьТекст("0000000001");
	ЗаписьXML.ЗаписатьКонецЭлемента(); // ид классификатора
	ЗаписьXML.ЗаписатьНачалоЭлемента("Наименование"); // наименование классификатора
	ЗаписьXML.ЗаписатьТекст("Классификатор (Основной каталог товаров)"); // название классификатора
	ЗаписьXML.ЗаписатьКонецЭлемента(); // наименование классификатора
	//владелец
	ЗаписьXML.ЗаписатьНачалоЭлемента("Владелец"); // Владелец
	
	ЗаписьXML.ЗаписатьНачалоЭлемента("Ид"); // ид владелец
	ЗаписьXML.ЗаписатьТекст("0000000002"); // ид владельца
	ЗаписьXML.ЗаписатьКонецЭлемента(); // ид владелец
	
	ЗаписьXML.ЗаписатьНачалоЭлемента("Наименование"); // наименование владелец
	ЗаписьXML.ЗаписатьТекст("Организация"); // наименование владельца
	ЗаписьXML.ЗаписатьКонецЭлемента(); // наименование владелец
	
	//офиц наименование
	ЗаписьXML.ЗаписатьНачалоЭлемента("ОфициальноеНаименование");
	ЗаписьXML.ЗаписатьТекст("Организация");
	ЗаписьXML.ЗаписатьКонецЭлемента(); 
	//инн
	ЗаписьXML.ЗаписатьНачалоЭлемента("ИНН");
	//ЗаписьXML.ЗаписатьТекст("Организация");
	ЗаписьXML.ЗаписатьКонецЭлемента(); 
	//КПП
	ЗаписьXML.ЗаписатьНачалоЭлемента("КПП");
	//ЗаписьXML.ЗаписатьТекст("Организация");
	ЗаписьXML.ЗаписатьКонецЭлемента(); 
	
	//Расчетные счета
	ЗаписьXML.ЗаписатьНачалоЭлемента("РасчетныеСчета");
	// расчетный счет здесь указать если потребуется
	
	ЗаписьXML.ЗаписатьКонецЭлемента(); // конец расчетныеСчета
	//конец расчетные счета
	
	
	ЗаписьXML.ЗаписатьКонецЭлемента(); // Владелец
    // конец владелец
	
	//ЗаписьXML.ЗаписатьКонецЭлемента(); // Владелец
	
	//группы
    ЗаписьXML.ЗаписатьНачалоЭлемента("Группы");
	
	// получаем дерево каталога
	дерево=получитьДеревоКаталога();
	// обходим дерево
	Для Каждого Стр из дерево.строки Цикл
	//	сообщить(стр.ГруппаНоменклатуры);
	//	сообщить(строка(стр.ГруппаНоменклатуры.УникальныйИдентификатор()));
		// xml группа
		ЗаписьXML.ЗаписатьНачалоЭлемента("Группа");
		          ЗаписьXML.ЗаписатьНачалоЭлемента("Ид");
				  ЗаписьXML.ЗаписатьТекст(строка(стр.ГруппаНоменклатуры.УникальныйИдентификатор()));
				  ЗаписьXML.ЗаписатьКонецЭлемента(); // Ид
				  
				  ЗаписьXML.ЗаписатьНачалоЭлемента("Наименование");
				  ЗаписьXML.ЗаписатьТекст(строка(стр.ГруппаНоменклатуры));
				  ЗаписьXML.ЗаписатьКонецЭлемента(); // Наименование
	
		
    ОбойтиДеревоЗначений(Стр,ЗаписьXML); // обход всех элементов в группе
		ЗаписьXML.ЗаписатьКонецЭлемента(); // Группа
		// конец xml группа
КонецЦикла;

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

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

//*******************************************************товар*********************************************
//!!!!!!!!!!!!!!!!! пишем товар
массивТоваров=получитьСписокТоваровИСвойства();
ЗаписьXML.ЗаписатьНачалоЭлемента("Каталог"); 
ЗаписьXML.ЗаписатьАтрибут("СодержитТолькоИзменения", "false");
// ид
ЗаписьXML.ЗаписатьНачалоЭлемента("Ид"); // ид
ЗаписьXML.ЗаписатьТекст("0000000001");
ЗаписьXML.ЗаписатьКонецЭлемента(); // ид 
// идКлассификатора
ЗаписьXML.ЗаписатьНачалоЭлемента("ИдКлассификатора"); // ид
ЗаписьXML.ЗаписатьТекст("0000000001");
ЗаписьXML.ЗаписатьКонецЭлемента(); // ид 
// Наименование
ЗаписьXML.ЗаписатьНачалоЭлемента("Наименование"); // наименование
ЗаписьXML.ЗаписатьТекст("Основной каталог товаров");
ЗаписьXML.ЗаписатьКонецЭлемента(); // наименование
//владелец
	ЗаписьXML.ЗаписатьНачалоЭлемента("Владелец"); // Владелец
	
	ЗаписьXML.ЗаписатьНачалоЭлемента("Ид"); // ид владелец
	ЗаписьXML.ЗаписатьТекст("0000000002"); // ид владельца
	ЗаписьXML.ЗаписатьКонецЭлемента(); // ид владелец
	
	ЗаписьXML.ЗаписатьНачалоЭлемента("Наименование"); // наименование владелец
	ЗаписьXML.ЗаписатьТекст("Организация"); // наименование владельца
	ЗаписьXML.ЗаписатьКонецЭлемента(); // наименование владелец
	
	//офиц наименование
	ЗаписьXML.ЗаписатьНачалоЭлемента("ОфициальноеНаименование");
	ЗаписьXML.ЗаписатьТекст("Организация");
	ЗаписьXML.ЗаписатьКонецЭлемента(); 
	//инн
	ЗаписьXML.ЗаписатьНачалоЭлемента("ИНН");
	//ЗаписьXML.ЗаписатьТекст("Организация");
	ЗаписьXML.ЗаписатьКонецЭлемента(); 
	//КПП
	ЗаписьXML.ЗаписатьНачалоЭлемента("КПП");
	//ЗаписьXML.ЗаписатьТекст("Организация");
	ЗаписьXML.ЗаписатьКонецЭлемента(); 
	
	//Расчетные счета
	ЗаписьXML.ЗаписатьНачалоЭлемента("РасчетныеСчета");
	// расчетный счет здесь указать если потребуется
	
	ЗаписьXML.ЗаписатьКонецЭлемента(); // конец расчетныеСчета
	//конец расчетные счета
	
	ЗаписьXML.ЗаписатьКонецЭлемента(); // Владелец
    // конец владелец

	//***************************товары***************************
	ЗаписьXML.ЗаписатьНачалоЭлемента("Товары"); 
	для индекс=0 по массивТоваров.количество()-1 цикл	
		товар=массивТоваров[индекс];
	// товар
	ЗаписьXML.ЗаписатьНачалоЭлемента("Товар"); // 
	// ид
	ЗаписьXML.ЗаписатьНачалоЭлемента("Ид"); // 
	ЗаписьXML.ЗаписатьТекст(строка(Товар.ссылка.УникальныйИдентификатор())); // 
	ЗаписьXML.ЗаписатьКонецЭлемента(); // ид
    // наименование
	ЗаписьXML.ЗаписатьНачалоЭлемента("Наименование"); // 
	ЗаписьXML.ЗаписатьТекст(строка(Товар.наименование)); // 
	ЗаписьXML.ЗаписатьКонецЭлемента(); // наименование
	// БазоваяЕдиница
	ЗаписьXML.ЗаписатьНачалоЭлемента("БазоваяЕдиница"); // 
	ЗаписьXML.ЗаписатьАтрибут("Код", строка(товар.ЕдиницаИзмерения.код));
	ЗаписьXML.ЗаписатьАтрибут("НаименованиеПолное", строка(товар.ЕдиницаИзмерения.НаименованиеПолное));
	ЗаписьXML.ЗаписатьАтрибут("МеждународноеСокращение", строка(товар.ЕдиницаИзмерения.МеждународноеСокращение));
	ЗаписьXML.ЗаписатьТекст(строка(товар.ЕдиницаИзмерения.Наименование)); // 
	ЗаписьXML.ЗаписатьКонецЭлемента(); // БазоваяЕдиница
	//Группы
	ЗаписьXML.ЗаписатьНачалоЭлемента("Группы"); // 
	ЗаписьXML.ЗаписатьНачалоЭлемента("Ид"); // 
	ЗаписьXML.ЗаписатьТекст(строка(Товар.родитель.УникальныйИдентификатор())); // 
	ЗаписьXML.ЗаписатьКонецЭлемента(); // Ид
	ЗаписьXML.ЗаписатьКонецЭлемента(); // группы
	//конец группы
	
	// ставки налогов
	ЗаписьXML.ЗаписатьНачалоЭлемента("СтавкиНалогов"); // 
	ЗаписьXML.ЗаписатьНачалоЭлемента("СтавкаНалога"); // 
	ЗаписьXML.ЗаписатьНачалоЭлемента("Наименование"); // 
	ЗаписьXML.ЗаписатьТекст("НДС"); // 
	ЗаписьXML.ЗаписатьКонецЭлемента(); // наименование
	ЗаписьXML.ЗаписатьНачалоЭлемента("Значение"); // 
	ЗаписьXML.ЗаписатьТекст(СтрЗаменить(строка(товар.СтавкаНДС),"%","")); // 
	ЗаписьXML.ЗаписатьКонецЭлемента(); // значение
	ЗаписьXML.ЗаписатьКонецЭлемента(); // ставка налога 
	ЗаписьXML.ЗаписатьКонецЭлемента(); // ставки налогов 
	// конец ставки налогов
	
	// значения реквизитов
	ЗаписьXML.ЗаписатьНачалоЭлемента("ЗначенияРеквизитов"); // 
	
	//****************значение реквизита**************************
	ЗаписьXML.ЗаписатьНачалоЭлемента("ЗначениеРеквизита"); // 
	// наименование
	ЗаписьXML.ЗаписатьНачалоЭлемента("Наименование"); // 
	ЗаписьXML.ЗаписатьТекст("ВидНоменклатуры"); // 
	ЗаписьXML.ЗаписатьКонецЭлемента(); // наименование
	// значение
	ЗаписьXML.ЗаписатьНачалоЭлемента("Значение"); // 
	ЗаписьXML.ЗаписатьТекст(строка(товар.ВидНоменклатуры)); // 
	ЗаписьXML.ЗаписатьКонецЭлемента(); // значение
	
	ЗаписьXML.ЗаписатьКонецЭлемента(); // Значение реквизита
	//******************конец значение реквизита*******************
	
	//****************значение реквизита**************************
	ЗаписьXML.ЗаписатьНачалоЭлемента("ЗначениеРеквизита"); // 
	// наименование
	ЗаписьXML.ЗаписатьНачалоЭлемента("Наименование"); // 
	ЗаписьXML.ЗаписатьТекст("ТипНоменклатуры"); // 
	ЗаписьXML.ЗаписатьКонецЭлемента(); // наименование
	// значение
	ЗаписьXML.ЗаписатьНачалоЭлемента("Значение"); // 
	ЗаписьXML.ЗаписатьТекст(строка(товар.ТипНоменклатуры)); // 
	ЗаписьXML.ЗаписатьКонецЭлемента(); // значение
	
	ЗаписьXML.ЗаписатьКонецЭлемента(); // Значение реквизита
	//******************конец значение реквизита*******************

	//****************значение реквизита**************************
	ЗаписьXML.ЗаписатьНачалоЭлемента("ЗначениеРеквизита"); // 
	// наименование
	ЗаписьXML.ЗаписатьНачалоЭлемента("Наименование"); // 
	ЗаписьXML.ЗаписатьТекст("ПолноеНаименование"); // 
	ЗаписьXML.ЗаписатьКонецЭлемента(); // наименование
	// значение
	ЗаписьXML.ЗаписатьНачалоЭлемента("Значение"); // 
	ЗаписьXML.ЗаписатьТекст(строка(товар.Наименование)); // 
	ЗаписьXML.ЗаписатьКонецЭлемента(); // значение
	
	ЗаписьXML.ЗаписатьКонецЭлемента(); // Значение реквизита
	//******************конец значение реквизита*******************
	
	
	ЗаписьXML.ЗаписатьКонецЭлемента(); // Значения реквизитов
	// конец значения реквизитов
	
	ЗаписьXML.ЗаписатьКонецЭлемента(); // товар
	// конец товар
	конецЦикла;
	
	
	ЗаписьXML.ЗаписатьКонецЭлемента(); // товары	
	//***************************конец товары*********************
ЗаписьXML.ЗаписатьКонецЭлемента();// каталог
// конец пишем товар
//********************************************конец товар*************************************************

ЗаписьXML.ЗаписатьКонецЭлемента(); // Коммерческая информация

ЗаписьXML.Закрыть();
	
конецПроцедуры

&НаСервере
функция получитьСписокТоваровИСвойства()   // для выгрузки товаров
	Запрос = Новый Запрос();
	// убрать первые 50 !!!!!!!!!!!!!!!!!!!!!!!!!!!!
Запрос.Текст = "ВЫБРАТЬ
               |	Номенклатура.Ссылка,
               |	Номенклатура.Родитель,
               |	Номенклатура.ЕдиницаИзмерения,
               |	Номенклатура.СтавкаНДС,
               |	Номенклатура.ТипНоменклатуры,
               |	Номенклатура.ВидНоменклатуры,
               |	Номенклатура.Наименование
               |ИЗ
               |	Справочник.Номенклатура КАК Номенклатура
               |ГДЕ
               |	Номенклатура.ЭтоГруппа = ЛОЖЬ";
ТоварыИСвойства = ПреобразоватьТаблицуЗначенийВМассив(Запрос.Выполнить().Выгрузить());
возврат ТоварыИСвойства;
конецФункции


В результате выполнения обработки получаем нужный файл import.xml

так описываются каталоги

а вот так товары

Цены и характеристики (т.е. на языке битрикса "торговые предложения") делаем в файле offers.xlm. Делается он по аналогии.

Дальше думаю понятно. Если у Вас подобная задача и не удалось ее сделать, обращайтесь :)

Я бы конечно посоветовал выгружать в свой формат xml, txt или excell.

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

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






Удаленный программист 1С к вашим услугам:

логотип ООО Партнер

телефон программиста 1С 8(495)005-62-29

 skype: live:di-sem

Связь с программистом 1с через телеграм @programmist_1C

Заявка программисту 1С Отправить заявку