diff --git a/Hcs.Client/Client/Api/BillsApi.cs b/Hcs.Client/Client/Api/BillsApi.cs
new file mode 100644
index 0000000..505279c
--- /dev/null
+++ b/Hcs.Client/Client/Api/BillsApi.cs
@@ -0,0 +1,23 @@
+using Hcs.Client.Api.Payload.Bills;
+using Hcs.Client.Api.Request.Bills;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace Hcs.Client.Api
+{
+ // http://open-gkh.ru/BillsServiceAsync/
+ public class BillsApi(ClientBase client) : ApiBase(client)
+ {
+ ///
+ /// Импорт сведений о платежных документах
+ ///
+ /// Пейлоад сведений о платежных документах
+ /// Токен отмены
+ /// true, если операция выполнена успешно, иначе - false
+ public async Task ImportPaymentDocumentAsync(ImportPaymentDocumentPayload payload, CancellationToken token = default)
+ {
+ var request = new ImportPaymentDocumentRequest(client);
+ return await request.ExecuteAsync(payload, token);
+ }
+ }
+}
diff --git a/Hcs.Client/Client/Api/Payload/Bills/ImportPaymentDocumentPayload.cs b/Hcs.Client/Client/Api/Payload/Bills/ImportPaymentDocumentPayload.cs
new file mode 100644
index 0000000..30c47d7
--- /dev/null
+++ b/Hcs.Client/Client/Api/Payload/Bills/ImportPaymentDocumentPayload.cs
@@ -0,0 +1,229 @@
+using Hcs.Client.Api.Registry;
+using Hcs.Client.Api.Type;
+using System;
+using System.Collections.Generic;
+
+namespace Hcs.Client.Api.Payload.Bills
+{
+ // http://open-gkh.ru/Bills/importPaymentDocumentRequest.html
+ public class ImportPaymentDocumentPayload
+ {
+ // http://open-gkh.ru/Bills/importPaymentDocumentRequest/PaymentInformation.html
+ public class PaymentInformation
+ {
+ ///
+ /// БИК банка получателя
+ ///
+ public string bankBIK;
+
+ ///
+ /// Номер расчетного счета
+ ///
+ public string operatingAccountNumber;
+ }
+
+ ///
+ /// Начисление по услуге
+ ///
+ // http://open-gkh.ru/Bills/PaymentDocumentType/ChargeInfo.html
+ public interface IChargeInfo { }
+
+ ///
+ /// Главная коммунальная услуга
+ ///
+ // http://open-gkh.ru/Bills/PDServiceChargeType/MunicipalService.html
+ public class MunicipalService : IChargeInfo
+ {
+ ///
+ /// Необязательное. Перерасчеты, корректировки, руб.
+ ///
+ public decimal? moneyRecalculation;
+
+ ///
+ /// Необязательное. Льготы, субсидии, скидки, руб.
+ ///
+ public decimal? moneyDiscount;
+
+ ///
+ /// Необязательное. Норматив потребления коммунальных ресурсов в целях использования и содержания
+ /// общего имущества в многоквартирном доме.
+ ///
+ public decimal? houseOverallNeedsNorm;
+
+ ///
+ /// Необязательное. Норматив потребления коммунальных услуг.
+ ///
+ public decimal? individualConsumptionNorm;
+
+ ///
+ /// Необязательное. Текущие показания приборов учёта коммунальных ресурсов - индивидуальных
+ /// (квартирных).
+ ///
+ public decimal? individualConsumptionCurrentValue;
+
+ ///
+ /// Необязательное. Текущие показания приборов учёта коммунальных ресурсов - коллективных (общедомовых).
+ ///
+ public decimal? houseOverallNeedsCurrentValue;
+
+ ///
+ /// Необязательное. Суммарный объём коммунальных ресурсов в многоквартирном доме - в помещениях дома.
+ ///
+ public decimal? houseTotalIndividualConsumption;
+
+ ///
+ /// Необязательное. Суммарный объём коммунальных ресурсов в многоквартирном доме - в целях содержания
+ /// общего имущества в многоквартирном доме.
+ ///
+ public decimal? houseTotalHouseOverallNeeds;
+
+ ///
+ /// Необязательное. Способ определения объема коммунальных ресурсов при индивидуальном потреблении.
+ ///
+ public MunicipalServiceVolumeDeterminingMethod? individualConsumptionVolumeDeterminingMethod;
+
+ ///
+ /// Необязательное. Объем/площадь/кол-во коммунальных ресурсов при индивидуальном потреблении.
+ ///
+ public decimal? individualConsumptionVolumeValue;
+
+ ///
+ /// Необязательное. Способ определения объема коммунальных ресурсов при содержании общего имущества.
+ ///
+ public MunicipalServiceVolumeDeterminingMethod? overallConsumptionVolumeDeterminingMethod;
+
+ ///
+ /// Необязательное. Объем/площадь/кол-во коммунальных ресурсов при содержании общего имущества.
+ ///
+ public decimal? overallConsumptionVolumeValue;
+
+ ///
+ /// Необязательное. Размер повышающего коэффициента.
+ ///
+ public decimal? multiplyingFactorRatio;
+
+ ///
+ /// Необязательное. Размер превышения платы, рассчитанной с применением повышающего коэффициента над
+ /// размером платы, рассчитанной без учета повышающего коэффициента, руб.
+ ///
+ public decimal? amountOfExcessFees;
+
+ ///
+ /// К оплате за индивидуальное потребление коммунальной услуги, руб.
+ ///
+ public decimal? municipalServiceIndividualConsumptionPayable;
+
+ ///
+ /// К оплате за общедомовое потребление коммунальной услуги, руб.
+ ///
+ public decimal? municipalServiceCommunalConsumptionPayable;
+
+ ///
+ /// Необязательное. Размер платы за коммунальные услуги, индивидуальное потребление.
+ ///
+ public decimal? amountOfPaymentMunicipalServiceIndividualConsumption;
+
+ ///
+ /// Необязательное. Размер платы за коммунальные услуги, общедомовые нужды.
+ ///
+ public decimal? amountOfPaymentMunicipalServiceCommunalConsumption;
+
+ ///
+ /// Код услуги из справочника "Вид коммунальной услуги" НСИ 3
+ ///
+ public RegistryElement serviceType;
+
+ ///
+ /// Тариф/Размер платы на кв.м, руб./Размер взноса на кв.м, руб.
+ ///
+ public decimal rate;
+
+ ///
+ /// К оплате за расчетный период, руб.
+ ///
+ public decimal totalPayable;
+
+ ///
+ /// Необязательное. Начислено за расчетный период (без перерасчетов и льгот), руб.
+ ///
+ public decimal? accountingPeriodTotal;
+ }
+
+ // http://open-gkh.ru/Bills/importPaymentDocumentRequest/PaymentDocument.html
+ public class PaymentDocument
+ {
+ ///
+ /// Платежный реквизит
+ ///
+ public PaymentInformation paymentInformation;
+
+ ///
+ /// Идентификатор лицевого счета
+ ///
+ public string accountGuid;
+
+ ///
+ /// Необязательное. Номер платежного документа, по которому внесена плата, присвоенный такому
+ /// документу исполнителем в целях осуществления расчетов по внесению платы
+ ///
+ public string paymentDocumentNumber;
+
+ ///
+ /// Начисления по услугам
+ ///
+ public List chargeInfo;
+
+ ///
+ /// Необязательное. Задолженность за предыдущие периоды, руб.
+ ///
+ public decimal? debtPreviousPeriods;
+
+ ///
+ /// Необязательное. Аванс на начало расчетного периода, руб.
+ ///
+ public decimal? advanceBllingPeriod;
+
+ ///
+ /// Необязательное. Итого к оплате за расчетный период c учетом задолженности/переплаты, руб.
+ /// (по всему платежному документу)
+ ///
+ public decimal? totalPayableByPDWithDebtAndAdvance;
+
+ ///
+ /// Необязательное. Сумма к оплате за расчетный период, руб. (по всему платежному документу).
+ ///
+ public decimal? totalPayableByPD;
+
+ ///
+ /// Необязательное. Оплачено денежных средств, руб.
+ ///
+ public decimal? paidCash;
+
+ ///
+ /// Необязательное. Дата последней поступившей оплаты
+ ///
+ public DateTime? dateOfLastReceivedPayment;
+ }
+
+ ///
+ /// Месяц расчетного периода платежного документа
+ ///
+ public int month;
+
+ ///
+ /// Год расчетного периода платежного документа
+ ///
+ public short year;
+
+ ///
+ /// Сведения о платежных реквизитах получателя платежа - бизнес-ключ поиска размещенных платежных
+ /// реквизитов в ГИС ЖКХ
+ ///
+ public PaymentInformation[] paymentInformation;
+
+ ///
+ /// Размещаемый платежный документ. Максимум 500.
+ ///
+ public PaymentDocument[] paymentDocument;
+ }
+}
diff --git a/Hcs.Client/Client/Api/Request/Bills/BillsRequestBase.cs b/Hcs.Client/Client/Api/Request/Bills/BillsRequestBase.cs
new file mode 100644
index 0000000..3021a34
--- /dev/null
+++ b/Hcs.Client/Client/Api/Request/Bills/BillsRequestBase.cs
@@ -0,0 +1,55 @@
+using Hcs.Client.Api.Request;
+using Hcs.Client.Api.Request.Adapter;
+using Hcs.Service.Async.Bills;
+using System.Threading.Tasks;
+
+namespace Hcs.Service.Async.Bills
+{
+#pragma warning disable IDE1006
+ public partial class getStateResult : IGetStateResultMany { }
+#pragma warning restore IDE1006
+
+ public partial class BillsPortsTypeAsyncClient : IAsyncClient
+ {
+ public async Task GetStateAsync(RequestHeader header, IGetStateRequest request)
+ {
+ return await getStateAsync(header, (getStateRequest)request);
+ }
+ }
+
+#pragma warning disable IDE1006
+ public partial class getStateResponse : IGetStateResponse
+#pragma warning restore IDE1006
+ {
+ public IGetStateResult GetStateResult => getStateResult;
+ }
+
+ public partial class AckRequestAck : IAck { }
+
+ public partial class ErrorMessageType : IErrorMessage { }
+
+#pragma warning disable IDE1006
+ public partial class getStateRequest : IGetStateRequest { }
+#pragma warning restore IDE1006
+}
+
+namespace Hcs.Client.Api.Request.Bills
+{
+ internal class BillsRequestBase(ClientBase client) :
+ RequestBase(client)
+ {
+ protected override EndPoint EndPoint => EndPoint.BillsAsync;
+
+ protected override bool EnableMinimalResponseWaitDelay => true;
+
+ protected override bool CanBeRestarted => true;
+
+ protected override int RestartTimeoutMinutes => 20;
+ }
+}
diff --git a/Hcs.Client/Client/Api/Request/Bills/ImportPaymentDocumentRequest.cs b/Hcs.Client/Client/Api/Request/Bills/ImportPaymentDocumentRequest.cs
new file mode 100644
index 0000000..4cd29e2
--- /dev/null
+++ b/Hcs.Client/Client/Api/Request/Bills/ImportPaymentDocumentRequest.cs
@@ -0,0 +1,274 @@
+using Hcs.Client.Api.Payload.Bills;
+using Hcs.Client.Api.Request.Exception;
+using Hcs.Client.Api.Type;
+using Hcs.Client.Internal;
+using Hcs.Service.Async.Bills;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace Hcs.Client.Api.Request.Bills
+{
+ internal class ImportPaymentDocumentRequest(ClientBase client) : BillsRequestBase(client)
+ {
+ protected override bool CanBeRestarted => false;
+
+ internal async Task ExecuteAsync(ImportPaymentDocumentPayload payload, CancellationToken token)
+ {
+ // TODO: Добавить проверку пейлоада
+
+ var request = GetRequestFromPayload(payload);
+ var result = await SendAndWaitResultAsync(request, async asyncClient =>
+ {
+ var response = await asyncClient.importPaymentDocumentDataAsync(CreateRequestHeader(), request);
+ return response.AckRequest.Ack;
+ }, token);
+
+ result.Items.OfType().ToList().ForEach(error =>
+ {
+ throw RemoteException.CreateNew(error.ErrorCode, error.Description);
+ });
+
+ result.Items.OfType().ToList().ForEach(commonResult =>
+ {
+ commonResult.Items.OfType().ToList().ForEach(error =>
+ {
+ throw RemoteException.CreateNew(error.ErrorCode, error.Description);
+ });
+ });
+
+ return true;
+ }
+
+ private importPaymentDocumentRequest GetRequestFromPayload(ImportPaymentDocumentPayload payload)
+ {
+ var items = new List