Перейти к основному содержимому

Интеграция с внешними системами

Сокращения​

  1. КП - контейнерная площадка
  2. КГ - контейнерная группа
  3. ПЗ - план-задание
  4. ТС - транспортное средство
  5. КГО - крупногабаритные отходы
  6. ТКО - твердые коммунальные отходы
  7. РСО - раздельный сбор отходов
  8. ЧЛ - чистая логистика

Способ интеграции​

Схема​

img_3.png

На данной схеме показано, что ЧЛ может одновременно и принимать и отдавать объекты. Но на практике, в конкретной интеграции будет выбрано только одно направление: либо экспорт, либо импорт; в зависимости от того, кто является источником данных.

Та же логика касается и внешней системы: либо она источник отчетов о вывозе, либо потребитель. В каждом конкретном случае будет работать что-то одно: или экспорт, или импорт

На схеме лишь приведен общий случай

  1. Сценарии кто является источником ПЗ, источником справочников могут быть разные
  2. ЧЛ подключается к кафке и слушает сообщения от внешних систем
  3. ЧЛ отправляет сообщения о справочниках, ПЗ, факте вывоза (отправляет то, что необходимо внешней системе)
  4. Внешняя система подключается к кафке и слушает необходимые сообщения
  5. Внешняя система отправляет о справочниках, ПЗ, факте вывоза (отправляет то, что необходимо в рамках данной конкретной интеграции)

Apache Kafka​

Для интеграции ЧЛ с внешними системами используется брокер сообщений Kafka

Сайт​

CLI​

Пример запроса в CLI
sh kafka-console-producer.sh --bootstrap-server ip:port --topic CL_INTEGRATION_TEST
>test-cli-message

Техническая реализация​

  • Импорт сообщений в ЧЛ осуществляется через топик перевозчика EXTERNAL_SYNC_DSP_IMPORT{regionCode}_{queueSuffix}
  • Экспорт сообщений из ЧЛ - через топик перевозчика EXTERNAL_SYNC_DSP_EXPORT{regionCode}_{queueSuffix}
  • Ошибки обработки сообщений ЧЛ отправляет в топик EXTERNAL_SYNC_DSP_ERROR{regionCode}
  • Импорт фото в ЧЛ - через GraphQL-мутацию uploadPhoto (POST /graphql)
  • Экспорт фото из ЧЛ - через HTTP-запрос (по url)

Где regionCode - код региона сервера (настройка services.lkSynch.regionCode), он дописывается к префиксу топика без разделителя; queueSuffix - суффикс топиков перевозчика из его настройки обмена (см. ниже).

Топики перевозчиков​

Обмен ведётся по топикам перевозчиков. Настройка обмена хранится у организации-перевозчика (Company.externalSyncCarrierConfig):

ПолеТипОписание
queueSuffixстрокаСуффикс топиков перевозчика: EXTERNAL_SYNC_DSP_IMPORT{regionCode}_{queueSuffix} и EXTERNAL_SYNC_DSP_EXPORT{regionCode}_{queueSuffix}
importEnabledEntitiesмассив entityTypeСущности, которые перевозчик передаёт в ЧЛ. Если список не пуст, ЧЛ слушает топик импорта перевозчика
exportEnabledEntitiesмассив entityTypeСущности, которые ЧЛ отправляет в топик экспорта перевозчика
regionsмассив ID участковУчастки перевозчика (вложенные участки учитываются). КП, а также заявки без указанного перевозчика отправляются в топик перевозчика, если участок КП входит в этот список
specialBindingContainerAreasIdsмассив ID КПКП, которые отправляются в топик перевозчика независимо от участка
Пример настройки перевозчика
{
"queueSuffix": "CARRIER1",
"importEnabledEntities": ["DRIVER_PLAN", "DRIVER_PLAN_ITEM_REPORT", "DRIVER_PLAN_WEIGHT_ITEM_REPORT", "CONTAINER_REQUEST_REPORT"],
"exportEnabledEntities": ["CONTAINER_AREA", "DRIVER_PLAN", "REMOVAL_REQUEST", "CONTAINER_REQUEST"],
"regions": ["00000000-0000-0000-0000-000000000005"],
"specialBindingContainerAreasIds": []
}

Общие топики без суффикса перевозчика - EXTERNAL_SYNC_DSP_IMPORT{regionCode} и EXTERNAL_SYNC_DSP_EXPORT{regionCode} - используются, только если включена настройка kafkaSyncOnDefaultQueuesEnabled. Тогда ЧЛ слушает общий топик импорта и дополнительно отправляет в общий топик экспорта сообщения тех направлений, экспорт которых включён.

Топик ошибок​

Если включена настройка kafkaSyncSendErrorEnabled, ЧЛ отправляет в топик EXTERNAL_SYNC_DSP_ERROR{regionCode} сообщения об ошибках импорта и экспорта: отклонённые при проверке сообщения, не найденные связанные сущности, ошибки разбора JSON. Ключ сообщения - {entityType} - IMPORT. id = {id} или {entityType} - EXPORT. id = {id}.

Сообщение об ошибке
{
"id": "00000000-0000-0000-0000-000000000000", //ID сущности из сообщения (если удалось определить)
"entityType": "DRIVER_PLAN_ITEM_REPORT", //Тип сущности | NOT_DEFINED, если не удалось определить
"message": "...", //Текст ошибки
"description": "...", //Описание причины ошибки
"errorCode": "ValidationException", //Класс ошибки
"stackTrace": "..." //Стек вызовов
}

Поддерживаемые направления обмена по сущностям​

Технически ЧЛ реализует не для всех сущностей оба направления. В таблице — что фактически поддерживается на стороне ЧЛ. В конкретной интеграции обычно задействуется только одно направление (см. раздел «Схема»), но возможности ЧЛ следующие:

СущностьentityTypeИмпорт в ЧЛЭкспорт из ЧЛ
ОрганизацияCOMPANY✅✅
УчастокREGION✅✅
ГаражGARAGE✅✅
Место загрузки/разгрузкиWASTE_POINT✅✅
ТСVEHICLE✅✅
СотрудникEMPLOYEE✅✅
Тип контейнераCONTAINER_TYPE✅✅
КП (вместе с КГ)CONTAINER_AREA✅✅
ПЗDRIVER_PLAN✅✅
Отчёт водителя по КПDRIVER_PLAN_ITEM_REPORT✅✅
Весовой отчётDRIVER_PLAN_WEIGHT_ITEM_REPORT✅✅
Заявка на вывозREMOVAL_REQUEST✅✅
Заявка на отмену вывозаREMOVAL_CANCEL_REQUEST❌✅
Заявка на установку контейнераCONTAINER_REQUEST❌✅
Отчёт по заявке на установку контейнераCONTAINER_REQUEST_REPORT✅✅ (в составе заявки)

Примечания:

  • Заявка на отмену вывоза (REMOVAL_CANCEL_REQUEST) на стороне ЧЛ поддерживается только на экспорт — импорт этого типа не обрабатывается (сообщение будет проигнорировано).
  • Отчёт водителя импортируется/экспортируется под entityType = DRIVER_PLAN_ITEM_REPORT, весовой отчёт — под entityType = DRIVER_PLAN_WEIGHT_ITEM_REPORT.
  • Заявка на установку контейнера (CONTAINER_REQUEST) передаётся только на экспорт и только согласованная. Внешняя система добавляет заявку в ПЗ через поле requestItems точки ПЗ (элементы CONTAINER_REQUEST_ITEM), а результат установки передаёт отчётом CONTAINER_REQUEST_REPORT - отдельным сообщением или внутри элемента requestItems[].report.
  • Каждое направление дополнительно управляется toggle-флагами (см. таблицу ниже) и по перевозчикам настройкой importEnabledEntities / exportEnabledEntities.
НастройкаЧто включает
kafkaExternalSyncEnabledОбмен с внешними системами в целом
kafkaSyncReferencesImportEnabled / kafkaSyncReferencesExportEnabledИмпорт / экспорт справочников (организации, участки, гаражи, места загрузки/разгрузки, ТС, сотрудники, типы контейнеров, КП)
kafkaSyncDriverPlansImportEnabled / kafkaSyncDriverPlansExportEnabledИмпорт / экспорт ПЗ
kafkaSyncDriverReportsImportEnabled / kafkaSyncDriverReportsExportEnabledИмпорт / экспорт отчётов водителя
kafkaSyncWeightReportsImportEnabled / kafkaSyncWeightReportsExportEnabledИмпорт / экспорт весовых отчётов
kafkaSyncRemovalRequestsImportEnabled / kafkaSyncRemovalRequestsExportEnabledИмпорт / экспорт заявок на вывоз
kafkaSyncRemovalCancelRequestsExportEnabledЭкспорт заявок на отмену вывоза
kafkaSyncContainerRequestsExportEnabledЭкспорт заявок на установку контейнера
kafkaSyncContainerRequestReportsImportEnabledИмпорт отчётов по заявкам на установку отдельными сообщениями CONTAINER_REQUEST_REPORT (отчёт внутри requestItems точки ПЗ принимается вместе с ПЗ)
kafkaSyncOnDefaultQueuesEnabledОбмен через общие топики без суффикса перевозчика
kafkaSyncSendErrorEnabledОтправка ошибок в топик ошибок

Загрузка фото​

Импорт фото в ЧЛ​

Выполняется GraphQL-мутацией uploadPhoto (POST /graphql) с токеном авторизации в заголовке Authorization: Bearer .... У пользователя должна быть одна из ролей: ROLE_DRIVER, ROLE_MASTER, ROLE_DISPATCHER, ROLE_SYSTEM_ADMIN, ROLE_INSPECTOR, TELEGRAM_BOT.

Фото нужно загрузить до отправки отчёта, который на него ссылается: при импорте отчёта водителя, весового отчёта и отчёта по заявке на установку каждое фото ищется по id, и если фото не найдено, отчёт отклоняется.

Пример запроса на загрузку фото
POST {{cl_url}}/graphql
Authorization: Bearer {{token}}
Content-Type: application/json

{
"query": "mutation uploadPhoto($photo: PhotoFileDescriptorInput!) {uploadPhoto(photo: $photo){ id url }}",
"variables": {
"photo": {
"id": "84f9642c-d980-48f9-85dd-4dac17dd7d84",
"extension": "jpeg",
"name": "2025-05-06T08:43:19.000Z",
"createDate": "2025-05-06T08:43:19.000Z",
"geoData": {
"geometricFigure": "POINT",
"center": {
"latitude": 52.2854833,
"longitude": 104.2890217
}
},
"distance": 2014.2369207351182,
"bytesBase64": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAECAYAAACzzX7wAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAATSURBVBhXY7Cxd/yPD9NcgeN/ACNmN2H+qp84AAAAAElFTkSuQmCC"
}
}
}

Экспорт фото из ЧЛ​

Фото можно получить по HTTP запросу, используя photo.url

Пример: https://disp.t1.groupstp.ru/media/2024/01/09/84f9642c-d980-48f9-85dd-4dac17dd7d84.jpeg

Форматы данных​

Статус объекта
ACTIVE          // Активный
ARCHIVED // Архивный
DELETED // Удаленный
Тип организации
REG_OPERATOR            //Региональный оператор
CARRIER //Перевозчик
CONTRACTOR //Контрагент
OTHER //Другое
Организация
{
"entityType": "COMPANY", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"status": "ACTIVE", //Статус сущности | По умолчанию активный
"id": "00000000-0000-0000-0000-000000000000", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID организации
"name": "СпецАвтоТранс", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ имя организации
"inn": "0477744444", //ИНН организации
"type": "CARRIER" //Тип организации
}
Участок
{
"entityType": "REGION", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"status": "ACTIVE", //Статус сущности | По умолчанию активный
"id": "00000000-0000-0000-0000-000000000000", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID участка
"name": "Таганский", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ имя участка
"parent": { //Родительский участок
"entityType": "REGION", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности родительского участка
"id": "00000000-0000-0000-0000-000000000001" //ID родительского участка | должен быть синхронизирован заранее
},
"polygon": [ //Полигон участка для отрисовки на карте, минимум 3 точки | необязательное поле
{
"lat": 55.0, //ОБЯЗАТЕЛЬНОЕ ПОЛЕ широта точки полигона
"lon": 50.0 //ОБЯЗАТЕЛЬНОЕ ПОЛЕ долгота точки полигона
},
{
"lat": 55.1,
"lon": 50.0
},
{
"lat": 55.1,
"lon": 51.0
},
{
"lat": 55.1,
"lon": 52.0
},
{
"lat": 55.2,
"lon": 52.0
}
]
}
Гараж
{
"entityType": "GARAGE", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"status": "ACTIVE", //Статус сущности | По умолчанию активный
"id": "00000000-0000-0000-0000-000000000000", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID гаража
"name": "Гараж САТ", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ имя гаража
"address": "Котельническая, 12", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ адрес гаража
"owner": { //ОБЯЗАТЕЛЬНОЕ ПОЛЕ владелец гаража
"entityType": "COMPANY", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "00000000-0000-0000-0000-000000000001" //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID владельца гаража | владелец ТС должен быть синхронизирован заранее
},
"polygon": [ //ОБЯЗАТЕЛЬНОЕ ПОЛЕ полигон гаража, для отрисовки на карте, минимум 3 точки
{
"lat": 55.0, //ОБЯЗАТЕЛЬНОЕ ПОЛЕ широта точки гаража
"lon": 50.0 //ОБЯЗАТЕЛЬНОЕ ПОЛЕ долгота точки гаража
},
{
"lat": 55.1,
"lon": 50.0
},
{
"lat": 55.1,
"lon": 51.0
},
{
"lat": 55.1,
"lon": 52.0
},
{
"lat": 55.2,
"lon": 52.0
}
]
}
Тип места загрузки/разгрузки ТС (мусорный полигон, МПС, МСС, КПО)
WASTE_DUMP,                           //Мусорный полигон
TRANSFER_STATION, //Мусоро-перегрузочная станция
WASTE_SORTING_STATION, //Мусоро-сортировочная станция
TRANSFER_AND_SORTING_STATION, //Перегрузочно-сортировочная станция
WASTE_PROCESSING_PLANT, //Комплекс по переработке отходов
Место загрузки/разгрузки (Мусорный полигон, МПС, МСС, КПО)
{
"entityType": "WASTE_POINT", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"status": "ACTIVE", //Статус сущности | По умолчанию активный
"id": "00000000-0000-2222-0000-000000000000", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID места
"name": "Мусорный полигон Румянцево", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ имя места
"address": "Центральная, 75", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ адрес места
"owner": { //ОБЯЗАТЕЛЬНОЕ ПОЛЕ владелец места
"entityType": "COMPANY", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "00000000-0000-0000-0000-000000000001" //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID владельца места | владелец ТС должен быть синхронизирован заранее
},
"haveWeightControl": true, //Присутствует ли весовой контроль
"type": "WASTE_DUMP", //Тип места
"entryPoint": { //Точка заезда на место разгрузки | по умолчанию будет взята первая точка из polygon
"lat": 55.0, //ОБЯЗАТЕЛЬНОЕ ПОЛЕ широта точки
"lon": 50.0 //ОБЯЗАТЕЛЬНОЕ ПОЛЕ долгота точки
},
"polygon": [ //ОБЯЗАТЕЛЬНОЕ ПОЛЕ полигон места, для отрисовки на карте, минимум 3 точки
{
"lat": 55.0, //ОБЯЗАТЕЛЬНОЕ ПОЛЕ широта точки
"lon": 50.0 //ОБЯЗАТЕЛЬНОЕ ПОЛЕ долгота точки
},
{
"lat": 55.1,
"lon": 50.0
},
{
"lat": 55.1,
"lon": 51.0
},
{
"lat": 55.1,
"lon": 52.0
},
{
"lat": 55.2,
"lon": 52.0
}
]
}
Тип погрузки контейнера на ТС
BODY_SIDE_LOADING           //Боковая загрузка
BACK_SIDE_LOADING //Задняя загрузка
BUNKER_CONTAINER_LOADER //Бункеровоз
HOOK //Крюковой погрузчик
TOP //Сверху
FRONT //Фронтальная
DEEPENING //Заглубленная
MULTYLIFT //Мультилифт
UNIVERSAL //Универсальный мультилифт
KMU //КМУ
LOMOVOZ //Ломовоз
Тип топлива ТС
PETROL                      //Бензин
DIESEL //Дизель
GAS //Пропан
ELECTRICITY //Электричество
ТС
{
"entityType": "VEHICLE", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"status": "ACTIVE", //Статус сущности | По умолчанию активный
"id": "00000000-0000-0000-0000-000000000000", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID ТС

"owner": { //ОБЯЗАТЕЛЬНОЕ ПОЛЕ владелец ТС
"entityType": "COMPANY", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "00000000-0000-0000-0000-000000000001" //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID владельца ТС | владелец ТС должен быть синхронизирован заранее
},
"region": { //ОБЯЗАТЕЛЬНОЕ ПОЛЕ участок ТС
"entityType": "REGION", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "00000000-0000-0000-0000-000000000002" //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID участок ТС | участок ТС должен быть синхронизирован заранее
},
"garage": { //Гараж, локация ТС
"entityType": "GARAGE", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "00000000-0000-0000-0000-000000000003" //ID гаража ТС | гараж ТС должен быть синхронизирован заранее
},

"loadType": "BUNKER_CONTAINER_LOADER", //Тип погрузки контейнера | из списка "Тип погрузки контейнера на ТС"
"fuelType": "DIESEL", //Тип топлива | из списка "Тип топлива ТС"
"number": "А100ВЕ138", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ гос.номер ТС
"volume": 100.0, //Объем кузова ТС, м3 | число
"compressionCoefficient": 1.0, //Коэффициент уплотнения (сжатия) кузова ТС | число
"capacity": 150.0, //Грузоподъемность | число
"modelName": "SCANIA", //Имя модели ТС
"yearOfManufacture": 1985 //Год выпуска ТС | целое число
}
Роли сотрудника
MASTER                                                  //Мастер
DISPATCHER //Диспетчер
DRIVER //Водитель
GUEST //Гость
OFFICE_MANAGER //Офис-менеджер
REG_OPERATOR_ADMIN //РО админ
REG_OPERATOR //Сотрудник регионального оператора (признак сотрудника, а не роль пользователя)
GOVERNMENT //Госслужащий
CONTAINER_AREAS_EDITOR //Редактор КП
REPORT_CORRECTOR //Корректировщик данных о вывозе
INSPECTOR //Инспектор
Сотрудник
{
"entityType": "EMPLOYEE", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"status": "ACTIVE", //Статус сущности | По умолчанию активный
"id": "00000000-0000-0000-0000-000000000000", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ | ID СОТРУДНИКА
"personFullName": "Лысенко Владимир Петрович", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ | ФИО СОТРУДНИКА
"company": {
"entityType": "COMPANY", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "00000000-0000-0000-0000-000000000001" //ID компании где устроен сотрудник | компания должна быть синхронизирована заранее
},
"phone": "89999999999", //Номер телефона
"email": "example@example.com", //Электронная почта
"personnelNumber": "000001", //Табельный номер
"login": "i.ivanov", //Логин пользователя сотрудника. Пользователь создается, если переданы login, password и roles; для роли DRIVER - автоматически, со сгенерированными логином и паролем, если они не переданы. Иначе пользователь сотрудника отключается
"password": "BiABDihcaq#%\"qa67%IHC", //Пароль пользователя сотрудника
"roles": [ //Роли сотрудника | из списка "Роли сотрудника"; REG_OPERATOR - признак сотрудника регионального оператора
"MASTER",
"DISPATCHER",
"REG_OPERATOR"
],
"regions": [ //Регионы, к которым у сотрудника есть доступ
{
"entityType": "REGION", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "00000000-0000-0000-0000-000000000004" //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID участка
},
{
"entityType": "REGION", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "00000000-0000-0000-0000-000000000005" //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID участка
}
],
"carriers": [ //Перевозчики, к которым у сотрудника есть доступ
{
"entityType": "COMPANY", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "00000000-0000-0000-0000-000000000006" //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID перевозчика
}
]
}
Тип контейнера
{
"entityType": "CONTAINER_TYPE", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"status": "ACTIVE", //Статус сущности | По умолчанию активный
"id": "00000000-0000-0000-0000-000000000000", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID типа контейнера
"name": "Стандартный 0,75 м3", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ имя типа контейнера
"volume": 0.75, //ОБЯЗАТЕЛЬНОЕ ПОЛЕ объем типа контейнера
"loadTypes": [ //Типы погрузки контейнера на ТС
"BODY_SIDE_LOADING",
"BACK_SIDE_LOADING",
"TOP"
]
}
Тариф КП
NORMATIVE                                               //Расчет по нормативам
FACT //Расчет по факту
Тип КП
CLOSED                                                      //Закрытая КП
OPENED //Открытая КП
GARBAGE_ROOM, //Мусорокамера
DEEPENING, //Подземная КП
BAG, //Помешочный сбор
PRESS, //Пресс компактор
PUBLIC_TRANSPORT_STOP //Остановка общественного транспорта
Виды отходов
TKO,                                                        //TKO
PAPER, //Бумага
PLASTIC, //Пластик
GLASS, //Стекло
METAL //Металл

Категория контейнерной группы (КГ)
TKO,                                                        //ТКО
RSO, //РСО (раздельный сбор отходов)
KGO, //КГО (крупногабаритные отходы)
BAG, //Мешок
OTHER, //Прочие
SWEEPINGS //Смёт
Категории КП
LEGAL_ENTITY,                                               //Юридическое лицо
APARTMENT_BUILDING, //Многоквартирный дом
PRIVATE_SECTOR, //Частный сектор
GARAGE, //Гаражно-строительный кооператив
GOVERNMENT, //Бюджетное учреждение
MEDICAL, //Медицинское учреждение
EDUCATIONAL, //Образовательное учреждение
MILITARY, //Военная часть
GARDEN, //СНТ
RAILWAY, //РЖД
OTHER, //Прочие отходы
INDIVIDUAL, //Индивидуальные контейнеры
BAG //Помешочный сбор

График
{
"entityType": "SCHEDULE", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"notation": "4-ПН,2-ВТ" //ОБЯЗАТЕЛЬНОЕ ПОЛЕ представление в нотации графика
}
Виды нотаций графика
По дате
Пример представления: "1,2,3,15,27"
Описание: 1, 2, 3, 15, 27 дни каждого месяца
Разделитель: ,
Ограничения: числа из 1-31

Дни недели
Пример представления: "ПН,СР,ПТ"
Описание: понедельник, среда, пятница
Разделитель: ,
Ограничения: значения из ПН/ВТ/СР/ЧТ/ПТ/СБ/ВС, регистр не важен

Ежедневно
Пример представления: "ПН,ВТ,СР,ЧТ,ПТ,СБ,ВС"
Описание: Ежедневно
Разделитель: ,
Ограничения: значения из ПН/ВТ/СР/ЧТ/ПТ/СБ/ВС, регистр не важен

Календарный
Пример представления: "30.09.2025, 05.10.2025"
Описание: Только указанные дни календаря 30.09.2025 и 05.10.2025
Разделитель: ,
Ограничения: Дата в Европейском формате, разделитель между днями, месяцами, годами - точка. Разделитель между датами - запятая

Повторный
Пример представления: "4-ПН,2-ВТ"
Описание: Каждый 4 понедельник месяца, каждый 2 вторник месяца ,
Разделитель: ,
Ограничения: значения из ПН/ВТ/СР/ЧТ/ПТ/СБ/ВС, регистр не важен, число от 1 до 5

Интервальный
Пример представления: "3/5 с 01.01.2022"
Описание: Вывоз 3 дня подряд, через 5 дней, начиная с 1 января 2022
Разделитель: Не допускается
Ограничения: кол-во дней не больше 365, год 1900-2099, строгое соответствие записи

По заявке
Пример представления: "По заявке"
Описание: График отсутствует
Разделитель: Не допускается
Ограничения: Пустая ячейка
КП
{
"entityType": "CONTAINER_AREA", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"status": "ACTIVE", //Статус сущности | По умолчанию активный
"id": "00000000-0000-0000-0000-000000000000", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID КП
"tariff": "NORMATIVE", //Тариф КП | по умолчанию норматив
"hasKGOZone": true, //Имеет площадку под КГО
"code": "99000001", //Код КП в инфраструктуре ЧЛ-ЛК-Взыскание
"externalCode": "Обл-гор-пос 33/51с", //Код КП во внешней инфраструктуре
"address": "Таганская, 53", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ адрес КП
"owner": { //ОБЯЗАТЕЛЬНОЕ ПОЛЕ организация-собственник КП
"entityType": "COMPANY", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "00000000-0000-0000-0000-000000000001" //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ссылка на собственника КП
},
"region": { //Участок КП | если не заполнен, будет вычислен по координатам
"entityType": "REGION", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "00000000-0000-0000-0000-000000000005" //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID участка
},
"note": "Звонить за 10 минут до приезда", //Заметка о КП
"commentForDriver": "Объезжать двор со стороны школы", //Комментарий водителю
"type": "GARBAGE_ROOM", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ Тип КП
"location": { //ОБЯЗАТЕЛЬНОЕ ПОЛЕ координаты КП
"lat": 54.3698, //ОБЯЗАТЕЛЬНОЕ ПОЛЕ координаты КП широта
"lon": 32.9624 //ОБЯЗАТЕЛЬНОЕ ПОЛЕ координаты КП долгота
},
"phone": "88005553535", //Телефон контактного лица
"isAvailableOnHolidays": false, //Доступность в выходные и праздники | по умолчанию true
"isArchived": false, //КП в архиве | по умолчанию false
"category": "RAILWAY", //Категория КП
"hasPhotoProhibited": true, //На КП запрещено фотографирование | по умолчанию false
"isSecured": true, //КП находится на режимном объекте | по умолчанию false
"schedule": { //График работы КП
"entityType": "SCHEDULE", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"notation": "4-ПН,2-ВТ" //ОБЯЗАТЕЛЬНОЕ ПОЛЕ представление в нотации графика
},
"emails": [ //Почтовые адреса для уведомлений
"aaa@mail.com",
"bbb@mail.com",
"ccc@mail.com"
],
"gatePhone": "88005552020", //Номер телефона шлагбаума
"telegramChat": "-388414554456456", //ID чата ТГ для уведомлений
"groups": [
{
"entityType": "CONTAINER_GROUP", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "00000000-0000-0000-0000-000000000009", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID КГ
"amount": 5, //ОБЯЗАТЕЛЬНОЕ ПОЛЕ количество контейнеров в группе
"type": { //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип контейнера (объем)
"entityType": "CONTAINER_TYPE", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "00000000-0000-0000-0000-000000000008" //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID типа контейнера в группе
},
"schedule": { //График вывоза КГ
"entityType": "SCHEDULE", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"notation": "4-ПН,2-ВТ" //ОБЯЗАТЕЛЬНОЕ ПОЛЕ представление в нотации графика
},
"carrier": { //Перевозчик КГ
"entityType": "COMPANY", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "00000000-0000-0000-0000-000000000006" //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID организации-перевозчика
},
"wasteType": "TKO", //Вид отхода, ожидаемый в контейнерах КГ
"category": "TKO" //Категория КГ | если не передана, категория у КГ не заполняется
},
{
"entityType": "CONTAINER_GROUP", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "00000000-0000-0000-0000-000000000002", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID КГ
"amount": 5, //ОБЯЗАТЕЛЬНОЕ ПОЛЕ количество контейнеров в группе
"type": { //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип контейнера (объем)
"entityType": "CONTAINER_TYPE", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "00000000-0000-0000-0000-000000000003" //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID типа контейнера в группе
},
"schedule": { //График вывоза КГ
"entityType": "SCHEDULE", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"notation": "ВТ" //ОБЯЗАТЕЛЬНОЕ ПОЛЕ представление в нотации графика
},
"carrier": { //Перевозчик КГ
"entityType": "COMPANY", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "00000000-0000-0000-0000-000000000005" //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID организации-перевозчика
},
"wasteType": "PAPER", //Вид отхода, ожидаемый в контейнерах КГ
"category": "RSO" //Категория КГ | если не передана, категория у КГ не заполняется
}
]
}
Причины невывоза КП
CONTAINER_IN_FIRE               //Пожар в контейнере
LIQUID_WASTE //ЖКО в контейнере
CONSUMER_REFUSE //Отказ потребителя
BLOCKED_BY_WEATHER //Нет подъезда (снег/грязь/гололед)
CONTAINER_NOT_WHELL_OUT //Не выкатили контейнер
SWC_VIOLATION //Смешанные отходы в РСО
CONTAINER_BROKEN //Контейнер неисправен
VEHICLE_BROKEN //Поломка автомобиля
BIOLOGICAL_WASTE //Биологические отходы
BUILDING_WASTE_IN_CONTAINER //Строительный мусор в контейнере
CLOSED //КП закрыта
BLOCKED_BY_ROAD_WORKS //Нет подъезда (дорожные работы)
NOT_INCLUDED_IN_TRIP //Не вошло в рейс
BLOCKED_BY_VEHICLES //Нет подъезда (заставлено авто)
AREA_NOT_FOUND //КП не найдена
CONTAINER_NOT_FOUND //Контейнер отсутствует
FIRE_IN_CONTAINER //Контейнер горит
AREA_HAS_NOT_FENCE //Нет ограждения
BLOCKED_BY_DIMENSIONS //Нет подъезда (по габаритам)
KGO_IN_CONTAINER //КГО в контейнере
BLOCKED_BY_WASTE_BLOCKAGE //Нет подъезда (завал ТКО)
KGO_BLOCKAGE //Завал КГО на КП
NO_KGO_BLOCKAGE //Завал не ТКО на КП
BUILDING_WASTE_ON_AREA //Строительный мусор на КП
CONTAINER_OVERLOADING //Контейнеры переполнены
BLOCKED_BY_SNOW //КП завалена снегом
CONTAINER_MISSED //Контейнер отсутствует
BAD_WEATHER //Погодные условия
ПЗ
{
"entityType": "DRIVER_PLAN", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"status": "ACTIVE", //Статус сущности | По умолчанию активный
"id": "00000000-0000-0000-0000-000000000000", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID план-задания
"date": "2025-01-05", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ дата ПЗ
"carrier": { //Организация-перевозчик ПЗ | по умолчанию будет взято из ТС
"entityType": "COMPANY", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "00000000-0000-0000-0000-000000000001" //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID перевозчика ПЗ
},
"region": { //Участок ПЗ | по умолчанию будет взято из ТС
"entityType": "REGION", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "00000000-0000-0000-0000-000000000003" //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ссылка на участок
},
"vehicle": { //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ТС исполнитель ПЗ
"entityType": "VEHICLE", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "00000000-0000-0000-0000-000000000002" //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ссылка на ТС
},
"driver": { //Водитель
"entityType": "EMPLOYEE", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "00000000-0000-3355-0000-000000000001" //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID водителя
},
"shiftNumber": 2, //Номер смены ТС
"mileage": 28741.58, //Пробег по ПЗ
"fuelSpending": 63.78, //Затраты топлива на ПЗ
"completeDate": "2025-01-05T12:12:31.000±03:00", //Дата выполнения
"items": [ //Элементы плана
{
"entityType": "DRIVER_PLAN_ITEM", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "a0000000-0000-0000-0000-000000000000", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID элемента ПЗ
"order": 1, //ОБЯЗАТЕЛЬНОЕ ПОЛЕ Порядковый номер элемента в ПЗ
"area": { //ОБЯЗАТЕЛЬНОЕ ПОЛЕ КП
"entityType": "CONTAINER_AREA", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "a0000000-0000-0000-0000-000000000004" //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID КП
},
"requireRemoveKgo": true, //Требуется ли вывозить КГО | по умолчанию false
"isImportant": false, //Важный элемент ПЗ | по умолчанию false
"removalRequestItems": [ //Ссылки на позиции заявок на вывоз, породившие элемент
{
"entityType": "REMOVAL_REQUEST_ITEM", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "c0000000-0000-0000-0000-000000000000" //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID позиции заявки на вывоз
}
],
"requestItems": [ //Элементы заявок на установку контейнера, добавленных внешней системой в элемент ПЗ | только импорт в ЧЛ
{
"entityType": "CONTAINER_REQUEST_ITEM", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "e0000000-0000-0000-0000-000000000001", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID элемента заявки | назначает внешняя система
"request": { //Заявка на установку | обязательна при первой передаче элемента
"entityType": "CONTAINER_REQUEST", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "e0000000-0000-0000-0000-000000000000" //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID заявки на установку
},
"report": { //Отчет по заявке на установку | формат - "Отчет по заявке на установку контейнера", поле requestItem не передается
"entityType": "CONTAINER_REQUEST_REPORT", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "e0500000-0000-0000-0000-000000000000", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID отчета
"done": true, //ОБЯЗАТЕЛЬНОЕ ПОЛЕ установка выполнена
"containerNumber": "К-000125", //Номер установленного контейнера
"reportTs": "2025-01-05T12:30:00.000+03:00" //ОБЯЗАТЕЛЬНОЕ ПОЛЕ время отчета с часовым поясом
}
}
],
"planDetailing": [ //Детализация плана вывоза
{
"entityType": "DRIVER_PLAN_DETAILING", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "a0000000-0000-0000-0000-000000000000", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID детализации плана
"group": { //ОБЯЗАТЕЛЬНОЕ ПОЛЕ КГ
"entityType": "CONTAINER_GROUP", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "a0000000-0000-0000-0000-000000000009" //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID КГ, запланированной к вывозу
},
"amount": 5 //ОБЯЗАТЕЛЬНОЕ ПОЛЕ количество контейнеров из указанной группы, запланированных к вывозу
},
{
"entityType": "DRIVER_PLAN_DETAILING", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "b0000000-0000-0000-0000-000000000000", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID детализации плана
"group": { //ОБЯЗАТЕЛЬНОЕ ПОЛЕ КГ
"entityType": "CONTAINER_GROUP", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "b0000000-0000-0000-0000-000000000008" //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID КГ, запланированной к вывозу
},
"amount": 7 //ОБЯЗАТЕЛЬНОЕ ПОЛЕ количество контейнеров из указанной группы, запланированных к вывозу
}
],
"report": {
"entityType": "DRIVER_PLAN_ITEM_REPORT", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "a0500000-0000-0000-0000-000000000000", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID отчета о вывозе
"driverPlanItem": { //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ссылка на элемент ПЗ
"entityType": "DRIVER_PLAN_ITEM", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "a505e7b9-2ce5-4443-94ae-e88ba4ea9749" //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID элемента ПЗ
},
"driver": { //Водитель
"entityType": "EMPLOYEE", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "00000000-0000-3355-0000-000000000001" //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID водителя
},
"detailings": [ //ОБЯЗАТЕЛЬНОЕ ПОЛЕ детализация вывоза по КГ, не менее одной записи
{
"entityType": "DRIVER_REPORT_DETAILING", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "a505e7b9-2ce5-4c40-94ae-e88ba4ea9749", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID детализации
"group": { //ОБЯЗАТЕЛЬНОЕ ПОЛЕ КГ
"entityType": "CONTAINER_GROUP", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "a0000000-0000-0000-0000-000000000009" //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID вывезенной КГ
},
"fact": 4,
"notRemoved": 1,
"empty": 1
},
{
"entityType": "DRIVER_REPORT_DETAILING", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "a505e7b9-2ce5-4c40-1111-e88ba4ea9749", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID детализации
"group": { //ОБЯЗАТЕЛЬНОЕ ПОЛЕ КГ
"entityType": "CONTAINER_GROUP", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "b0000000-0000-0000-0000-000000000008" //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID вывезенной КГ
},
"fact": 5,
"notRemoved": 1,
"empty": 1
}
],
"photos": [
{
"entityType": "PHOTO", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "b4000000-0000-0000-0000-000000000000" //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID фото
},
{
"entityType": "PHOTO", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "b3000000-0000-0000-0000-000000000000" //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID фото
}
],
"removalFailReason": "CONTAINER_IN_FIRE", //Причина невывоза
"pickedUpVolume": 1.7, //Объем подбора ТКО в кубометрах
"pickedUpContainer": { //Подобранные контейнеры (детализация подбора)
"group": { //ОБЯЗАТЕЛЬНОЕ ПОЛЕ КГ
"entityType": "CONTAINER_GROUP", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "a0000000-0000-0000-0000-000000000009" //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID подобранной КГ
},
"amount": 2 //ОБЯЗАТЕЛЬНОЕ ПОЛЕ количество подобранных контейнеров
},
"removalDate": "2025-01-05T12:09:44.000±03:00" //Локальное время вывоза
},
"acceptDate": "2025-01-05T13:19:54.000±03:00" //Дата принятия/согласования элемента ПЗ мастером
}
],
"weightItems": [ //Запланированные загрузки/разгрузки
{
"entityType": "DRIVER_PLAN_WEIGHT_ITEM", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "b3e00000-0000-0000-0000-000000000000", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID запланированной загрузки/разгрузки
"order": 1, //ОБЯЗАТЕЛЬНОЕ ПОЛЕ порядковый номер запланированной загрузки/разгрузки
"point": { //ОБЯЗАТЕЛЬНОЕ ПОЛЕ место загрузки/разгрузки
"entityType": "WASTE_POINT", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "fff00000-0000-0000-0000-000000000000" //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID места
},
"type": "LOADING", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип запланированной загрузки/разгрузки
"report": {
"entityType": "DRIVER_PLAN_WEIGHT_ITEM_REPORT", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "a0500000-0000-0000-0000-000000000044", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID отчета о вывозе
"unplanned": false, //Внеплановая ли разгрузка/загрузка | по умолчанию true - внеплановая
"number": 1, //Если разгрузка внеплановая, нужно указать ее порядковый номер внутри ПЗ
"driverPlanWeightItem": { //Ссылка на элемент ПЗ в котором (если была) запланирована разгрузка/загрузка
"entityType": "DRIVER_PLAN_WEIGHT_ITEM", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "a505e7b9-2ce5-4443-94ae-e88ba4ea9000" //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID элемента ПЗ
},
"driverPlan": { //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ссылка на ПЗ
"entityType": "DRIVER_PLAN", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "00000000-0000-0000-0000-000000000000" //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID план-задания
},
"driver": { //Водитель
"entityType": "EMPLOYEE", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "00000000-0000-3355-0000-000000000001" //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID водителя
},
"type": "LOADING", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип весового отчета загрузка или разгрузка
"photosBefore": [ //Фото до разгрузки/загрузки
{
"entityType": "PHOTO", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "b4000000-0000-0000-0000-000000000000", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID фото
"url": "https://disp.t1.groupstp.ru/media/2024/01/09/84f9642c-d980-48f9-85dd-4dac17dd7d84.jpeg" //url фото
},
{
"entityType": "PHOTO", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "b4100000-0000-0000-0000-000000000000", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID фото
"url": "https://disp.t1.groupstp.ru/media/2024/01/09/84f9642c-d980-48f9-85dd-4dac17dd7d84.jpeg" //url фото
}
],
"photosAfter": [ //Фото после разгрузки/загрузки
{
"entityType": "PHOTO", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "ee000000-0000-0000-0000-000000000000", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID фото
"url": "https://disp.t1.groupstp.ru/media/2024/01/09/84f9642c-d980-48f9-85dd-4dac17dd7d84.jpeg" //url фото
},
{
"entityType": "PHOTO", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "ee100000-0000-0000-0000-000000000000", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID фото
"url": "https://disp.t1.groupstp.ru/media/2024/01/09/84f9642c-d980-48f9-85dd-4dac17dd7d84.jpeg" //url фото
}
],
"weightBefore": 15954.47, //ОБЯЗАТЕЛЬНОЕ ПОЛЕ масса до разгрузки/загрузки
"weightAfter": 8934.21, //ОБЯЗАТЕЛЬНОЕ ПОЛЕ масса после разгрузки/загрузки
"date": "2025-01-05T12:09:44.000±03:00", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ дата время разгрузки/загрузки
"geoPoint": { //Координаты где происходила разгрузка/загрузка
"lat": 56.023407, //Широта
"lon": 37.489282 //Долгота
},
"wastePoint": { //ОБЯЗАТЕЛЬНОЕ ПОЛЕ место загрузки/разгрузки
"entityType": "WASTE_POINT", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "fff00000-0000-0000-0000-000000000000" //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID места
}
}
},
{
"entityType": "DRIVER_PLAN_WEIGHT_ITEM", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "b3f00000-0000-0000-0000-000000000000", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID запланированной загрузки/разгрузки
"order": 2, //ОБЯЗАТЕЛЬНОЕ ПОЛЕ порядковый номер запланированной загрузки/разгрузки
"point": { //ОБЯЗАТЕЛЬНОЕ ПОЛЕ место загрузки/разгрузки
"entityType": "WASTE_POINT", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "fff00000-0000-0000-0000-000000000000" //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID места
},
"type": "UNLOADING", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип запланированной загрузки/разгрузки
"report": {
"entityType": "DRIVER_PLAN_WEIGHT_ITEM_REPORT", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "a0500000-0000-0000-0000-000000000044", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID отчета о вывозе
"unplanned": false, //Внеплановая ли разгрузка/загрузка | по умолчанию true - внеплановая
"number": 1, //Если разгрузка внеплановая, нужно указать ее порядковый номер внутри ПЗ
"driverPlanWeightItem": { //Ссылка на элемент ПЗ в котором (если была) запланирована разгрузка/загрузка
"entityType": "DRIVER_PLAN_WEIGHT_ITEM", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "a505e7b9-2ce5-4443-94ae-e88ba4ea9000" //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID элемента ПЗ
},
"driver": { //Водитель
"entityType": "EMPLOYEE", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "00000000-0000-3355-0000-000000000001" //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID водителя
},
"type": "UNLOADING", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип весового отчета загрузка или разгрузка
"photosBefore": [ //Фото до разгрузки/загрузки
{
"entityType": "PHOTO", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "b4000000-0000-0000-0000-000000000000", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID фото
"url": "https://disp.t1.groupstp.ru/media/2024/01/09/84f9642c-d980-48f9-85dd-4dac17dd7d84.jpeg" //url фото
},
{
"entityType": "PHOTO", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "b4100000-0000-0000-0000-000000000000", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID фото
"url": "https://disp.t1.groupstp.ru/media/2024/01/09/84f9642c-d980-48f9-85dd-4dac17dd7d84.jpeg" //url фото
}
],
"photosAfter": [ //Фото после разгрузки/загрузки
{
"entityType": "PHOTO", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "ee000000-0000-0000-0000-000000000000", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID фото
"url": "https://disp.t1.groupstp.ru/media/2024/01/09/84f9642c-d980-48f9-85dd-4dac17dd7d84.jpeg" //url фото
},
{
"entityType": "PHOTO", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "ee100000-0000-0000-0000-000000000000", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID фото
"url": "https://disp.t1.groupstp.ru/media/2024/01/09/84f9642c-d980-48f9-85dd-4dac17dd7d84.jpeg" //url фото
}
],
"weightBefore": 15954.47, //ОБЯЗАТЕЛЬНОЕ ПОЛЕ масса до разгрузки/загрузки
"weightAfter": 8934.21, //ОБЯЗАТЕЛЬНОЕ ПОЛЕ масса после разгрузки/загрузки
"date": "2025-01-05T12:09:44.000±03:00", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ дата время разгрузки/загрузки
"geoPoint": { //Координаты где происходила разгрузка/загрузка
"lat": 56.023407, //Широта
"lon": 37.489282 //Долгота
},
"wastePoint": { //ОБЯЗАТЕЛЬНОЕ ПОЛЕ место загрузки/разгрузки
"entityType": "WASTE_POINT", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "fff00000-0000-0000-0000-000000000000" //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID места
}
}
}
]
}
Отчет водителя по вывозу КП
{
"entityType": "DRIVER_PLAN_ITEM_REPORT", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"status": "ACTIVE", //Статус сущности | По умолчанию активный
"id": "a0500000-0000-0000-0000-000000000000", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID отчета о вывозе
"driverPlanItem": { //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ссылка на элемент ПЗ
"entityType": "DRIVER_PLAN_ITEM", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "a505e7b9-2ce5-4443-94ae-e88ba4ea9749" //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID элемента ПЗ
},
"driver": { //Водитель
"entityType": "EMPLOYEE", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "00000000-0000-3355-0000-000000000001" //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID водителя
},
"detailings": [ //ОБЯЗАТЕЛЬНОЕ ПОЛЕ детализация вывоза по КГ, не менее одной записи
{
"entityType": "DRIVER_REPORT_DETAILING", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "a505e7b9-2ce5-4c40-94ae-e88ba4ea9749", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID детализации
"group": { //ОБЯЗАТЕЛЬНОЕ ПОЛЕ КГ
"entityType": "CONTAINER_GROUP", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "a0000000-0000-0000-0000-000000000009" //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID вывезенной КГ
},
"fact": 4,
"notRemoved": 1,
"empty": 1
},
{
"entityType": "DRIVER_REPORT_DETAILING", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "cdd53730-6c97-430e-806d-8ed62b336007", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID детализации
"group": { //ОБЯЗАТЕЛЬНОЕ ПОЛЕ КГ
"entityType": "CONTAINER_GROUP", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "b0000000-0000-0000-0000-000000000008" //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID вывезенной КГ
},
"fact": 5,
"notRemoved": 1,
"empty": 1
}
],
"photos": [
{
"entityType": "PHOTO", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "b4000000-0000-0000-0000-000000000000", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID фото
"url": "https://disp.t1.groupstp.ru/media/2024/01/09/84f9642c-d980-48f9-85dd-4dac17dd7d84.jpeg" //url фото
},
{
"entityType": "PHOTO", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "b4100000-0000-0000-0000-000000000000", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID фото
"url": "https://disp.t1.groupstp.ru/media/2024/01/09/84f9642c-d980-48f9-85dd-4dac17dd7d84.jpeg" //url фото
}
],
"removalFailReason": "CONTAINER_IN_FIRE", //Причина невывоза
"pickedUpVolume": 1.7, //Объем подбора ТКО в кубометрах
"pickedUpContainer": { //Подобранные контейнеры (детализация подбора)
"group": { //ОБЯЗАТЕЛЬНОЕ ПОЛЕ КГ
"entityType": "CONTAINER_GROUP", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "a0000000-0000-0000-0000-000000000009" //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID подобранной КГ
},
"amount": 2 //ОБЯЗАТЕЛЬНОЕ ПОЛЕ количество подобранных контейнеров
},
"removalDate": "2025-01-05T12:09:44.000±03:00" //Локальное время вывоза
}

Окно правки отчета водителя. Отчет принимается, только пока не истекло окно правки: до конца месяца даты вывоза плюс N дней (настройка driverReportEditDaysAfterMonthEnd, при значении 0 проверка не выполняется). Проверяются и текущая дата вывоза отчета в ЧЛ, и дата вывоза из сообщения. Если окно закрыто, отчет отклоняется (EditWindowClosedException).

Все фото, на которые ссылается отчет (photos[].id), должны быть заранее загружены в ЧЛ через uploadPhoto, иначе отчет отклоняется.

Тип весового отчета (загрузка или разгрузка)
LOADING,                                            //Загрузка
UNLOADING //Разгрузка
Весовой отчет (отчет о разгрузке/загрузке)
{
"entityType": "DRIVER_PLAN_WEIGHT_ITEM_REPORT", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"status": "ACTIVE", //Статус сущности | По умолчанию активный
"id": "a0500000-0000-0000-0000-000000000044", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID отчета о вывозе
"unplanned": false, //Внеплановая ли разгрузка/загрузка | по умолчанию true - внеплановая
"number": 1, //Если разгрузка внеплановая, нужно указать ее порядковый номер внутри ПЗ
"driverPlanWeightItem": { //Ссылка на элемент ПЗ в котором (если была) запланирована разгрузка/загрузка
"entityType": "DRIVER_PLAN_WEIGHT_ITEM", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "a505e7b9-2ce5-4443-94ae-e88ba4ea9000" //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID элемента ПЗ
},
"driverPlan": { //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ссылка на ПЗ
"entityType": "DRIVER_PLAN", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "00000000-0000-0000-0000-000000000000" //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID план-задания
},
"driver": { //Водитель
"entityType": "EMPLOYEE", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "00000000-0000-3355-0000-000000000001" //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID водителя
},
"type": "UNLOADING", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип весового отчета загрузка или разгрузка
"photosBefore": [ //Фото до разгрузки/загрузки
{
"entityType": "PHOTO", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "b4000000-0000-0000-0000-000000000000", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID фото
"url": "https://disp.t1.groupstp.ru/media/2024/01/09/84f9642c-d980-48f9-85dd-4dac17dd7d84.jpeg" //url фото
},
{
"entityType": "PHOTO", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "b4100000-0000-0000-0000-000000000000", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID фото
"url": "https://disp.t1.groupstp.ru/media/2024/01/09/84f9642c-d980-48f9-85dd-4dac17dd7d84.jpeg" //url фото
}
],
"photosAfter": [ //Фото после разгрузки/загрузки
{
"entityType": "PHOTO", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "ee000000-0000-0000-0000-000000000000", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID фото
"url": "https://disp.t1.groupstp.ru/media/2024/01/09/84f9642c-d980-48f9-85dd-4dac17dd7d84.jpeg" //url фото
},
{
"entityType": "PHOTO", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "ee100000-0000-0000-0000-000000000000", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID фото
"url": "https://disp.t1.groupstp.ru/media/2024/01/09/84f9642c-d980-48f9-85dd-4dac17dd7d84.jpeg" //url фото
}
],
"weightBefore": 15954.47, //ОБЯЗАТЕЛЬНОЕ ПОЛЕ масса до разгрузки/загрузки
"weightAfter": 8934.21, //ОБЯЗАТЕЛЬНОЕ ПОЛЕ масса после разгрузки/загрузки
"date": "2025-01-05T12:09:44.000±03:00", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ дата время разгрузки/загрузки
"geoPoint": { //Координаты где происходила разгрузка/загрузка
"lat": 56.023407, //Широта
"lon": 37.489282 //Долгота
},
"wastePoint": { //ОБЯЗАТЕЛЬНОЕ ПОЛЕ место загрузки/разгрузки
"entityType": "WASTE_POINT", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "fff00000-0000-0000-0000-000000000000" //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID места
}
}
Тип заявки на вывоз
TKO                                                     //ТКО
KGO //КГО
Статус заявки на вывоз
NEW                                                     //Новая
ADDED_TO_TASK //Добавлена в ПЗ
EXPIRED //Просрочена
GOT_SUCCESS_REPORT //Получен отчёт об успешном вывозе
GOT_FAIL_REPORT //Получен отчёт о невывозе
Решение по заявке на вывоз
IN_WORK                                                 //В работе
APPROVED //Согласована
REJECTED //Отклонена
Заявка на вывоз
{
"entityType": "REMOVAL_REQUEST", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"status": "ACTIVE", //Статус сущности | По умолчанию активный
"id": "00000000-0000-0000-0000-000000000000", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID заявки на вывоз
"type": "TKO", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип заявки (ТКО или КГО)
"number": "ЗВ-000123", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ номер заявки
"area": { //ОБЯЗАТЕЛЬНОЕ ПОЛЕ КП, на которую подана заявка
"entityType": "CONTAINER_AREA", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "a0000000-0000-0000-0000-000000000004" //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID КП
},
"carrier": { //Перевозчик заявки
"entityType": "COMPANY", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "00000000-0000-0000-0000-000000000006" //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID перевозчика
},
"tripsPerDay": 2, //Количество рейсов в день
"suggestedDate": "06.01.2025", //Предлагаемая дата вывоза | формат dd.MM.yyyy (при импорте принимается также yyyy-MM-dd)
"contact": "Иванов И.И.", //Контактное лицо
"email": "example@example.com", //Электронная почта заявителя
"reason": "Переполнение контейнеров", //Причина заявки
"comment": "Просьба вывезти до обеда", //Комментарий
"authorName": "Петров П.П.", //Автор заявки
"note": "Заметка по заявке", //Заметка
"requestStatus": "NEW", //Статус заявки
"requestDecision": "IN_WORK", //Решение по заявке
"rejectReason": "", //Причина отклонения (если requestDecision = REJECTED)
"items": [ //Позиции заявки
{
"entityType": "REMOVAL_REQUEST_ITEM", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "c0000000-0000-0000-0000-000000000000", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID позиции заявки
"group": { //ОБЯЗАТЕЛЬНОЕ ПОЛЕ КГ, на которую подана заявка | обычная КГ отдаётся КРАТКОЙ формой (id + type)
"entityType": "CONTAINER_GROUP", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "00000000-0000-0000-0000-000000000009", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID КГ
"type": { //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип контейнера (объём)
"entityType": "CONTAINER_TYPE", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "00000000-0000-0000-0000-000000000008" //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID типа контейнера
}
},
"driverPlanItem": { //Элемент ПЗ, которым отработана заявка
"entityType": "DRIVER_PLAN_ITEM", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "a0000000-0000-0000-0000-000000000000" //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID элемента ПЗ
}
},
{
"entityType": "REMOVAL_REQUEST_ITEM", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "c0000000-0000-0000-0000-000000000001", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID позиции заявки
"group": { //КГ с isCustom=true отдаётся ПОЛНОЙ (расширенной) формой
"entityType": "CONTAINER_GROUP", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "00000000-0000-0000-0000-000000000010", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID КГ
"amount": 1, //количество контейнеров в группе
"type": { //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип контейнера (объём)
"entityType": "CONTAINER_TYPE", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "00000000-0000-0000-0000-000000000008" //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID типа контейнера
},
"category": "KGO", //Категория КГ
"schedule": { //График вывоза КГ
"entityType": "SCHEDULE", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"notation": "По заявке" //представление в нотации графика
},
"carrier": { //Перевозчик КГ
"entityType": "COMPANY", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "00000000-0000-0000-0000-000000000006" //ID организации-перевозчика
},
"wasteType": "TKO", //Вид отхода
"isCustom": true //если true - это специальная (временная) КГ, которая скрыта при обычном экспорте КП
}
}
]
}

О форме КГ в позиции заявки. КГ (group) в позиции заявки отдаётся в двух формах:

  • обычная КГ — краткая форма: только entityType, id и type;
  • КГ с isCustom = true — полная (расширенная) форма: дополнительно amount, category, schedule, carrier, wasteType и сам флаг isCustom.

isCustom = true означает специальную (временную) КГ, которая скрыта при обычном экспорте КП, поэтому её описание передаётся целиком именно в составе заявки.

Статус заявки на отмену вывоза
NEW                                                     //Новая
ACCEPTED //Согласована
DENIED //Отклонена
Заявка на отмену вывоза (только экспорт из ЧЛ)
{
"entityType": "REMOVAL_CANCEL_REQUEST", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"status": "ACTIVE", //Статус сущности | По умолчанию активный
"id": "00000000-0000-0000-0000-000000000000", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID заявки на отмену
"number": "ЗО-000045", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ номер заявки на отмену
"area": { //ОБЯЗАТЕЛЬНОЕ ПОЛЕ КП, на которую подана заявка
"entityType": "CONTAINER_AREA", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "a0000000-0000-0000-0000-000000000004" //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID КП
},
"dateFrom": "2025-01-06", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ дата начала периода отмены
"dateTo": "2025-01-10", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ дата окончания периода отмены
"kgo": false, //Отменяется ли вывоз КГО
"contact": "Иванов И.И.", //Контактное лицо
"email": "example@example.com", //Электронная почта заявителя
"reason": "Ремонт подъезда к КП", //Причина отмены
"comment": "Отмена на время работ", //Комментарий
"requestStatus": "NEW", //Статус заявки на отмену
"items": [ //Позиции заявки на отмену
{
"entityType": "REMOVAL_CANCEL_REQUEST_ITEM", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "d0000000-0000-0000-0000-000000000000", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID позиции заявки
"group": { //ОБЯЗАТЕЛЬНОЕ ПОЛЕ КГ, вывоз которой отменяется
"entityType": "CONTAINER_GROUP", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "00000000-0000-0000-0000-000000000009" //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID КГ
}
}
]
}
Тип заявки на установку контейнера
INSTALL                                                 //Установка
Заявка на установку контейнера (только экспорт из ЧЛ)
{
"entityType": "CONTAINER_REQUEST", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"status": "ACTIVE", //Статус сущности | По умолчанию активный
"id": "e0000000-0000-0000-0000-000000000000", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID заявки на установку
"type": "INSTALL", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип заявки
"number": "ЗУ-000017", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ номер заявки
"area": { //ОБЯЗАТЕЛЬНОЕ ПОЛЕ КП, на которую подана заявка
"entityType": "CONTAINER_AREA", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "a0000000-0000-0000-0000-000000000004" //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID КП
},
"carrier": { //Перевозчик заявки
"entityType": "COMPANY", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "00000000-0000-0000-0000-000000000006" //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID перевозчика
},
"suggestedDate": "06.01.2025", //Желаемая дата установки | формат dd.MM.yyyy
"contact": "Иванов И.И.", //Контактное лицо
"email": "example@example.com", //Электронная почта заявителя
"reason": "Увеличение объема накопления", //Причина заявки
"comment": "Установить у въезда", //Комментарий
"authorName": "Петров П.П.", //Автор заявки
"note": "Заметка по заявке", //Заметка
"requestStatus": "ADDED_TO_TASK", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ статус заявки | из списка "Статус заявки на вывоз"
"requestDecision": "APPROVED", //Решение по заявке | из списка "Решение по заявке на вывоз"
"groups": [ //КГ к установке | КГ КП - краткой формой, КГ, созданная под заявку (isCustom = true), - полной
{
"entityType": "CONTAINER_GROUP", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "00000000-0000-0000-0000-000000000009", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID КГ
"type": { //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип контейнера (объем)
"entityType": "CONTAINER_TYPE", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "00000000-0000-0000-0000-000000000008" //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID типа контейнера
}
}
],
"items": [ //Элементы заявки - точки ПЗ, в которые добавлена заявка
{
"entityType": "CONTAINER_REQUEST_ITEM", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"status": "ACTIVE", //Статус | DELETED, если элемент снят с точки ПЗ
"id": "e0000000-0000-0000-0000-000000000001", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID элемента заявки
"groups": [ //КГ элемента (та же форма, что в groups заявки)
{
"entityType": "CONTAINER_GROUP",
"id": "00000000-0000-0000-0000-000000000009",
"type": {
"entityType": "CONTAINER_TYPE",
"id": "00000000-0000-0000-0000-000000000008"
}
}
],
"driverPlanItem": { //Элемент ПЗ, в который добавлена заявка
"entityType": "DRIVER_PLAN_ITEM", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "a0000000-0000-0000-0000-000000000000" //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID элемента ПЗ
},
"report": { //Отчет по элементу заявки | формат - "Отчет по заявке на установку контейнера", без поля requestItem
"entityType": "CONTAINER_REQUEST_REPORT",
"status": "ACTIVE",
"id": "e0500000-0000-0000-0000-000000000000",
"done": true,
"containerNumber": "К-000125",
"reportTs": "2025-01-05T12:30:00.000+03:00"
}
}
]
}

Выгружаются только согласованные заявки (requestDecision = APPROVED). Заявка отправляется в топик перевозчика, указанного в заявке; если перевозчик не указан - в топики перевозчиков, в участки которых (regions) входит КП. Снятая с заявки КГ передается со статусом DELETED.

Добавление заявки на установку контейнера в ПЗ (импорт в ЧЛ)

Внешняя система добавляет заявку на установку в точку ПЗ через поле requestItems элемента ПЗ (см. пример ПЗ):

  • requestItems[].entityType - CONTAINER_REQUEST_ITEM, requestItems[].id - ID элемента заявки, его назначает внешняя система. Повторная передача элемента с тем же id не создает дубль.
  • requestItems[].request - ссылка на заявку CONTAINER_REQUEST. Обязательна при первой передаче элемента.
  • Заявка должна быть согласована, не удалена и относиться к той же КП, что и элемент ПЗ. Иначе сообщение отклоняется.
  • В элемент попадают все действующие КГ заявки, поле requestItems[].groups при импорте не учитывается.
  • Элемент, который пришел в другой точке ПЗ, переносится в нее. Элемент с отчетом не переносится.
  • Если в точке ПЗ передано поле requestItems, элементы, которых в нем нет, снимаются с точки (кроме элементов с отчетом). Это выполняется, только если перевозчику ПЗ выгружаются заявки на установку (CONTAINER_REQUEST в exportEnabledEntities). Точка без поля requestItems не меняется.
  • Отчет по элементу можно передать внутри элемента (requestItems[].report) или отдельным сообщением CONTAINER_REQUEST_REPORT.
Отчет по заявке на установку контейнера
{
"entityType": "CONTAINER_REQUEST_REPORT", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"status": "ACTIVE", //Статус сущности | удаление отчета (DELETED) не поддерживается
"id": "e0500000-0000-0000-0000-000000000000", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID отчета
"requestItem": { //ОБЯЗАТЕЛЬНОЕ ПОЛЕ в отдельном сообщении: элемент заявки, по которому отчет
"entityType": "CONTAINER_REQUEST_ITEM", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "e0000000-0000-0000-0000-000000000001" //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID элемента заявки
},
"done": false, //ОБЯЗАТЕЛЬНОЕ ПОЛЕ установка выполнена (true) или не выполнена (false)
"failReason": "BLOCKED_BY_VEHICLES", //Причина невыполнения при done = false | из списка "Причины невывоза КП"
"containerNumber": "К-000125", //Номер фактически установленного контейнера
"comment": "Подъезд заставлен", //Комментарий
"driver": { //Водитель | если не указаны driver и master, берется водитель ПЗ
"entityType": "EMPLOYEE", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "00000000-0000-3355-0000-000000000001" //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID водителя
},
"master": { //Мастер, если отчет правил мастер
"entityType": "EMPLOYEE", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "00000000-0000-3355-0000-000000000002" //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID мастера
},
"photos": [ //Фото | должны быть заранее загружены через uploadPhoto
{
"entityType": "PHOTO", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ тип сущности
"id": "b5000000-0000-0000-0000-000000000000" //ОБЯЗАТЕЛЬНОЕ ПОЛЕ ID фото
}
],
"reportTs": "2025-01-05T12:30:00.000+03:00", //ОБЯЗАТЕЛЬНОЕ ПОЛЕ время отчета в местном времени со смещением к UTC (ISO 8601)
"location": { //Координаты отчета
"lat": 56.023407, //ОБЯЗАТЕЛЬНОЕ ПОЛЕ широта
"lon": 37.489282 //ОБЯЗАТЕЛЬНОЕ ПОЛЕ долгота
}
}

Отчет привязывается к элементу заявки один раз: если по элементу уже есть другой отчет, входящий отчет игнорируется. Отчет со статусом DELETED не применяется, ошибка отправляется в топик ошибок. Отдельные сообщения CONTAINER_REQUEST_REPORT принимаются при включенной настройке kafkaSyncContainerRequestReportsImportEnabled.

Подключение 1С к kafka​

  1. Скачать и распаковать архив https://github.com/NuclearAPK/Kafka1CExtension
  2. Документация в readme.md https://github.com/NuclearAPK/Simple-Kafka_Adapter
  3. Подключение https://github.com/NuclearAPK/Simple-Kafka_Adapter/blob/main/connection.md
  4. Отправка сообщений https://github.com/NuclearAPK/Simple-Kafka_Adapter/blob/main/producer.md
  5. Чтение сообщений https://github.com/NuclearAPK/Simple-Kafka_Adapter/blob/main/consumer.md
  6. Создать расширение, загрузить структуру, методом "загрузить из файлов" из распакованного архива
  7. Адаптировать расширение и модули под клиентскую версию платформы
  8. Использовать встроенные в расширение методы для подключения к кафке
Пример кода
//Пробуем подключить компоненту
ПодключитьВнешнююКомпоненту("ОбщийМакет.KFK_Компонента", "Integration", ТипВнешнейКомпоненты.Native);

Попытка
Компонента = Новый("AddIn.Integration.simpleKafka1C");
Исключение
ВызватьИсключение "Компонента <Simple Kafka 1C> не подключена!";
КонецПопытки;

Компонента.УстановитьПараметр("queue.buffering.max.ms", "1");
Компонента.УстановитьПараметр("socket.blocking.max.ms", "1");
Компонента.УстановитьПараметр("message.timeout.ms", "5000");

РезультатИнициализации = Компонента.ИнициализироватьПродюсера(Справочники.KFK_Брокеры.НайтиПоНаименованию("Основной").АдресБрокера);

Если Не РезультатИнициализации Тогда
ВызватьИсключение "Ошибка инициализации компоненты или продюсера";
КонецЕсли;

//Организации
Пока Организации.Следующий() Цикл

ДанныеОрганизации = Новый Структура;
ДанныеОрганизации.Вставить("entityType", "COMPANY");
ДанныеОрганизации.Вставить("id", Строка(Организации.Ссылка.УникальныйИдентификатор()));
ДанныеОрганизации.Вставить("name", Организации.Наименование);
ДанныеОрганизации.Вставить("inn", Организации.ИНН);
ДанныеОрганизации.Вставить("type", Строка(Организации.ТипОрганизации.Метаданные().Имя));

ДанныеJSON = KFK_ОбщегоНазначения.ЗначениеВJSON(ДанныеОрганизации);
РезультатОтправки = Компонента.ОтправитьСообщениеСОжиданиемРезультата(ДанныеJSON, Топик,,"COMPANY " + Организации.Наименование);

Если Не РезультатОтправки Тогда
Сообщить(Компонента.ПолучитьСообщениеОбОшибке());
КонецЕсли;

КонецЦикла;

FAQ​

Q1. Почему в качестве инструмента интеграции выбрана kafka?
* A1.1. Во-первых, почему брокер сообщений, а не что-то другое.
Какие вообще есть альтернативы?
REST, интеграция через БД, файловый обмен, ручная интеграция.
Последние 2 вида даже не будем рассматривать.
Проблема интеграции через БД, как минимум в согласовании служб безопасности для доступа в чужую БД,
не говоря уже о различиях в СУБД, блокировках запросов, производительности итд.
REST тоже имеет кучу проблем: необходимость непрерывного аптайма обоих систем,
необходимость писать механизмы гарантии доставки, обработки ошибок, переотправки данных.
Самый разумный выбор брокер сообщений: все проблемы REST в нем более менее решены,
инструмент универсальный, не требует жесткой связности систем, как следствие меньше затрат на разработку

* A1.2. Во-вторых, почему именно кафка, а не другой брокер.
Apache-лицензия, активное сообщество, куча документации, самый ходовой брокер.
Бо́льший процент разработчиков знаком именно с кафкой, чем с другими брокерами
Q2. Почему фото загружаются по REST? Противоречие с A1.1.
* A2. Все содержимое фото придется гнать через кафку, размер одного фото ~4Мб, 
количество фото порядка 1к-10к / день
Получается очень большой объем данных, который нужно еще и хранить какое-то время внутри топиков
Отказались из-за неразумности данного подхода, слишком большой нагрузки на кафку
Q3. Что такое детализация плана/факта/подбора/итд и для чего она нужна?
* A3. Разберем на примере детализации плана.
Пусть у нас есть реестр КП, готовые маршруты, мы составляем ПЗ для водителя на завтра
Натыкаемся на КП, где стоят три вида контейнеров:
0.75 - который нужно вывезти, 1.1 - тоже нужно вывезти, и 8 бункер - который завтра вывозить не нужно
Итого: в ПЗ нужно добавить контейнера объемом 1.1 и 0.75, но при этом не добавлять бункер
Если мы бы просто в ПЗ поставили ссылку на КП, водитель бы не понял какие контейнера нужно забирать,
а какие нет.
Решением этой проблемы и является детализация плана: мы просто перечисляем из какой КГ сколько контейнеров
мы хотим вывезти

Аналогично детализация факта: описывает сколько контейнеров из какой группы было вывезено
Детализация невывоза - сколько контейнеров из какой группы было невывезено
Детализация пустоты - сколько контейнеров из какой группы оказалось пустыми
Q4. Почему даты всех событий нужно передавать с часовым поясом?
* A4. Унификация. Вполне возможно что именно вас не интересует часовой пояс, в котором приняли смену ПЗ.
Но другой системе это может быть интересно. При таком сценарии можно будет обойтись всего лишь одной правкой
в ЧЛ, не нужно будет собирать все внешние системы и рассказывать им об изменениях в формате.
Формат делаем максимально полным и статичным