Имя: Пароль:
1C
1С v8
Запуск скрипта SQL
0 ВежливаяТварь
 
27.08.12
15:47
Добрый день. Столкнулся с весьма интересной проблемой. Есть сторонняя программа (SalesWork) данные она тянет из Microsoft SQL 2005 Express.
В этой программе есть один отчет. Причем сам текст запроса с помощью которого формируется отчет хранится в таблице в этой же Sql-базе. Вопрос: я же могу точно так же использовать этот запрос, но из 1с? И если могу то, пожалуйста, опишите основные шаги.
1 Rie
 
27.08.12
15:47
ADODB.Recordset - не подойдёт?
2 shuhard
 
27.08.12
15:48
(0)[опишите основные шаги]
- извлечь текст запроса
- выполнить на стороне сервера
- убедиться в абсурдности данных
- перейти к пункту 1
3 ВежливаяТварь
 
27.08.12
15:49
(1) Я не знаю что это, но спасибо за подсказку, сейчас поищу в гугле.
4 ВежливаяТварь
 
27.08.12
15:49
(2) А почему данные будут абсурдны?
5 shuhard
 
27.08.12
15:50
(4) получишь - узнаешь
6 ВежливаяТварь
 
27.08.12
15:51
(5) то есть я не смогу вытянуть адекватные данные из Sql?
7 Rie
 
27.08.12
15:52
(6) Можешь. Но надо будет преобразовать их в достойный 1С вид.
8 shuhard
 
27.08.12
15:55
(6) бессодержательный вопрос
мы не видели ни текста запроса, ни структуры данных, ни передаваемых параметров

в общем случае - да, не сможешь
9 ВежливаяТварь
 
27.08.12
16:25
(8)

CREATE PROCEDURE swra_Sales_Desktop
   @ProdCategory_id INT = NULL,
   @ProdGroup_id INT = NULL,
   @ProductType_id INT = NULL,
   @Product_id INT = NULL,

   @WType_id UNIQUEIDENTIFIER = NULL,
   @W_id UNIQUEIDENTIFIER = NULL,

   @Date_From DATETIME = NULL,
   @Date_To DATETIME = NULL
AS
   
   SET @ProdCategory_id = ISNULL(@ProdCategory_id, 0)
   SET @ProdGroup_id = ISNULL(@ProdGroup_id, 0)
   SET @ProductType_id = ISNULL(@ProductType_id, 0)
   SET @Product_id = ISNULL(@Product_id, 0)
   
   SET @WType_id = ISNULL(@WType_id, '00000000-0000-0000-0000-000000000000')
   SET @W_id = ISNULL(@W_id, '00000000-0000-0000-0000-000000000000')
   
   SET @Date_From = ISNULL(@Date_From, '2008-01-01')
   SET @Date_To = ISNULL(@Date_To, '2011-01-01')
   
   DECLARE @l INT
   SET @l = (SELECT CONVERT(INT, PrefValue) FROM tblGlobalSettings WHERE Pref_id = 52)

   DECLARE @Products TABLE (Product_id INT)
   INSERT INTO @Products
   SELECT Product_id
   FROM tblProducts
   JOIN tblProductTypes ON tblProductTypes.ProductType_Id = tblProducts.ProductType_Id
   JOIN tblProductGroups ON tblProductGroups.ProdGroup_ID = tblProductTypes.ProdGroup_Id
   JOIN tblProductCategory ON tblProductCategory.ProdCategory_ID = tblProductGroups.ProdCategory_ID
   WHERE
       (tblProductCategory.ProdCategory_ID = @ProdCategory_id OR @ProdCategory_id = 0)
       AND (tblProductGroups.ProdGroup_id = @ProdGroup_id OR @ProdGroup_id = 0)
       AND (tblProductTypes.ProductType_Id = @ProductType_Id OR @ProductType_Id = 0)
       AND (tblProducts.Product_Id = @Product_Id OR @Product_Id = 0)

SET DATEFORMAT DMY
SET QUOTED_IDENTIFIER OFF
SELECT    
   tblCustomers.Cust_Name [Дистрибьютор],
   
   ISNULL(tblSupervisors.Supervisor_Name, '-') [СВ],
   ISNULL(tblMerchandisers.MerchName, '-') [ТП],
   
   ISNULL(tblOutlets.Ol_Code, '-') [ТТ, код],
   ISNULL(CONVERT(NVARCHAR(MAX),tblOutlets.OL_id), '-') [ТТ, id],
   ISNULL(tblOutlets.OLname, '-') [ТТ, юр.назв],
   ISNULL(tblOutlets.OLTradingName, '-') [ТТ, факт.назв],
   ISNULL(tblOutlets.OlAddress, '-') [ТТ, юр.адрес],
   ISNULL(tblOutlets.OlDeliveryAddress, '-') [ТТ, факт.адрес],
   ISNULL(CONVERT(NVARCHAR(MAX),tblOutlets.Status), '-') [ТТ, статус],
   ISNULL(tblNetworks.Network_Name, '-') [ТТ, Сеть],
   ISNULL(tblOutletSubTypes.OLSubTypeName, '-') [ТТ, подтип],
   ISNULL(tblOutletTypes.OLtype_name, '-') [ТТ, тип],
   ISNULL(tblOutLetGroups.OLGroup_name, '-') [ТТ, группа],
   
   ISNULL(tblAreas.Area_name, '-') [Территория, район города],
   ISNULL(tblCities.City_name, '-') [Территория, город],
   ISNULL(tblDistricts.District_name, '-') [Территория, область],
   ISNULL(tblRegions.Region_name, '-') [Территория, регион],
   ISNULL(tblCountry.Country_name, '-') [Территория, страна],
   
   ISNULL(tblWarehouses.W_ExternalCode, '-') [Склад, код],
   ISNULL(CONVERT(NVARCHAR(36), tblWarehouses.W_id), '-') [Склад, id],
   ISNULL(tblWarehouses.W_ShortName, '-') [Склад, кор.назв.],
   ISNULL(tblWarehouses.W_LongName, '-') [Склад, назв.],

   ISNULL(tblProducts.ProductCode, '-') [Продукт, код],
   ISNULL(tblProducts.EANCode, '-') [Продукт, штрих-код],
   ISNULL(tblProducts.ProductName, '-') [Продукт, назв.],
   ISNULL(tblProducts.ProductShortName, '-') [Продукт, кор.назв.],
   ISNULL(tblProductTypes.ProdTypeName, '-') [Продукт, тип],
   ISNULL(tblProductGroups.ProdGroupName, '-') [Продукт, группа],
   ISNULL(tblProductCategory.ProdCategoryName, '-') [Продукт, категория],
   ISNULL(tblLocalProducts.LocalProductCode, '-') [Продукт, лок. код],
   ISNULL(tblLocalProducts.LocalProductName, '-') [Продукт, лок. назв.],
   ISNULL(tblLocalProducts.LocalProductShortName, '-') [Продукт, лок. кор. назв.],

   Sales.Date [Накл, дата],
   Sales.Invoice_No [Накл, код],
   ISNULL(tblGlobalLookup.LValue, CONVERT(NVARCHAR, Sales.status) + ' Неизвестно')  [Накл, статус],
   ISNULL(tblDocTypes.DocTypeName, '(без типа)') [Накл, тип документа],
   Sales.DLM [Накл, дата модиф.],
   CONVERT(NVARCHAR(MAX), Sales.OrderNo) [Накл, номер зак.],
   
   Sales.Product_qty [Накл, кол-во продукции],
   Sales.Product_qty * ProductVolume [Накл, объем],
   Sales.Product_qty * ProductVolume/10 [Накл, объем,дал],
   Sales.Price [Накл, прод. цена без НДС],
   Sales.Price + Sales.Price/100*Sales.VAT [Накл, прод. цена с НДС],
   Sales.Price * Sales.Product_Qty [Накл, сумма без НДС],
   (Sales.Price + Sales.Price/100*Sales.VAT)*Sales.Product_Qty [Накл, сумма с НДС]
FROM (
   SELECT
       W_id, Ol_id, Status, Doc_Type, Merch_id, Date, DLM, Invoice_No, OrderNo,
       Product_id, LocalProductCode,
       ISNULL(tblSaloutD.Product_Qty, 0) + ISNULL(tblSaloutLocalD.Product_Qty, 0) Product_Qty,
       ISNULL(tblSaloutD.Price, 0) + ISNULL(tblSaloutLocalD.Price, 0) Price,
       ISNULL(tblSaloutD.VAT, 0) + ISNULL(tblSaloutLocalD.VAT, 0) VAT
   FROM tblSaloutH
   LEFT JOIN tblSalOutD ON tblSaloutH.Invoice_id = tblSaloutD.Invoice_id AND @l = 0
   LEFT JOIN tblSalOutLocalD ON tblSaloutH.Invoice_id = tblSalOutLocalD.Invoice_id AND @l = 1
   WHERE
   (tblSalOutD.Invoice_id IS NOT NULL AND @l = 0)
   OR (tblSalOutLocalD.Invoice_id IS NOT NULL AND @l = 1)
) Sales
CROSS JOIN tblCustomers
LEFT JOIN tblDistributors ON tblDistributors.Distr_id = tblCustomers.Cust_id
LEFT JOIN tblWarehouses ON tblWarehouses.w_id = Sales.W_id

LEFT JOIN tblDocTypes ON tblDocTypes.Doc_Type = Sales.Doc_Type
LEFT JOIN tblGlobalLookup ON TableName='tblSaloutH' AND FieldName='Status' AND tblGlobalLookup.Status=2 AND tblGlobalLookup.LKey = Sales.status
LEFT JOIN tblOutlets ON tblOutlets.Ol_id = Sales.Ol_id

LEFT JOIN tblMerchandisers ON Sales.Merch_id = tblMerchandisers.Merch_id
LEFT JOIN tblSupervisors ON tblSupervisors.Supervisor_id = tblMerchandisers.Supervisor_id
LEFT JOIN tblCustomerSupervisors ON tblCustomerSupervisors.Supervisor_id = tblSupervisors.Supervisor_id

LEFT JOIN tblOutletSubTypes ON tblOutletSubTypes.OLSubType_id = tblOutlets.OlSubType_id
LEFT JOIN tblOutLetTypes ON tblOutLetTypes.OLtype_id = tblOutletSubTypes.OLType_ID
LEFT JOIN tblOutLetGroups ON tblOutletGroups.OLGroup_id = tblOutLetTypes.OLGroup_id
LEFT JOIN tblNetworks ON tblNetworks.Network_id = tblOutlets.Network_ID

LEFT JOIN tblAreas ON tblAreas.Area_id = tblOutlets.Area_ID
LEFT JOIN tblCities ON tblCities.City_id = tblAreas.City_id
LEFT JOIN tblDistricts ON tblDistricts.District_id = tblCities.District_id
LEFT JOIN tblRegions ON tblRegions.Region_id = tblDistricts.Region_id
LEFT JOIN tblCountry ON tblCountry.Country_id = tblRegions.Country_id

LEFT JOIN tblLocalProducts ON tblLocalProducts.LocalProductCode = Sales.LocalProductCode
LEFT JOIN tblProducts ON tblProducts.Product_id = COALESCE(Sales.Product_id, tblLocalProducts.Product_id)
LEFT JOIN tblProductTypes ON tblProductTypes.ProductType_id = tblProducts.ProductType_id
LEFT JOIN tblProductGroups ON tblProductGroups.ProdGroup_ID = tblProductTypes.ProdGroup_ID
LEFT JOIN tblProductCategory ON tblProductCategory.ProdCategory_ID = tblProductGroups.ProdCategory_ID

WHERE
   (tblWarehouses.wtype_id = @wtype_id OR @wtype_id = '00000000-0000-0000-0000-000000000000')
   AND (Sales.W_id = @w_id OR @w_id = '00000000-0000-0000-0000-000000000000')
   AND Sales.Date BETWEEN @Date_From AND @Date_To
   AND Sales.status<>9
10 shuhard
 
27.08.12
16:31
(9) ставки:
95% - взлетит/ 5% упадёт
11 ВежливаяТварь
 
27.08.12
16:33
(10) мне баланс нравится. Такой вопрос: я так понимаю мне нужно установить связь с sql, передать этот запрос, считать результат. А я смогу сделать как эта программа делает- передать не сам текст запроса а место в таблице где он хранится?
12 shuhard
 
27.08.12
16:35
(11) х.з.
ступай на sql.ru
вопрос далеко за пределами 1С
13 ВежливаяТварь
 
27.08.12
16:36
Я понял. Всем огромное спасибо.
14 Fedot200
 
27.08.12
16:38
ServerName=СокрЛП(ИмяСервера);    //имя или IP-адрес сервера
   DSN=СокрЛП(ИмяБазыДанных);        //имя базы данных
   UID=СокрЛП(ИмяПользователя_);    //логин пользователя
   PWD=СокрЛП(Пароль);                //пароль
   ConnectString="Provider=SQLOLEDB;Data Source="+ServerName+";DatabaseName="+DSN+";Initial Catalog="+DSN+";UID="+UID+";PWD="+PWD;
   Соединение=Новый COMОбъект("ADODB.Connection");
   Соединение.ConnectionTimeOut=600;
   Попытка              
       Соединение.Open(ConnectString);
   Исключение
       Предупреждение("Не удалось соединиться с базой данных!");
       Сообщить(ОписаниеОшибки());
       Возврат;
   КонецПопытки;
   
   Cmd=Новый COMОбъект("ADODB.Command");
   Rs=Новый COMОбъект("ADODB.RecordSet");
   Cmd.ActiveConnection=Соединение;
   Cmd.CommandTimeOut=600;
   Cmd.CommandType=1;    //запрос на языке SQL
   Cmd.Commandtext=СокрЛП(ТекстЗапроса);
   Попытка
       Rs.ActiveConnection=Соединение;
       Rs=Cmd.Execute();
   Исключение
       Сообщить(ОписаниеОшибки());
       Возврат;
   КонецПопытки;
15 Rie
 
27.08.12
16:38
(11) Передаёшь текст запроса. Получаешь результат запроса (recordset). И делаешь с ним, что хочешь. Не забывай только, что в SQL элементы справочников, документы и т.п. представлены своими UIDами.
16 774816
 
27.08.12
16:39
(11)это хранимая процедура которая возвращает набор данных, сам запрос хп не надо писать, нужно вызвать эту хп с параметрами, для этого тебе нужно ADODB.Command + ADODB.Recordset юзать
17 Fedot200
 
27.08.12
16:41
+14 этот код обзови, например Процедура УстановитьSQL_соединение(ТекстЗапроса)
18 Fedot200
 
27.08.12
16:42
Вот пример как вызывать:

ТекстЗапросаКонтрагенты="SELECT
                           |_Reference63_Q_000_T_001._Description AS f_1,
                           |_Reference63_Q_000_T_001._Fld1041 AS f_2,
                           |'' AS f_3,
                           |_InfoReg11245_Q_000_T_002._Fld11249 AS f_4,
                           |_InfoReg11245_Q_000_T_003._Fld11249 AS f_5,
                           |_Reference63_Q_000_T_001._Fld1038 AS f_6,
                           |_Reference6._Code AS f_7,
                           |_Reference7._Fld773 AS f_8,
                           |_Reference6._Description AS f_9,
                           |_Reference6._Fld768 AS f_10,
                           |_Reference6._Fld770 AS f_11,
                           |'' AS f_12,
                           |_Reference63_Q_000_T_001._Fld1039 AS f_13,
                           |_Reference9._Description AS f_14,
                           |_Reference63_Q_000_T_001._Fld1040 AS f_15,
                           |_Reference63._Description AS f_16,
                           |''  AS f_17,
                           |''  AS f_18,
                           |'' AS f_19,
                           |'' AS f_20,
                           |'' AS f_21
                           |FROM
                           |_Reference63 _Reference63_Q_000_T_001 WITH(NOLOCK)
                           |LEFT OUTER JOIN _Reference36 WITH(NOLOCK)
                           |ON _Reference63_Q_000_T_001._Fld1032RRef = _Reference36._IDRRef
                           |LEFT OUTER JOIN _Reference7 WITH(NOLOCK)
                           |ON _Reference63_Q_000_T_001._Fld1042RRef = _Reference7._IDRRef
                           |LEFT OUTER JOIN _InfoReg11245 _InfoReg11245_Q_000_T_002 WITH(NOLOCK)
                           |ON _InfoReg11245_Q_000_T_002._Fld11246_TYPE = 0x08 AND _InfoReg11245_Q_000_T_002._Fld11246_RTRef = 0x0000003F AND _Reference63_Q_000_T_001._IDRRef = _InfoReg11245_Q_000_T_002._Fld11246_RRRef AND _InfoReg11245_Q_000_T_002._Fld11247RRef = 0x9c49b3cc99a0381f473f31dd972971a9 AND _InfoReg11245_Q_000_T_002._Fld11248_TYPE = 0x08 AND _InfoReg11245_Q_000_T_002._Fld11248_RRRef = 0xbc597d7deec26cde42de22114e115265
                           |LEFT OUTER JOIN _InfoReg11245 _InfoReg11245_Q_000_T_003 WITH(NOLOCK)
                           |ON _InfoReg11245_Q_000_T_003._Fld11246_TYPE = 0x08 AND _InfoReg11245_Q_000_T_003._Fld11246_RTRef = 0x0000003F AND _Reference63_Q_000_T_001._IDRRef = _InfoReg11245_Q_000_T_003._Fld11246_RRRef AND _InfoReg11245_Q_000_T_003._Fld11247RRef = 0x94a0fd27bdad5c8041f122244cd904b6 AND _InfoReg11245_Q_000_T_003._Fld11248_TYPE = 0x08 AND _InfoReg11245_Q_000_T_003._Fld11248_RRRef = 0x8a12a42cbf99a84548bac3b0c5bb357f
                           |LEFT OUTER JOIN _Reference63 WITH(NOLOCK)
                           |ON _Reference63_Q_000_T_001._ParentIDRRef = _Reference63._IDRRef
                           |LEFT OUTER JOIN _Reference9 WITH(NOLOCK)
                           |ON _Reference36._Fld872RRef = _Reference9._IDRRef
                           |LEFT OUTER JOIN _Reference6 WITH(NOLOCK)
                           |ON _Reference7._Fld774RRef = _Reference6._IDRRef
                           |WHERE
                           |_Reference63_Q_000_T_001._Folder = 0x01";
   
   
   
   УстановитьSQL_соединение(ТекстЗапросаКонтрагенты);
   КоличествоПолей=Rs.Fields.Count();
   Попытка
       Пока Rs.EOF()=0    Цикл
           ОбработкаПрерыванияПользователя();                  
           НоваяСтрока = ТаблицаЗагрузки.Добавить();
           Для i=0 по КоличествоПолей-1 Цикл
               НоваяСтрока["Поле_"+СокрЛП(i+1)] = СокрЛП(Rs.Fields(i).Value);
           КонецЦикла;
           Rs.MoveNext();
       КонецЦикла;
   Исключение
       Сообщить(ОписаниеОшибки());
       Возврат;
   КонецПопытки;
   Rs.Close();
   Соединение.Close();
19 ВежливаяТварь
 
27.08.12
16:44
Понял. сейчас попробую. Спасибо.
20 ВежливаяТварь
 
28.08.12
10:38
Добрый день. Ещё один вопрос возник. Сделал вот так:


Функция УстановитьSQL_соединение(ТекстЗапроса)
   
   ТаблицаЗагрузки= Новый ТаблицаЗначений;
   ТаблицаЗагрузки.Колонки.Добавить("Поле");
   
   ServerName=СокрЛП("192.168.2.56");    //имя или IP-адрес сервера
   DSN=СокрЛП("RB_ATS");        //имя базы данных
   UID=СокрЛП("sa");    //логин пользователя
   PWD=СокрЛП("SW_Desktop");                //пароль

   ConnectString="Provider=SQLOLEDB;Data Source="+ServerName+";DatabaseName="+DSN+";Initial Catalog="+DSN+";UID="+UID+";PWD="+PWD;
   Соединение=Новый COMОбъект("ADODB.Connection");
   Соединение.ConnectionTimeOut=600;
   Попытка              
       Соединение.Open(ConnectString);
   Исключение
       Предупреждение("Не удалось соединиться с базой данных!");
       Сообщить(ОписаниеОшибки());
       Возврат Неопределено;
   КонецПопытки;
   
   Cmd=Новый COMОбъект("ADODB.Command");
   Rs=Новый COMОбъект("ADODB.RecordSet");
   Cmd.ActiveConnection=Соединение;
   Cmd.CommandTimeOut=600;
   Cmd.CommandType=1;    //запрос на языке SQL

   Cmd.Commandtext=СокрЛП(ТекстЗапроса);
   Попытка
       Rs.ActiveConnection=Соединение;
       Rs=Cmd.Execute();
   Исключение
       Сообщить(ОписаниеОшибки());
       Возврат Неопределено;
   КонецПопытки;
   
   КоличествоПолей=Rs.Fields.Count();
   Попытка
       Пока Rs.EOF()=0    Цикл
           НоваяСтрока = ТаблицаЗагрузки.Добавить();
           Для i=0 по КоличествоПолей-1 Цикл
               НоваяСтрока.Поле = СокрЛП(Rs.Fields(i).Value);
           КонецЦикла;
           Rs.MoveNext();
       КонецЦикла;
   Исключение
       Сообщить(ОписаниеОшибки());
       Возврат Неопределено;
   КонецПопытки;
   Rs.Close();
   Соединение.Close();
   Возврат ТаблицаЗагрузки;
   
КонецФункции


Текст запроса просто строка с запросом. А вот как педать парематеры в неё такие как
@wtype_id  @wtype_id @w_id @w_id Date_From  @Date_To? Просто вписывать в строку? или есть более кошерные варианты?
21 ВежливаяТварь
 
28.08.12
11:15
Нашёл такой ответ, может кому нибудь пригодится:

par = Command.CreateParameter("DATEN", 133, 3);
Command.Parameters.Append(par);
par.Value = ДатаН;