Пример использования метода decompose класса QueryHelper, для исправления ошибки выборки при использовании коллекций ORM Bitrix В коллекции будет доступно:
Элементы инфоблока
Элемент инфоблока связанные с элементами инфоблока ($iblockId)
Значения св-ва с кодом COLOR элементов которые связаны с элементами инфоблока ($iblockId)
use Bitrix\Main\ORM\Query\QueryHelper;
$entity = Iblock::wakeUp($iblockId)->getEntityDataClass();
$referencePropCode = 'PROCEDURE_ID'; // код св-ва тип "Привязка к элементам" которое используется для связи элементов инфоблоков
$query = $entity::query()
->setSelect([
'ID',
'NAME',
'PREVIEW_TEXT',
'PREVIEW_PICTURE' => '',
$referencePropCode .'_ID_VALUE' => $referencePropCode,
$referencePropCode . '.ELEMENT.NAME',
$referencePropCode . '.ELEMENT.COLOR.VALUE'
])
->setOrder(["ID" => "desc"])
->setFilter([])
->setLimit(10)
->setOffset(0);
$collection = QueryHelper::decompose($query);
foreach ($collection as $element) {
$element->getId();
}
Написал модуль, который добавляет кнопку «Типографировать» в визуальный редактор. При нажатии на кнопку производится типографирование содержимого редактора — в тексте автоматически расставляются неразрывные пробелы, кавычки приводятся к правильному виду, дефисы заменяются на тире.
Публикую актуальную на 2024 год инструкцию по настройке облачного хранилища в модуле "Облачные хранилища" для провайдера Selectel. Selectel в 2023 году переделал интерфейсы и управление доступом к ресурсам, поэтому старые инструкции для новых пользователей Selectel не работают.
Во вкладке "Подключение" заполняем поля: Активность: {важно чекбокс снять!!!} Сортировка: 500 Провайдер: S3 compatible storage Регион: {поле осталось пустым} Имя сервера (API host): s3.ru-1.storage.selcloud.ru Ключ доступа: {Access S3-ключ} Секретный ключ: {Secret S3-ключ} Подключаться с использованием https: {чекбокс отмечен} Контейнер: {оставить то, что подставилось автоматически} Только для чтения: {чекбокс снят} Каноническое имя домена (CNAME): {поле оставляем пустым}
Нажимаем "Применить".
Первый раз вышло сообщение "Ошибка добавления контейнера: нераспознанный ответ службы (ошибка #3)." Настоящая ошибка выглядела так "Error establishing an SSL connection". Поймал настоящую ошибку, изменив в файле bitrix/modules/clouds/classes/general/storage_service_s3.php массив для записи в лог. И в файле init.php включил логирование запросов к провайдеру с помощью константы define('BX_CLOUDS_TRACE', true);
Для исправления ошибки "Error establishing an SSL connection", открыл в браузере https://s3.ru-1.storage.selcloud.ru/ и экспортировал все сертификаты из цепочки. Сертификаты на сервере с сайтом добавил в доверенные.
После добавления сертификатов в доверенные ошибка ушла. Подключение сохранилось и в Selectel контейнер создался.
В Selectel контейнер создается как приватный. Переходим в контейнер на вкладку "Конфигурация" https://my.selectel.ru/storage/{storage uid}/containers/ru-1/{имя контейнера}/configuration, делаем контейнер публичным. После того как сделали контейнер публичным, рядом на вкладке "Домены", появляется ссылка на публичный домен. https://{контейнер uid}.selstorage.ru Копируем публичный домен без https:// в поле "Каноническое имя домена (CNAME)" на вкладке "Подключение" в Битриксе, которое ранее оставили пустым.
Когда поле Каноническое имя домена (CNAME) не заполнено, битрикс формирует ссылки такого вида: https://s3.ru-1.storage.selcloud.ru/{название контейнера}/{путь до файла}, по которым доступ к файлу запрещен. Когда в поле Каноническое имя домена (CNAME) вписываем публичный домен, который предоставляет Selectel, то ссылки становятся https://{публичный домен контейнера}/{путь до файла} и файлы начинают скачиваться.
Переходим на вкладку "Правила". По умолчанию там правило с пустыми полями. Заполняем значения в полях. Если оставить пустыми, то после активации подключения в хранилище полетят ВСЕ новые файлы.
Сохраняем.
В списке подключений https://example.ru/bitrix/admin/clouds_storage_list.php?lang=ru, когда все согласования пройдены, у подключения в контекстном меню нажимаем "Активировать", далее "Переместить файлы в облачное хранилище". Ждем перемещения, после этого сбрасываем кэш сайта.
Здравствуйте, я новичок. Подскажите, как можно исправить ошибку в меню в футере. На всех страницах настроено так, ссылка на раздел становиться некликабельной, когда ты находишься в этом разделе. Стоит class="selected". Но на одной странице у двух разделов в инструменте разработчика отображается class="selected" (и из-за этого ссылка неактивна). Подскажите как это можно исправить?
Какое-то время не формировались фискальные чеки по оплатам. Потребовалось создание чеков коррекции для таких оплат. Требовалось выбрать завершенные оплаты за период, когда была сломана касса, и отобразить их как XML согласно документации XML сохранялся в файл и загружался в личном кабинете https://online.atol.ru/lk/ui/#/xml.
Обмен данными через Web Сервисы IIS через XDTO . Ничего серьезного, 1С JSON тоже может обрабатывать. Пусть не пугают слова SOAP, XDTO
Многие обратили внимание на неожиданно большое количество условно-бесплатных приложений в маркетплейсе Б24 и преогромное количество вакансий с содержанием "интеграция с 1С и внешними системами"
Есть много готовых удобных инструментов для интеграции, требующие дополнительных ресурсов. Удобные, в два-три клика. Сегодня расскажу про "30 строк кода" или новую тему для обучения в "школах программирования за месяц" "Вложи 20тр, получи 420тр" . Спасибо Равшану Намазову и его партнеру Юлию Кирюше , а то бы мне и в голову не пришла идея опубликовать статью и писать код ( API_bitrix24_1C )
Обмен данными через Web Сервисы ? Теперь это сделать можно легко и быстро. (1С web-service, которую может настроить выпускник ВУЗа) Со стороны Bitrix24 - не надо писать апплеты с валидацией, не надо заморачиваться с токенизацией и форматом данных и подробной документацией, тестированием. Есть FastAPI и fastBitrix24. Весь код представлен на https://github.com/validtugrikov/API_bitrix24_1C
Для организации обмена данными между 1С и Bitrix24 с использованием PHP, FastAPI и 1С, можно следовать следующей схеме:
Схема обмена данными
PHP код в Bitrix24: Отправляет запрос с помощью curl к FastAPI приложению.
FastAPI приложение: Обрабатывает запрос от Bitrix24, формирует данные в формате XDTO и отправляет запрос к 1С с использованием requests.post.
1С: Получает и обрабатывает данные, отправленные с FastAPI приложения.
Шаги реализации
PHP код в Bitrix24
В вашем бизнес-процессе Bitrix24, используйте curl для отправки данных на FastAPI приложение. Пример кода на PHP:
Создайте приложение на FastAPI, которое будет принимать запросы от Bitrix24 и отправлять их в 1С. Пример кода на Python с использованием FastAPI и requests:
Создайте обработчик в 1С, который будет принимать запросы и обрабатывать данные в формате XDTO. Пример кода на 1С
Процедура ОбработатьЗапрос(Запрос)
HTTPЗапрос = Новый HTTPЗапрос(Запрос);
ТелоЗапроса = HTTPЗапрос.ПолучитьТелоКакСтроку();
Данные = СтрНайти(ТелоЗапроса);
// Пример обработки данных
Имя = Данные["name"];
ЭлектроннаяПочта = Данные["email"];
// Обработка данных (сохранение в базе и т.д.)
HTTPОтвет = Новый HTTPОтвет(200);
HTTPОтвет.УстановитьТело(Новый HTTPСообщение(Новый Строка(Формат("Данные успешно получены: %1", Имя))));
Запрос.ОтправитьОтвет(HTTPОтвет);
КонецПроцедуры
Пример схемы взаимодействия
Bitrix24 (PHP):
Отправка данных на FastAPI приложение.
curl запрос с данными в формате JSON.
FastAPI (Python):
Прием данных от Bitrix24.
Формирование данных в формате XDTO.
Отправка данных в 1С с использованием requests.post.
1С (1C):
Прием данных от FastAPI.
Обработка и сохранение данных.
Пример XDTO данных
Формат XDTO данных может быть любым, но для примера это может быть JSON:
Таким образом, схема обмена данными между 1С и Bitrix24 с использованием PHP, FastAPI и 1С будет состоять из четко определенных шагов по передаче данных между системами, обеспечивая гибкость и масштабируемость интеграции.
По умолчанию агенты на кроне запускаются раз в минуту.
Для запуска раз в секунду используется скрипт-прослойка.
# Содержимое command-every-second.sh
#!/bin/bash
command=$@
# Пробелы и косые в команде заменяются на нижние подчеркивания.
no_spaces=`echo $command | sed -e 's/\s/_/g' -e 's|/|_|g'`
# Имя файла для блокировки на время выполнения основной команды.
lockfile=/tmp/$no_spaces.lock
# Раз в секунду пытаемся поставить блокировку на команду и выполнить.
for i in {1..60}
do
/usr/bin/flock -n $lockfile $command
/bin/sleep 1
done
rm $lockfile
# Пример команды для крона.
crontab -e
* * * * * nice -n 1 ionice -c2 -n4 /var/www/www-root/data/command-every-second.sh /opt/php81/bin/php -f /var/www/www-root/data/www/example.ru/bitrix/php_interface/cron_events.php >/dev/null 2>&1
Утилиты nice и ionice устанавливаем отдельно под рутом, если не установлены. Утилиты используются для запуска агентов на кроне с более низким приоритетом, чем другие процессы на сервере.
Устанавливаем консольную утилиту для конвертации картинок в webp Оригинал: https://www.digitalocean.com/community/tutorials/how-to-create-and-serve-webp-images-to-speed-up-your-website В оригинале есть как настроить для Ubuntu и Rewrite для Apache через .htaccess Для случаев, когда используется оригинальное имя картинки, требуется изменение в формировании webp_path. Например, в одну директорию заливают photo.jpeg и photo.png разного содержания, на выходе получается photo.webp для png, а картики в jpeg как будто и не было. Скрипты и настройки ниже делались для проекта с уникальными названиями картинок.
Сборка redis.so для ispmanager 5 Для php 8.1, для других версий меняется путь /opt/php74/, /opt/php82/ и т.д. Релизы в репозиториях igbinary и phpredis подбираются под версию php.
wget https://github.com/igbinary/igbinary/archive/refs/tags/3.2.14.zip -O igbinary.zip
unzip -o ./igbinary.zip
cd igbinary-3.2.14/
/opt/php81/bin/phpize
./configure --with-php-config=/opt/php81/bin/php-config
make && make install
#Обязательное расширение
echo 'extension=igbinary.so' > /opt/php81/etc/php.d/igbinary.ini
wget https://github.com/phpredis/phpredis/archive/refs/tags/5.3.7.zip -O phpredis.zip
unzip -o ./phpredis.zip
cd phpredis-5.3.7/
/opt/php81/bin/phpize
./configure --with-php-config=/opt/php81/bin/php-config --enable-redis-igbinary
make && make install
echo 'extension=redis.so' > /opt/php81/etc/php.d/redis.ini
#Рестарт сервера php, в данном случае apache
systemctl restart httpd
В php_info() проверить, что у redis появился доступный метод сериализации
Добрый день! Подскажите, пожалуйста, кто-то сталкивался с проблемой, когда при внесении изменений в элемент ИБ слетают стили? Конкретно при сохранении или применении правок разделяется тег <style> и его уже невозможно поправить: Доступ: контент-менеджер
Примерная команда для создания символической ссылки local на другую папку, в вашем случае может быть другой путь.
# путь может отличаться на сервере
# не запускать из под root, лучше под своим пользователем.
# !! сайт битрикса добавил в путь пробел.
#ln -s ../. ./www/local local
Мы делали общую папку local, раздельные папки local. Пришли к решению:
- при добавлении нового сайта на разных доменах всегда делать общую папку local, вместе с bitrix и upload - с разными папками local админка работает по-разному, в зависимости от домена под которым зашли - разные $_SERVER["DOCUMENT_ROOT"] и разные local, - делать общую папку /local, чтобы в админке были списки шаблонов сайта, и Битрикс ничего не ломал при сохранении настроек сайта, чтобы срабатывали все обработчики событий в админке и подключались все модули.
Фактически, при добавлении второго сайта приходится дорабатывать первый сайт, чтобы он поддерживал многосайтовость. Это можно включать в оценку работ по дополнительному сайту.
- обработчики будут вызываться на всех сайтах. Надо делать проверки внутри обработчиков для каких сайтов обработчики. Например, Обработчики для авторизации по телефону должны иметь настройки для каких сайтов. - обработчики можно указывать для одного из сайтов в /local/php_interface/s1/init.php, где s1 - id сайта , но в админке этот обработчик из /s1/init/php не вызовется - свои модули дорабатывать, чтобы поддерживали многосайтовость, если мешают работать одному из сайтов. - доработка модуля из маркетплейса, если не наш, - поменять версию с 1.1.0 на 1001.1.0, чтобы не обновлялся. Поменять название и описание, что модуль изменён и что в нём изменено. В будущем самостоятельно следить за модулем и его обновлениями, - шаблоны и классы, если они относятся только к одному сайту назвать с именем сайта в папке local. - шаблоны компонентов или сайтов с одинаковым именем переименовывать. Избегать имён шаблонов компонентов .default в шаблоне сайта .default - обработчики связанные с почтовыми шаблонами должны понимать для какого сайта обрабатывается письмо
Общая папка local избавляет от кучи проблем. Правда, создаются новые проблемы. Непонятно, к какому из двух сайтов относится общий код - желательно комментировать или переименовать. Но это лучше, чем неправильно работающая админка.
Здравствуйте, подскажите пожалуйста. Решил познакомиться с 1cbitrix и хочу научиться создавать свой шаблон с 0 для 1cbitrix. какие курсы и книги и другие источники информации посмоветуете?
Всем Доброго! Нужна помощь При использовании умного фильтра, не выдает результаты ,а окончание сайта filter/clear/apply/ ,при чем в каталоге он работает, а в другом разделе нет, есть ли идеи?
Расширение позволяет в два клика исключить директории кешей битрикса, а также директории upload и install. Файлы в исключенных директориях не индексируются, поэтому индексация проекта будет проходить быстрее. Также в автокомплите не будут подсказываться методы из install директорий модулей.
В Битрикс Управление Сайтом отсутствует возможность получения товаров которые указаны в правилах работы с корзиной, простыми словами товаров на которые применяются скидки. Написал класс для реализации такой возможности https://github.com/Cleverscript/ProductDiscount пользуйтесь, буду рад предложениям по доработке!
В 1С-Битрикс для уменьшения времени повторного создания страниц сайта используется механизм кеширования. Кеш позволит сохранить результат выполнения компонента - html шаблона, данные для заполнения метаданных страницы. Сайту не потребуется выполнять множество запросов к базе данных, расчет скидок и формирование шаблона на каждый хит.
Обратитесь в «Техдиректор» за помощью, если сталкиваетесь с проблемой долгого формирования страницы вашего сайта.
Методы создания кеша компонента
Для начала кеширования данных вызывается метод CBitrixComponent::StartResultCache(…) в качестве условия оператора if. Если данные в кеше актуальны, метод вернет false и тело оператора if будет пропущено.
Запись данных в кеш происходит при вывозе методов CBitrixComponent::EndResultCache() или CBitrixComponent::IncludeComponentTemplate(...). Метод должен быть расположен последним внутри блока if с вызовом метода CBitrixComponent::StartResultCache(…).
Пример кеширования с html-шаблоном:
if ($this->StartResultCache($arParams['CACHE_TIME'], [ ...$additionalCacheId ]))
{
// загрузка данных
$this->IncludeComponentTemplate(); // кеширование $arResult и html-шаблона
}
// установка мета-данных страницы
Пример кеширования только $arResult:
if ($this->StartResultCache($arParams['CACHE_TIME'], [ ...$additionalCacheId ]))
{
// загрузка данных $arResult для кеширования
$this->EndResultCache(); // кеширование только $arResult
}
// обработка запроса пользователя
$this->IncludeComponentTemplate();
HTML-шаблон одинаков для большой группы пользователей
Пользователь может сделать выбор, ввести данные
Данные в кеше
HTML-шаблона, $arResult, $templateData
$arResult
Выполнение result_modifier.php и template.php
Один раз
Каждый хит
Параметры запроса $_REQUEST, $_GET, $_POST, $_SESSION, $USER в result_modifier.php и template.php
Передавать в параметрах вызова компонента $arParams с приведением значения по допустимому списку вариантов.
Пример - вариант отображения списка или сортировка.
Без ограничений. Для вывода использовать функцию htmlspecialcharsbx() (уязвимость XSS).
Рекомендуется использовать данные $arResult.
Глобальные переменные (например, $APPLICATION) в result_modifier.php и template.php
Сохранить данные в $arResult или $templateData. Выполнить в component_epilog.php ^1.
Например, установка заголовка страницы ^2.
Без ограничений
Кеширование дополнительной выборки в result_modifier.php и template.php
Не требуется
Требуется
^1 - для вложенных компонентов component_epilog.php выполнится, если при вызове [$APPLICATION->IncludeComponent(...)](https://dev.1c-bitrix.ru/api_help/main/reference/cmain/includecomponent.php) передан аргумент $parentComponent. ^2 - обратите внимание, после component_epilog.php будет выполнен код компонента, расположенный ниже вызова метода CBitrixComponent::IncludeComponentTemplate(...), поэтому для установки метаданных может потребоваться изменить $component->arResult, т.к. компонент выполнит функции позже и переопределить глобально установленные значения.
Хранение кеша
Путь к файлу кеша формируется из директории кеша и md5-хеша идентификатора кеша.
По умолчанию директория кеша выглядит как bitrix/cache/{siteId}/{relativeComponentPath}/{salt} (например, bitrix/cache/s1/bitrix/catalog.smart.filter/59d). Переопределить директорию кеша компонента можно, передав аргумент $cachePath для метода CBitrixComponent::StartResultCache(…).
Идентификатор кеша, позволяет отличить файл кеша для вызова компонента в разных областях страницы и параметрах окружения. По умолчанию зависит от значений всех параметров компонента, идентификатора сайта, языка, шаблона сайта, временной зоны и порядковому номеру вызова на странице данного компонента. Разработчик может добавить собственные аргументы в идентификатор кеша, передав аргумент $additionalCacheID для метода CBitrixComponent::StartResultCache(…) (например, группы пользователя в зависимости от параметра CACHE_GROUPS).
Идентификатор кеша формируется в методе CBitrixComponent::GetCacheID(), может быть переопределен в собственном компоненте. В стандартных компонентах метод GetCacheID изменен только в компонентах bitrix:menu и bitrix:intranet.contact_center.list.
В качестве хранения системы хранения кеша можно выбрать Memcached или Redis. Обратите внимание, не рекомендуется использовать динамический sid для сайтов с многосайтовостью. Возможна проблема сброса кеша только по одному ключу sid.
Время кеширования
Время кеширования для компонентов с поддержкой тегированного кеша можно выбрать достаточно большим (например, один день). В случае изменения данных 1С-Битрикс автоматически отметит связанный кеш для удаления. По умолчанию при выборке данных из инфоблока [CIBlockResult::Fetch()](https://bxapi.ru/src/?module_id=iblock&name=CIBlockResult%3A%3AFetch) регистрируется тег инфоблока, поэтому вызов $CACHE_MANAGER->RegisterTag(...) необязателен. Стоить обратить внимание, что тег кеша скидок не регистрируется, поэтому при изменении скидок потребуется сбросить кеш вручную.
Особенность тегированного кеша 1С-Битрикс состоит в том, что при изменении любого товара, происходит сброс кеша всего каталога. Что приводит к проблеме, если при максимальной активности посетителей, изменения товаров происходят с периодичностью несколько раз в минуту. В таком случае рекомендуем выбрать время кеширования от 10 минут до 1 часа и отключить автоматическое тегирование перед вызовом компонента каталога.
В кеше стоит хранить компоненты на часто посещаемых страницах сайта и одинаковых для большой группы пользователей. Поэтому:
Кеширование при установленном фильтре (параметр CACHE_FILTER) стоит отключить по умолчанию. Включать, если используете дополнительный фильтр по умолчанию (заполняете $GLOBALS[$arParams['FILTER_NAME']]) и не выбраны дополнительные условия в смарт-фильтре. Также стоит включить CACHE_FILTER для страниц, ссылки на которые размещены на странице раздела в качестве тегов или используются в рекламе.
Список товаров в поиске также не стоит кешировать, т.к. кеш будет разным для каждого уникального запроса пользователя.
В персональном разделе покупателя использовать кеширование компонентов по умолчанию не требуется.
Если в параметрах компонента передаете генерируемые данные, которые со временем больше не могут быть использованы. Например, в качестве параметра компонента используете результат функции date('Y-m-d'). В таком случае потребуется реализовать агент, который будет очищать устаревший кеш (на основе \Bitrix\Main\Data\Cache::clearCache(...)), чтобы избежать переполнения места на диске.
PHP Fatal error: Declaration of Bitrix\Main\Diag\Logger::log($level, Stringable|string $message, array $context = []): void must be compatible with Psr\Log\LoggerInterface::log($level, $message, array $context = []) in ..../bitrix/modules/main/lib/diag/logger.php
Столкнулись с ошибкой, которую не удается зафиксировать в exception_handling 1С-Битрикс. Происходит фатальное исключение при попытке записать исключение в лог.
Обратитесь в «Техдиректор» за помощью, если сталкиваетесь с проблемой на вашем проекте.
Причина: 1. В главном модуле обновился пакет psr/log - для аргументов функции добавлено указание типов. 2. Класс для логирования exception_handling (Bitrix\Main\Diag\Logger) теперь так же реализует интерфейс с типами аргументов. 3. В проекте может быть загружена старая версия psr/log (без указания типов). Например, в php_interface или стороннем модуле.
Как происходит: 1. Класс Psr\Log\LoggerInterface загружается из старой версии psr/log (пункт №3) 2. Exception_handling 1С-Битрикс загружает Bitrix\Main\Diag\Logger (пункт №2). 3. PHP выбрасывает исключение, т.к. Bitrix\Main\Diag\Logger сужает набор типов аргумента относительно интерфейса. В PHP при наследовании можно только расширять набор типов аргументов функции или сужать тип возвращаемого значения ^1.
Как найти ошибку, если ничего не выводится и exception_handling не работает: 1. Проверьте error_log веб-сервера или файл, указанный в php.ini для error_log. 2. В начале скрипта вставьте register_shutdown_function с выводом последней зарегистрированной ошибки. Если в браузере не получается вывести ошибку, заполните $_SERVER['DOCUMENT_ROOT'] и запустите скрипт через ssh.
//$_SERVER['DOCUMENT_ROOT'] = ....; use for cli
register_shutdown_function(function() {
print_r(error_get_last());
});
Как найти старую версию psr/log, если столкнулись с таким текстом ошибки: 1. Перед строкой с проблемой можно вставить (например, в init.php). Обратите внимание, может давать разный результат в зависимости от порядка автозагрузки классов
$reflection = new ReflectionClass(\Psr\Log\LoggerInterface::class);
echo $reflection->getFileName();
2. Выполнить через ssh в директории сайта grep -r "namespace Psr\\\\Log;" --include=*.php . 3. Оригинальный psr/log лежит в файле bitrix/modules/main/vendor/psr/log/src/LoggerInterface.php. Если нашли имеено его, воспользуйтесь вторым вариантом поиска.
Что делать: 1. Удалить папку со старым psr/log, если расположена вне модуля. 2. Если расположена внутри модуля, переименовать папку psr/log внутри модуля. Написать разработчикам модуля. 3. Проверить, что сайт продолжает работать. В командной PHP-строке административной панели выполнить throw new RuntimeException('dummy');, проверить результат в логе exception_handling.
Чтобы избежать конфликта, устанавливайте зависимости composer, отключая загрузку пакетов, которые уже есть в главном модуле с помощью параметра replace. Для поддержки старых версий модуля main, реализуйте условный загрузчик на примере модуля techdir.sentry.