Задача:

Конфигурация 1с УНФ 1.6.13(для 1с УТ эта обработка тоже подойдет) Загрузить данные с сайта в 1С. 150'000 товаров. Если грузить напрямую то данные в 1с импортируются "криво", все уходит в дополнительные сведения "кучей".

Предварительная оценка:

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

Загружать буду своей обработкой.

Конфигурацию менять нельзя.

Картинки к товарам нужно закачивать в 1с по ссылке. Одну из картинок нужно назначать основной.

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

Если значения доп реквизитов "Дополнительное значение", т.е. значения которые выбираются из списка, то список будем создавать по мере загрузки товаров. Если значение в списке есть, то подставляем в доп реквизит, если значения нет, создаем значение доп. реквизита и подставляем его.

Решение:

Выгрузка csv вначале тоже была некорректной. Внутри полей встречались разделители и переносы строк. Это приводило к неправильному преобразованию в поля. Пришлось переделывать выгрузку. Для Excell она бы подошла, а вот 1с читает этот файл построчно и разбивает на поля по указанному разделителю.

Приведем выгрузку к понятному 1с виду.

Выгрузка до

1с выгрузка из csv

После обработки:

Процедура, которая привела выгрузку к нормальному виду. Выкладываю как есть. Разделитель "^" выбран т.к. он во всем тексте ни разу не встречался.

// приводим файл выгрузки в порядок
&НаКлиенте
Процедура УбратьЛишниеПереносы(Команда)
	Источник=новый ТекстовыйДокумент;
  Источник.Прочитать("d:\items_new2.csv"); // ИмяФайла - путь к файлу на диске Победа

// Определяем количество колонок по шапке таблицы, для этого исползуем
// стандартную процедуру РазложитьСтрокуВМассивПодстрок
КоличествоКолонок=СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(Источник.ПолучитьСтроку(1), ";").Количество();

// убираем лишние переносы и сохраняем в файл
ПривестиКНужномуФормату(Источник.ПолучитьТекст(),";", КоличествоКолонок);
возврат;


// Читаем данные файла, шапку можно отсечь потом
МассивКол = ПрочитатьCSV(Источник.ПолучитьТекст(),";", КоличествоКолонок);



Для каждого Товар из МассивКол Цикл

//переменная МассивКол содержит массив строк таблицы из файла CSV.
//Каждый элемент массива в свою очередь представляет массив колонок.
// В этом цикле можно сделать все необходимое с полученными данными.

КонецЦикла;

КонецПроцедуры


# область ОтформатироватьВыгрузку
&наКлиенте
Функция ПрочитатьCSV(Знач Строка, Разделитель, КоличествоКолонок)

Результат = Новый Массив; // массив строк

Скобка=ЛОЖЬ;
Начало=1;
Колонка=0;
СтрокаФайла=новый Массив; // массив колонок в строке

для Позиция=1 по СтрДлина(Строка) Цикл // обходим файл посимвольно

Символ=Сред(Строка, Позиция, 1);

//если встречается кавычка, фиксируем ее открытие, прекращаем итерацию и продолжаем цикл.
Если Символ="""" И Скобка=Ложь Тогда
Скобка=Истина;
Продолжить;
//Если встречается закрывающаяся кавычка, фиксируем ее закрытие и тоже продолжаем цикл
ИначеЕсли Символ="""" И Скобка=Истина ТОгда
Скобка=Ложь;
Продолжить;
КонецЕсли;

//Если встречается разделитель или перенос строки вне кавычек,
//вносим информацию в массив
Если (Символ=Разделитель ИЛИ Символ=Символы.ПС) И Скобка=Ложь Тогда
Конец=Позиция;
Колонка=Колонка+1;
СтрокаФайла.Добавить(Сред(Строка, Начало, Конец-Начало));

//Если набралось количество колонок, равное их количеству в шапке, записываем всю строку
//в массив и переходим к следующей
Если Колонка=КоличествоКолонок Тогда

Результат.Добавить(СтрокаФайла);
СтрокаФайла=Новый Массив;

Колонка=0;
КонецЕсли;

Начало=Позиция+1;
КонецЕсли;
КонецЦикла;

//Удаляем шапку таблицы из массива строк
Результат.Удалить(0);
Возврат Результат;

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

&наКлиенте
процедура ПривестиКНужномуФормату(Знач Строка, Разделитель, КоличествоКолонок) // сохраняем в формат csv
	

	
Результат = Новый ТекстовыйДокумент; // массив строк

Скобка=ЛОЖЬ;
Начало=1;
Колонка=0;
СтрокаФайла=новый Массив; // массив колонок в строке

для Позиция=1 по СтрДлина(Строка) Цикл // обходим файл посимвольно

Символ=Сред(Строка, Позиция, 1);

//если встречается кавычка, фиксируем ее открытие, прекращаем итерацию и продолжаем цикл.
Если Символ="""" И Скобка=Ложь Тогда
Скобка=Истина;
Продолжить;
//Если встречается закрывающаяся кавычка, фиксируем ее закрытие и тоже продолжаем цикл
ИначеЕсли Символ="""" И Скобка=Истина ТОгда
Скобка=Ложь;
Продолжить;
КонецЕсли;

//Если встречается разделитель или перенос строки вне кавычек,
//вносим информацию в массив
Если (Символ=Разделитель ИЛИ Символ=Символы.ПС) И Скобка=Ложь Тогда
Конец=Позиция;
Колонка=Колонка+1;
СтрокаФайла.Добавить(Сред(Строка, Начало, Конец-Начало));

//Если набралось количество колонок, равное их количеству в шапке, записываем всю строку
//в массив и переходим к следующей
Если Колонка=КоличествоКолонок Тогда

// сделаем нужную строку
строкаДляЗаписи="";
для нн=0 по строкаФайла.Количество()-1 цикл
	если нн=0 тогда
	//СтрокаФайла[нн]=СтрЗаменить(СтрокаФайла[нн],""","");
	//СтрокаФайла[нн]=СтрЗаменить(СтрокаФайла[нн],";","^"); // удаляю все лишние ; и заменяю их ^ - этого символа в выгрузке нет
	строкаДляЗаписи=СтрЗаменить(СтрокаФайла[нн],символы.ПС," ");	
иначе
	//СтрокаФайла[нн]=СтрЗаменить(СтрокаФайла[нн],""","");
	//СтрокаФайла[нн]=СтрЗаменить(СтрокаФайла[нн],";","^");
	строкаДляЗаписи=строкаДляЗаписи+"^"+СтрЗаменить(СтрокаФайла[нн],символы.ПС," ");  // тут ; - разделитель	
	конецЕсли;
	
	конецЦикла;
	
Результат.ДобавитьСтроку(строкаДляЗаписи);
СтрокаФайла=Новый Массив;

Колонка=0;
КонецЕсли;

Начало=Позиция+1;
КонецЕсли;
КонецЦикла;

//Удаляем шапку таблицы из массива строк
//Результат.Удалить(0);
результат.Записать("l:\PosleFormat.csv");


конецПроцедуры

Далее нужно разобраться с загружаемыми полями из файла csv.

Определить их свойства:

  • Название доп реквизита
  • Тип
  • Список это или простой тип строка, число, дата.
  • Загружать его или нет
  • Являются ли они доп реквизитами или будем подставлять в стандартные реквизиты
  • Множественный он или нет.

С множественными проблема т.к. в 1с без изменения конфигурации множественные просто так не загрузить. Поэтому решено множественные разбивать на несколько простых доп реквизитов.

Продолжение следует....

Добавить комментарий


Защитный код
Обновить