Импорт из Excel

Курс содержит полную информацию по работе с модулем «Импорт из Excel» http://marketplace.1c-bitrix.ru/solutions/kda.importexcel/

Данный модуль предназначен для загрузки данных из Excel-файлов различных форматов в инфоблоки или highload-блоки.

Возможен как ручной запуск импорта, так и периодический импорт по крону. Модуль умеет автоматически загружать файлы из различных источников: из структуры сайта, по внешней ссылке с других сайтов, с ftp-сервера, с email-адреса, по ссылке с авторизацией. Возможна загрузка файла в виде архива и автоматическая распаковка на сайте.

Поддерживается импорт всех стандартных полей инфоблока, свойств, цены, остатков на складах, скидок, комплектов, наборов, торговых предложений и т.д.



 Начать курс обучения

 

Пользовательские комментарии

Страницы: 1 2 3 4 5 След.
Дмитрий Кривочуров
Цитата
SeguraStore
Да, звучит вполне логично. Благодарю за помощь. Теоритически теперь все должно работать правильно. Завтра потестирую.
Какие-то еще данные помимо $val не вытаскивая через API битрикса я могу получить в php обработчике в табличке (2 шаг)? Достать-то все можно, но зачем лишние действия, если в итерации уже используется массив в элементом ID_SKU
Если Вы имеете ввиду этот обработчик https://skr.sh/sGyp1LTwUHi, то там на данный момент доступна только переменная $val. Мы не рекомендуем его использовать для сложных условий. Этот обработчик является устаревшим функционалом и мы его оставляем в модуле только для обратной совместимости.
Если нужна фильтрация по каким-то сложным значениям, то можно использовать фильтр совместно с преобразованиями https://skr.sh/sGyLHWeUyjA. Фильтрация работает по преобразованным значениям, а в php-преобразовании можно получить любые поля из файла.
ИмяЦитировать0
SeguraStore
Цитата
1) Значение в колонке 2 и значение из колонки 3 - это исходные значения из файла без учёта предыдущих преобразований. Т.е., первое php-преобразование у Вас в данном случае не учитывается.
2) Текущее значение https://skr.sh/sGxo0vtjn9a - это уже значение с учётом всех предыдущих преобразований.
Да, звучит вполне логично. Благодарю за помощь. Теоритически теперь все должно работать правильно. Завтра потестирую.
Какие-то еще данные помимо $val не вытаскивая через API битрикса я могу получить в php обработчике в табличке (2 шаг)? Достать-то все можно, но зачем лишние действия, если в итерации уже используется массив в элементом ID_SKU
ИмяЦитировать0
Дмитрий Кривочуров
Цитата
SeguraStore
ой нет, не получилось. Сделал вот так и он просто 1 везде проставил.
Здесь есть ещё некоторые нюансы по использованию преобразований.

На скриншоте Вы сравниваете значение в колонке 2 со значением в колонке 3. И здесь важно понимать следующее.
1) Значение в колонке 2 и значение из колонки 3 - это исходные значения из файла без учёта предыдущих преобразований. Т.е., первое php-преобразование у Вас в данном случае не учитывается.
2) Текущее значение https://skr.sh/sGxo0vtjn9a - это уже значение с учётом всех предыдущих преобразований.

Т.е., в Вашем случае нужно проверять именно "текущее значение".

Правда здесь будут сложности с 3-м преобразованием, т.к. "текущее значение" в нём уже может быть изменено вторым преобразованием и сравнить значение из первого преобразования с исходным значением из колонки 2 уже не получится. Но можно проверить конечное значение и задать преобразование такого вида https://skr.sh/sGx82FxEgHX?a.

По php-обработчику, который задаётся на 1-м шаге. В нём доступна только переменная $ID и больше ничего. Этот обработчик выполняется уже после обновления товара. При необходимости все измененные поля из товара можно запросить через API Битрикса, но данные об этом товаре, которые были в файле импорта, внутри этого обработчика уже никак не получить.
ИмяЦитировать0
SeguraStore
ой нет, не получилось. Сделал вот так и он просто 1 везде проставил.
ИмяЦитировать0
SeguraStore
Отлично, получилось
ИмяЦитировать0
Guest
Цитата
1) Остаток рулона делим на длину текущей позиции. В этом преобразовании нет условия.
Вы почти правильно меня поняли, но видимо я как обычно криво пояснил.
Допустим в табличке
ID_SKU (ковер из рулона)
LENGHT
ID_ПАПОЧКИ (рулона)
Для последнего столбика я сделал преобразование php
   $ar_res = CCatalogProduct::GetByID($val);    $val = $ar_res[QUANTITY];
Вот теперь я знаю, сколько метров осталось в рулоне, и осталось сделать любую из проверок
LENHGT > ID_ПАПОЧКИ (после преобразование тут остаток длины) ? 1 : 0;
или как предложили вы
ID_ПАПОЧКИ / LENGHT >= 1 ? 1 : 0;
У меня остался последний вопрос
Как мне достать параметр длины из ТП на текущей итерации (наверное есть уже $arrSKU или хотя бы $ID элемента, который итерирует ваш супер-пупер модуль)
|| или
Как мне сравнить в визуальной табличке значение в двух столбиках (скрин прикладываю)
Интересны оба варианта для понимания.


P.s.: Благодарю за описание работы php в поле преобразования. Эта инфа будет полезна в общем мануале. А как быть с php на первой странице? Вся информация - Переменная $ID содержит идентификатор элемента. $arrSKU тоже можно использовать? #IP_PROP# текущего элемента тоже есть? Если на текущей итерации я хочу изменить данные торгового предложения уже надо использовать CIBlockElement::Update
ИмяЦитировать0
Дмитрий Кривочуров
Цитата
SeguraStore
Привет. Бесконечные респекты за модуль, он прекрасен. Обнял!

Нигде не нашел почитать про php , было б интересно примерчики получить.

Округление было бы логично настроить до х знаков после запятой?
P.s.: round($val,2) - вместо округления выбираем php, раз нет настройки.

На картинке видно, как я проверил форму торгового предложения и если "рулон" умножил количество на длину рулона в метрах.

Теперь у меня есть отдельным файликом пачка товаров, готовые отрезы типа, у них есть свойство с ID папочки (рулон, из которого нарезка делается), и их остаток зависит от остатка папочки рулона. Это уже по любому php писать надо? Помогите плиз.

То есть смысл преобразования:
если остаток папочки рулона больше длины текущей позиции тогда остаток 1, иначе 0

Пример
Товар рулона остался 2.5 метра
Загружаем товары нарезки
1х2 - остаток 1
1х2.5 - остаток 1
1х3 - остаток 0
и тп
Здравствуйте.

По php-преобразованиям возможны 2 варианта написания.
1) Любой однострочный код, который сразу возвращает результат (без return).
Примеры:
Код
1.1) round($val,2) 
1.2) round(max($val*2, $val+10),2)+25 
1.3) $val.' дополнительный текст'

2) Любой код, содержащий присвоение переменной $val. Т.е., в переменной $val содержится как входящее значение, так в неё может быть передано и исходящее значение.
Здесь, думаю, хватит одного примера.
Код
$val = $val*2; 
$val = round($val,2);
И ещё важный момент по php-преобразованиям. Если в них использовать вставки вида #IP_PROP12#, то они сначала заменятся на значения этих полей, а потом уже выполнится php-код. Это может вызывать ошибки.

Например.
Код
$val = #IP_PROP12#*2;
Данный код будет выполнен правильно только если #IP_PROP12# имеет числовое значение. Иначе мы получим ошибку php.
Чтобы избежать таких ошибок, в php-преобразованиях лучше использовать переменные такого вида ${'#IP_PROP12#'}. С ними никаких проблем не должно быть.

Что касается округления, то в последних версиях модуля должен работать такой вариант https://skr.sh/sGw4uhmx4Os. Т.е. точность округления можно указать в последнем поле.

Если я правильно понял задачу по расчёту остатков, то можно её решить и без php-преобразования. Для этого потребуются простые преобразования со следующим набором действий.
1) Остаток рулона делим на длину текущей позиции. В этом преобразовании нет условия.

2) Если текущее значение больше или равно 1, то заменить на 1
3) Если текущее значение меньше 1, то заменить на 0.
ИмяЦитировать0
SeguraStore
Привет. Бесконечные респекты за модуль, он прекрасен. Обнял!

Нигде не нашел почитать про php , было б интересно примерчики получить.

Округление было бы логично настроить до х знаков после запятой?
P.s.: round($val,2) - вместо округления выбираем php, раз нет настройки.

На картинке видно, как я проверил форму торгового предложения и если "рулон" умножил количество на длину рулона в метрах.

Теперь у меня есть отдельным файликом пачка товаров, готовые отрезы типа, у них есть свойство с ID папочки (рулон, из которого нарезка делается), и их остаток зависит от остатка папочки рулона. Это уже по любому php писать надо? Помогите плиз.

То есть смысл преобразования:
если остаток папочки рулона больше длины текущей позиции тогда остаток 1, иначе 0

Пример
Товар рулона остался 2.5 метра
Загружаем товары нарезки
1х2 - остаток 1
1х2.5 - остаток 1
1х3 - остаток 0
и тп
ИмяЦитировать0
Guest
Цитата
[TABLE][TR][TH]Цитата[/TH][/TR][TR][TD]Guest
Здравствуйте!
Загружаем файл из Яндекс.Диска, путь файла вставляем как ссылку на папку Яндекс.Диска
В папке Яндекс.Диска несколько файлов, это прайс-листы с разной датой.
В данном случае, по какой логике выбирается файл для загрузки?
Я думал что по дате создания, но нет. по дате изменения – тоже нет[/TD][/TR][/TABLE]Здравствуйте.
Да, при указании ссылки на папку нет никакой закономерности, какой именно файл будет загружен, т.к. в данном случае модуль скачивает zip-архив со всем содержимым папки и потом уже из архива выбирает первый подходящий по формату файл. А zip-архиве уже не понятно, какой файл и когда был создан.
В данном случае Вам нужно использовать ссылку такого вида https://disk.yandex.ru/d/hsDiMdZ23ZLyHX#маска_названия_файла
Т.е., после ссылки на папку через решётку можно указать названия файла по маске. В маске можно использовать * - это любой набор символов в названии файла. Например, маска вида "Импорт*.xlsx" будет загружать файлы с названиями "Импорт остатков.xlsx", "Импорт 7.11.2022.xlsx" и т.д.
При поиске файлов по маске модуль не загружает zip-архив, а ищет подходящий файл через API Яндекса с сортировкой по дате создания в обратном порядке. Т.е., в этом случае всегда будет загружаться самый свежий файл, который был создан последним.
отлично, спасибо!
Может кому полезно будет)

https://disk.yandex.ru/d/hsDiMdZ23ZLyHX#{Остатки,остатки}*{xls,xlsx}
ИмяЦитировать0
Дмитрий Кривочуров
Цитата
Guest
Здравствуйте!
Загружаем файл из Яндекс.Диска, путь файла вставляем как ссылку на папку Яндекс.Диска
В папке Яндекс.Диска несколько файлов, это прайс-листы с разной датой.
В данном случае, по какой логике выбирается файл для загрузки?
Я думал что по дате создания, но нет. по дате изменения – тоже нет
Здравствуйте.
Да, при указании ссылки на папку нет никакой закономерности, какой именно файл будет загружен, т.к. в данном случае модуль скачивает zip-архив со всем содержимым папки и потом уже из архива выбирает первый подходящий по формату файл. А zip-архиве уже не понятно, какой файл и когда был создан.
В данном случае Вам нужно использовать ссылку такого вида https://disk.yandex.ru/d/hsDiMdZ23ZLyHX#маска_названия_файла
Т.е., после ссылки на папку через решётку можно указать названия файла по маске. В маске можно использовать * - это любой набор символов в названии файла. Например, маска вида "Импорт*.xlsx" будет загружать файлы с названиями "Импорт остатков.xlsx", "Импорт 7.11.2022.xlsx" и т.д.
При поиске файлов по маске модуль не загружает zip-архив, а ищет подходящий файл через API Яндекса с сортировкой по дате создания в обратном порядке. Т.е., в этом случае всегда будет загружаться самый свежий файл, который был создан последним.
ИмяЦитировать0
Guest
Здравствуйте!
Загружаем файл из Яндекс.Диска, путь файла вставляем как ссылку на папку Яндекс.Диска
В папке Яндекс.Диска несколько файлов, это прайс-листы с разной датой.
В данном случае, по какой логике выбирается файл для загрузки?
Я думал что по дате создания, но нет. по дате изменения – тоже нет
ИмяЦитировать0
Guest
Цитата
[TABLE][TR][TH]Цитата[/TH][/TR][TR][TD]Андрей
Добрый день!

Подскажите, как в фильтре отсутствующих в файле элементов указать несколько значений поставщика, бренда и тд
Воспринимает лишь одно значение.[/TD][/TR][/TABLE]Здравствуйте.

Несколько значений в фильтре на данный момент можно указать только для свойств типа Привязка к элементам. В этом случае можно задать несколько значений через запятую. Также можно это сделать для свойства типа Список.
Для остальных свойств пока выбор нескольких значений недоступен. Но можно на 2-м шаге в настройках нужного свойства использовать такие параметры https://disk.yandex.ru/i/jCMgXHHrAQvt_w. Такое поле тоже будет использовано для фильтрации отсутствующих элементов.
Банально неверно название бренда прописал после запятой, поэтому думал не работает)
Спасибо большое, Дмитрий!
ИмяЦитировать0
Дмитрий Кривочуров
Цитата
Андрей
Добрый день!

Подскажите, как в фильтре отсутствующих в файле элементов указать несколько значений поставщика, бренда и тд
Воспринимает лишь одно значение.
Здравствуйте.

Несколько значений в фильтре на данный момент можно указать только для свойств типа Привязка к элементам. В этом случае можно задать несколько значений через запятую. Также можно это сделать для свойства типа Список.
Для остальных свойств пока выбор нескольких значений недоступен. Но можно на 2-м шаге в настройках нужного свойства использовать такие параметры https://disk.yandex.ru/i/jCMgXHHrAQvt_w. Такое поле тоже будет использовано для фильтрации отсутствующих элементов.
ИмяЦитировать0
Андрей
Добрый день!

Подскажите, как в фильтре отсутствующих в файле элементов указать несколько значений поставщика, бренда и тд
Воспринимает лишь одно значение.

ИмяЦитировать0
Дмитрий Кривочуров
Цитата
Влад
Спасибо за модуль, очень выручает.
Подскажите пожалуйста, мне нужно реализовать следующую логику - на сайт выгружаю со своего SQL каталога номенклатуру в виде объемного файла CSV, очень важно запускать профиль импорта только если csv успешно загружен на сайте. Я не хочу подвязываться к крону, так как он может запуститься в момент когда файл еще не загрузился в директорию сайта. При отправке файла я делаю проверку соответствия и только если загруженный файл соответствует, хочу запустить определенный профиль импорта из множества других.
Какую функцию вызвать для запуска профиля импорта к примеру с ID 243?
Здравствуйте.
Если я правильно понял, Вы хотите запустить импорт из какого-то своего скрипта.
Это можно сделать с помощью вызова файла для крона таким образом:
Код
$argv[1] = 243;
include($_SERVER['DOCUMENT_ROOT'].'/bitrix/php_interface/include/kda.importexcel/cron_frame.php');
В переменную $argv[1] передается ID профиля.
Но при этом учитывайте, что если это скрипт выполняется в http-запросе, то там будут серверные ограничения по максимальному времени выполнения скрипта и он может просто не завершиться.
Чтобы избежать таких ограничений, можно использовать запуск системной команды такого вида:
Код
exec('/usr/bin/php -f '.$_SERVER['DOCUMENT_ROOT'].'/bitrix/php_interface/include/kda.importexcel/cron_frame.php 243');
Это полный аналог запуска по крону.
ИмяЦитировать0
Влад
Спасибо за модуль, очень выручает.
Подскажите пожалуйста, мне нужно реализовать следующую логику - на сайт выгружаю со своего SQL каталога номенклатуру в виде объемного файла CSV, очень важно запускать профиль импорта только если csv успешно загружен на сайте. Я не хочу подвязываться к крону, так как он может запуститься в момент когда файл еще не загрузился в директорию сайта. При отправке файла я делаю проверку соответствия и только если загруженный файл соответствует, хочу запустить определенный профиль импорта из множества других.
Какую функцию вызвать для запуска профиля импорта к примеру с ID 243?
ИмяЦитировать0
Дмитрий Кривочуров
Цитата
Анастасия
Добрый! Огромное спасибо за модуль, очень помогает в работе.

Подскажите где в Битриксе хранятся файлы статистики?
Здравствуйте.
Если речь идет о статистике импорта, но она хранится в таблице БД b_kdaimportexcel_profile_exec_stat.
ИмяЦитировать0
Анастасия
Добрый! Огромное спасибо за модуль, очень помогает в работе.

Подскажите где в Битриксе хранятся файлы статистики?
ИмяЦитировать0
Дмитрий Кривочуров
Цитата
Андрей
Здравствуйте. Можете подсказать, есть ли какая то возможность, чтобы при настройке преобразований значений в ячейке отбиралось конкретное значение, а не часть фразы. Имеем два наименования от поставщика (к примеру Altenzo Sports Comforter 215/35 R19 85W XL и Altenzo Sports Comforter 2 215/35 R19 85W XL), мне нужно чтобы при преобразовании оставалось только значение "Sports Comforter" в первом случае и "Sports Comforter 2 во втором случае. Проблема состоит в том, что импорт думает, что в обоих случаях это одно и тоже значение. Во втором случае после преобразование получается "Sports ComforterSports Comforter 2". Может можно указать какой нибудь символ, поставить в кавычки искомое значение?
Здравствуйте.
Здесь все зависит от того, какие именно сейчас преобразования Вы используете. Просто составить какое-то универсальное преобразование для подобных случаев не получится, т.к. названия товаров могут иметь совершенно разные вариации.
Но если речь только о этих 2-х конкретных моделях, то можно использовать такие преобразования https://skr.sh/sE1hUhsJlC4.Во втором преобразовании задаётся проверка по регулярному выражению https://skr.sh/sE1BWBDCZd7, где символы \d{2} означают, что на этом месте должно быть минимум 2 цифры. Т.е., для названия "Altenzo Sports Comforter 2 215/35 R19 85W XL)" это регулярное выражение уже не сработает.
ИмяЦитировать0
Андрей
Здравствуйте. Можете подсказать, есть ли какая то возможность, чтобы при настройке преобразований значений в ячейке отбиралось конкретное значение, а не часть фразы. Имеем два наименования от поставщика (к примеру Altenzo Sports Comforter 215/35 R19 85W XL и Altenzo Sports Comforter 2 215/35 R19 85W XL), мне нужно чтобы при преобразовании оставалось только значение "Sports Comforter" в первом случае и "Sports Comforter 2 во втором случае. Проблема состоит в том, что импорт думает, что в обоих случаях это одно и тоже значение. Во втором случае после преобразование получается "Sports ComforterSports Comforter 2". Может можно указать какой нибудь символ, поставить в кавычки искомое значение?
ИмяЦитировать0
Страницы: 1 2 3 4 5 След.
Комментировать