Известно преимущество платформы 1С по разработке удобных интерфейсов для пользователей: быстрота разработки, качество, красота и удобство для пользователей.
Было принято решение разработать небольшую конфигурацию на платформе 1С 8.3.
Для связи с данными системы Галактика ERP использовался COMОбъект.
Для реализации соединения COM в 1С используется специальный механизм под названием COMConnector. Этот объект устанавливается вместе с платформой и применяется для связи информационных баз.
Чтобы иметь возможность подключиться к данным другой базы и запросить нужную информацию или иметь соединения COM в 1С платформе, необходимо знать следующие данные:
1. какого она типа – файловая или клиент-серверная;
2. где располагается;
3. под каким именем и паролем в нее можно зайти;
4. какие данные вас интересуют.
По условиям описанной выше задачи формируем соединение COM в 1С:
&НаСервере
Процедура СоединениеСБДГалактикиЕЕР()
ГалактикаСоединение = Новый СОМОбъект("ADODB.Connection");
Provider = "SQLOLEDB"; //Драйвер SQL
DataSource = "SQL02\GALAKTIKA"; //Имя или IP-адрес SQL-сервера
Initialcatalog = "bszgal"; //Имя базы данных
UID = "sa"; //Логин пользователя SQL-сервера
PWD = "lqaz@WSX"; //Пароль пользователя SQL-сервера
ConnectString = "Provider=" + Provider + ";Data Source=" + DataSource + ";Initial Catalog=" + Initialcatalog + ";UID=" + UID + ";PWD=" + PWD; ГалактикаСоединение.Connectionstring = ConnectString;
ГалактикаСоединение.ConnectionTimeOut = 6;
ГалактикаСоединение.CommandTimeout = 600;
Попытка
ГалактикаСоединение.Open() ;
Сообщить("Мы соединились с БД Галактики ERP") ;
Исключение
ГалактикаСоединение = Неопределено;
Сообщить ("Не удалось соединиться с БД Галактики ERP");
КонецПопытки;
КонецПроцедуры
Все – мы имеем доступ к данным.
Дальше все просто. Формируем SQL запрос к данным:
&НаСервере
Процедура ХПГалактикиНаСервере()
СоединениеСБДГалактикиЕЕР();
ОбъектХП = Новый COMObject ("ADODB.Command"); Попытка
ТекстЗапроса =
"SELECT
|KatSopr.F$NSopr НомДок
|,dbo.uf_ToMSDate(KatSopr.F$DSopr) ДДок
|, CASE WHEN Dogovor.F$NoDoc IS NULL THEN Dogovor.F$NoDoc_Ext ELSE Dogovor.F$NoDoc END НомерДоговора
|, dbo.uf_ToMSDate(Dogovor. F$DDoc) ДДоговор
|, Dogovor.F$Summa ДоговорСумма
|, Dogovor.F$SUMNDS ДоговорНДС
|, KatOrg.F$Code КодКонтрагент
|, KatOrg.F$Name ИмяКонтрагент
|, KatUsl.F$Kod КодУслуга
|, KatUsl.F$Name ИмяУслуга
|, KatEd.F$Abbr ЕдИзм
|, SpSopr.FSKolFact КоличествоДок, SpSopr.F$Price ЦенаДок, SpSopr.F$SumNDS СуммаНДСДок
|, CASE WHEN KatSopr.F$VhodNal=l THEN SpSopr.F$KolFact*SpSopr.F$Price-SpSopr.F$SumNDS ELSE SpSopr.F$
|, SpSoprPodr.AttrValvString Подразделение
|, OborotSoprDoc.SumOb СуммаОборот
|, AttrValOS.KatOSInNum КодОР, AttrValOS.KatOSNameOS ИмяОР
| AttrValBuhSchet.BuhSchet БухСчет, AttrValBuhSchet.BuhSchetName БухСчетИмя
|, AttrValStZatr.StZatrKod КодЗатрата, AttrValStZatr.StZatrName ИмяЗатрата
| FROM TSKatSopr KatSopr
| LEFT JOIN T$Dogovor Dogovor ON KatSopr.FSCDogovor = Dogovor.F$NRec
| LEFT JOIN T$KatOrg KatOrg ON KatSopr.FScOrg = KatOrg.FSNRec
| INNER JOIN TSSpSopr SpSopr ON SpSopr.FScSopr = KatSopr.F$NRec
| LEFT JOIN T$KatUsl KatUsl ON SpSopr.FScMCUsl = KatUsl.F$NRec»;
| LEFT JOIN (SELECT AttrVal.FScRec AttrValcRec, AttrVal.FSvString AttrValvString
| FROM TSAttrVal AttrVal
| INNER JOIN TSAttrNam AttrNam ON AttrVal.FScAttrNam=AttrNam.FSNRec AND |AttrNam.FSName=‘Подразделение’
| WHERE AttrVal.FSwTable=1110) SpSoprPodr ON SpSoprPodr.AttrValcRec=SpSopr.FSNRec
| INNER JOIN (SELECT Oborot.FScSoprDoc cSoprDoc, SUM(Oborot.FSSumOb) SumOb
| FROM T$Oborot Oborot
| WHERE Oborot.FSSchetK = ‘560’
| AND Oborot.F$SubSchK = ‘01’
| AND dbo.uf_ToMSDate(Oborot.FSDatOb) BETWEEN ‘"+ДатаС+"’ AND ‘"+ДатаПо+"'
| AND dbo.Tolnt64 (Oborot.FScPlansSch)=281474976710657
| GROUP BY Oborot.FScSoprDoc
| HAVING ROUND(SUM(Oborot.FSSumOb), 2)00) Oborot SoprDoc ON KatSopr. FSNRec=OborotSoprDoc. cSoprDoc
|LEFT JOIN (SELECT AttrVal.FScRec AttrValcRec, KatOS.FSlnNum KatOSInNum, KatOS.F$NameOS KatOSNameOS
| FROM TSAttrNam AttrNam
| LEFT JOIN TSAttrVal AttrVal ON AttrVal.FSCAttrNam = AttrNam.FSNRec
| LEFT JOIN TSKatOS KatOS ON AttrVal.FSvComp = KatOS.FSNRec
| WHERE AttrNam.FSName = тОбъект ремонта’
| AND AttrNam.F$wTable = 1110) AttrValOS ON SpSopr.F$NRec = AttrValOS.AttrValcRec
| LEFT JOIN (SELECT AttrVal.FScRec AttrValcRec
| , CASE WHEN BuhSchet.FSSubSch = TT THEN SUBSTRING(BuhSchet.FSSchet, 2, LEN (BuhSchet.FSSchet) - 1) ELSE |SUBSTRINGS
| , BuhSchet.FSName BuhSchetName
|FROM TSAttrNam AttrNam
| LEFT OUTER JOIN TSAttrVal AttrVal ON AttrVal.FSCAttrNam = AttrNam.FSNRec
| LEFT OUTER JOIN TSBuhSchet BuhSchet ON AttrVal.FSvComp = BuhSchet.FSNRec
| WHERE AttrNam.F$Name = ‘Ан_Счет отнесения затрат’
| AND AttrNam.FSwTable = 1110) AttrValBuhSchet ON SpSopr.FSNRec = AttrValBuhSchet.AttrValcRec
| INNER JOIN (SELECT AttrVal.FScRec AttrValcRec, StZatr.F$Kod StZatrKod, StZatr.F$Name StZatrName
| FROM TSAttrNam AttrNam
| LEFT JOIN TSAttrVal AttrVal ON AttrVal.FScAttrNam = AttrNam.FSNRec
| LEFT JOIN TSStZatr StZatr ON AttrVal.FSvComp = StZatr.FSNRec
| WHERE AttrNam.FSName = 'Ан_Статьи расходов/доходов’
| AND AttrNam.FSwTable = 1110
Причем, как вы видите в тексте запроса, мы используем богатый арсенал по организации выборок, предоставленный нам инструментом SQL Server в Management Studio.
А дальше еще проще: загружаем полученные данные в таблицу значений и выводим ее на форму:
НаборДанных = Новый СОМОбъект("ADODB.Recordset");
НаборДанных.ActiveConnection = ГалактикаСоединение;
НаборДанных.Open(ТекстЗапроса, ГалактикаСоединение);
Таблица = Новый ТаблицаЗначений;
Для НомерСтолбца = 0 По НаборДанных.Fields.Count-1 Цикл
ИмяСтолбца =НаборДанных.Fields.Item(НомерСтолбца).Name;
Таблица.Колонки.Добавить(ИмяСтолбца);
КонецЦикла;
Пока НаборДанных.EOF = 0 Цикл
НоваяСтрока = Таблица.Добавить () ;
Для НомерСтолбца = 0 По НаборДанных.Fields.Count-1 Цикл
НоваяСтрока.Установить (НомерСтолбца, НаборДанных.Fields (НомерСтолбца). Value);
КонецЦикла;
НаборДанных.MoveNext();
КонецЦикла;
НаборДанных.Close();
Надо сказать, что пользователь был очень доволен. Он получил необходимые данные, используя преимущество 1С – юзабилити.