Битрикс: ConvertDateTime и ConvertTimeStamp, первая публикация и JSON карты (id и url)
Страница-шпаргалка «Различные полезности» на сводит к коротким примерам работы с датой через API главного модуля. Ниже — тот же смысл своими словами: когда хватает ConvertDateTime и ConvertTimeStamp, а когда удобнее DateTime; плюс практичная связка с инфоблоками: строки активности, ответ AJAX после первого сохранения и JSON для карты. Подробный разбор форматов полей и интервалов — в материале о работе с датой в Битрикс, фильтры по границам показа — в заметке про условия фильтрации по датам.
ConvertDateTime: из строки сайта в нужный формат
ConvertDateTime берёт дату-время в «формате сайта» (как его хранит платформа для полей вроде ACTIVE_FROM) и возвращает строку в шаблоне, который вы задаёте вторым аргументом; третий параметр — язык формата (ru и т.д.). Для выгрузки в SQL или API часто нужен YYYY-MM-DD:
ConvertDateTime($item['ACTIVE_FROM'], 'YYYY-MM-DD', 'ru');
Тот же результат можно получить через Unix-метку и date(), если явно согласовать разбор входной строки с тем, как она приходит из выборки:
date('d.m.y', strtotime($item['ACTIVE_FROM']));
Смысл один: не хранить вручную «угадай формат», а либо опираться на API конвертации, либо один раз зафиксировать шаблон разбора под ваш проект.
ConvertTimeStamp: из Unix в строку сайта
ConvertTimeStamp переводит Unix-время в строку в формате сайта. Полный вывод с датой и временем:
ConvertTimeStamp(time(), 'FULL');
Эквивалент на DateTime — задать тот же шаблон, что использует публичная часть (часто это форматы из языковых файлов; для иллюстрации фиксируют константу):
const BITRIX_DATETIME_FORMAT = 'd.m.Y H:i:s';
$date = new DateTime();
$date->format(self::BITRIX_DATETIME_FORMAT);
Первая публикация элемента: когда появляются id и url
Пока запись в b_iblock_element не создана успешным CIBlockElement::Add() (или эквивалентом через ORM), постоянного числового идентификатора нет — в интерфейсе и в JSON до ответа сервера не нужно «придумывать» id. После сохранения обработчик может сразу вернуть пару id и готовую детальную ссылку из выборки:
use Bitrix\Main\Web\Json;
$element = new CIBlockElement();
$newId = (int) $element->Add([
'IBLOCK_ID' => $iblockId,
'NAME' => $title,
'ACTIVE' => 'Y',
]);
if ($newId <= 0) {
echo Json::encode(['ok' => false, 'error' => $element->LAST_ERROR]);
return;
}
$row = CIBlockElement::GetList(
[],
['ID' => $newId, 'IBLOCK_ID' => $iblockId],
false,
['nTopCount' => 1],
['ID', 'DETAIL_PAGE_URL']
)->Fetch();
echo Json::encode([
'ok' => true,
'id' => $newId,
'url' => (string) ($row['DETAIL_PAGE_URL'] ?? ''),
]);
Фронт после первой успешной записи получает и стабильный id, и ЧПУ карточки, а не заглушку «до HTTP 200».
Карта: тот же контракт id + url
Для меток на карте обычно добавляют координаты; для ссылки «подробнее» из подписи достаточно тех же id и url. Пример выборки активных элементов с заполненными свойствами широты и долготы и отдачи JSON (имена свойств подставьте под свой инфоблок):
use Bitrix\Main\Web\Json;
$markers = [];
$res = CIBlockElement::GetList(
['SORT' => 'ASC'],
[
'IBLOCK_ID' => $mapIblockId,
'ACTIVE' => 'Y',
'!PROPERTY_MAP_LAT' => false,
'!PROPERTY_MAP_LNG' => false,
],
false,
false,
['ID', 'DETAIL_PAGE_URL', 'PROPERTY_MAP_LAT', 'PROPERTY_MAP_LNG']
);
while ($row = $res->GetNext()) {
$lat = trim((string) $row['PROPERTY_MAP_LAT_VALUE']);
$lng = trim((string) $row['PROPERTY_MAP_LNG_VALUE']);
if ($lat === '' || $lng === '') {
continue;
}
$path = (string) $row['DETAIL_PAGE_URL'];
$absolute = $path;
if ($path !== '' && defined('SITE_SERVER_NAME') && SITE_SERVER_NAME && strpos($path, 'http') !== 0) {
$absolute = 'https://' . SITE_SERVER_NAME . $path;
}
$markers[] = [
'id' => (int) $row['ID'],
'url' => $absolute,
'lat' => (float) $lat,
'lng' => (float) $lng,
];
}
header('Content-Type: application/json; charset=UTF-8');
echo Json::encode($markers);
Если в виджете нужны только пары id и url без координат, уберите свойства и соответствующие поля массива.
Краткий чеклист
ConvertDateTime— строка в формате сайта → ваша строка по шаблону;ConvertTimeStamp— Unix → строка сайта.- До успешного создания элемента постоянного
idв базе нет. - После
Addв типовом AJAX отдайте минимумidиDETAIL_PAGE_URL; для карты добавьте координаты в тот же JSON, который читает сценарий карты.
Не хотите копаться сами?
Починю за 1-3 дня. Без предоплаты — оплата по результату.
15+ лет опыта с 1С-Битрикс · Без предоплаты · 7 дней гарантии