Сравнение версий

Ключ

  • Эта строка добавлена.
  • Эта строка удалена.
  • Изменено форматирование.

Якорь
------crm4dev1575
------crm4dev1575
Инструкция: структура фида Обмен с

...

сайтами 

Якорь
Назначение

Документ описывает, как в CRM 4DEV формируется JSON-фид для сайта через механизм Дев_ОбменССайтомОнлайн, какие поля попадают в структуру и откуда они берутся в 1С.

...

Важно: в origin/release, коммит f68bf6a61 CRM4DEV-1575, на момент проверки поле ceiling_height еще отличается: в JSON-ключе есть пробел в конце ("ceiling_height "). В origin/develop это исправлено на "ceiling_height".

Якорь
--
--
Где находится код

Основная логика формирования фида:

...

  • ПолучитьДанные_ОбменССайтомОнлайн(Запрос) - проверяет name, token, вызывает формирование данных и возвращает HTTP-ответ.
  • ВыполнитьФормированиеДанных_ОбменССайтомОнлайн(УзелОбмена) - собирает итоговую JSON-структуру.
  • ПодготовитьДанныеДляВыгрузки_ОбменССайтомОнлайн(Параметры) - получает данные через СКД и дополнительные пакетные запросы.
  • ДобавитьЗапросыВПакет(ТекстЗапроса, Параметры) - добавляет к основному СКД-запросу выборки цен, скидок, доп. свойств, файлов и итогового дерева.
  • ПолучитьСтруктуру_Район, ПолучитьСтруктуру_Объект, ПолучитьСтруктуру_Секция, ПолучитьСтруктуру_ОН, ПолучитьСтруктуру_Балкон, ПолучитьСтруктуру_Цены, ПолучитьСтруктуру_Скидка, ПолучитьСтруктуру_Свойства - задают состав JSON-объектов.

Якорь
endpoint
endpoint
Endpoint

HTTP-сервис: RestApi.

URL-шаблон: /feeds/{ИмяМетода}.

...

Для получения фида используется:

Блок кода
languagenone
themeDefault
languagenone
GET /feeds/feeds?name=<НаименованиеУзлаОбмена>
token: <ТокенУзлаОбмена>

Параметры:

ПараметрГде передаетсяНазначение
namequery stringНаименование узла плана обмена Дев_ОбменССайтомОнлайн. По нему выполняется ПланыОбмена.Дев_ОбменССайтомОнлайн.НайтиПоНаименованию(name)
tokenHTTP-заголовок token; если заголовка нет, проверяется тело запросаСравнивается с реквизитом Токен найденного узла обмена

Ответ всегда оборачивается через СтрокаОтвета:

Блок кода
languagejson
themeDefault
languagejson
{
  "data": {},
  "success": true,
  "err_msg": ""
}

При ошибках:

УсловиеHTTP-кодsuccesserr_msg
Узел обмена не найден по name405falseWrong name : "..."
Токен не заполнен или не совпал405falseWrong token
Ошибка формирования/сериализации500falseПодробное представление ошибки 1С

Дальше в документе описана структура внутри data.

Якорь
--json
--json
Общая структура JSON

Блок кода
language
languagejson
themeDefaultjson
{
  "data": {
    "complexes": [
      {
        "id": "...",
        "name": "...",
        "company": "...",
        "city": "...",
        "images": ["..."],
        "buildings": [
          {
            "id": "...",
            "name": "...",
            "address": "...",
            "floor_cnt": 0,
            "commissioning_period": "2026-12-31T00:00:00",
            "construction_completion": "2026-09-30T00:00:00",
            "sections": [
              {
                "id": "...",
                "name": "Секция 2",
                "flats": [
                  {
                    "id": "...",
                    "name": "...",
                    "section": "...",
                    "building": "...",
                    "complexe": "...",
                    "prices": [],
                    "discounts": [],
                    "additional_properties": []
                  }
                ]
              }
            ]
          }
        ]
      }
    ]
  },
  "success": true,
  "err_msg": ""
}

...

  1. complexes[] - районы строительства.
  2. complexes[].buildings[] - объекты строительства внутри района.
  3. complexes[].buildings[].sections[] - секции объекта строительства.
  4. complexes[].buildings[].sections[].flats[] - лоты / объекты недвижимости.

Якорь
--
--
Как выбираются данные

Основной набор данных строится через СКД СхемаВыгрузкиДанных плана обмена Дев_ОбменССайтомОнлайн.

...

  • доп. свойства из табличной части узла обмена ДополнительныеРеквизитыСведения и значений объекта недвижимости;
  • присоединенные файлы объектов недвижимости;
  • присоединенные файлы районов строительства;
  • скидки/наценки;
  • связанные объекты;
  • все фактические цены по объекту недвижимости;
  • итоговое дерево Район -> Объект -> Секция -> ОбъектНедвижимости.

Якорь
complexes--
complexes--
complexes[]: район строительства

Источник уровня: СтрокаРайон из итогового дерева ДеревоДанных.

JSON-полеТипИсточник 1СЗначение
idstringXMLСтрока(СтрокаРайон.Район)Уникальный идентификатор района строительства
namestringСтрокаРайон.РайонНаименование = ВремНедвижимость.Район.НаименованиеНаименование района
companystringСтрокаРайон.СобственникНаименованиеСобственник района/объектов, подтянутый из регистра собственников
citystringСтрокаРайон.РайонГородНаименование = ЕСТЬNULL(ВремНедвижимость.Район.Город.Наименование, "")Город района
imagesarray[string]РайоныСтроительстваПрисоединенныеФайлы.ОписаниеURL/описания файлов района. Берутся только если включена выгрузка файлов
buildingsarray[object]Вложенные строки итогов по объектам строительстваОбъекты строительства района

Якорь
buildings----
buildings----
buildings[]: объект строительства / корпус

Источник уровня: СтрокаОбъект из итогового дерева.

JSON-полеТипИсточник 1СЗначение
idstringXMLСтрока(СтрокаОбъект.Объект)Уникальный идентификатор объекта строительства
namestringСтрокаОбъект.ОбъектНаименование = ВремНедвижимость.Объект.НаименованиеНаименование объекта/корпуса
addressstringСтрокаОбъект.СтроительныйАдрес = ПОДСТРОКА(ВремНедвижимость.Объект.СтроительныйАдрес, 1, 1000)Строительный адрес
floor_cntnumber/stringСтрокаОбъект.КоличествоЭтажей = ВремНедвижимость.Объект.КоличествоЭтажейКоличество этажей объекта строительства
commissioning_periodISO date stringЗаписатьДатуJSON(СтрокаОбъект.СрокВводаВЭксплуатацию, ФорматДатыJSON.ISO)Срок ввода в эксплуатацию
construction_completionISO date stringЗаписатьДатуJSON(СтрокаОбъект.СрокОкончанияСтроительства, ФорматДатыJSON.ISO)Срок окончания строительства
sectionsarray[object]Вложенные строки итогов по секциямСекции объекта строительства

Якорь
-commissioningperiod--constructioncompletion
-commissioningperiod--constructioncompletion
Разница commissioning_period и construction_completion

commissioning_period = реквизит объекта строительства СрокВводаВЭксплуатацию.

...

Отдельно: в другом описательном API в коде встречается поле construction_completion_date, но в данном фиде используется именно construction_completion.

Якорь
sections-
sections-
sections[]: секция

Источник уровня: СтрокаСекция из итогового дерева.

JSON-полеТипИсточник 1СЗначение
idstringXMLСтрока(СтрокаСекция.Секция)Уникальный идентификатор секции
namestringСтрокаСекция.СекцияНаименование = ВремНедвижимость.Секция.НаименованиеНаименование секции, например Секция 2
flatsarray[object]Вложенные строки объектов недвижимостиЛоты секции

Отдельного поля с номером секции в текущей структуре нет. Сейчас сайт может получить номер только из name, например из строки Секция 2. Это хрупко: если наименование станет 2 секция, Блок А, Секция 2А, парсинг на сайте сломается.

Рекомендация: добавить в ПолучитьСтруктуру_Секция() отдельное поле, например number, и заполнять его из отдельного реквизита секции, если такой реквизит есть в справочнике секций. Если отдельного реквизита нет, лучше добавить его в 1С, а не парсить номер из наименования.

Якорь
flats----
flats----
flats[]: объект недвижимости / лот

Источник уровня: СтрокаОН из итогового дерева.

JSON-полеТипИсточник 1СЗначение
idstringXMLСтрока(СтрокаОН.ОбъектНедвижимости.УникальныйИдентификатор())Уникальный идентификатор лота
namestringСтрокаОН.ОбъектНедвижимостиНаименование = ВремНедвижимость.ОбъектНедвижимости.НаименованиеНаименование объекта недвижимости
sectionstringСтруктура_Секция.idID секции
buildingstringСтруктура_Объект.idID объекта строительства
complexestringСтруктура_Район.idID района. Важно: ключ называется complexe, не complex
descriptionstringСтрокаОН.ОбъектНедвижимостиОписание = ПОДСТРОКА(ВремНедвижимость.ОбъектНедвижимости.Описание, 1, 1000)Описание лота
tagsarray[string]РегистрСведений.ТегиОбъектовНедвижимости, поле Тег.НаименованиеТеги объекта недвижимости
object_typestringСтрокаОН.ОбъектНедвижимостиВидНедвижимости = ЕСТЬNULL(ВидНедвижимости.Представление, "")Вид недвижимости текстом
typestringXMLСтрока(СтрокаОН.ОбъектНедвижимостиТипНедвижимости)Тип недвижимости ссылкой/идентификатором
floornumber/stringСтрокаОН.ЭтажЭтаж
floor_numbernumber/stringСтрокаОН.НомерНаЭтажеНомер на этаже
number_of_objectstringСтрокаОН.НомерУсловныйУсловный номер лота
rooms_countnumber/stringСтрокаОН.КоличествоКомнатКоличество комнат
kitchen_areanumber/stringСтрокаОН.ПлощадьКухниПлощадь кухни
project_areanumber/stringСтрокаОН.ОбщаяПлощадьПроектнаяОбщая проектная площадь
bti_areanumber/stringСтрокаОН.ОбщаяПлощадьБТИОбщая площадь БТИ
areanumber/stringСтрокаОН.ПриведеннаяПлощадьПриведенная площадь. Если БТИ-приведенная площадь не заполнена, берется проектная приведенная площадь
azimutnumber/stringСтрокаОН.АзимутАзимут
Balconiesarray[object]Табличная часть объекта недвижимости БалконыБалконы/лоджии лота. Важно: ключ начинается с заглавной буквы
decorationstringXMLСтрока(СтрокаОН.ОтделкаНаименование)Наименование отделки
living_areanumber/stringСтрокаОН.ЖилаяПлощадьЖилая площадь. Если жилая БТИ не заполнена, берется проектная жилая площадь
type_planstringXMLСтрока(СтрокаОН.ТипПланировки)Тип планировки
livingroom_areanumber/stringСтрокаОН.ПлощадьГостинаяПлощадь гостиной
canteen_areanumber/stringСтрокаОН.ПлощадьКухниБТИПлощадь кухни БТИ; если БТИ = 0, берется ПлощадьКухни
status_detailstringXMLСтрока(СтрокаОН.СтатусНедвижимости)Статус недвижимости
object_planesarray[string]ПланировкиСервер.ПолучитьВсеИзображения(...).ПланКвартирыИзображения плана квартиры
integr_planesarray[string]ПланировкиСервер.ПолучитьВсеИзображения(...).ПланДляИнтеграцийПланировки для интеграций
floor_planesarray[string]ПланировкиСервер.ПолучитьВсеИзображения(...).ПланЭтажаПлан этажа
tour_3dstringСтрокаОН.СсылкаНаPlanoplan = ЕСТЬNULL(ОбъектНедвижимости.Планировка.СсылкаНаPlanoplan, "")Ссылка на 3D-тур / Planoplan
costnumber/stringФактическаяЦена.Стоимость, если вид цены равен основному виду ценыИтоговая стоимость по основному виду цены
pricenumber/stringФактическаяЦена.Цена, если вид цены равен основному виду ценыЦена за единицу площади/метр по основному виду цены
pricesarray[object]РегистрСведений.УПДК_ФактическиеЦеныНедвижимостиВсе не удаленные виды цен по лоту
discountsarray[object]РегистрСведений.УПДК_ФактическиеСкидкиНаценки.СрезПоследнихСкидки/наценки по лоту
additional_propertiesarray[object]Настроенные в узле обмена доп. реквизиты/сведения и их значения по лотуДинамические доп. параметры
feature_mortgagebooleanОбъектНедвижимости.ИпотекаПризнак “Ипотека”
feature_liftbooleanОбъектНедвижимости.лифтПризнак “Лифт”
feature_parkingbooleanОбъектНедвижимости.ПарковкаПризнак “Парковка”
feature_securitybooleanОбъектНедвижимости.ОхранаПризнак “Охрана”
feature_kids_zonebooleanОбъектНедвижимости.ДетскаяЗонаПризнак “Детская зона”
feature_gymbooleanОбъектНедвижимости.СпортзалПризнак “Спортзал”
view_to_yardbooleanОбъектНедвижимости.ВидВоДворВид во двор
layout_replanning_possiblebooleanОбъектНедвижимости.ВозможностьПерепланировкиВозможность перепланировки
layout_freebooleanОбъектНедвижимости.СвободнаяПланировкаСвободная планировка
layout_two_sidesbooleanОбъектНедвижимости.КвартираНа2СтороныКвартира на две стороны
layout_big_bathroombooleanОбъектНедвижимости.БольшаяВаннаяБольшая ванная
layout_laundrybooleanОбъектНедвижимости.ПостирочнаяПостирочная
layout_wardrobe_nichebooleanОбъектНедвижимости.НишаПодШкафНиша под шкаф
layout_cabinetbooleanОбъектНедвижимости.КабинетКабинет
metro_minutesstring/numberОбъектНедвижимости.БлижайшееМетроБлижайшее метро, мин. По названию реквизита это может быть не только число, нужно проверять тип в 1С
bathroom_area_totalnumber/stringОбъектНедвижимости.ПлощадьСанузловОбщая площадь санузлов
mall_minutesstring/numberОбъектНедвижимости.СколькоДоТЦСколько до ТЦ, мин
school_minutesstring/numberОбъектНедвижимости.СколькоДоШколыСколько до школы, мин
compassstringОбъектНедвижимости.КомпасКомпас/направление
central_park_minutesstring/numberОбъектНедвижимости.СколькоДоЦентральногоПаркаСколько до Центрального парка, мин
wardrobesboolean/stringОбъектНедвижимости.КладовыеКладовые. Добавлено в CRM4DEV-1575
ceiling_heightnumber/stringОбъектНедвижимости.ВысотаПотолкаНедвижимостиВысота потолка. В origin/develop ключ корректный без пробела
view_from_the_windowsstringСтрока(ОбъектНедвижимости.ВидИзОкон)Вид из окон. Добавлено в CRM4DEV-1575
sidestringСтрока(ОбъектНедвижимости.Сторона)Сторона света/сторона. Добавлено в CRM4DEV-1575

Якорь
balconies
balconies
Balconies[]

Источник: табличная часть объекта недвижимости Балконы.

JSON-полеТипИсточник 1СЗначение
typestringXMLСтрока(Строка_Балкон.ТипБалкона)Тип балкона/лоджии
square_metersstringXMLСтрока(Строка_Балкон.ПлощадьБалкона)Площадь балкона/лоджии

Якорь
prices
prices
prices[]

Источник: РегистрСведений.УПДК_ФактическиеЦеныНедвижимости.

В массив попадают все цены по объекту недвижимости, где вид цены не помечен на удаление.

JSON-полеТипИсточник 1СЗначение
price_type_idstringXMLСтрока(ФактическаяЦена.ВидЦены)ID вида цены
price_namestringФактическаяЦена.ВидЦеныНаименованиеНаименование вида цены
pricenumber/stringФактическаяЦена.ЦенаЦена
costnumber/stringФактическаяЦена.СтоимостьСтоимость

Важно по корневым полям price и cost лота: они заполняются не первой ценой из массива, а только той строкой, где ФактическаяЦена.ВидЦены = УПДК_ЦенообразованиеПовтИсп.ПолучитьОсновнойВидЦены(). Если такого вида цены нет среди фактических цен, корневые price и cost останутся пустыми, но массив prices[] может быть заполнен.

Якорь
discounts
discounts
discounts[]

Источник: РегистрСведений.УПДК_ФактическиеСкидкиНаценки.СрезПоследних(&Дата, ).

...

  • берется последний проведенный документ УПДК_РасчетФактическихСкидокНаценок;
  • не выгружаются скидки/наценки с признаком СкидкаНаценка.НеВыгружатьНаСайт;
  • блок работает, если включена константа ИспользоватьУправляемыеСкидкиНаценки.
JSON-полеТипИсточник 1СЗначение
promotion_idstringXMLСтрока(Скидка.МаркетинговаяКампания)ID маркетинговой кампании
discount_namestringСкидка.СкидкаНаценкаНаименованиеНаименование скидки/наценки
discount_idstringXMLСтрока(Скидка.СкидкаНаценка)ID скидки/наценки
amountnumber/stringСкидка.СуммаСумма скидки/наценки
extra_chargebooleanСкидка.ЭтоНаценкаtrue, если это наценка; false, если скидка

Якорь
additionalproperties
additionalproperties
additional_properties[]

Это не резерв “на будущее”. Массив реально заполняется текущим кодом.

...

  1. В узле плана обмена Дев_ОбменССайтомОнлайн есть табличная часть ДополнительныеРеквизитыСведения с синонимом Дополнительные свойства.
  2. В этой табличной части выбираются свойства из плана видов характеристик ДополнительныеРеквизитыИСведения.
  3. При формировании фида код берет только те свойства, которые указаны в этом узле обмена.
  4. Значения берутся из двух источников: - Справочник.УПДК_ОбъектыНедвижимости.ДополнительныеРеквизиты, если свойство является дополнительным реквизитом; - РегистрСведений.ДополнительныеСведения, если свойство является дополнительным сведением.
  5. В фид попадает строковое представление значения: Строка(ОписаниеСвойства.Значение).

Структура элемента:

JSON-полеТипИсточник 1СЗначение
typestringСтрока(ОписаниеСвойства.СвойствоТипЗначения)Тип значения свойства в 1С
idstringXMLСтрока(ОписаниеСвойства.Свойство)ID свойства
namestringОписаниеСвойства.СвойствоЗаголовокЗаголовок свойства
valuestringСтрока(ОписаниеСвойства.Значение)Значение свойства строкой

Пример:

Блок кода
language
languagejson
themeDefaultjson
{
  "additional_properties": [
    {
      "type": "Число",
      "id": "...",
      "name": "Площадь террасы",
      "value": "12,5"
    },
    {
      "type": "Булево",
      "id": "...",
      "name": "Терраса",
      "value": "Да"
    }
  ]
}

Следствие для сайтовиков: состав additional_properties[] не фиксированный в коде. Он зависит от настройки конкретного узла обмена. Если в узел добавили свойство Погреб, Теплый балкон, Номер парковки, Площадь террасы и у лота есть значение, оно попадет в этот массив. Если свойство не добавлено в узел обмена, оно не выгрузится, даже если заполнено в карточке объекта недвижимости.

Якорь
---crm4dev1575
---crm4dev1575
Что изменено по CRM4DEV-1575

По смыслу изменения задачи:

...

Технически в origin/develop эти поля берутся из ВремНедвижимость.ОбъектНедвижимости.<Реквизит>, то есть из реквизитов объекта недвижимости, а не из старого отдельного раздела “Новые параметры”.

Якорь
--
--
Важные нюансы контракта

  1. complexe написано с буквой e на конце. Это текущее имя поля в фиде. Если сайт ожидает complex, потребуется отдельное изменение контракта.
  2. Balconies начинается с заглавной буквы. Это текущее имя поля в фиде.
  3. В sections[] нет отдельного номера секции. Есть только id и name.
  4. additional_properties[] динамический и зависит от настройки узла обмена.
  5. Часть числовых значений может сериализоваться как число, а часть как строка, потому что в коде местами используется XMLСтрока(...) или Строка(...).
  6. Даты commissioning_period и construction_completion сериализуются через ЗаписатьДатуJSON(..., ФорматДатыJSON.ISO).
  7. description, address, images и часть файлов ограничиваются ПОДСТРОКА(..., 1, 1000) в запросах.

Якорь
---
---
Ответы на вопросы сайтовиков

Якорь
1-commissioningperiod--constructioncompletion---
1-commissioningperiod--constructioncompletion---
1. commissioning_period и construction_completion: в чем разница?

commissioning_period - срок ввода объекта строительства в эксплуатацию, источник ОбъектСтроительства.СрокВводаВЭксплуатацию.

...

Если сайт определяет “квартал сдачи корпуса”, нужно согласовать бизнес-смысл: ввод в эксплуатацию или окончание строительства. По названию “срок сдачи/окончание строительства” чаще подходит construction_completion, но текущие сайты уже могут использовать commissioning_period, поэтому менять интерпретацию без миграции нельзя.

Якорь
2-------
2-------
2. Можно ли получать номер секции отдельным полем?

В текущем фиде отдельного поля номера секции нет. Есть только:

Блок кода
languagejson
themeDefaultlanguagejson
{
  "id": "...",
  "name": "Секция 2",
  "flats": []
}

Получать номер из name технически можно, но это ненадежно. Рекомендуемое изменение: добавить в секцию поле number, например:

Блок кода
languagejson
themeDefaultlanguagejson
{
  "id": "...",
  "name": "Секция 2",
  "number": "2",
  "flats": []
}

Источник должен быть отдельным реквизитом секции. Если такого реквизита нет, его лучше добавить в 1С. Парсинг из наименования лучше не использовать как постоянное решение.

Якорь
3-----additionalproperties--
3-----additionalproperties--
3. Что может попадать в additional_properties у лота?

В additional_properties попадают только свойства, настроенные в конкретном узле обмена в табличной части Дополнительные свойства (ДополнительныеРеквизитыСведения). Значения берутся из дополнительных реквизитов/сведений объекта недвижимости.

Это массив для динамических полей, которые не являются фиксированной частью JSON-контракта. Например, туда могут попадать Погреб, Терраса, Площадь террасы, Теплый балкон, Номер парковки, если они заведены как дополнительные реквизиты/сведения, добавлены в узел обмена и заполнены у объекта недвижимости.

...

Минимальный набор проверок:

  1. Вызвать GET /feeds/feeds?name=<узел> с корректным токеном и проверить success = true.
  2. Проверить, что data.complexes[] содержит только районы из табличной части Районы выбранного узла обмена.
  3. Проверить, что у корпуса одновременно присутствуют commissioning_period и construction_completion, и значения соответствуют реквизитам объекта строительства.
  4. Проверить, что в sections[] нет отдельного number, если изменение еще не реализовано.
  5. Проверить, что у лота есть ключ ceiling_height без пробела на конце. Это критично после переноса фикса из develop в release.
  6. Проверить, что wardrobes, view_from_the_windows, side берутся из карточки объекта недвижимости, раздел “Параметры”.
  7. Добавить в узел обмена тестовое дополнительное свойство, заполнить его у объекта недвижимости и проверить появление в additional_properties[].
  8. Удалить/не добавлять это свойство из узла обмена и проверить, что оно не попадает в additional_properties[].
  9. Проверить лот без цен основного вида: prices[] может быть заполнен, а корневые price/cost останутся пустыми.
  10. Проверить регрессию по старым ключам: complexe, Balconies, additional_properties, prices, discounts не должны переименоваться без согласования с сайтами.

...

.