Setting up Yandex.Directory for 1C-Bitrix

Our company is engaged in the development, support and maintenance of Bitrix and Bitrix24 solutions of any complexity. From simple one-page sites to complex online stores, CRM systems with 1C and telephony integration. The experience of developers is confirmed by certificates from the vendor.
Our competencies:
Development stages
Latest works
  • image_website-b2b-advance_0.png
    B2B ADVANCE company website development
    1212
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Website development for FIXPER company
    815
  • image_bitrix-bitrix-24-1c_development_of_an_online_appointment_booking_widget_for_a_medical_center_594_0.webp
    Development based on Bitrix, Bitrix24, 1C for the company Development of an Online Appointment Booking Widget for a Medical Center
    565
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Development based on 1C Enterprise for MIRSANBEL
    747
  • image_crm_dolbimby_434_0.webp
    Website development on CRM Bitrix24 for DOLBIMBY
    657
  • image_crm_technotorgcomplex_453_0.webp
    Development based on Bitrix24 for the company TECHNOTORGKOMPLEKS
    980

Configuring Yandex Business Directory for 1C-Bitrix

Yandex Business Directory is a data source for an organization card in Yandex Maps, search, and other services. The problem with most Bitrix sites: organization data is scattered — phone in one template place, address in another, working hours nowhere, and NAP (Name, Address, Phone) on the site doesn't match Directory data. Search engines use NAP consistency as a local ranking signal.

Structured Data LocalBusiness in Bitrix

Before working with the Directory, you need to handle markup on the site itself. Schema.org LocalBusiness is what the search engine scans and compares with aggregator data. In Bitrix, markup is added to template or component.

Organization data is best stored in site settings or a "Contacts" infoblock — not hardcoded in template:

// Get data from "Contacts" infoblock
$contacts = \CIBlockElement::GetList(
    [],
    ['IBLOCK_CODE' => 'contacts', 'ACTIVE' => 'Y'],
    false,
    ['nTopCount' => 1],
    ['ID', 'NAME', 'PROPERTY_PHONE', 'PROPERTY_ADDRESS', 'PROPERTY_HOURS']
)->GetNextElement()->GetFields();

JSON-LD in template's footer.php:

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "LocalBusiness",
  "name": "<?= htmlspecialcharsEx($siteName) ?>",
  "telephone": "<?= htmlspecialcharsEx($contacts['PROPERTY_PHONE_VALUE']) ?>",
  "address": {
    "@type": "PostalAddress",
    "streetAddress": "<?= htmlspecialcharsEx($contacts['PROPERTY_ADDRESS_VALUE']) ?>",
    "addressLocality": "Moscow",
    "addressCountry": "RU"
  },
  "openingHours": "<?= htmlspecialcharsEx($contacts['PROPERTY_HOURS_VALUE']) ?>",
  "url": "https://<?= SITE_SERVER_NAME ?>"
}
</script>

Automatic Synchronization with Directory API

Yandex Business Directory has an API for bulk organization management. For a site with one location, this is excessive, but for a network of stores — mandatory. The API works via REST:

POST https://api.business.yandex.net/v1/companies/{company_id}
Authorization: OAuth {token}
Content-Type: application/json

{
  "name": "Name",
  "phones": [{"number": "+7 495 123-45-67"}],
  "address": {
    "country_code": "RU",
    "locality": "Moscow",
    "street": "Tverskaya",
    "housenumber": "1"
  },
  "work_intervals": [
    {"day": "MON", "time_minutes_begin": 540, "time_minutes_end": 1200}
  ]
}

In Bitrix, synchronization runs via agent when data in the infoblock changes — via OnAfterIBlockElementUpdate event.

Map Widget on Site

Yandex Maps are embedded via API or standard iframe widget. For Bitrix, it's recommended to use Yandex Maps JavaScript API with lazy loading — map loads only when user scrolls to it:

const mapSection = document.getElementById('yandex-map');
const observer = new IntersectionObserver((entries) => {
    if (entries[0].isIntersecting) {
        loadYandexMap();
        observer.disconnect();
    }
}, { threshold: 0.1 });
observer.observe(mapSection);

function loadYandexMap() {
    const script = document.createElement('script');
    script.src = 'https://api-maps.yandex.ru/2.1/?lang=en_US&apikey=YOUR_KEY';
    script.onload = initMap;
    document.head.appendChild(script);
}

This prevents loading 300KB of Yandex Maps JavaScript API on every "Contacts" page visit.

Monitoring Data Relevance

After synchronization, Directory data passes moderation — from several hours to several days. To automatically check alignment between the site and Directory, use https://yandex.com/maps/org/{company_id}/info/ — compare data programmatically or manually once a month. Discrepancy in phone, address, or working hours between site and Directory negatively affects local SEO.