Интеграция с внешними системами
Сокращения
- КП - контейнерная площадка
- КГ - контейнерная группа
- ПЗ - план-задание
- ТС - транспортное средство
- КГО - крупногабаритные отходы
- ТКО - твердые коммунальные отходы
- РСО - раздельный сбор отходов
- ЧЛ - чистая логистика
Способ интеграции
Схема

На данной схеме показано, что ЧЛ может одновременно и принимать и отдавать объекты. Но на практике, в конкретной интеграции будет выбрано только одно направление: либо экспорт, либо импорт; в зависимости от того, кто является источником данных.
Та же логика касается и внешней системы: либо она источник отчетов о вывозе, либо потребитель. В каждом конкретном случае будет работать что-то одно: или экспорт, или импорт
На схеме лишь приведен общий случай
- Сценарии кто является источником ПЗ, источником справочников могут быть разные
- ЧЛ подключается к кафке и слушает сообщения от внешних систем
- ЧЛ отправляет сообщения о справочниках, ПЗ, факте вывоза (отправляет то, что необходимо внешней системе)
- Внешняя система подключается к кафке и слушает необходимые сообщения
- Внешняя система отправляет о справочниках, ПЗ, факте вывоза (отправляет то, что необходимо в рамках данной конкретной интеграции)
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
- Скачать и распаковать архив https://github.com/NuclearAPK/Kafka1CExtension
- Документация в readme.md https://github.com/NuclearAPK/Simple-Kafka_Adapter
- Подключение https://github.com/NuclearAPK/Simple-Kafka_Adapter/blob/main/connection.md
- Отправка сообщений https://github.com/NuclearAPK/Simple-Kafka_Adapter/blob/main/producer.md
- Чтение сообщений https://github.com/NuclearAPK/Simple-Kafka_Adapter/blob/main/consumer.md
- Создать расширение, загрузить структуру, методом "загрузить из файлов" из распакованного архива
- Адаптировать расширение и модули под клиентскую версию платформы
- Использовать встроенные в расширение методы для подключения к кафке
Пример кода
//Пробуем подключить компоненту
ПодключитьВнешнююКомпоненту("ОбщийМакет.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. Унификация. Вполне возможно что именно вас не интересует часовой пояс, в котором приняли смену ПЗ.
Но другой системе это может быть интересно. При таком сценарии можно будет обойтись всего лишь одной правкой
в ЧЛ, не нужно будет собирать все внешние системы и рассказывать им об изменениях в формате.
Формат делаем максимально полным и статичным