• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

1c7. Com-объекты

  • Автор темы KiR
  • Дата начала
K

KiR

из 1С делаю через COM-объект запрос к базе данных. Подобной конструцией уже пользовался. Сейчас сделал по аналогии - и обломался. Может кто-то что-то подскажет?
Код:
Процедура Загрузить() 	//получение данных SQL  
Д = Строка(ДатаГод(ДатаДок));
Д = ?(ДатаМесяц(ДатаДок)<10,Д +"0" + Строка(ДатаМесяц(ДатаДок)),Д + Строка(ДатаМесяц(ДатаДок)));
Д = ?(ДатаЧисло(ДатаДок)<10,Д +"0" + Строка(ДатаЧисло(ДатаДок)),Д + Строка(ДатаЧисло(ДатаДок)));
СтрокаСоединения="Provider=sqloledb;Data Source=db;UID=a;PWD=e4r;Initial Catalog=bp;"
Соединение=СоздатьОбъект("ADODB.Connection");
Соединение.Open(СтрокаСоединения);
Записи=СоздатьОбъект("ADODB.RecordSet");
Записи.ActiveConnection=Соединение;	 
Записи.Open("exec [dbo].[un_forts4buh] @oper_date='"+ Д "'");
СпрКонтр = СоздатьОбъект("Справочник.Контрагенты");
Пока Записи.EOF() = 0 Цикл	 
НоваяСтрока(); 
Код = Записи.Fields("client_code").VALUE;
Контрагент = Записи.Fields("client_name").VALUE;
Сумма = Записи.Fields("sum_bal").VALUE;
Операция = Записи.Fields("oper_name").VALUE;
Записи.MoveNext();
КонецЦикла; 
Записи.Close();			
КонецПроцедуры
ошибка: Пока Записи.EOF() = 0 Цикл
{Документ.ЗагрузкаФОРТС.Форма.Модуль(14)}: ADODB.Recordset: Operation is not allowed when the object is closed.
 
K

KiR

Какое-то прямо наваждение сегодня! Уже переписал чуточку с другими СОМ-объектами:
Код:
Процедура Загрузить() 
СпрКонтр = СоздатьОбъект("Справочник.Контрагенты");
//получение данных SQL  
Д = Строка(ДатаГод(ДатаДок));
Д = ?(ДатаМесяц(ДатаДок)<10,Д +"0" + Строка(ДатаМесяц(ДатаДок)),Д + Строка(ДатаМесяц(ДатаДок)));
Д = ?(ДатаЧисло(ДатаДок)<10,Д +"0" + Строка(ДатаЧисло(ДатаДок)),Д + Строка(ДатаЧисло(ДатаДок)));
СтрокаСоединения="Provider=sqloledb;Data Source=db;Initial Catalog=bk;Integrated Security=SSPI;";
Соединение=СоздатьОбъект("ADODB.Connection");
Соединение.Open(СтрокаСоединения);
Записи=СоздатьОбъект("ADODB.Command");
Записи.ActiveConnection=Соединение; 
Записи.CommandTimeout = 180;
Записи.CommandType = 1;
Записи.CommandText = "exec [dbo].[un_forts4buh] @oper_date='"+Д+"'";
recordset = Записи.Execute();
Пока recordset.EOF() = 0 Цикл	 
НоваяСтрока(); 
Код = recordset.Fields("client_code").VALUE;
Контрагент = recordset.Fields("client_name").VALUE;
Сумма = recordset.Fields("sum_bal").VALUE;
Операция = recordset.Fields("oper_name").VALUE;
recordset.MoveNext();
КонецЦикла; 
КонецПроцедуры
И все равно продолжает выдавать все ту же ошибку ADODB.Recordset: Operation is not allowed when the object is closed. ПОМОГИТЕ ПОЖАЛУЙСТА ЛЮДИ ДОБРЫЕ!
 
P

puh14

а ежли заместо "exec [dbo].[un_forts4buh] @oper_date='"+Д+"'"

написать

"Select * from un_forts4buh where oper_date='"+Д+"'"

Пардон - что то я с селектами савсем зашился.
 
K

KiR

puh14, спасибо за совет конечно... но дело в том что un_forts4buh - это не таблица, а хранимая процедура и к ней через Select низзя обратится к сожалению
 
P

puh14

ну это я и имел ввиду под пардоном :(
вообще похоже что у тебя recordset пустым выходит - потому и ругается.
на какую точно строчку он ругается?
на recordset = Записи.Execute();
или
Пока recordset.EOF() = 0 Цикл ?
 
K

KiR

Пока recordset.EOF() = 0 Цикл
{Документ.ЗагрузкаФОРТС.Форма.Модуль(17)}: ADODB.Recordset: Operation is not allowed when the object is closed.
эт ты мысль подкинул.
тогда вопрос становится другой стороной - почему я выполняют вызов процедуры в каком-нить сиквельном query analazire и мне возвращается таблица со значениями, а при вызове из 1С - возвращается пустая?
 
P

puh14

значит либо условие форматируется через Ж - попробуй вообще без него, что выдаст?
или лучше Записи.Open("exec [dbo].[un_forts4buh] @oper_date<>'"+ Д "'");
Либо надо текст хранимой процедуры смотреть.
 
K

KiR

Точно. В процедуре дело было. Забыл указать SET NOCOUNT ON))
Тема закрыта и достойна удаления. всем спасибо)
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!