ФГИС «Сатурн» из 1С:БП: HTTP 500 вместо своих данных, одноразовый refresh-токен и пустые ПАТ

19.10.26

Интеграция - Обмен с ГосИС

Типовая интеграция БП с ФГИС «Сатурн» на первом же запросе мест хранения своей организации вернула HTTP 500 с ошибкой 401 внутри. Причина оказалась в теле запроса: при пустых условиях поиска типовая не передает фильтр, а Сатурн без фильтра по своей организации отвечает ошибкой. Лечится передачей идентификатора организации в типовые функции. В статье разбор обмена, почему пара ключей принадлежит одной базе (ключ обновления одноразовый), дозагрузка пустых ПАТ «Требуется загрузка», сопоставление участков и препаратов, регламенты из полной карточки, особенности проведения актов применения и честный список нерешенного.

У нас в 1С:Бухгалтерии предприятия КОРП 3.0 на платформе 8.5 работает собственный блок защиты растений: планы и факты обработок садов, справочник препаратов, нормы расхода. ФГИС «Сатурн» понадобился по двум причинам. Применение пестицидов и агрохимикатов оформляется в госсистеме актами и планами применения, и вводить их второй раз руками бухгалтеру не хочется. А в реестре Сатурна по каждому препарату лежат регламенты: культура, вредный объект, норма, кратность, срок ожидания. Их удобно сверять с тем, что агроном на самом деле сделал в саду.

Интеграция с Сатурном в БП типовая. Подключили, ввели ключи, запросили места хранения своей организации и получили ошибку. На поиск причины ушел день, и большая его часть ушла на ложный след. Ниже то, что подтвердилось на практике: запросы, ответы и обходы. Код писали вместе с ИИ-агентом в EDT, как и все остальное в проекте (об этом отдельная серия), но эта статья про Сатурн.

 

Как устроен обмен

Типовой модуль ИнтерфейсСАТУРН ходит на два адреса. Ключи обновляются на fgis-saturn.ru по ресурсу backend/role/newaccesstoken, данные читаются и пишутся на api.fgis-saturn.ru по ресурсу probeInnerArm/innerArm/seapi/. Для тестового контура есть отдельный хост demo-hs.fgis-saturn.ru, он включается константой РежимРаботыСТестовымКонтуромСАТУРН.

Все запросы к данным устроены одинаково: POST на один и тот же ресурс, а что именно нужно, говорит тело. Это SE-API.

{

  "com": "execOperation",

  "otype": "Warehouse",

  "op": "static/getList()",

  "opargs": {

    "pos": 0,

    "size": 100,

    "getFullCards": 0,

    "filters": [ { "column": "ownerId", "condition": "=", "value": ["<ИД_организации>"] } ]

  }

}

otype задает тип объекта: Warehouse (места хранения), Acreage (места применения), PatProduct (реестр ПАТ), Contractor (организации), PATBatch (партии) и так далее. Список типов отдает команда getRegisteredEtityNames (имя команды именно такое, с опечаткой). При getFullCards = 0 ответ приходит таблицей resData.attrTable: первая строка содержит имена колонок, следующие строки содержат данные. При getFullCards = 1 приходят полные карточки в resData.objList._OBJ_ARRAY, и только в них есть вложенные данные, например регламенты препарата.

Поверх типовой подсистемы мы построили свое:

  • препарат блока СЗР связан с элементом реестра ПАТ;
  • сад связан с местами применения Сатурна (отдельный регистр сведений);
  • склад СЗР связан с местом хранения через типовой классификатор организаций;
  • регламенты препаратов загружаются в свой регистр раз в месяц регламентным заданием;
  • из факта обработки создается акт применения, из плана обработки создается план применения.

Отправляет документы в Сатурн пользователь, из типового рабочего места. Наш код их только создает, заполняет и пытается провести.

 

Схема обмена 1С и ФГИС «Сатурн»

 

Запрос без фильтра уходит не туда

Первый же вызов типовой функции на чтение мест хранения вернул вот что (внутренний адрес сокращен):

{"status": 500, "error": "Internal Server Error",

 "message": "401 Unauthorized from POST http://<внутренний-хост>/internal/warehouses/seapi-by-filter/<ИД_организации>",

 "path": "/probeInnerArm/innerArm/seapi/"}

HTTP 500, а внутри 401 от какого-то внутреннего сервиса. Первая гипотеза была про ключи: в поле iss токена стоит адрес с поддоменом demo-auth, и мы решили, что ключи выданы для тестового контура. Переключили константу на тестовый контур и получили уже честное «Ошибка авторизации. Проверьте ключи авторизации и обновления». Ключи были боевые, а demo-auth в издателе токена ни о чем не говорит. На этом месте ушло полдня.

Дальше пошли сырыми запросами мимо типовой библиотеки. Прототипов на Python здесь не было: короткие BSL-скрипты, которые читают ключ из регистра настроек, отправляют тело в HTTPСоединение и пишут ответ в файл. Сам ключ в вывод не попадает.

Соединение = Новый HTTPСоединение("api.fgis-saturn.ru", 443, , , , 60, Новый ЗащищенноеСоединениеOpenSSL);

Запрос = Новый HTTPЗапрос("/probeInnerArm/innerArm/seapi/");

Запрос.Заголовки.Вставить("Authorization", "Bearer " + КлючАвторизации);

Запрос.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");

Тело = "{""com"":""execOperation"",""otype"":""Warehouse"",""op"":""static/getList()"","

    + """opargs"":{""pos"":0,""size"":100,""getFullCards"":0,"

    + """filters"":[{""column"":""ownerId"",""condition"":""="",""value"":[""<ИД_организации>""]}]}}";

Запрос.УстановитьТелоИзСтроки(Тело, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);

Ответ = Соединение.ВызватьHTTPМетод("POST", Запрос);

Данные = ОбщегоНазначения.JSONВЗначение(Ответ.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8), , Истина);

Таблица = Данные.Получить("resData").Получить("attrTable"); // [0] - имена колонок

Сравнение с тем, что отправляет типовая, показало разницу. Когда условий поиска нет, типовая не передает в теле фильтр вовсе, и Сатурн отвечает HTTP 500 с ошибкой 401 внутри: такой запрос он маршрутизирует во внутренний сервис «данные моей организации», а тот отказывает. С фильтром по своей организации (ownerId, значение массивом) тот же запрос возвращает места хранения своей организации.

Типовая процедура ИнтерфейсСАТУРН.ДобавитьУсловиеОтбора сама заворачивает значение в массив, поэтому лечится одной строкой: всегда передавать идентификатор организации.

ПараметрыПоиска = Новый Структура("ИдентификаторОрганизации", ИдОрганизацииСатурн);

Ответ = ИнтерфейсСАТУРН.СписокМестХранения(ПараметрыПоиска, 1, 100);

Ответ = ИнтерфейсСАТУРН.СписокМестПрименения(ПараметрыПоиска, 1, 100);

Колонка фильтра зависит от типа: для Warehouse это ownerId, для Acreage уже managingContractorId, типовая подставляет нужную сама. Идентификатор организации есть в поле contractorid токена, его же возвращает ИнтерфейсСАТУРН.СписокКонтрагентов по ИНН. По одному ИНН может прийти несколько записей: у нас их было две, действующая и архивная, с другим наименованием. Брать нужно ту, у которой lcState = actual.

И общий урок про ошибки. Сатурн почти все отдает как HTTP 500, а настоящая причина лежит в поле message: там бывает и 401 от внутреннего сервиса, и Could not resolve attribute 'ownerId', и исключение Java. Логировать нужно тело ответа целиком, код состояния почти ничего не говорит.

 

Токены: одна пара на одну базу

Пару ключей пользователь вводит в форме «Настройки подключения САТУРН». Оба ключа являются JWT. По полю exp у нас вышло: ключ авторизации живет 14 дней, ключ обновления 28.

Типовая обновляет пару сама. Если ключу авторизации осталось меньше 7 дней (или он уже истек), а ключ обновления еще действует, она отправляет GET на fgis-saturn.ru/backend/role/newaccesstoken с заголовком refresh-token, получает access_token и refresh_token и под исключительной блокировкой перезаписывает пару в регистре НастройкиПодключенияСАТУРН. Старый ключ обновления после этого мертв: он одноразовый.

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

 

Жизненный цикл ключей Сатурна

Ключи мы никогда не выводим и не передаем через скрипты или переписку, их вводит человек в форме. А проверить состояние пары можно и не показывая ее, типовая умеет декодировать токен:

Данные = ИнтеграцияСАТУРНСлужебный.ДекодироватьТокенJWT(Настройки.КлючОбновления);

Сообщить(СтрШаблон("ошибка декодирования %1, тип %2, действует до %3",

    Данные.ОшибкаДекодирования, Данные.Тип, Формат(Данные.ДействуетДо, "ДЛФ=DT")));

На рабочей базе эта проверка сразу показала, что в поле ключа авторизации лежит не JWT, а ключа обновления нет вовсе. Это быстрее, чем разбирать сообщение об ошибке обмена.

 

Справочники: пустые ПАТ, участки и препараты

ПАТ «<Требуется загрузка>». Функция Справочники.КлассификаторПАТСАТУРН.ПАТ(Идентификатор, ПараметрыОбмена) находит элемент по идентификатору реестра, а если его нет, создает пустышку с наименованием <Требуется загрузка> и признаком ТребуетсяЗагрузка. Карточку она не загружает. Если сопоставлять препараты по идентификаторам, таких пустышек набирается много (у нас было 68). Дозагрузка:

Выборка = ... // Справочник.КлассификаторПАТСАТУРН ГДЕ ТребуетсяЗагрузка

ПараметрыОбмена = ИнтеграцияСАТУРН.ПараметрыОбмена();

Пока Выборка.Следующий() Цикл

    Отбор = Новый Структура("Идентификатор, РасширенныйСоставДанных", Выборка.Ид, Истина);

    Ответ = ИнтерфейсСАТУРН.СписокПАТ(Отбор, 1, 1);

    Если ЗначениеЗаполнено(Ответ.ТекстОшибки) ИЛИ Ответ.Список = Неопределено Тогда

        Ответ = ИнтерфейсСАТУРН.СписокПАТ(Отбор, 1, 1); // реестр отвечает ошибкой через раз

    КонецЕсли;

    Если ЗначениеЗаполнено(Ответ.ТекстОшибки) ИЛИ Ответ.Список.Количество() = 0 Тогда

        Продолжить; // в протокол

    КонецЕсли;

    Данные = Справочники.КлассификаторПАТСАТУРН.ДанныеОбъекта(Ответ.Список[0]);

    Справочники.КлассификаторПАТСАТУРН.ЗагрузитьОбъект(Данные, ПараметрыОбмена, Выборка.Ссылка.ПолучитьОбъект(), Ложь);

КонецЦикла;

Повтор там не для красоты: реестр время от времени отвечает ошибкой на запрос, который сразу после этого проходит.

Места применения. В Сатурне это земельные участки, перенесенные из другой системы: в описании так и написано «обновлено из Cerber», а в наименовании стоят номер площадки, кадастровый номер и метка вида «(сад №N)». Участков 120, садов около десятка. Сопоставление по кадастровому номеру дало 6 совпадений из 120: у сада в 1С один номер, а участков у него десятки. Сработала метка в наименовании, 117 из 120, оставшиеся три без метки разобрал человек. Попался и участок, который в Сатурне записан дважды с разными метками сада, одна из них ошибочная. Такие случаи скрипт должен выводить, а не решать сам.

Площади участка в типовом справочнике мест применения нет: в ответе SE-API поле area приходит, но реквизита для него в справочнике нет. Поэтому при создании акта расход препарата по саду мы делим поровну между его участками, а последний участок получает остаток от округления.

Препараты. В реестре наименование хранится без препаративной формы («Кораген», а форма лежит отдельным полем), у нас с ней («Кораген, КС»). Перед поиском форму отрезаем, сравниваем по нормализованному ключу: без пробелов и знаков препинания, латинские буквы-двойники заменены кириллицей. Сплошной проход по 128 препаратам дал 71 однозначное совпадение, 4 случая с несколькими кандидатами, 14 только с похожими названиями и 39 без совпадений. Среди ненайденных удобрения, адъюванты, опечатки и одно название с латинской «C» в начале. Автоматически связали только однозначные, остальные решал человек.

И одно предупреждение про интерфейс. Кнопку «Создать» в классификаторе организаций Сатурна не нажимайте ради проверки: она регистрирует организацию в госсистеме.

 

Регламенты и документы применения

Поле razresheniya в карточке ПАТ у нас было пустым. Регламенты лежат в массиве regulations, и только в полной карточке (getFullCards = 1, в типовой это параметр РасширенныйСоставДанных). Одна запись выглядит так:

{

  "harmfulObject": "Яблонная плодожорка",

  "cropName": "Яблоня",

  "processingMethod": "Опрыскивание в период вегетации",

  "applicationRateOfPreparationMin": "0,4",

  "applicationRateOfPreparationMax": "0,5",

  "applicationRateOfPreparationUnit": "л/га",

  "waitingPeriod": "10",

  "treatFreq": "3",

  "timeForManualWork": "-",

  "timeForMechWork": "3",

  "allowForAviation": false

}

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

За 21 секунду 68 препаратов дали 11 709 регламентов. Это все культуры, на которые зарегистрирован препарат, включая декоративную яблоню и подвои. Для проверки мы берем регламенты своей культуры без декоративных посадок и по ним самые строгие значения: наибольший срок ожидания, наименьшую ненулевую кратность. У 24 наших препаратов регламента на яблоню нет вовсе, в основном это удобрения. Регистр перезаполняется регламентным заданием первого числа каждого месяца в 03:00. Проверки показываются в форме факта и плана обработки, плюс отдельный отчет о соблюдении регламентов.

С документами всплыли две особенности типовой.

Первая: программная запись документа в режиме проведения не выполняет проверку заполнения. Акт без партий и номенклатуры спокойно проводится. Поэтому перед проведением вызываем ПроверитьЗаполнение() сами. Если проверка не прошла, документ остается записанным, а сообщения сворачиваются в одну строку на колонку с числом строк: «Не заполнена колонка "Партия" списка "Препараты" (строк: 30)».

Вторая: если заполнить ДокументОснование плана применения строкой, типовой расчет статусов оформления вызывает у основания Метаданные() и падает. Основание мы не заполняем, связь «документ блока СЗР и документ Сатурна» храним в своем регистре и в комментарии.

 

Грабли одной таблицей

Грабля Симптом Решение
Запрос списка без фильтра HTTP 500, в message 401 от seapi-by-filter/<ИД> всегда передавать ИдентификаторОрганизации
demo-auth в издателе токена ложная мысль о тестовых ключах смотреть, на какой хост идут запросы, а не на iss
Две записи организации по одному ИНН берется архивная выбирать lcState = actual
Одноразовый ключ обновления при следующем обновлении одна из баз теряет доступ отдельная пара на каждую базу, очищать ключи в копиях
ПАТ «<Требуется загрузка>» пустые элементы реестра дозагрузка СписокПАТ по идентификатору
Реестр отвечает ошибкой через раз случайные отказы в цикле один повтор запроса
Нет площади участка расход не распределить по площади делить поровну с остатком на последний участок
Регламенты только в полной карточке razresheniya пустое getFullCards = 1, массив regulations
Числа регламента строками «0,4», «3(1)», «-» своя функция разбора
Проведение без проверки заполнения проводится неполный акт ПроверитьЗаполнение() перед проведением
Строковый ДокументОснование падает расчет статусов основание не заполнять, связь в своем регистре

 

Что не решено

Прочитать свои партии, остатки и сведения о применении сырыми запросами SE-API не получилось. Для PATBatch фильтр по владельцу отвечает Could not resolve attribute 'ownerId' (то же для contractorId и managingContractorId), WarehouseStates падает с исключением Java на любом фильтре, PatUsage уходит в тот же внутренний сервис и получает 401. Партии в документах подбирает типовой механизм, а для него нужны сопоставления склада с местом хранения и номенклатуры с ПАТ. Их делает бухгалтер вручную, и номенклатура пока указана у 19 препаратов из 128. Поэтому созданные акты сейчас в основном остаются записанными, но не проведенными, и их дозаполняет человек.

На рабочую базу сопоставления переносятся скриптом по идентификаторам Сатурна: препараты там другие элементы, их ищем по тому же нормализованному наименованию. Проверочный прогон без записи нашел все 73 препарата и все 117 мест применения, запись запускается только после того, как в рабочей базе введена ее собственная пара ключей.

Сатурн выглядит как обычный REST, но ведет себя иначе: один ресурс на все, а ошибки упакованы в HTTP 500, и настоящую причину приходится искать в теле ответа. Главное правило, которое снимает основную часть проблем: каждый запрос списка делать с идентификатором своей организации, через типовые функции. Если вы интегрировали Сатурн, напишите в комментариях: читаются ли у вас партии и остатки своей организации через SE-API, каким способом, и пробовали ли вы поле area мест применения. Каждый такой ответ экономит кому-то день.

Вступайте в нашу телеграмм-группу Инфостарт

ФГИС Сатурн Сатурн пестициды агрохимикаты SE-API интеграция HTTPСоединение JSON токен refresh-token ПАТ акт применения БП КОРП ГосИС

Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

См. также

Обмен с ГосИС Бюджетный учет Регламентированный учет и отчетность Бухгалтер Пользователь 1С:Предприятие 8 1С:Бухгалтерия 3.0 1С:Управление холдингом Химическая промышленность Государственные, бюджетные структуры Электротехника и микроэлектроника Машиностроение и приборостроение Металлургическая промышленность Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Автоматизация раздельного учета в 1С:Бухгалтерии по ГОЗ в соответствии с 275-ФЗ. Готовое решение для учета госконтрактов, формирования отчетности и контроля исполнения. Поддержка военной приемки, НИОКР и требований Минпромторга. Профессиональный консалтинг и регулярные обновления продукта

40000 руб.

28.08.2020    576603    4244    145    

1537

Бюджетный учет Обмен с ГосИС Бухгалтер 1С:Предприятие 8 1С:Бухгалтерия 3.0 Государственные, бюджетные структуры Россия Бухгалтерский учет Платные (руб)

Доработка конфигурации 1С:Бухгалтерия предприятия, редакция 3.0. реализована в виде расширения. Предназначена для ведения раздельного учета и автоматизации заполнения отчетности исполнения контрактов ГОЗ в конфигурациях 1С БП КОРП, ПРОФ, Базовая, БИТ.ФИНАНС.

62220 руб.

16.08.2019    108416    338    97    

190

Оптовая торговля Розничная торговля Обмен с ГосИС Разработчик Бухгалтер Пользователь 1С:Предприятие 8 1C:Бухгалтерия Розничная и сетевая торговля (FMCG) Оптовая торговля, дистрибуция, логистика Россия Бухгалтерский учет Управленческий учет Платные (руб)

Решение создано для помощи разработчикам, интеграторам и другим заинтересованным лицам по настройке системы маркировки обуви, одежды, лекарств, табака, фото, молока, духов(парфюма), питьевой воды, велосипедов и шин. Задавайте вопросы по работе с ЦРПТ, GS1, ЭДО, Национальным каталогом, накоплен опыт и знания по данным темам.

20900 руб.

18.03.2019    128362    111    115    

212

Оптовая торговля Розничная торговля Обмен с ГосИС Бухгалтер 1С:Предприятие 8 1С:Управление торговлей 10 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Розничная и сетевая торговля (FMCG) Оптовая торговля, дистрибуция, логистика Рестораны, кафе и фаст-фуд Россия Бухгалтерский учет Управленческий учет Акцизы Платные (руб)

Автоматизация учета ЕГАИС в 1С для оптовой торговли, производства и импорта алкогольной продукции. Получение и отправка ТТН, отправка акта о постановке на баланс и акта о списании. Получение остатков. Загрузка и сопоставление номенклатуры и контрагентов. Оправка в ЕГАИС отчетов о производстве и импорте.

1091 руб.

15.12.2015    188379    1403    374    

421

Обмен с ГосИС Бухгалтер Пользователь 1С 8.3 1С 8.5 1С:Бухгалтерия 3.0 1С:ERP Управление предприятием 2 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 1.6 1С:Управление нашей фирмой 3.0 1С:Управление торговлей 11 1С:Розница 2 1С:Розница 3.0 1С:РМК Ювелирная промышленность и торговля Россия Управленческий учет Платные (руб)

Интеграция для работы 1С с ГИИС ДМДК. Государственная интегрированная информационная система в сфере контроля за оборотом драгоценных металлов, драгоценных камней и изделий из них на всех этапах этого оборота.

80000 руб.

12.04.2022    28039    217    34    

57

Обмен с ГосИС Логистика, склад и ТМЦ Разработчик Пользователь 1С:Предприятие 8 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Россия Платные (руб)

Внешняя обработка для инвентаризации кодов маркировки в системе "Честный знак". Позволяет быстро определить и списать коды маркировки проданного, испорченного, утраченного (полный перечень причин списания указан ниже)  товара, которые всё ещё числятся за организацией. Привести в соответствие остатки маркированного товара программы 1С и системы "Честного знака".

6649 руб.

09.01.2024    22177    229    30    

204

Обмен с ГосИС Разработчик 1С:Предприятие 8 1C:Бухгалтерия Оптовая торговля, дистрибуция, логистика Россия Управленческий учет Платные (руб)

Универсальная конфигурация ХамелеонЗерно для взаимодействия с системой ФГИС Зерно (тестовый+рабочий контур) может использоваться для интеграции в любую конфигурацию на базе 1С, версии ПРОФ и выше. Работа через API 1.0.7 и на API 1.0.8. Для удобства реализован общий интерфейс в виде обработки, схожей с интерфейсом ФГИС Зерно, но возможностей гораздо больше, т.к. при интеграции в Вашу учетную систему, можно на основании Ваших справочников и документов, создавать соответствующие документы и справочники в системе ФГИС Зерно и наоборот.

25498 руб.

27.06.2023    9818    53    2    

25

Оптовая торговля Производство готовой продукции (работ, услуг) Розничная торговля Обмен с ГосИС Разработчик Бухгалтер Пользователь 1С:Предприятие 8 1C:Бухгалтерия Сельское хозяйство и рыболовство Розничная и сетевая торговля (FMCG) Оптовая торговля, дистрибуция, логистика Рестораны, кафе и фаст-фуд Пищевая промышленность Россия Бухгалтерский учет Управленческий учет Платные (руб)

Универсальная конфигурация Хамелеон Меркурий для взаимодействия с системой Меркурий (тестовый+рабочий+демо контур) может использоваться для интеграции в любую конфигурацию на базе 1С, версии ПРОФ и выше. Основное отличие от других решений - работа через веб-интерфейс и API 2.0(API 2.1). Для удобства реализован общий интерфейс в виде обработки, схожей с интерфейсом Меркурий, но возможностей гораздо больше, т.к. при интеграции в Вашу учетную систему, можно на основании Ваших справочников и документов, создавать соответствующие документы и справочники в системе Меркурий и наоборот.

11000 руб.

08.11.2017    132050    293    153    

409
Для отправки сообщения требуется регистрация/авторизация