Показать сообщение отдельно
Старый 03.12.2004, 11:31   #14  
raz is offline
raz
NavAx
Аватар для raz
NavAx Club
Лучший по профессии 2014
Лучший по профессии 2009
 
1,490 / 1060 (38) ++++++++
Регистрация: 22.07.2003
Адрес: МО
У меня работает так:
1. В 1С в глобальном модуле написано несколько функций, котрые принимают данные и создают документы в 1С.
2. В Axapta сделано несколько функций для передачи документов в 1С и через COM идет вызов функций из глобального модуля.

Конкретный пример (не причесаный, прямо из рабочего приложения):

В 1С добавляем функцию:
PHP код:
// Функция предназначена для создания сотрудника через COM
// Вызывается из Axapta
Функция COMДобавитьСотрудника(Код,Название,АдресПрописка,АдресФакт,Гражданство,ДатаРегистрации,
                              
ДатаРождения,ДокументУдЛичность,ИНН,КодИМНС,МестоРождения,
                              
СтраховойНомерПФР,Телефон,Пол,СтажНепрерывный,СтажОбщий,
                              
СтажСеверныйЭкспорт

    Спр 
СоздатьОбъект("Справочник.Сотрудники");
    
Если ПустоеЗначение(Код) = 1 Тогда
        Возврат 100
;
    
Конецесли;
    
Если ПустоеЗначение(Название) = 1 Тогда
        Возврат 101
;
    
Конецесли;
    
Если Спр.НайтиПоКоду(Код,0) = 1 Тогда
        Спр
.Наименование        Название;
        
Спр.АдресПрописка       АдресПрописка;
        
Спр.АдресФакт           АдресФакт;
        
Спр.Гражданство         Гражданство;
        
Спр.ДатаРегистрации     ДатаРегистрации;
        
Спр.ДатаРождения        ДатаРождения;
        
Спр.ДокументУдЛичность  ДокументУдЛичность;
        
Спр.ИНН                 ИНН;
        
Спр.КодИМНС             КодИМНС;
        
Спр.МестоРождения       МестоРождения;
        
Спр.СтраховойНомерПФР   СтраховойНомерПФР;
        
Спр.Телефон             Телефон;

        
СпрПол СоздатьОбъект("Справочник.ОКИН");
        
СпрПол.НайтиПоНаименованию(Пол);
        
Если СпрПол.Выбран()>0 тогда
            Пол 
СпрПол.ТекущийЭлемент()
        
КонецЕсли;

        
Спр.Пол                 Пол;
        
Спр.СтажНепрерывный     СтажНепрерывный;
        
Спр.СтажОбщий           СтажОбщий;
        
Спр.СтажСеверный        СтажСеверный;
        
Спр.Записать();
        
Спр.ОсновнойЭлемент     Спр.ТекущийЭлемент();
        
Спр.Записать();

        
Возврат 102;
    
Конецесли;

    
Спр.Новый();
    
Спр.Код                 Код;
    
Спр.Наименование        Название;
    
Спр.АдресПрописка       АдресПрописка;
    
Спр.АдресФакт           АдресФакт;
    
Спр.Гражданство         Гражданство;
    
Спр.ДатаРегистрации     ДатаРегистрации;
    
Спр.ДатаРождения        ДатаРождения;
    
Спр.ДокументУдЛичность  ДокументУдЛичность;
    
Спр.ИНН                 ИНН;
    
Спр.КодИМНС             КодИМНС;
    
Спр.МестоРождения       МестоРождения;
    
Спр.СтраховойНомерПФР   СтраховойНомерПФР;
    
Спр.Телефон             Телефон;

    
СпрПол СоздатьОбъект("Справочник.ОКИН");
    
СпрПол.НайтиПоНаименованию(Пол);
    
Если СпрПол.Выбран()>0 тогда
        Пол 
СпрПол.ТекущийЭлемент()
    
КонецЕсли;

    
Спр.Пол                 Пол;
    
Спр.СтажНепрерывный     СтажНепрерывный;
    
Спр.СтажОбщий           СтажОбщий;
    
Спр.СтажСеверный        СтажСеверный;
    
Спр.Записать();
    
Спр.ОсновнойЭлемент     Спр.ТекущийЭлемент();
    
Спр.Записать();

    
Возврат 200;
КонецФункции 
В Axapta:
PHP код:
public void EmployersTo1C()
{
    
COM                     v77;
    
COM                     ref;
    
COM                     obj;
    
int                     res;
    
str                     Param;
    
counter                 ijerr;

    
EmplTable               EmplTable;
    
RO_Logins1C             RO_Logins1C;
    
RPayTaxParameters       rPayTaxParameters RPayTaxParameters::find();
    
RHRMVirtualNetworkTable rhrmVirtualNetworkTable;
    
RpayHRMOrganization     RpayHRMOrganization;

    
Addressing Address()
    {
        
Addressing      addressing;

        if(! 
emplTable.AddressMap_RU::isEmptyAdress())
            
addressing emplTable.AddressMap_RU::makeAddress(rPayTaxParameters.PensionFundAddressFormatId);
        else if(! 
rhrmVirtualNetworkTable.AddressFactMap_RU::isEmptyAdress())
            
addressing =  rhrmVirtualNetworkTable.AddressFactMap_RU::makeAddress(rPayTaxParameters.PensionFundAddressFormatId);
        else if(! 
emplTable.AddressFactMap_RU::isEmptyAdress())
            
addressing =  emplTable.AddressFactMap_RU::makeAddress(rPayTaxParameters.PensionFundAddressFormatId);
        else
            
addressing "";

        return 
addressing;
    }

    
Addressing AddressFact()
    {
        
Addressing      addressing;

        if(! 
rhrmVirtualNetworkTable.AddressFactMap_RU::isEmptyAdress())
            
addressing =  rhrmVirtualNetworkTable.AddressFactMap_RU::makeAddress(rPayTaxParameters.PensionFundAddressFormatId);
        else if(! 
emplTable.AddressFactMap_RU::isEmptyAdress())
            
addressing =  emplTable.AddressFactMap_RU::makeAddress(rPayTaxParameters.PensionFundAddressFormatId);
        else
            
addressing "";

        return 
addressing;
    }
    ;
    while 
select RpayHRMOrganization where RpayHRMOrganization.hrmOrganizationId == RO_OrgMain
            join RO_Logins1C where RO_Logins1C
.MainOrganization == RpayHRMOrganization.hrmOrganizationId
    
{
        
progressDlg.setText(strfmt("Передаем данные компании '%1'",RpayHRMOrganization.hrmOrganizationId));
        
progressDlg.update(true);

        if (!
winapi::pathExists(RO_Logins1C.PathTo1C))
        {
            
info(strfmt("С вашего компьютера не доступна 1С:ЗиК компании '%1'.",RpayHRMOrganization.description));
            continue;
        }

        
Param strfmt("/d\"%1\" /N%2 /P%3",RO_Logins1C.PathTo1C,RO_Logins1C.UserName1C,RO_Logins1C.Password1C);

        
info(strfmt("----- Начинаем использовать компанию '%1' ------",RpayHRMOrganization.description));

        
v77 = new COM("v77.Application");
        
res v77.initialize(v77.RMtrade(),Param,"NO_SPLASH_SHOW");
        if( !
res ) throw error("Ошибка открытия 1С");

        
ttsbegin;
        while 
select forupdate EmplTable
                where EmplTable
.RO_1CUpdated == NoYes::No &&
                      
EmplTable.RO_OrgMain   == RpayHRMOrganization.hrmOrganizationId
              join rhrmVirtualNetworkTable
                where rhrmVirtualNetworkTable
.EmplId == EmplTable.EmplId
        
{
            
Param "COMДобавитьСотрудника("                                    +
                    
"\"" + (EmplTable.RO_1C_Code EmplTable.RO_1C_Code EmplTable.EmplId) + "\"," +
                    
"\"" strrem(EmplTable.Name,"\"\n")                + "\"," +
                    
"\"" "," strrem(Address(),"\"\n")               + "\"," +
                    
"\"" "," strrem(AddressFact(),"\"\n")           + "\"," +
                    
"\"" Country::find(RHRMVirtualNetworkTable::findEmplId(EmplTable.EmplId).citizenship).RO_1C_Code "\"," +
                    
"\"" strfmt("%1",EmplTable.rhrmCreateDate)        + "\"," +
                    
"\"" strfmt("%1",EmplTable.BirthDate)             + "\"," +
                    
"\"" strrem(EmplTable.RO_IdentityCardFull_RU(),"\"\n") + "\"," +
                    
"\"" EmplTable.PayInn_RU                          "\"," +
                    
"\"" EmplTable.PayGniCode_RU                      "\"," +
                    
"\"" strrem(strfmt("0,%4,%3,%2,%1",Country::find(EmplTable.rhrmCountryBirthId).AddrFormat,
                                  
EmplTable.rhrmStateBirth,EmplTable.rhrmCountyBirth,EmplTable.rhrmTownBirth),"\"\n") + "\"," +
                    
"\"" strrem(EmplTable.PayInnPf_RU,"\"\n")         + "\"," +
                    
"\"" strrem(EmplTable.Phone,"\"\n")               + "\"," +
                    
"\"" strfmt("%1",RHRMVirtualNetworkTable::findEmplId(EmplTable.EmplId).gender) + "\"," +
                    
"\"" EmplTable.continuityDate_RU(false,'')        + "\"," +
                    
"\"" EmplTable.seniorityDate_RU(false,'')         + "\"," +
                    
"\"" EmplTable.northSeniorityDate_RU(false,'')    + "\"" +
                    
")";

            
strrem(Param,"\n");

            
res   v77.evalexpr(Param);

            switch (
res)
            {
                    case 
100 :
                            
info("Ошибка. Не указан табельный номер.");
                            
err++;
                            break;
                    case 
101 :
                            
info("Ошибка. Не указаны ФИО.");
                            
err++;
                            break;
                    case 
102 :
                            
info(strfmt("Сотрудник с табельным '%1' обновлен в 1С.",EmplTable.EmplId));
                            
EmplTable.RO_1C_Code   EmplTable.RO_1C_Code EmplTable.RO_1C_Code EmplTable.EmplId;
                            
EmplTable.RO_1CUpdated NoYes::Yes;
                            
EmplTable.doUpdate();
                            
j++;
                            break;
                    case 
200 :
                            
info(strfmt("Сотрудник '%1' %2 передан в 1С.",EmplTable.EmplId,EmplTable.Name));
                            
EmplTable.RO_1C_Code   EmplTable.RO_1C_Code EmplTable.RO_1C_Code EmplTable.EmplId;
                            
EmplTable.RO_1CUpdated NoYes::Yes;
                            
EmplTable.doUpdate();
                            
i++;
                            break;
            }
        }
        
ttscommit;

        
v77 null;

        
info(strfmt("----- Закончили использовать компанию '%1' ------",RpayHRMOrganization.description));
    }

    if (
|| || err)
        
info(strfmt("Передача в 1С: новых %1, совпадений кодов %2, ошибок %3.",i,j,err));
    else
        
info("Нет данных для передачи в 1С.");