Интеграция с личным кабинетом самозанятого (Мой налог)

04.08.25

Интеграция - WEB-интеграция

Привет! Меня зовут Дарья, я 1С-разработчик. В свободное время преподаю математику — раньше это было моей основной работой, и мне захотелось автоматизировать создание чеков в ФНС и их отправку ученикам в Telegram. Если у Telegram API хорошо документировано, то для ЛК самозанятого я ничего подобного не нашла — пришлось разбираться самостоятельно. Надеюсь, эта статья поможет начинающим разработчикам.

Нет документации по API? Не беда!

Захожу на сайт ЛК самозанятого, открываю консоль разработчика (вкладка Network → Fetch/XHR), авторизуюсь и наблюдаю что-то страшное... Здесь отображаются все запросы, которые браузер отправляет на сервер.


 

Регистрирую покупку вручную, к списку добавляется запрос income, а на экране появился чек.


 


Нажимаем на incomeи разбираем подробнее:

Это POST-запрос, принимающий JSON с данными клиента (вкладка Payload) и возвращающий УИД чека (вкладка Response/Preview)





Сам чек появляется через GET-запрос print, он также появился в списке, а во вкладке Preview доступно его изображение.

URL запроса print: https://lknpd.nalog.ru/api/v1/receipt/ваш_ИНН/УИД_чека/print



Авторизация

ЛК самозанятого использует OAuth2 с Bearer-токеном. При каждом запросе нужно передавать access_token в заголовке, его можно увидеть в любом запросе из списка. 
Этот токен живёт 1 час, поэтому его нужно регулярно обновлять.





 

Как получить access_token?

Через запрос на /api/v1/auth/token с таким JSON:

{
  "deviceInfo": {
    "sourceDeviceId": "*******",
    "sourceType": "WEB",
    "appVersion": "1.0.0",
    "metaDetails": {
      "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36"
    }
  },
  "refreshToken": "ваш_refresh_token"
}

Как видим, что в запросе для получения access_token закрался еще один refresh_token.
 

Да кто этот ваш refresh_token?

Это токен обновления, который живёт около года. Получить его можно:

  1. Через POST запрос на /api/v1/auth/lkfl, где тело:

    {
      "deviceInfo": {
        "sourceDeviceId": "*******",
        "sourceType": "WEB",
        "appVersion": "1.0.0",
        "metaDetails": {
          "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36"}
      },
      "username": "*******",
      "password": "*******"
    }

    В ответе будет refresh_token.

  2. "Ленивым" способом: взять из запроса verify из списка при авторизации и записать в регистр сведений ТокеныАвторизации или в константу, но его всё равно нужно обновлять раз в год вручную.
     

Логика работы с токенами

Перед каждым запросом проверяю:

  1. Не истёк ли refresh_token

  2. Не истёк ли access_token
    При необходимости обновляю их.

Пример кода на 1С для обновления access_token:

Функция AccessToken(Соединение, RefreshToken) Экспорт
 
    МенеджерЗаписи           = РегистрыСведений.ТокеныАвторизации.СоздатьМенеджерЗаписи();
    МенеджерЗаписи.Ресурс    = Соединение.Сервер;
    МенеджерЗаписи.ТипТокена = Перечисления.ТипыТокенов.AccessToken;
    МенеджерЗаписи.Прочитать();
    
    Если Не ИстекСрокДействия(МенеджерЗаписи.СрокДействия) И МенеджерЗаписи.Токен <> Неопределено Тогда
        
        Возврат МенеджерЗаписи.Токен;

    Иначе

        JSONАвторизации = ПолучитьJSONАвторизации(RefreshToken); //строка json вида из пункта access_token
        
        ЗапросPOST = Новый HTTPЗапрос();
        ЗапросPOST.АдресРесурса = "/api/v1/auth/token";
        ЗапросPOST.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
        ЗапросPOST.УстановитьТелоИзСтроки(JSONАвторизации, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
        
        Ответ = Соединение.ОтправитьДляОбработки(ЗапросPOST);
        
        Если Ответ.КодСостояния = 200 Тогда

            ОтветСтрокой = Ответ.ПолучитьТелоКакСтроку();
            Чтение = Новый ЧтениеJSON;
            Чтение.УстановитьСтроку(ОтветСтрокой);
            Объект = ПрочитатьJSON(Чтение, Истина);
            Token = Объект["token"];
            
            МенеджерЗаписи.СрокДействия = ТекущаяДатаСеанса() + 3600;
            МенеджерЗаписи.Токен        = Token;
            МенеджерЗаписи.Записать();
            
            Возврат Token;

        Иначе
            Возврат Неопределено;
        КонецЕсли;

    КонецЕсли;

КонецФункции


Пример формирования продажи:

JSONПродажи = ПолучитьJSONПродажи(Источник.Услуга, Источник.Оплачено); //строка json вида из пункта запроса income

ЗапросPOST  = Новый HTTPЗапрос();
ЗапросPOST.АдресРесурса = "/api/v1/income";
ЗапросPOST.Заголовки.Вставить("Authorization", "Bearer " + AccessToken);
ЗапросPOST.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
ЗапросPOST.УстановитьТелоИзСтроки(JSONПродажи, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);

Ответ = HTTP.ОтправитьДляОбработки(ЗапросPOST);

Если Ответ.КодСостояния = 200 Тогда

    ОтветСтрокой = Ответ.ПолучитьТелоКакСтроку();

    Чтение = Новый ЧтениеJSON;
    Чтение.УстановитьСтроку(ОтветСтрокой);
    Объект = ПрочитатьJSON(Чтение, Истина);
    IDЧека = Объект["approvedReceiptUuid"];
    
    // Отправка чека ученику в Telegram
    ОбменТелеграм.ЗаписатьСсылкуВОчередьОтправки(
        "Чек оплаты занятия", 
        "https://lknpd.nalog.ru/api/v1/receipt/" + INN + "/" + IDЧека + "/print",
        ОбщегоНазначенияСервер.РеквизитОбъекта(Источник.Ученик, "ТелеграмID"));

Иначе
     ЗаписьЖурналаРегистрации("ФормированиеЧекаОплаты",
        УровеньЖурналаРегистрации.Ошибка, 
        Источник.Занятие,
        ,
        СтрШаблон("Ошибка формирования чека оплаты. Код состояния: %1, Тело: %2",
            Ответ.КодСостояния,
            ОтветСтрокой));
КонецЕсли;

 

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

API ФНС ЛК самозанятого Мой налог OAuth2 Bearer Token автоматизация чеков refresh_token access_token интеграция с ФНС DevTools HTTP-запросы

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

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

См. также

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

Модуль "Экспортер" — это расширение для 1С, предназначенное для автоматизации процессов выгрузки данных. Оно позволяет эффективно извлекать, преобразовывать и передавать данные из систем 1С в интеграционную платформу Spot2D. Подсистема упрощает настройку, снижает количество ручных операций и обеспечивает удобный контроль данных.

17568 руб.

20.12.2024    7268    33    4    

34

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

Модуль "Подсистема интеграции AmoCRM с 1С" позволяет обеспечить единое информационное пространство, в котором пользователи могут эффективно управлять клиентской базой, следить за статусами сделок и поддерживать актуальность данных как в AmoCRM, так и в 1С.

60000 руб.

07.05.2019    44276    76    45    

32

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

Интеграционный модуль обмена между конфигурацией Альфа Авто 5 и Альфа Авто 6 и порталом AUTOCRM / LOGICSTARS. Данный модуль универсален. Позволяет работать с несколькими обменами AUTOCRM / LOGICSTAR разных брендов в одной информационной базе в ручном и автоматическом режиме.

42700 руб.

03.08.2020    25325    41    26    

30

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

Интеграционный модуль обмена по API между конфигурацией 1С:Альфа-Авто 6 и порталом LogicStar. Позволяет работать с несколькими обменами LogicStars разных брендов (CHERY, OMODA, JAECOO, EXEED, TENET) в одной информационной базе в ручном и автоматическом режиме. Поддерживается выгрузка заказ-нарядов, реализаций товаров и товарных остатков.

20740 руб.

13.05.2025    2792    4    0    

7

Интеграция WEB-интеграция Системный администратор Разработчик Аналитик Руководитель проекта 1С:Предприятие 8 1C:Бухгалтерия 1C:ERP 1С:КА 1С:УНФ 1С:УТ 1С:Розница 1С:ERP Управление предприятием 2 1С:Управление торговлей 10 1С:Управление торговлей 11 1С:Розница 3.0 Платные (руб)

Обмен данными с 1С. Данный модуль подойдет, если вам нужно: выгрузить данные из 1С в другой сервис (сайт, мобильное приложение, CRM), загрузить в 1С данные из скрипта или сторонней системы, изменить формат, потому что 1С предоставляет данные не так, как нужно.

14640 руб.

02.04.2025    4401    1    6    

5
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. SerVer1C 1143 07.08.25 12:39 Сейчас в теме
+ за исследование
Странно, что нет описания API. Нашел, что уже народ заморачивался данной темой
надо сделать свой велосипед для вывода с ИС )
2. ErmakovAlexey 29.08.25 13:27 Сейчас в теме
А есть ли готовое решение интеграции?
3. Fil15 4 19.05.26 14:32 Сейчас в теме
(1) пока только с физ. лицом. Скоро будет у меня оплата юр. лица, вот тогда и допишу, что бы сразу проверить на боевом примере.
4. Fil15 4 19.05.26 14:34 Сейчас в теме
Извиняюсь, не туды написал
5. YA_568096588 05.09.26 06:32 Сейчас в теме
Даш, спасибо тебе ОГРОМНОЕ.
6. YA_568096588 09.09.26 07:10 Сейчас в теме
Функция ОтменитьЧек(ЧекНдп, ТокенДоступа = "") Экспорт

Соединение = Новый HTTPСоединение("lknpd.nalog.ru",,,,,,Новый ЗащищенноеСоединениеOpenSSL(
Новый СертификатКлиентаWindows(),
Новый СертификатыУдостоверяющихЦентровWindows()));
ТокенДоступа = ?(ТокенДоступа = "", AccessToken(Соединение), ТокенДоступа);
JSONОтмены = ПолучитьJSONОтмены(ЧекНдп); //строка json вида из пункта запроса incomeСоединениеи
ЗапросPOST = Новый HTTPЗапрос();
ЗапросPOST.АдресРесурса = "/api/v1/cancel";
ЗапросPOST.Заголовки.Вставить("Authorization", "Bearer " +ТокенДоступа );
ЗапросPOST.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
ЗапросPOST.УстановитьТелоИзСтроки(JSONОтмены, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);

Ответ = Соединение.ОтправитьДляОбработки(ЗапросPOST);
ЧекОтменен = Ответ.ПолучитьТелоКакСтроку();
Если Ответ.КодСостояния = 200 Тогда
ЧекОтменен ="";
КонецЕсли;
Возврат ЧекОтменен;

КонецФункции

Функция ПолучитьJSONОТмены(ЧекНдп) Экспорт

//{"operationTime":"2026-09-09T04:13:56+03:00","requestTime":"2026-09-09T04:13:56+03:00","comment":"Чек сформирован ошибочно","receiptUuid":"209s3i18dt","partnerCode":null}

JsonОтмены = Новый Структура("operationTime,requestTime,comment,receiptUuid,partnerCode",
СтрЗаменить(Формат(ТекущаяДата(),"ДФ='yyyy-MM-dd чч:мм:сс'"), " ", "T") + "+03:00",
СтрЗаменить(Формат(ТекущаяДата(),"ДФ='yyyy-MM-dd чч:мм:сс'"), " ", "T") + "+03:00",
"Чек сформирован ошибочно",
СтрРазделить(ЧекНдп, "/", Истина)[7]);
ЗаписьJson = Новый ЗаписьJson;
ЗаписьJson.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJson, JsonОтмены);
JsonОтмены = ЗаписьJson.Закрыть();
Возврат JsonОтмены ;


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