Задача: импортировать справочник из CSV в битрикс Особенности: некоторые строки имеют одинаковые значения названия, но разные значения остальных свойств. Технологии и инструменты: Битрикс, Эксель Эксперимент №1. Захожу в админку, добавляю две записи с одинаковыми названиями, убеждаюсь что всё ок. Оно и логично - ID записи получают автоматом разные. Эксперимент №2. Создаю CSV из двух строк, названия одинаковые, свойства разные, IE_XML_ID и IE_ID не задаю, т.к. данные новые, нужно вставить. Импортирую, наблюдаю грустную картину, что записи склеились в одну, у множественных свойств всё ок, а вот обычные имеют значение последней записи. Читаю ещё раз документацию http://dev.1c-bitrix.ru/learning/cour...ON_ID=2012
Для загрузки данных для свойств с признаком множественности необходимо повторить строку с элементом столько раз, сколько будет значений множественного поля. ... Все строки должны быть одинаковыми по содержанию, за исключением множественных полей, которые изменяются указанием новых данных для этого свойства.
Замечательно, у меня свойства разные, а Битрикс решил, что это я так множественные поля подгружаю. Обращаюсь в техподдержку, выясняю новые и интересные вещи:
Идентификация одного элемента из списка в CSV-файле происходит по "Названию" или "XML_ID". У Вас одно название в двух строках, поэтому это один элемент, но с разными значениями множественного свойства, а значения остальных не множественных свойств определится из последней строки.
Значит нужны разные XML_ID. Есть идея проставить вручную от 1 до сколько нужно, но как это будет интерпретировать Битрикс неясно. Строк в справочнике под 1000, в следующем уже счёт идёт на десятки тысяч, в админке не посидишь... В результате подумав, решаю сделать всё 2-ступенчатым алгоритмом. Шаг 1. Вместо IE_NAME прописываю уникальные числа от 1 и далее в экселе, сохранив отдельно столбец со старыми названиями, соответствующими этим числам. Импортирую новые данные. Результат - загружены все данные кроме названий, ни одна из строк не склеилась Шаг 2. Экспортирую загруженные данные. На самом деле мне нужно лишь 2 столбца. При попытке экспортировать только XML_ID и IE_NAME, данных оказывается почему-то меньше. Экспортирую всё, вырезаю только эти два столбца. Функцией ВПР возвращаю в IE_NAME законные названия, ещё раз импортирую. Результат - у всех данных оказываются правильные имена.
Таким образом, без написания какого-либо кода или обработок задача решена, данные скормлены Битриксу, ура!
у меня, к счастью, была возможность, поэтому я просто сгенерировал в файлике с табличкой абстрактный XML_ID вида xxxx-xxxx-xxxx-yyyy, где yyyy - последние цифры уникального артикула товара и все залилось наконец-то, а вообще странно, почему нельзя инсертить просто по строке, зачем определять, уникальное ли название?
Жуков Евгений, функция называется «Импорт», а не «Импорт с проверкой уникальности определённых полей и их последующим обновлением если это не так». И получается, вместо галочки «Проверять уникальность» или «Генерировать уникальный XML_ID» я вынужден искать программиста, что бы сотворить костыль для вашего решения или додумывать сам уникальные значения, тем самым усложняя казалось бы простой процесс экспорта csv из внешнего источника и его импорта в битру.
Тот же экспорт из таблицы в csv происходит без удаления дублей. Экспорт из ИБ в csv — тоже без удаления дублей. Так какого было принято решение удалять дубли при импорте, без возможности просто импорта, а?
Да у вас даже в документации написано «Сберегите свое время и силы. Подготовьте CSV-файл с данными, а встроенный инструмент импорта быстро загрузит ВСЕДАННЫЕ в инфоблок.» Враньё прямо в глаза — импорт не всех данных; время и силы такой импорт не бережёт.
Добавил динамические пункты меню в .catalog.menu_ext.php через bitrix:menu.sections (см. https://dev.1c-bitrix.ru/user_help/com...ection.php) и при проверке в одновременно открытом с админкой браузере в режиме инкогнито долго не мог понять причину "мигания" данных. Меню то выводилось, то полностью исчезало. Оказалось, не прописал доступ всем пользователям на чтение в правах ИБ. Соответственно, кэш, генерируемый админом был доступен обычному пользователю. Но при обновлении данных, если первый раз открыть обычным пользователем, кэш очищался.
Нужно учитывать при разработке и обратный эффект: если доступ к какому-то ИБ закрыт через настройки доступа, через кэш он может отобразиться.
Столкнулся со своеобразной проблемой при работе с купонами: переставали применяться и пересчитываться суммы в корзине, если делать ограничение на применение, по группе, например, сделать купон "только для администраторов". В AJAX запросе на применение купона, где использовалась функция CSaleDiscount::DoProcessOrder(), помогла просто передача ID пользователя
В другом AJAX запросе, возвращающем сумму корзины с учётом скидок (но без учёта доставки) с помощью техподдержки удалось успешно решить задачу применением следующего кода:
if (\Bitrix\Main\Loader::includeModule('sale')) {
$basket = \Bitrix\Sale\Basket::loadItemsForFUser(
\CSaleBasket::GetBasketUserID(), "s1")->getOrderableItems();
$discounts = \Bitrix\Sale\Discount::buildFromBasket($basket, new \Bitrix\Sale\Discount\Context\Fuser($basket->getFUserId(true)));
$discounts->calculate();
$arBasketDiscounts = $discounts->getApplyResult(true);
$sum = 0;
// массив объектов \Bitrix\Sale\BasketItem
$basketItems = $basket->getBasketItems();
/** @var \Bitrix\Sale\BasketItem $basketItem */
foreach ($basketItems as $basketItem ) {
// чтоб в этом цикле их вывести
$basketCode = $basketItem->getBasketCode();
if (isset($arBasketDiscounts["PRICES"]['BASKET'][$basketCode]))
{
$sum += $arBasketDiscounts["PRICES"]['BASKET'][$basketCode]["PRICE"]*$basketItem->getQuantity();
} else {
$sum += $basketItem->getFinalPrice();
}
}
echo number_format($sum, '2', ',', ' ') . ' руб.';
}
Алексей, всё зависит от конкретного готового решения или доработок, сделанных создателями сайта. В моём случае оформление заказа было полностью кастомное и пришлось много отлаживать код и сделать некоторые доработки, чтобы подружить оформление заказа и промокоды. В итоге исходные коды стали представлять собой ядрёную смесь старого кода и D7, потому что какой-то функционал работал только через D7, какой-то - только по-старому. Чтобы определить, где и что нужно менять: 1) Установите отдельно демо-версию чистого Битрикса, убедитесь, что нужный функционал в принципе поддерживается системой со всеми установленными обновлениями. Убедитесь, что у Вас установлены все последние обновления 2) AJAX-обращения к файлам видно в браузере в средствах разработчика (F12) 3) Если обращения уходят вглубь системы, вызываются какие-то функции и классы, можно делать трассировку с помощью PHP (см. https://www.php.net/manual/ru/function...ktrace.php) или XDEBUG (см. https://habr.com/ru/post/31463/). Включить трассировку с записью можно попросить администраторов хостинга. Но делать это надо только на пустом сайте или его тестовой копии, т.к. логи быстро могут занять очень много места (500 Гб, например). 4) Самостоятельная отладка, чаще всего с помощью записи логов в файл, т.к. в AJAX-ответ бывает трудно что-то распечатать, ломается логика на принимающей стороне 5) Если ничего не помогло - отладка с помощью того же XDEBUG в среде разработки PHP. Есть бесплатные, такие как PHPStorm и бесплатные: VS Code, Netbeans и др.
По умолчанию компонент bitrix:catalog.smart.filter голосует "против", если нажата хотя бы одна галочка: С моей точки зрения это странно, ведь фильтр обычно полностью определяется URL и не зависит от данных сессии, как, например, корзина.Логика отключения Битрикс - фильтр может порождать большое количество страниц, что может потребовать много места для кэша. Однако, без кастомизации компонента такое поведения напрямую исправить нельзя, что неудобно, о чём я и написал в техподдержку. Техподдержка проявила понимание и создала тикет разработчикам. Ждать изменений в новой версии, впрочем, необязательно.
Из документации https://dev.1c-bitrix.ru/learning/cour...1&LESSO... begin() означает отображение "данных компонента, полученные на предыдущем хите" C begin('') получалось, что фильтр сначала не показывается (вместо него пустая заглушка), потом подгружется, мигает, что выглядит не очень хорошо и с точки зрения пользователя и с точки зрения SEO. С begin() работает как надо, сразу виден с нужными галочками.
За сутки получил результаты: соотношение страниц в кэше к количеству их просмотра примерно 1 к 3. Т.е., к примеру 100 пользователей обратились к странице и ждали, пока она сгенерируется сервером, а 300 получили уже готовый результат. Соответственно, 75% пользователей получают закэшированные результаты. Это впечатляет и радует. Кэширование фильтра однозначно нужно!
За рост кэша можно не переживать, композит автоматически вытесняет редко востребованные страницы Пожалуй, стоит смотреть время от времени состав кэша, не забит ли он полностью вариантами фильтров, благо композит это позволяет легко делать.
Дополнительную эффективность такому кэшированию придаёт использование готовых "рецептов", когда результаты фильтра менеджер размещает в рекламе или рассылке, например "Новая серия ABC" со ссылкой на фильтр по ней. После публикации все пользователи после 1го будут получать композитный кэш, нагрузка на сервер минимальна.
P.S. В ходе анализа результатов, когда эксель не смог переварить "Выгруженную в Эксель" статистику из админки Битрикса, научился полезной фишке Экселя - массовому преобразованию текста в числа. Это если "Изменить формат" выделенных ячеек не помогает и они продолжают висеть с предупреждениями "Число отформатировано как текст". Есть чудесная кнопка "Данные - Текст по столбцам" : https://support.office.com/ru-ru/artic...BE%D0%B... Она всё сделает.
В кастомизированном шаблоне комплексного компонента новостей, содержащем вызов 2х других компонентов нужно было передать значение из первого компонента второму.Способ через глобальные переменные не подошёл, т.к. компонент стандартный и кэшируется (возможно, стоило попробовать через componet_epilog.php) https://dev.1c-bitrix.ru/learning/cour...p;LESSO... В итоге по сути продублировал обращение к БД из первого компонента и сделал тэгированное кэширование, как написано тут https://dev.1c-bitrix.ru/learning/cour...p;LESSO... Без тегирования кэш не обновлялся при изменении данных, нужно было бы писать свои обработчики на изменения. Кэш через getList в D7 также не обновлялся, хотя тут написано, что должен:
Сброс кеша происходит в любом методе add/update/delete.
Столкнулся с тем, что при изменении параметров веб-формы, форма на странице сама не обновлялась. Я посмотрел код компонента form.result.new и обнаружил, что используется тегированный управляемый кэш, как описано тут:https://dev.1c-bitrix.ru/learning/cour....4780.2978 Кэш успешно принудительно сбрасывается функцией типа $CACHE_MANAGER->ClearByTag('form_'.$ID_формы) Однако при сохранении параметров формы эта функция для сброса кэша почему-то не вызывается. В списке событий найти событие на изменение данных самой веб-формы найти не смог: https://dev.1c-bitrix.ru/api_help/form.../index.php Ограничился выставлением небольшого времени кэширования компонента. Написал в Битрикс, завели тикет на доработку.
Веб-форму можно привязать к одному или нескольким сайтам. В фильтрах функции CForm::GetList можно указать, привязанные к каким сайтам выбирать формы. Но результат, возвращаемый этой функцией не содержит информации о привязке найденных форм к сайтам. Если Вам нужно узнать, к каким сайтам привязана форма, можно воспользоваться функцией CForm::GetSiteArray(ID_формы) (См. https://bxapi.ru/src/?module_id=form&n...tSiteArray) Решение подсказано службой поддержки Битрикс.
Если вы пишите свой модуль, называться папки, в которых они будут лежать будут называться примерно так mycompany.module1 mycompany.module2 Компоненты, которые они содержат, при установке обычно размещаются в папке /bitrix/components/mycompany/ (или /local/components/mycompany/) Т.е. пространство компонентов у двух разных модулей одного разработчика будет совпадать. При удалении модуля он должен найти и удалить только свои компоненты. Мне не удалось найти примеров в готовых модулях Битрикса - они только копируют компоненты, но их не удаляют. Поэтому я сделал так:
//Класс установки модуля
class mycompany_component1 extends CModule{
//Пространство имён компонентов
public $MODULE_COMPONENTS_NAMESPACE = "mycompany";
//Компоненты модуля
public $arModuleComponents = ["component1"];
...
function UnInstallFiles()
{
...
//Удаление компонентов модуля из /local
foreach ($this->arModuleComponents as $componentName) {
if (strlen($componentName) > 0) {
$resDel=DeleteDirFilesEx("/local/components/" . $this->MODULE_COMPONENTS_NAMESPACE . '/' . $componentName . '/');
}
}
//TODO: удалять папку с компонентами, если она оказывается пустая
return true;
}
}
По-хорошему нужно ещё проверять, не удалили ли мы все наши модули и все их компоненты и в этом случае удалять пустую папку пространства имён наших компонентов
Я уже сделал также как автор тут описывал сделать т.е. положил шаблон в папку "local" Я просто все думал можно ли в текущий шаблон сайта сразу залить ... но наверное это не правильно ...
Бачар Константин, да компоненты должны лежать в /local/components или в /bitrix/components. В других местах Битрикс их не найдёт. Но есть другой вопрос: где должны лежать шаблоны компонентов? Если я делаю сайт и модули к нему без публикации, часть шаблонов компонентов будет в папке /local/templates, а другая часть, будет в папке /local/components/имя компонента/templates/.default С моей точки зрения это неудобно, действительно возникает желание их сразу отправлять в текущий шаблон.
Модули Веб-формы и Опросы очень похожи друг на друга, но модуль Опросы, как более специализированный, имеет ряд преимуществ - позволяет делить опросы на группы, умеет подводить итоги по каждому вопросу и экспортировать эти итоги в Excel. Единственный недостаток - результаты он экспортирует в достаточно странном виде и теряет идентификационную информацию по респондентам:
Почему-то выгружает только имя и фамилию. На странице редактирования опроса есть кнопка "Список голосов", ведущая на /bitrix/admin/vote_user_votes_table.php
На этой странице есть нужная информация по каждому проголосовавшему: ID, IP, ответы. Однако кнопки экспорта в Эксель, которая есть у аналогичной страницы в "Веб-формах" почему-то нет. Вместо неё кнопка Результаты, ведущая на красивые графики. Однако, на этой странице есть "секретная" выгрузка в Excel. Достаточно добавить параметр "mode=excel" и страница выдаст все результаты в виде таблицы для Excel: /bitrix/admin/vote_user_votes_table.php?lang=ru&VOTE_ID=1&mode=excel
Здесь уже есть полная информация о проголосовавших пользователях - и ID и IP и ФИО полностью печатается.
Останется только статистику посчитать, например функцией Excel СЧЁТЕСЛИ или использовать имеющийся экспорт результатов опросов
Необходимо было сделать настройку работы на кроне агентов стандартным образом, через запуск системного скрипта /bitrix/modules/main/tools/cron_events.php. Агенты не работали, проверка выводила "Ошибка! Не настроен запуск cron_events.php на cron, последний агент отработал больше суток назад."
Больше всего продвинул в сторону решения материал Артемия Зайцева
https://dev.1c-bitrix.ru/community/web...log/10059/ Насколько могу судить, предыдущие разработчики начали делать первод всех агентов на cron, но по каким-то причинам его не доделали. Соответственно, при запуске /bitrix/modules/main/tools/cron_events.php вызов CheckAgents() не происходил вообще ни при каких комбинациях констант в /bitrix/php_interface/dbconn.php. После установки параметра check_agents модуля main, периодические агенты (у которых указано "через заданный интервал") начали выполняться по cron'у,
Группы на сайте создаются не только сотрудниками «1С-Битрикс», но и партнерами компании. Поэтому мнения участников групп могут не совпадать с позицией компании «1С-Битрикс».