Ищем в команду https://business-up.org/ на попроектную основу разработчика Bitrix, который сможет разрабатывать и поддерживать веб-приложения на платформе Bitrix.
Вот основной список задач, которые нужно будет выполнять:
Разработка сайтов на CMS (Bitrix\wordpress) и Framework. Отличное знание PHP8, MySQL, API «1C-Битрикс», HTML/CSS;
Поддержка и доработка существующих проектов
Интеграция с различными сервисами
Написание скриптов на Javascript (Ajax, BX)
Четкое следование ТЗ
Работать в команде, взаимодействовать с другими участниками команды
Соблюдать стандарты компании по оформлению кода
Работать с системой контроля версий git
Кто нам нужен:
Внимательный php разработчик, который готов выполнять поставленные задачи в срок, желательно с опытом Front-разработки. Business-up часто изучает новую информацию, пополняя и обновляя свои знания. Поэтому, нам важно расширять команду опытными, но открытыми к новому сотрудниками.
В нашей команде ты сможешь пользоваться преимуществами, которые описаны ниже:
IT-отсрочка
удаленка: можно работать откуда угодно
график 5/2 с 9 до 18 часов, но при необходимости часы работы подстроим под вас
оформление по ТК РФ: больничный, отпуск — всё как положено
крупные заказчики, интересные кейсы, нетривиальные задачи
профильные конференции: оплатим дорогу и участие
вечеринки и атмосфера: любим веселиться в офисе и за его пределами
Всем привет! Подскажите, пожалуйста, в битриксе при импорте из 1С порядок добавления фото в MORE_PHOTO соответствует порядку в xml-файле? https://disk.yandex.ru/d/fWOmgjudnL55iQ
Всем добрый рабочий день! Возникла проблема в силу малого опыта с вебом в принципе. Подскажите, пожалуйста, как правильно формируются гет-параметры при открытии модальных окон через ajax-запросы. Задача была создать функционал для предпросмотра информации о товарах в разделах каталога. В шаблоне вывода списка товаров добавил <span> с ссылкой на шаблон модального окна
Но при клике открывается модальное окно с сообщением "The requested content cannot be loaded. Please try again later." Я так понимаю, проблема именно в адресе запроса, но не могу его корректно настроить. При выводе гет-параметра через var_dump($_GET['ID']), понятное дело, отображается NULL.
В MySQL 8 поломались скрипты, которые определяли размер таблиц.
Переменная information_schema_stats_expiry теперь не 0, а 84600 по умолчанию. Информация из information_schema.tables обновляется раз в сутки.
Мы не знаем, что таблица большая или маленькая. Мы не можем из-за кеша адекватно оценить размер будущего бекапа. Мы не можем почистить переполненные таблицы.
Решение проблемы - надо сделать запрос SET SESSION information_schema_stats_expiry = 0; , перед тем, как читать таблицу.
Делать FLUSH TABLES и подобные манипуляции не нужно. Кеш для information_schema.tables - про другое
$connection = \Bitrix\Main\Application::getConnection($connection_name);
$database_name = $connection->getDatabase();
$query = "SET SESSION information_schema_stats_expiry = 0;";
$dbResult = $connection->query($query);
$query = "SEL ECT table_name AS table_name, data_length AS total_size, table_rows as table_rows
FR OM information_schema.tables WHERE table_schema = '$database_name' AND table_name = '$table_name';";
$rs = $connection->query($query);
$arInfo = $rs->fetch();
В примере выше добрый сайт битрикса вставил пробелы в слова sel ect и fr om. Надо без пробелов, конечно.
Добрый день, хотелось бы узнать какие версии битры чаще всего встречаются у клиентов. Хотим разработать свой плагин и выложить в маркетплейс. Вопрос в том с какой версии поддерживать своё решение для маркетплейса. По моему скоромному опыту на рынке остаётся ещё достаточно клиентов с версиями 22 года на php74+.
Приветствую! Как сделать, чтобы капча работала и у авторизованных пользователей? Мне нужно для компонента main.feedback сделать, чтобы капча показывалась всегда в том числе и для авторизованных пользователей, не только для гостей!
Здравствуйте, при использовании вебхука с локальным адресом и портом не приходят события (при публичном все работает). Есть ли возможность задать вебхук с локальным адресом и портом ? Быть может настройка сети в панели администратора. Спасибо
При операциях записи в ORM очень важно проверять получившийся результат.
Пример Warning
$result = \Bitrix\Catalog\Model\Price::delete($arFields["ID"]);
$result->__destruct();
// Warning. Потому что произошла ошибка, и не сделали $result->isSuccess(), $result->getErrors(), $result->getErrorMessages()
Warning: CAskaronMyTest: запрещено удалять значение цены in /bitrix/modules/main/lib/orm/data/result.php on line 87
Call Stack
# Time Memory Function Location
{main}( ) .../test5.php:0
Bitrix\Main\ORM\Data\Result->__destruct( ) .../test5.php:65
trigger_error( $message = 'CAskaronMyTest: запрещено удалять значение цены', $error_level = 512 ) .../result.php:87
Пример вызова - обработчик ORM D7 перед удалением значения цены
Warning получается если метод ORM вернул результат с ошибкой, и мы не проверили результат.
$eventManager = \Bitrix\Main\EventManager::getInstance();
$eventManager->addEventHandler("catalog", "Bitrix\\Catalog\\Model\\Price::OnBeforeDelete",
array("CAskaronMyTest", "PriceOnBeforeDelete"),
false,
50
);
class CAskaronMyTest {
public static function PriceOnBeforeDelete( \Bitrix\Main\Event $event )
{
$result = new \Bitrix\Main\Entity\EventResult();
$arErrors = array();
$arErrors[] = new \Bitrix\Main\Entity\EntityError(
__CLASS__.": запрещено удалять значение цены"
);
$result->setErrors($arErrors);
return $result;
}
}
// Удалить цены для товара
$PRODUCT_ID = 15709;
if ( \Bitrix\Main\Loader::includeModule( "catalog" ) )
{
$res = \Bitrix\Catalog\PriceTable::getList(
array(
"filter" => array(
"=PRODUCT_ID" => $PRODUCT_ID,
),
)
);
while ($arFields = $res->fetch())
{
$result = \Bitrix\Catalog\Model\Price::delete($arFields["ID"]);
$result->__destruct();
// Warning. Потому что произошла ошибка, и не сделали $result->isSuccess(), $result->getErrors(), $result->getErrorMessages()
}
}
Деструктор Bitrix\Main\ORM\Data\Result выкидывает Warning, если вернулась ошибка, и мы забыли сделать $result->isSuccess(), $result->getErrors() или $result->getErrorMessages()
Не забывайте проверять результат. Проблема не в том месте, где мы выкидываем ошибку. А в том месте, где мы не проверяем ошибку Bitrix\Main\ORM\Data\Result->__destruct( )
Так не будет Warning:
$result = \Bitrix\Catalog\Model\Price::delete( $arFields["ID"] );
if (!$result->isSuccess())
{
// нужна проверка isSuccess, чтобы не было Warning
// https://dev.1c-bitrix.ru/community/webdev/user/25773/blog/45090/
//echo "Ошибка";
//echo "<pre>"; print_r( $result->getErrors() ) ;echo "</pre>";
//echo "<pre>"; print_r( $result->getErrorMessages() ) ;echo "</pre>";
}
// $result->__destruct(); // не будет Warning
В документации эта ситуация упоминается, но считается редкой:
В предыдущих примерах есть нюанс: запрос на обновление данных вызывается без проверки результата. Если запрос не прошел из-за "проваленной" валидации, и не была вызвана проверка isSuccess(), система сгенерирует E_USER_WARNING со списком ошибок, который можно будет увидеть в логе сайта (если соответствующим образом настроить .settings.php).
Самое плохое, если Warning появляется при обмене с 1С, или при самодельном импорте/экспорте. В таких ситуациях, где мы не можем исправить чужой скрипт, вывод предупреждений на сайте надо отключить.
Работает по принципу прогрессивного улучшения (Progressive Enhancement) Базово имеем обычный компонент, улучшение идет за счет js-расширения. При открытии страницы компонент "устанавливает" js-расширение из шаблона. Бэкэнд для расширения находится в ajax.php компонента.
Преимущества: 1) Вся верстка и фразы к ней в шаблоне. 2) Индексируемая верстка. 3) Наличие фоллбэка. 4) Основной js и css не загружаются сразу, возможны триггеры гидратации верстки. 5) Основная часть js и css пишется с использованием готовых библиотек из npm, плагинов для сборки и т.д. 6) Сохраняется самодостаточность компонента.
Путь до трейта с функционалом копирования расширения для классов компонентов: /local/modules/my.helper/lib/component/extensions.php Использование трейта и модуля не обязательны. Преимущества появляются только при большом количестве компонентов и привычке оформлять код в модули.
При открытии страницы компонент копирует js-расширение из шаблона, если метка времени у расширения в шаблоне свежее, чем у расширения в папке /local/js/.
namespace My\Helper\Component;
use Bitrix\Main\Application;
use Bitrix\Main\IO;
use Bitrix\Main\IO\Directory;
use CBitrixComponent;
/**
* Добавляет компоненту функционал
* копирования расширения из шаблона в папку /local/js.
*/
trait Extensions
{
/**
* Преобразовывает класс компонента в часть пути для расширения.
* Пример: MyComponentClass в my/component/class
*/
protected function componentClassName2Path(): string
{
return strtolower(
preg_replace(
'/([A-Z])/',
'/$1', __CLASS__
)
);
}
/**
* Копирование расширений из директории /js/ шаблона компонента
* в директорию /local/js/ расширений.
* @return void
*/
public function installComponentExtensions(): void
{
/**
* @var $this CBitrixComponent
*/
$this->initComponentTemplate();
$template = $this->getTemplate();
if(!$template) return;
$path = $template->getFolder();
$serverRoot = Application::getDocumentRoot();
$templateJsPath = sprintf('%s%s/js', $serverRoot, $path);
$templateJsDir = new IO\Directory($templateJsPath);
try {
if(!$templateJsDir->isExists()) {
return;
}
$files = $templateJsDir->getChildren();
} catch (IO\FileNotFoundException) {
return;
}
/**
* @var IO\Directory|IO\File $extDir
*/
foreach ($files as $directory) {
if (!$directory->isDirectory()) continue;
/** @var IO\Directory $file */
$this->installComponentExtension($directory);
}
}
/**
* Копирует директорию в /local/js/my/component/class
* для компонента MyComponentClass.
* Получаем расширение my.component.class.dirname
* @param Directory $dir
* @return void
*/
public function installComponentExtension(IO\Directory $dir): void
{
$pathByTemplateJs = $dir->getName();
$pathByComponent = $this->componentClassName2Path();
$serverRoot = Application::getDocumentRoot();
$localDir = sprintf('%s/local/js/%s/%s',
$serverRoot,
$pathByComponent,
$pathByTemplateJs
);
$bundleTimestampFile = $dir->getPath() . '/.timestamp';
$localTimestampFile = $localDir . '/.timestamp';
$bundleTimestamp = (int)file_get_contents($bundleTimestampFile);
if($bundleTimestamp == 0) return;
$localTimestamp = (int)file_get_contents($localTimestampFile);
$isLocalNotExist = $localTimestamp == 0;
$isBundleNewer = !$isLocalNotExist && $localTimestamp < $bundleTimestamp;
if($isBundleNewer || $isLocalNotExist) {
copyDirFiles(
$dir->getPath(),
$localDir,
true,
true
);
}
}
}
Путь до класса компонента: /local/components/my/component.class/class.php
use My\Helper\Component\Extensions;
class MyComponentClass extends CBitrixComponent
{
// Трейт копирования расширения из шаблона компонента в /local/js/
use Extensions;
public function executeComponent()
{
// Функция из трейта.
$this->installComponentExtensions();
$this->includeComponentTemplate();
}
}
Расширение должно находится в директории /js/ шаблона компонента. Конфиг для утилиты-сборщика bitrix: /local/components/my/component/templates/.default/js/v1/bundle.config.js Сборка командой: bitrix build
Путь до конфига расширения: /local/components/my/component/templates/.default/js/v1/config.php
<?php if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED !== true) die();
// my/component/class - название компонента.
// v1 - директория с расширением в директории /js/ шаблона компонента, в данном случае название равно версии расширения.
// dist/callback.bundle.js путь из конфига bundle.config.js для сборщика bitrix.
return [
'css' => '/local/js/my/component/class/v1/dist/callback.bundle.css',
'js' => '/local/js/my/component/class/v1/dist/callback.bundle.js',
'rel' => [],
'skip_core' => true,
];
Путь до шаблона компонента: /local/components/my/component/templates/.default/template.php Содержит индексируемую верстку, заглушку, точку для монтирования и т.д.
<?php if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED !== true) die();
use Bitrix\Main\Application;
use Bitrix\Main\Localization\Loc;
// Чтобы использовать один файл фраз для js-расширения и шаблона.
$extLangFile = Application::getDocumentRoot() . $templateFolder . '/js/v1/config.php';
Loc::loadLanguageFile($extLangFile);
?>
<!-- Точка монтирования расширения -->
<div
data-catalog-callback
data-callback-hash="#call_me"
data-callback-fallback-url="mailto:mail@example.com"
hidden
></div>
<!-- Ссылка не активна до монтирования или отработки фоллбэка -->
<a href="#call_me" class="disabled">
<?= Loc::getMessage('MY_COMPONENT_CLASS_CALL_ME') ?>
</a>
Путь до js с логикой монтирования и фоллбэка: /local/components/my/component/templates/.default/script.js
...
// Выше поиск точки монтирования, сбор параметров и триггеры монтирования.
// Обязательная часть.
// Итоговое название расширения для загрузки:
// 1) название класса компонента MyComponentClass записываем как my.component.class.
// 2) добавляем название директории v1 с расширением из /js/ шаблона.
BX.loadExt('my.component.class.v1').then(function(exports) {
try {
// BX.Catalog - неймспейс из bundle.config.js
// Callback - название класса расширения.
new BX.Catalog.Callback({
el: node, // Нода в DOM c атрибутом data-catalog-callback
hash: hash, // Значение атрибута data-callback-hash
});
// Расширение готово к использованию.
$('[href="' + hash + '"]').removeClass('disabled');
} catch (e) {
showFallBack();
}
});
// Ниже функция фоллбэка.
...
Путь до класса расширения: /local/components/my/component/templates/.default/js/v1/src/index.js Часть пути src/index.js задается в bundle.config.js, ключ input.
import {Type} from 'main.core';
import {Vue} from 'ui.vue';
import app from './App.vue';
export class Callback
{
constructor(options)
{
const {
el,
hash,
} = options;
Vue.create({
el,
data: () => ({
hash,
}),
components: {
'catalog-callback-wrapper': app,
},
template: `<catalog-callback-wrapper :hash="hash"/>`
})
}
}
Путь до файла с миксином фраз: /local/components/my/component/templates/.default/js/v1/src/localize.js Главное правило относительно фраз: не возвращать фразы с бэкэнда. Бэкэнд должен присылать только коды фраз.
Путь до файла с фразами: /local/components/my/component/templates/.default/js/v1/lang/ru/config.php
<?php
$MESS['MY_COMPONENT_CLASS_CALL_ME'] = 'Перезвони мне';
$MESS['MY_COMPONENT_CLASS_INTRO'] = 'Оставьте свой номер телефона и мы свяжемся с вами в рабочее время';
$MESS['MY_COMPONENT_CLASS_INTRO_OFFICE_OPEN'] = 'Оставьте свой номер телефона и мы свяжемся с вами в течение 15 минут';
Путь до класса контроллера смонтированного расширения: /local/components/my/component.class/ajax.php
namespace My\Components\Controllers;
use Bitrix\Main\Engine;
class CatalogCallback extends Engine\JsonController
{
public function isOfficeOpenAction()
{
$isOpen = date('H') > 10 && date('H') < 20;
return [
// Возвращаем коды фраз.
'resultCode' => $isOpen ? 'INTRO_OFFICE_OPEN' : 'INTRO'
];
}
}
Nostalgie en Direct : Plongez dans l'univers intemporel de la musique
La musique a ce pouvoir magique de nous transporter dans le temps, de réveiller des souvenirs enfouis et de nous faire revivre des moments précieux. Si vous êtes un amoureux des grands classiques,
Битрикс больше не вызывает метод ShowTaskForm из действий (активити) бизнес-процессов на странице выполнения задания. Последняя версия, где работало 24.200.0. Раньше мы могли скопировать активити и сделать своё кастомное действие с формой.
В форме мы могли рисовать свои собственные поля, в том числе таблицы полей. Могли делать вычисления одних полей из других полей и т. п.
В приложении картинка, как выглядело для пользователя Продление командировки, чтобы он заполнил форму прямо в задании.
Последняя версия, в которой работало:
Бизнес-процессы (bizproc) 24.200.0 от 10.04.2024
Далее от bizproc 24.200.0 зависят модули, которые тоже нельзя обновлять выше версий:
Дизайнер бизнес-процессов (bizprocdesigner) 24.600.0 от 28.10.2024
Мобильные бизнес-процессы (bizprocmobile) 24.200.0 от 10.04.2024
CRM (crm) 24.1000.0 от 01.11.2024
Теперь Битрикс предлагает свои активити (запрос дополнительной информации и запрос дополнительной информации с отклонением). Формы активити содержат типовые поля переменных бизнес-процесса, но влезть туда со своим кодом нельзя.
Есть вариант добавить форму, если исправить шаблоны компонентов Битрикс, или с помощью javascript что-то дорисовать. Но это только до следующего обновления, потом придётся восстанавливать.
Тестовый бизнес-процесс:
На новых версиях единственный способ более-менее стандартный, но ужасно некрасивый - в описании задания просить пользователя перейти по ссылке, где-то в другом месте заполнить нашу форму.
Пример текста задания для активити «Утверждение документа»:
Наш документ: {=System:HostUrl}{{=getdocumenturl()}}
1. Перейдите по ссылке и заполните форму для дополнительных сведений к документу:
{=System:HostUrl}/askaron/test.php?ELEMENT_ID={{ID элемента}}&WORKFLOW_ID={=Workflow:ID}
2. После заполнения формы нажмите «Утвердить дополнительные сведения к документу» в этой форме.
На своей странице /askaron/test.php мы рисуем свою форму, которая что-то куда-то сохраняет. Потом в бизнес-процессе мы должны эту информацию прочитать.
В приложении картинки тестового процесса, как можно сделать по-новому.
Сегодня узнал очень простой способ запустить сайт на Битрикс в режиме php-fpm (Когда из веб-сервера только nginx и php) для пользователей хостинг-панели ISPManager. Он поможет запустить, думаю, 95% сайтов на битриксе где используются стандартные роуты. Если роуты кастомные, конфиг уже придется дорабатывать. Для этого в панели ISPManager заходим в настройки нужного сайта и переключаем режим работы в FastCGI (Nginx+PHP-FPM). Далее в списке сайтов выделяем галочкой сайт который только что отредактировали и нажимаем на кнопку "Конфиг. файлы". В открывшемся редакторе ищем строку:
Сохраняем изменения и пересохраняем настройки сайта для применения изменений. Заходим на сайт проверяем что все работает. Если выдается ошибка "Forbidden" - в настройках сайта в секции "Индексная страница" указываем index.php.
Пример использования метода 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С будет состоять из четко определенных шагов по передаче данных между системами, обеспечивая гибкость и масштабируемость интеграции.