Как сделать конфигурацию «1С:Предприятие 8» приложением QuickBooks. Проходим авторизацию OAuth 1.0a+OpenID 2.0

Публикация № 671523

Разработка - Практика программирования

Пришло время, когда интеграция со сторонними организациями и их приложениями стала необходимостью для успешного ведения бизнеса. В этой статье будет рассмотрено прохождение авторизации OAuth 1.0a+OpenID 2.0 и превращение конфигурации «1С:Предприятие 8» в приложение QuickBooks.

Вводные данные:

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

OAuth 1.0a — это открытый протокол авторизации, который позволяет предоставить третьей стороне ограниченный доступ к защищённым ресурсам пользователя без необходимости передавать ей (третьей стороне) логин и пароль. С детальным описанием протокола можно ознакомится в информационном документе RFC 5849.

OpenID 2.0 — открытый стандарт децентрализованной системы аутентификации, предоставляющей пользователю возможность создать единую учётную запись для аутентификации на множестве не связанных друг с другом интернет-ресурсов, используя услуги третьих лиц.

QuickBooks — представляет собой пакет программного обеспечения для бухгалтерского учета. Продукты QuickBooks ориентированы главным образом на малые и средние предприятия и предлагают приложения для бухгалтерского учета на местах, а также версии на основе облачных вычислений.

Проблематика:

Многие компании за границей используют QuickBooks для бухгалтерского учета и все конфигурации «1С:Предприятие 8», которые фирма 1С предоставляет через известный сайт для западного рынка, пока не могут закрыть вопросы бухгалтерского учета. В то же время конфигурации подходят для складского учета и для других целей. На этом стыке возникает потребность в интеграции систем. Большинство программистов привыкли, что интеграция — это обмен сообщениями определенного формата, но когда они встречают столь сложную авторизацию и аутентификацию невольно опускаются руки.

QuickBooks использует комбинацию OAuth 1.0a + OpenID 2.0 для интеграции через приложение (App). Приложение можно создать по ссылке. После создания приложения станут доступны ключи доступа. Вот об комбинировании этой солянки и пойдет речь ниже.

ШАГ 1. Создаем приложение:

После создания приложения, необходимо получить ключи разработчика для песочницы. В нашем случае они будут:
oauth_consumer_key = qyprdEQRuexcfM4P05zd2vB0baw2TB 
oauth_consumer_secret = AbQpDjBAQlTHt08GBT9yktfuklrZJkvBL7Hswhoc
Ключи разработчика для песочницы QuickBooks

ШАГ 2. Получаем request token

Приложение должно запросить набор временных учетных данных token, также известный как request token. Он еще не связаны с какой-либо компанией QuickBooks конкретного пользователя. Приложением будет выступать конфигурация «1С:Предприятие 8» и для прохождения данного этапа необходимо реализовать некоторую базовую функциональность:

// Returns unique token your application should generate for each unique request.
//
// Returns:
//  String.
//
Function OAuthNonce()
    Return String(New UUID);  
EndFunction // OAuthNonce()

// Returns default oauth signature method name.
//
// Returns:
//  String.
//
Function OAuthSignatureMethod()
    Return "HMAC-SHA1";
EndFunction // OAuthSignatureMethod()

// Returns a sequence of characters or encoded information identifying when a certain 
// event occurred, usually giving date and time of day, sometimes accurate to a small 
// fraction of a second.
//
// Returns:
//  String.
//
Function OAuthTimestamp()
    Return Format(CurrentSessionDate() - Date("19700101"), "NG=0");
EndFunction // OAuthTimestamp()

// Returns the OAuth version 1.0.
//
// Returns:
//  String.
//
Function OAuthVersion()
    Return "1.0";
EndFunction // OAuthVersion()

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

// Only for internal use.
//
Function AuthorizeUrl() Export 
    Return "https://appcenter.intuit.com/Connect/Begin";   
EndFunction // AuthorizeUrl()

// Only for internal use.
//
Function CallbackUrl() Export
    Return "https://httpbin.org/forms/post?";  
EndFunction // CallbackUrl()

// Only for internal use.
//
Function TokenServerName()
    Return "https://oauth.intuit.com";   
EndFunction // TokenServerName()

// Only for internal use.
//
Function RequestTokenResource()
    Return "/oauth/v1/get_request_token";   
EndFunction // RequestTokenResource()

// Only for internal use.
//
Function AccessTokenResource()
    Return "/oauth/v1/get_access_token";   
EndFunction // AccessTokenResource()

// Only for internal use.
//
Function AppServerName() 
    Return "https://appcenter.intuit.com";
EndFunction // AppServerName()

// Only for internal use.
//
Function AppDisconnectResource()
    Return "/api/v1/connection/disconnect";
EndFunction // AppDisconnectResource()

Следующий код реализует получение `request token`:

// Only for internal use.
//
Procedure RequestToken() Export
        
    OAuthList = New ValueList();
    OAuthList.Add(OAuthNonce(),           "oauth_nonce");
    OAuthList.Add(OAuthVersion(),         "oauth_version");
    OAuthList.Add(CallbackUrl(),          "oauth_callback");
    OAuthList.Add(OAuthTimestamp(),       "oauth_timestamp");
    OAuthList.Add(OAuthConsumerKey(),     "oauth_consumer_key");
    OAuthList.Add(OAuthSignatureMethod(), "oauth_signature_method");
        
    Parameters = NewHTTPSecureParameters();
    Parameters.HTTPMethod = "GET";
    Parameters.ServerName = TokenServerName();
    Parameters.Resource   = RequestTokenResource();
    Parameters.Headers.Insert("Authorization", 
        AuthorizationHeader(Parameters.HTTPMethod, 
            Parameters.ServerName, 
            Parameters.Resource, 
            OAuthList));
    Parameters.Fields.Add("oauth_token");
    Parameters.Fields.Add("oauth_token_secret");
        
    HTTPSecureRequest(Parameters, EncryptedData);
    
EndProcedure // RequestToken()

Функция NewHTTPSecureParameters описывает структуру параметров запроса.
Методы шифрования в данной статье не рассматриваются и потому, EncryptFields не будет использован.

// Only for internal use.
//
Function NewHTTPSecureParameters() Export
    
    Parameters = New Structure;
    Parameters.Insert("HTTPMethod");
    Parameters.Insert("ServerName");
    Parameters.Insert("Resource");
    Parameters.Insert("Headers", New Map);
    Parameters.Insert("Fields", New Array);
    Parameters.Insert("EncryptFields", New Array);    
    Return Parameters;
    
EndFunction // NewHTTPSecureParameters()

Функция AuthorizationHeader формирует заголовок авторизации.

// Only for internal use.
//
Function AuthorizationHeader(HTTPMEthod, ServerName, Resource, OAuthList)
    
    RequestUrl = StrTemplate("%1%2", ServerName, Resource);
    
    Signature = "";
    URLEncoding = StringEncodingMethod.URLEncoding;
    
    URIStructure = URIStructure(RequestUrl);
    For Each Parameter In URIStructure.Parameters Do
        OAuthList.Add(Parameter.Value, Parameter.Key);   
    EndDo;
    
    OAuthList.SortByPresentation();
    For Each OAuthItem In OAuthList Do
        
        If IsBlankString(Signature) Then
            Signature = Signature + OAuthItem.Presentation + "=" 
                + EncodeString(OAuthItem.Value, URLEncoding);    
        Else
            Signature = Signature + "&" + OAuthItem.Presentation + "=" 
                + EncodeString(OAuthItem.Value, URLEncoding);   
        EndIf;
        
    EndDo;
    
    Position = StrFind(RequestUrl, "?");
    If Position > 0 Then
        RequestUrl = Left(RequestUrl, Position - 1);    
    EndIf;
    
    OAuthList.Add(OAuthSignature(HTTPMEthod, RequestUrl, 
        OAuthSignatureMethod(), Signature, EncryptedData), "oauth_signature");

            
    Authorization = "OAuth ";
    For Each OAuthItem In OAuthList Do
        
        If StrFind(OAuthItem.Presentation, "oauth_") = 1 Then
            
            If Authorization = "OAuth " Then
                Authorization = Authorization + OAuthItem.Presentation + "=""" 
                    + EncodeString(OAuthItem.Value, URLEncoding) + """";
            Else 
                Authorization = Authorization + "," + OAuthItem.Presentation + "=""" 
                    + EncodeString(OAuthItem.Value, URLEncoding) + """";
            EndIf;
                
        EndIf;
        
    EndDo;
             
    Return Authorization;    
    
EndFunction // AuthorizationHeader()

Функция URIStructure предназначена для разбора ссылки на составляющие.

// Dissembles URI string and returns it as a structure.
// Based on RFC 3986.
//
// Parameters:
//  StringURI - String - reference to the resource in the format:
//      <schema>://<login>:<password>@<host>:<port>/<path>?<parameters>#<anchor>
//
// Returns:
//  Structure - with keys:
//      * Schema       - String - schema.
//      * Login        - String - user login.
//      * Password     - String - user password.
//      * ServerName   - String - part : from the StringURI.
//      * Host         - String - host name.
//      * Port         - Number - port number.
//      * PathOnServer - String - part ?# from the StringURI.
//      * Parameters   - Map    - parsed parameters from the StringURI. 
//
Function URIStructure(Val StringURI) Export

    StringURI = TrimAll(StringURI);
    Parameters = New Map;
    
    // Schema
    Schema = "";
    Position = StrFind(StringURI, "://");
    If Position > 0 Then
        Schema = Lower(Left(StringURI, Position - 1));
        StringURI = Mid(StringURI, Position + 3);
    EndIf;

    // Connection string and path on the server.
    ConnectionString = StringURI;
    PathOnServer = "";
    Position = StrFind(ConnectionString, "/");
    If Position > 0 Then
        PathOnServer = Mid(ConnectionString, Position + 1);
        ConnectionString = Left(ConnectionString, Position - 1);
    EndIf;
    
    // Parameters
    Position = StrFind(PathOnServer, "?");
    If Position > 0 Then
        ParametersString = Mid(PathOnServer, Position + 1);        
        ParametersArray = StrSplit(ParametersString, "&");
        For Each Parameter In ParametersArray Do
            Position = StrFind(Parameter, "=");
            If Position > 1 Then
                Parameters.Insert(Left(Parameter, Position - 1), Mid(Parameter, Position + 1));    
            EndIf;    
        EndDo;
    EndIf;
        
    // User information and server name.
    AuthorizeString = "";
    ServerName = ConnectionString;
    Position = StrFind(ConnectionString, "@");
    If Position > 0 Then
        AuthorizeString = Left(ConnectionString, Position - 1);
        ServerName = Mid(ConnectionString, Position + 1);
    EndIf;

    // Login and password.
    Login = AuthorizeString;
    Password = "";
    Position = StrFind(AuthorizeString, ":");
    If Position > 0 Then
        Login = Left(AuthorizeString, Position - 1);
        Password = Mid(AuthorizeString, Position + 1);
    EndIf;

    // Host and port.
    Host = ServerName;
    Port = "";
    Position = StrFind(ServerName, ":");
    If Position > 0 Then
        
        Host = Left(ServerName, Position - 1);
        Port = Mid(ServerName, Position + 1); 
        For Index = 1 To StrLen(Port) Do
            Symbol = Mid(Port, Index, 1);
            If Not IsNumber(Symbol) Then
                Port = "";
                Break;    
            EndIf;
            
        EndDo;
        
        If IsBlankString(Port) Then
            If Schema = "http" Then
                Port = "80";
            ElsIf Schema = "https" Then
                Port = "443";
            EndIf;
        EndIf;
 
    EndIf;

    Result = New Structure;
    Result.Insert("Schema", Schema);
    Result.Insert("Login", Login);
    Result.Insert("Password", Password);
    Result.Insert("ServerName", ServerName);
    Result.Insert("Host", Host);
    Result.Insert("Port", ?(IsBlankString(Port), Undefined, Number(Port)));
    Result.Insert("PathOnServer", PathOnServer);
    Result.Insert("Parameters", Parameters);

    Return Result;

EndFunction // URIStructure()

Функция OAuthSignature формирует подпись из переданных данных.
Внимание на реализации функции HMAC_SHA1(UrlSignature, KeySignature) заострять не буду оно довольно тривиальное и достаточно легко реализуется.
Методы шифрования в данной статье не рассматриваются и потому ветка IsBlankString(EncryptNumber) не имеет реализации чтения зашифрованных значений.

Function OAuthSignature(Val HTTPMethod, Val URL, Val OAuthSignatureMethod, 
    Val PreparedSignature, EncryptedData) Export
    
    UrlSignature = HTTPMethod + "&" 
        + EncodeString(URL, StringEncodingMethod.URLEncoding) + "&" 
        + EncodeString(PreparedSignature, StringEncodingMethod.URLEncoding);
   
    KeySignature = EncryptedFiledValue("oauth_consumer_secret", EncryptedData) 
        + "&" + EncryptedFiledValue("oauth_token_secret", EncryptedData);
    
    If Upper(TrimAll(OAuthSignatureMethod)) = "HMAC-SHA1" Then
 
        Signature = HMAC_SHA1(UrlSignature, KeySignature);
        
    Else
        
        ErrorMessage = NStr("en = 'Signature method is not supported.';
            |ru = 'Сигнатурный метод не поддерживаеться.'");
            
        Raise ErrorMessage;
        
    EndIf;
    
    Return Signature;           
    
EndFunction // OAuthSignature()

// Only for internal use.
//
Function EncryptedFiledValue(FieldName, EncryptedData)
    
    SearchResult = EncryptedData.Find(FieldName, "FieldName");
    If SearchResult <> Undefined Then
        
        FieldValue = SearchResult.FieldValue;
        EncryptNumber = SearchResult.EncryptNumber;
        If IsBlankString(EncryptNumber) Then
            Return FieldValue;
        Else
            Return "";
        EndIf;
        
    Else
        
        Return "";    
        
    EndIf;
  
EndFunction // EncryptedFiledValue()

Процедура HTTPSecureRequest, непосредственно, выполняет обращение к серверу авторизации и при успешном результате полученные данные добавляет в таблицу EncryptedData, таблица имеет вид:
Реквизиты таблицы с зашифрованными данными OAuth 1.0a

Procedure HTTPSecureRequest(Parameters, EncryptedData) Export
    
    URIStructure = IHL_CommonUseClientServer.URIStructure(
        Parameters.ServerName + Parameters.Resource);
    
    HTTPRequest = New HTTPRequest(URIStructure.PathOnServer);
    For Each Header In Parameters.Headers Do 
        HTTPRequest.Headers.Insert(Header.Key, Header.Value);
    EndDo;
    
    HTTPConnection = New HTTPConnection(
        URIStructure.Host,
        URIStructure.Port,
        URIStructure.Login,
        URIStructure.Password,
        ,
        ,
        New OpenSSLSecureConnection(Undefined, Undefined));
        
    HTTPResponse = HTTPConnection.CallHTTPMethod(Parameters.HTTPMethod, 
        HTTPRequest);
    
    If HTTPResponse.StatusCode = 200 Then
        
        ContentType = HTTPResponse.Headers.Get("Content-Type");
        If ContentType = "text/plain" Then
            
            Body = HTTPResponse.GetBodyAsString();
            BodyParts = StrSplit(Body, "&");
            For Each BodyPart In BodyParts Do
                
                Position = StrFind(BodyPart, "=");
                If Position > 0 Then
                    FieldName  = Left(BodyPart, Position - 1);
                    FieldValue = Mid(BodyPart, Position + 1);
                    If Parameters.Fields.Find(FieldName) <> Undefined Then
                        RowResult = EncryptedData.Find(FieldName, "FieldName");
                        If RowResult = Undefined Then
                            RowResult = EncryptedData.Add();
                        EndIf;
                        RowResult.FieldName  = FieldName;
                        RowResult.FieldValue = FieldValue;
                    EndIf;
                EndIf;
            EndDo;
        EndIf;
    Else
        Raise HTTPResponse.GetBodyAsString();
    EndIf;
    
EndProcedure // HTTPSecureRequest()

ШАГ 3. Авторизация пользователя и приложения на QuickBooks

На этом шаге конфигурация «1С:Предприятие 8» должна перенаправить пользователя на ресурс для авторизации на адрес https://appcenter.intuit.com/Connect/Begin?oauth_token=token, где oauth_token равен полученному на предыдущем этапе. После успешной авторизации пользователя и предоставления доступа приложения к компании в QuickBooks, будет выполнено переход на CallbackUrl (вы можете разместить сервер который будет обрабатывать запросы или воспользоваться перехватом управления как выполнено в видео, что ниже).

ШАГ 4. Замена временного токена на постоянный

На последнем шаге необходимо заменить временный oauth_token на постоянный:

  • Функция OAuthToken() возвращает временный token полученный на шаге 2;
  • Функция OAuthVerifier() возвращает значение oauth_verifier, которое было получено на шаге 3 при переадресации на CallbackUrl:
// Only for internal use.
//
Procedure AccessToken() Export
    
    OAuthList = New ValueList();
    OAuthList.Add(OAuthNonce(),             "oauth_nonce");
    OAuthList.Add(OAuthToken(),             "oauth_token");
    OAuthList.Add(OAuthVersion(),           "oauth_version");
    OAuthList.Add(OAuthVerifier(),          "oauth_verifier");
    OAuthList.Add(OAuthTimestamp(),         "oauth_timestamp");
    OAuthList.Add(OAuthConsumerKey(),       "oauth_consumer_key");
    OAuthList.Add(OAuthSignatureMethod(),   "oauth_signature_method");
    
    Parameters = NewHTTPSecureParameters();
    Parameters.HTTPMethod = "GET";
    Parameters.ServerName = TokenServerName();
    Parameters.Resource   = AccessTokenResource();
    Parameters.Headers.Insert("Authorization", 
        AuthorizationHeader(Parameters.HTTPMethod, 
            Parameters.ServerName,
            Parameters.Resource,
            OAuthList));
    Parameters.Fields.Add("oauth_token");
    Parameters.Fields.Add("oauth_token_secret");
        
    HTTPSecureRequest(Parameters, EncryptedData);
      
EndProcedure // AccessToken()

После успешного выполнения необходимо сохранить данные таблицы EncryptedData и в дальнейшем использовать их для формирования AuthorizationHeader для выполнения запросов к ресурсам компании QuickBooks.

Вместо послесловия, полноценную рабочую версию не выкладываю из-за ограниченной лицензии, но мне кажется, не составит большого труда дописать недостающие части. Успехов в начинаниях.

Статья в личном блоге клац

Специальные предложения

Комментарии
Избранное Подписка Сортировка: Древо развёрнутое
Свернуть все
1. Tahallus 426 11.09.17 03:43 Сейчас в теме
Если не секрет можете рассказать для чего и как используется QuickBooks + 1С
2. pbazeliuk 1745 11.09.17 07:35 Сейчас в теме
(1) QuickBooks полноценная бухгалтерская система, в свою очередь конфигурация 1С используется как система для складского учета (1C:Small Business). Во многих организациях есть подобные связки бухгалтерия + складская или управленческая система.
3. flyer 228 11.09.17 12:39 Сейчас в теме
(2) у QuickBooks разве нет модуля управление складом?
4. pbazeliuk 1745 11.09.17 13:24 Сейчас в теме
(3) В "1С:Бухгалтерии" так же есть управление складом, но, как-то, не очень удобно, удобней "1С:Управление торговлей"... В "1С:Бухгалтерии" так же есть возможность учитывать розничные продажи, но, как-то, не очень удобно, удобней "1С:Розница"... и таких примеров масса.

В QuickBooks можно взять в оренду WMS как приложение, тут уже вопрос в цене.
5. kolya_tlt 22 12.09.17 14:20 Сейчас в теме
(4) если честно, так до конца и не понятно зачем делать какую-то конфигурацию.
у меня вот какой вопрос: удавалось ли решать вопросы единой аутентификации для всех систем, как в примере выше? QuickBooks + 1С.
затык заключается, в том, что openID 1C можно аутентифицироваться только в системах 1С, а хотелось бы иметь доступ во все платформы.
6. pbazeliuk 1745 12.09.17 14:37 Сейчас в теме
(5) если говорить об OpenID, то у стандарта всегда есть 3 стороны, в данном случае QuickBooks выступает как провайдер, клиент как клиент зарегистрированный у провайдера, 1С конфигурация как приложение, которое получает доступ к данным.
Для других систем так же можно пройти авторизацию, если провайдер поддерживается этими системами.

Аутентификацию к различным системам есть возможность выполнить с помощью https://infostart.ru/public/560516/ версии выше чем 0.9.0 (которая пока не доступна, но готовится к релизу, а пока делается описание, шаблоны для того чтобы выложить встраиваемую конфигурацию на общее обозрение).
7. kolya_tlt 22 12.09.17 14:54 Сейчас в теме
(6) у нас потребность не получении данных, в том, чтобы выполнив вход в провайдере (который не на 1С) попасть в систему 1С как в приложение.
8. pbazeliuk 1745 12.09.17 15:16 Сейчас в теме
(7) То что вы спрашиваете это не тема этой статьи, совсем. Но возможность такое сделать есть. Подали мне идею для платного модуля :)
9. kolya_tlt 22 12.09.17 16:35 Сейчас в теме
10. natalic 18.09.17 09:38 Сейчас в теме
Здравствуйте! в какой программе реализуется весь функционал? где писать код?
11. pbazeliuk 1745 18.09.17 10:30 Сейчас в теме
(10) Добрый день, все реализуется в «1С:Предприятие 8», после прохождения авторизации можно использовать все команды из API QuickBooks.
12. BigBoss 3 15.11.17 09:29 Сейчас в теме
(11) День добрый, вопрос: я как понимаю интеграция заключается в следующем: склад и всё что с ним связанно оформляется в 1С, а фин.операции оформляются в QuickBooks?
13. pbazeliuk 1745 15.11.17 10:16 Сейчас в теме
(12) Все зависит от того, какая конфигурация выбрана за основу и на сколько тесной необходима интеграция.
14. ylyas 25 15.12.18 23:03 Сейчас в теме
Ни где не нашел листинг процедуры из общего модуля: IHL_CommonUseClientServer.URIStructure
Можете привести?
16. ylyas 25 17.12.18 13:50 Сейчас в теме
(15) Благодарю, очень любезно с вашей стороны. Очень полезный экспириенс.
17. 0SpAGeTTi010 19.12.18 17:01 Сейчас в теме
Добрый Вечер! Опишите сам процесс подключения к песочнице.
Не совсем понятно, как ориентироваться на сайте, и какие поля там понадобятся в подключении. Спасибо
18. pbazeliuk 1745 21.12.18 21:31 Сейчас в теме
(17) About 18 months ago, we announced support for OAuth 2.0. At that time, all new apps started using OAuth 2.0 for authorization, and (optionally) OpenID Connect for single sign-on authentication.

We also launched an open OAuth 2.0 migration beta program so developers could give us feedback on our tools and resources. Over the past year, we have provided several OAuth 2.0 libraries, and included modules to migrate OAuth 1.0 tokens to OAuth 2.0 including, most recently, when we released libraries in Python and Node.js.

Если кратко, статья уже не актуальна. Уже OAuth 2.0, там все проще и проблем не должно возникать
19. ylyas 25 23.12.18 19:05 Сейчас в теме
(18)
Боюсь, что вы не до оцениваете ценность вашей статьи.
Мне, например, не к QuickBooks подключаться нужно.
И метод сигнатур другой используется.
Но есть еще куча ресурсов, которые по прежнему пользуют oauth1.0a( как в моем случае).
По этом ваша публикация очень хороший и наглядный пример для меня. :)
20. ylyas 25 23.12.18 19:17 Сейчас в теме
У меня вот к вам другой вопрос, Петр.
скажите, порядок выполнения запросов для авторизации(request token ->access token) всегда остается один и тот же независимо от oauth_signature_method ?
Просто в моем случае это private app и RSA-SHA1. То есть, на сайт выложен public key а у меня есть private key.
Или в таком случае уже не нужно запрашивать токен доступа? можно сразу выполнять запрос к данным передавая секретный ключ(oauth_token_secret) в заголовке?
23. pbazeliuk 1745 25.12.18 10:31 Сейчас в теме
(20) Пришлите ссылку на API, я вам порядок в личку распишу.
21. 0SpAGeTTi010 24.12.18 10:28 Сейчас в теме
Конечно, подключение к QuickBooks oline большая проблема для меня, и эта статься единственное от чего я отталкивался за все это время, правда все безрезультатно.
Теперь, у меня возник вопрос к подключению QuickBooks Desktop, вот тут на самом деле все проще должно быть, но нигде нет примеров подключения на встроенном языке 1С.
qbsdk130.exe я уже установил, хочу знать как запускать его программно из модуля 1с
22. ylyas 25 24.12.18 11:20 Сейчас в теме
(21) пробуйте ЗапуститьПриложение
24. 0SpAGeTTi010 04.01.19 14:00 Сейчас в теме
(22)Добрый день и С новым годом! Спасибо за предложенный вариант, но у меня нет необходимости открывать демонстративно qbsdk130.exe в 1С.
Мне нужно пользоваться инструменты qbsdk130.exe для интеграции. Как подключаться к qbsdk130.exe из модуля 1С, мне не известно, в интернете нет ни каких примеров(
25. ylyas 25 04.01.19 21:05 Сейчас в теме
(24)
Не понимаю о чем речь. вообще. пишите в личку. если интересно
26. 0SpAGeTTi010 05.01.19 14:59 Сейчас в теме
(25)Да, интересно. Напишите мне первым, у меня нет возможности до Вас дописаться
27. 0SpAGeTTi010 11.01.19 10:49 Сейчас в теме
Добрый день! Вы у меня в друзьях, а написать Вам не могу. Напишите мне первым, пожалуйста. У меня один вопросик будет
28. minlebay 03.09.19 14:20 Сейчас в теме
(27) Добрый день! Получилось ли у Вас подключиться к QuickBooks Online?
Оставьте свое сообщение

См. также

3 онлайн-курса по 1С-программированию: обмен данными, расчетные задачи и бухгалтерские задачи с 12 мая по 8 июля 2020 г. Промо

Практика программирования v8 Бесплатно (free)

Пакет из 3-х курсов по 1С-программированию. Основная цель - сформировать у слушателей практические навыки, связанные с реализацией задач обмена для прикладных решений, работающих на платформе “1С:Предприятие”, а также с разработкой прикладных решений, предназначенных для автоматизации расчета заработной платы и задач бухгалтерского учета.

22.04.2020    3197    23    infostart    2    

Программная работа с настройками СКД

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Нюансы программной работы с настройками системы компоновки данных в отчетах и динамических списках. Обзор всех видов настроек компоновки. Что в каких случаях правильно применять. В качестве примера рассмотрена работа с отборами и группировками.

27.01.2020    15045    0    ids79    26    

[СКД] Программное создание схемы компоновки данных

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Сделаем отчет на СКД полностью программно, без использования макета "схема компоновки данных".

15.01.2020    15640    0    John_d    22    

Последовательности событий. Шпаргалка

Практика программирования v8 Россия Бесплатно (free)

Собрал информацию о событиях/подписках/расширениях в одном месте.

30.12.2019    10760    0    kuzyara    33    

Использование программных перечислений, ч.1: строковые константы Промо

Практика программирования v8 1cv8.cf Бесплатно (free)

Часто ли у вас возникает необходимость в коде выполнять сравнение на строку?

10.12.2016    34178    0    unichkin    45    

Таблица значений. Нюансы

Практика программирования v8 Бесплатно (free)

Обзор некоторых аспектов использования общеизвестного инструмента 1С.

01.10.2019    25390    0    Yashazz    45    

[Шпаргалка] Программное создание элементов формы

Практика программирования Работа с интерфейсом v8 1cv8.cf Бесплатно (free)

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

06.09.2019    34807    0    rpgshnik    59    

Агрегатные функции СКД, о которых мало кто знает

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Пользуетесь ли Вы всеми возможными агрегатными функциями, которые предоставляет система компоновки данных? Если Вы используете только: СУММА, КОЛИЧЕСТВО, МИНИМУМ, МАКСИМУМ, СРЕДНЕЕ, то эта статья для Вас.

05.09.2019    36977    0    ids79    52    

Вспомогательные инструкции в коде 1С Промо

Практика программирования v8 1cv8.cf Бесплатно (free)

Помогаем редактору кода 1С помогать нам писать и анализировать код.

15.10.2018    26151    0    tormozit    100    

Регистры бухгалтерии. Общая информация

Практика программирования Математика и алгоритмы v8 v8::БУ БУ Бесплатно (free)

Общая информация о внутреннем устройстве регистров бухгалтерии.

05.09.2019    21632    0    YPermitin    24    

Три костыля. Сказ про фокусы в коде

Практика программирования v8 Бесплатно (free)

Три интересных (или странных) костыля в коде, которые могут помочь в повседневных и не очень задачах.

03.09.2019    21847    0    YPermitin    80    

Отслеживание выполнения фонового задания

Практика программирования Универсальные функции Разработка v8 1cv8.cf Бесплатно (free)

Запуск фонового задания из модуля внешней обработки. Отслеживание выполнения задания в виде прогресса, расположенного на форме.

17.08.2019    25731    0    ids79    16    

Оформление и рефакторинг сложных логических выражений Промо

Практика программирования v8 Россия Бесплатно (free)

В сложных логических выражениях нередко самому автору спустя какое-то время тяжело разобраться, не говоря уже о других программистах. Предлагаемая методика позволяет повысить наглядность таких выражений путем оформления в виде И-ИЛИ дерева и одновременно выполнять их рефакторинг.

20.09.2012    73676    0    tormozit    129    

Функции СКД: ВычислитьВыражение, ВычислитьВыражениеСГруппировкойМассив

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Подробное описание и использование внутренних функций системы компоновки данных: Вычислить, ВычислитьВыражение, ВычислитьВыражениеСГруппировкойМассив, ВычислитьВыражениеСГруппировкойТаблицаЗначений.

08.08.2019    56106    0    ids79    37    

Фоновое выполнение кода в 1С - это просто

Практика программирования v8 1cv8.cf Бесплатно (free)

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

02.08.2019    26425    0    avalakh    21    

СКД - наборы данных и связи между ними, создание собственной иерархии, вложенные отчеты

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Набор данных объект. Использование в схеме компоновки нескольких наборов данных. Различные варианты связи наборов: объединение, соединение. Использование иерархии в отчетах на СКД. Создание собственной иерархии, иерархия детальных записей. Использование вложенных схем в отчетах на СКД.

26.07.2019    42547    0    ids79    11    

Запись значения в поле ввода/формы со срабатыванием события ПриИзменении Промо

Практика программирования v8 1cv8.cf Россия Бесплатно (free)

Иногда возникает необходимость после записи значения в какое либо поле ввода/формы вызвать для него обработчик события ПриИзменении, а о вызове самого события приходится только мечтать. В этой статье приводится программный способ вызова этого события.

11.07.2007    44767    0    tormozit    38    

СКД - использование расширений языка запросов, секция ХАРАКТЕРИСТИКИ

Инструментарий разработчика Практика программирования v8 v8::СКД Бесплатно (free)

Автоматическое и не автоматическое заполнение полей компоновки данных. Использование расширений языка запросов для СКД «{…}», секция ВЫБРАТЬ, секция ГДЕ, параметры виртуальных таблиц. Автоматизированное использование дополнительных данных в запросе: секция ХАРАКТЕРИСТИКИ.

17.07.2019    28551    0    ids79    27    

Регистры сведений. За кулисами

Практика программирования Разработка v8 1cv8.cf Бесплатно (free)

Небольшие заметки по внутреннему устройству регистров сведений.

09.07.2019    21468    0    YPermitin    13    

"Меньше копипаста!", или как Вася универсальную процедуру писал

Практика программирования Разработка v8 v8::СКД 1cv8.cf Бесплатно (free)

Программист Вася разбирает подход создания универсальных методов на примере программного вывода СКД.

04.07.2019    16469    0    SeiOkami    50    

Как сделать из &НаКлиентеНаСервереБезКонтекста почти &НаКлиентеНаСервере Промо

Практика программирования v8 1cv8.cf Россия Бесплатно (free)

Как сделать метод формы, доступный на клиенте и на сервере одновременно, и сохранить при этом удобство разработки

10.09.2017    40524    0    tormozit    72    

Создание отчетов с помощью СКД - основные понятия и элементы

Практика программирования Математика и алгоритмы v8 v8::СКД Бесплатно (free)

Основные принципы работы СКД. Понятия схемы компоновки и макета компоновки. Описание основных элементов схемы компоновки: наборы данных, поля, вычисляемые поля, ресурсы, параметры.

25.06.2019    42303    0    ids79    19    

Многопоточное ускорение однопользовательских нагрузок в 1С + Microsoft SQL Server 2017

Практика программирования Производительность и оптимизация (HighLoad) v8 v8::Запросы Бесплатно (free)

Взаимодействие с Microsoft SQL Server нередко вызывает трудности у 1С-ников, а потому интересны любые моменты, связанные с его использованием. О своем опыте работы с новым SQL Server 2017 участникам конференции Infostart-2018 рассказал директор ООО «Аналитика софт» Дмитрий Дудин.

11.06.2019    21402    0    dmurk    144    

Регистры накопления. Структура хранения в базе данных

Практика программирования Разработка v8 1cv8.cf Бесплатно (free)

Структура хранения регистров накопления в базе данных для платформы 1С:Предприятие 8.x. Первая часть в серии публикаций.

16.05.2019    35416    0    YPermitin    30    

Выгрузка документа по условию Промо

Практика программирования Разработка v8 Бесплатно (free)

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

25.04.2019    14163    0    m-rv    2    

Выполнение внешней обработки в фоновом задании

Практика программирования Разработка v8 1cv8.cf Бесплатно (free)

Подробное описание подхода к созданию длительной операции на основе внешней обработки. Реализация протестирована на 1С 8.3.12.1714 (x64).

11.05.2019    24245    0    Eret1k    23    

О расширениях замолвите слово...

Практика программирования Разработка v8 Бесплатно (free)

О чём стоит задуматься при принятии решения о создании расширения конфигурации…

07.04.2019    29326    0    ellavs    126    

Git-репозитории для 1С-кода (опыт использования при небольших проектах)

Практика программирования Разработка v8 Бесплатно (free)

Инструкции по взаимодействию с Git-репозиторием, которые писались для тех наших программистов, которые вообще никогда не работали с Git (руководства в духе "Как получить код из git-репозитория?", "Как отправить код в git-репозиторий")...

28.03.2019    23050    0    ellavs    86    

Как прикрутить ГУИД к регистру сведений Промо

Практика программирования Перенос данных из 1C8 в 1C8 Разработка v8 Бесплатно (free)

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

16.04.2019    17773    0    m-rv    17    

RabbitMQ + Конвертация Данных 3.0

Внешние источники данных Обмен через XML Интеграция Перенос данных из 1C8 в 1C8 v8 КД Бесплатно (free)

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

21.03.2019    22765    0    barelpro    82    

Трюки с внешними источниками данных

Практика программирования Разработка v8 1cv8.cf Бесплатно (free)

Некоторые трюки для преодоления ограничений внешних источников данных.

14.03.2019    26468    0    YPermitin    53    

Разработка и сценарное тестирование с Vanessa-ADD. Отчетность Allure. Автоматизация запуска сценариев

Практика программирования Vanessa Automation v8 Россия Бесплатно (free)

Формируем отчетность о результатах выполнения сценариев. Автоматизируем запуск.

26.02.2019    18366    0    Vladimir Litvinenko    27    

Как сделать запрос на изменение данных Промо

Практика программирования v8 v8::Запросы 1cv8.cf Бесплатно (free)

В статье приведены особенности внутренней архитектуры и примеры работы с расширением языка запросов 1С.

01.06.2018    27426    0    m-rv    21    

Возможности типовых шаблонов ограничения доступа на уровне записей (RLS)

Практика программирования БСП (Библиотека стандартных подсистем) Роли и права v8 v8::Права Бесплатно (free)

Краткий обзор применения типовых шаблонов ограничения доступа на уровне записей в конфигурациях, созданных на базе БСП: #ПоЗначениям, #ПоНаборамЗначений, #ПоЗначениямРасширенный, #ПоЗначениямИНаборамРасширенный

03.02.2019    31444    0    ids79    9    

EnterpriseData – часть 2. Процесс выгрузки данных

Практика программирования Обмен через XML v8 v8::УФ Россия Бесплатно (free)

Основные этапы выгрузки данных через ED, обработчики событий выгрузки, правила обработки данных, правила конвертации объектов, конвертация свойств первого и второго этапов, процедуры БСП, используемые при выгрузке данных, структура «КомпонентыОбмена».

26.12.2018    22849    0    ids79    31    

Метод формирования движений в типовых регистрах нетиповыми регистраторами Промо

Практика программирования v8 1cv8.cf Бесплатно (free)

Вариант решения задач с проведением по типовым регистрам нетиповыми регистраторами. Зачем - чтобы при сравнении конфигурации не обращать внимание на свойства регистров и исключить вероятность допущения горькой оплошности при обновлении информационных баз, заменив типы регистраторов основной конфигурации типами конфигурации поставщика. Для программных продуктов, имеющих в своем составе метаданных документ "Корректировка регистров"("Корректировка записей регистров").

05.12.2017    25721    0    itriot11    34    

Новый подход к обмену данными EnterpriseData

Практика программирования Обмен через XML v8 v8::УФ Россия Бесплатно (free)

Хочу предложить Вашему вниманию цикл статей, посвященных обмену данными через универсальный формат (EnterpriseData или ED).

14.12.2018    35108    0    ids79    72    

EnterpriseData - пример доработки правил конвертации без использования КД 3.0 в расширении конфигурации

Практика программирования Обмен через XML v8 v8::УФ БП3.0 УТ11 Россия Бесплатно (free)

В статье подробно описан реальный пример доработки обмена данными через EnterpriseData (универсальный формат обмена) между конфигурациями УТ 11.4 и Бухгалтерия 3.0

16.11.2018    31779    0    ids79    32    

Программное заполнение пользовательских параметров и отборов СКД

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Публикация представляет из себя краткие примеры того, как можно заполнять параметры СКД программно так, чтобы все параметры и отборы были доступны в быстрых настройках и в обычных (типовых) настройках параметров и отборов СКД.

13.11.2018    37478    0    Unk92    21    

Использование классов .Net в 1С для новичков Промо

Практика программирования Разработка внешних компонент Универсальные функции v7.7 v8 Бесплатно (free)

Руководство для новичков. Написав статью http://infostart.ru/public/238584/, я понял, что многие не понимают того, что написано. Поэтому в этой статье постараюсь более подробно остановиться на азах и без кода на вражеском языке (C#)

27.01.2016    71056    0    Serginio    108    

Произвольный код в фоновом режиме

Практика программирования v8 1cv8.cf Бесплатно (free)

Задача: реализовать выполнение произвольного кода в фоновом режиме без изменения конфигурации, т.е. во внешней обработке.

03.09.2018    23960    0    nikita0832    42    

Основные понятия и механизмы оптимизации клиент-серверного взаимодействия в 1C

Математика и алгоритмы Практика программирования v8 Россия Бесплатно (free)

У многих начинающих 1С программистов часто возникают вопросы про клиент-серверное взаимодействие в 1С и чтобы разобраться в непростых механизмах платформы, необходимо понять, что же такое контекст, для чего предназначены директивы компиляции, что представляют собой контекстные/внеконтекстные вызовы и как наиболее оптимально описывать прикладные задачи в модулях управляемых форм.

23.08.2018    34838    0    Rain88    46    

Работаем с дополнительными реквизитами на форме

Практика программирования v8 Бесплатно (free)

Пара полезных процедур для работы с дополнительными реквизитами на форме. Далее в статье: 1. Как называются дополнительные реквизиты на форме и в какой момент они появляются на форме? 2. Как проверить до записи корректность заполнения пользователем дополнительного реквизита? 3. Как заполнить значение дополнительного реквизита по другому событию и обновить данные на форме? 4. Как расположить дополнительный реквизит в указанном месте на форме?

15.07.2018    29390    0    papche    37    

Автоматические и управляемые блокировки применительно к типовым конфигурациям 1С Промо

Математика и алгоритмы Практика программирования v8 v8::blocking 1cv8.cf Бесплатно (free)

Основные принципы работы с режимами автоматических и управляемых блокировок в 1С Предприятие 8. Теория и применение в типовых конфигурациях: БП, УТ, ЕРП

10.11.2018    30603    0    ids79    40    

Повышаем эффективность разработки правил обмена

Практика программирования Перенос данных из 1C8 в 1C8 v8 КД Бесплатно (free)

Как повысить скорость и качество разработки правил обмена? Как вести групповую разработку правил обмена? Как облегчить сопровождение правил обмена после передачи в эксплуатацию? Об этом и многом другом вы можете узнать из этой статьи.

25.06.2018    26136    0    olegtymko    47    

Введение в механизм представлений в ЗУП ред. 3

Практика программирования v8 v8::СПР ЗУП3.x Бесплатно (free)

В нашей организации на первом же телефонном собеседовании на должность разработчика по ЗУП ред. 3 вас обязательно спросят о том, что такое "Представления".

04.06.2018    34116    0    xrrg    82    

Строим графы средствами 1С (без GraphViz)

Практика программирования v8 Бесплатно (free)

Множество статей на Инфостарте описывают, как работать с компонентой GraphViz, чтобы построить ориентированный граф. Но практически нет материалов, как работать с такими графами средствами 1С. Сегодня я расскажу, как красиво строить графы с минимальным пересечением. Нам этот метод пригодился для отрисовки алгоритмов в БИТ.Финансе, т.к. типовой механизм не устраивал. Еще это может быть полезно для визуализации различных зависимостей: расчета себестоимости, графы аффилированности компаний и т.д. Надеюсь, эта статья поможет сделать мир 1С красивее и гармоничней:) Итак, поехали...

23.05.2018    22874    0    slozhenikin_com    20    

Тестер: частые вопросы Промо

Практика программирования v8 Бесплатно (free)

Ошибкам бой - тесты норма жизни!

25.07.2018    26244    0    grumagargler    26    

Распределение расходов пропорционально продажам

Финансовый учет и бюджетирование (FRP) Учет доходов и расходов Практика программирования Финансовый учет и бюджетирование (FRP) Учет доходов и расходов v8 v8::ОУ УТ10 УУ Бесплатно (free)

Финансовая модель. Распределение административных расходов по подразделениям пропорционально продажам за месяц. Дополнительные реквизиты против бизнес-процессов!

13.05.2018    17009    0    Rustig    9    

Просмотр временных таблиц запроса в отладчике без изменения кода

Практика программирования v8 v8::Запросы 1cv8.cf Бесплатно (free)

Данный способ можно использовать для просмотра содержимого временных таблиц запросов (менеджеров временных таблиц) без внесения изменений в код.

24.04.2018    42888    0    avfed@rambler.ru    26    

[ВсеПросто] "Оперативный" информатор из 1С за 5 мин.

Практика программирования v8 Бесплатно (free)

Быть всегда в курсе дел, даже в дороге!

22.02.2018    25303    0    DarkAn    25    

Минимализмы 3

Практика программирования Универсальные функции v8 Бесплатно (free)

Очередная серия "минимализмов" [http://infostart.ru/public/306536/, https://infostart.ru/public/460935/]. Также, как и в предыдущих статьях, здесь приведена подборка коротких оригинальных авторских решений некоторых задач. Ранее эти решения были разбросаны по моим комментариям к чужим публикациям.

19.02.2018    43859    0    ildarovich    45