Примечание:
Задача:
Конфигурация 1с УНФ 1.6.13(для 1с УТ эта обработка тоже подойдет) Загрузить данные с сайта в 1С. 150'000 товаров. Если грузить напрямую то данные в 1с импортируются "криво", все уходит в дополнительные сведения "кучей".
Предварительная оценка:
Выгрузку с сайта сделали в csv. Проблема: Выгрузка csv вначале тоже была некорректной. Внутри полей встречались разделители и переносы строк.
Загружать буду своей обработкой.
Конфигурацию менять нельзя.
Картинки к товарам нужно закачивать в 1с по ссылке. Одну из картинок нужно назначать основной.
Дополнительные реквизиты обработка должна создавать автоматически.
Если значения доп реквизитов "Дополнительное значение", т.е. значения которые выбираются из списка, то список будем создавать по мере загрузки товаров. Если значение в списке есть, то подставляем в доп реквизит, если значения нет, создаем значение доп. реквизита и подставляем его.
Решение:
1 Приводим в порядок CSV файл.
Выгрузка csv вначале тоже была некорректной. Внутри полей встречались разделители и переносы строк. Это приводило к неправильному преобразованию в поля. Пришлось переделывать выгрузку. Для Excell она бы подошла, а вот 1с читает этот файл построчно и разбивает на поля по указанному разделителю.
Приведем выгрузку к понятному 1с виду.
Выгрузка до
После обработки:
Процедура, которая привела выгрузку к нормальному виду. Выкладываю как есть. Разделитель "^" выбран т.к. он во всем тексте ни разу не встречался.
// приводим файл выгрузки в порядок &НаКлиенте Процедура УбратьЛишниеПереносы(Команда) Источник=новый ТекстовыйДокумент; Источник.Прочитать("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"); конецПроцедуры
2 Загрузка номенклатуры
Далее нужно разобраться с загружаемыми полями из файла csv.
Определить их свойства:
- Название доп реквизита
- Тип
- Список это или простой тип строка, число, дата.
- Загружать его или нет
- Являются ли они доп реквизитами или будем подставлять в стандартные реквизиты
- Множественный он или нет.
С множественными проблема т.к. в 1с без изменения конфигурации множественные просто так не загрузить. Поэтому решено множественные разбивать на несколько простых доп реквизитов.
Выгрузка csv содержит поля, которые нужно грузить в дополнительные реквизиты и основные реквизиты. Некоторые поля вообще не нужно грузить.
Чтобы удобнее было работать с полями сделал таблицу значений, где указал нужные свойства полей
Если грузить в номенклатуру только стандартные реквизиты, тогда эта таблица не нужна.
Загружаем данные из csv в 1с.
Обработка Первоначальная загрузка номенклатуры.zip
Что делает обработка
- Создает номенклатуру
- Заполняет основные реквизиты
- Заполняет, а в случае отсутствия, создает доп реквизиты с указанным типом значения.
- Если доп реквизит это список, то в случае отсутствия, нужное значение создается.
- С сайта по ссылке скачиваются картинки и прикрепляются к номенклатуре. Указывается главная картинка.
- Устанавливается цена
Эта обработка нуждается в адаптации под конкретные нужды, она не универсальная. Писал ее конкретно под клиента.
Ее можно доработать под свои нужды, но надеяться что она заработает сразу под ваш csv файл не стоит.
Характеристики в этой обработке не грузятся , т.к. клиент дал другую выгрузку для характеристик позже.
Характеристики грузил из другогих csv файлов.
Обработка создать характеристики и оприходовать остатки
Что делает обработка
- Создает характеристики номенклатуры
- Присваивает характеристикам имя в зависимости от значений
- Оприходует товар по 1шт.
Эта обработка нуждается в адаптации под конкретные нужды, она не универсальная. Писал ее конкретно под клиента.
Ее можно доработать под свои нужды, но надеяться что она заработает сразу под ваш csv файл не стоит.