Вопрос по COM объектам

Проблеми зв'язані з експортом\імпортом звітів, довідників.
asmer
Повідомлень: 12
З нами з: 22 січня 2013, 11:40

Вопрос по COM объектам

Повідомлення asmer » 22 січня 2013, 12:06

Добрый день. Вчера просматривал функции СОМ и возникло несколько вопросов ответы на которые не нашел в документации и на форуме
1- как получить таблицу справочников (фирма. контра, тмц)


2 - Почему не работает конструкция след вида... Хотя значения rsMain_.RecNo и rsMain_.RecordCount равны "1".

Код: Виділити все

           //  зацикливается 
		Doc = App.OpenDocumentByCode(КодДокументаСРеестра);
		rsMain_ =  Doc.DataSets(0);
		rsMain_.First();
		Пока Not rsMain_.EOF() Цикл        // 
                        ........
			rsMain_.Next();
		КонецЦикла;
пришлось добавлять условие на проверку

Код: Виділити все

	Если rsMain_.RecNo = rsMain_.RecordCount Тогда
				Прервать;
			КонецЕсли;
но при этом цикл для реестра отрабатывает на ура

Код: Виділити все

	charcode ="J1201004";
	rsMain = App.DocumentsDataSet("CharCode='" + charcode + "'", True);
        rsMain.First();
	Пока Not rsMain.EOF() Цикл

		рр = реестр.Добавить();
		рр.Code= rsMain.FldVal("Code");
		рр.Name = rsMain.FldVal("Name");
		рр.PerDate = rsMain.FldVal("PerDate");
		рр.CrtDate = rsMain.FldVal("CrtDate");
	
		rsMain.Next();
	КонецЦикла;
Я так и не понял в чем отличие таблиц (объектов) rsMain от rsMain_ .....
Востаннє редагувалось 22 січня 2013, 12:20 користувачем asmer, всього редагувалось 1 раз.

Родин Евгений

Re: Вопрос по COM объектам

Повідомлення Родин Евгений » 22 січня 2013, 12:13

1С 7 или 8?

asmer
Повідомлень: 12
З нами з: 22 січня 2013, 11:40

Re: Вопрос по COM объектам

Повідомлення asmer » 22 січня 2013, 12:15

1С Предприятие 8.2

В вашем примере - MERst_NN.xls - тоже с цикла не выходит при заполнении "выданых НН"

Родин Евгений

Re: Вопрос по COM объектам

Повідомлення Родин Евгений » 22 січня 2013, 12:23

1) Нет возможностей сейчас. Неоднократно обращались, но пока что порадовать нечем. если знаете как подключиться к БД FireBird, тогда может поможет знание таблиц, чтобы напрямую передавать?....
2) Сейчас (вернее. после окончания годовой отчетности) будет для 1С реализована прямая передача средствами самого Медка, а передача из 1С, соответтсвующей обработкой.
3) MERst_NN.xls - занимается другой специалист, но ввиду большой загруженнсоти, сможет помочь не ранее окончания годовой отчетности. К сожалению, с этой програмой (вернее, кодом) я лично не знаком.

asmer
Повідомлень: 12
З нами з: 22 січня 2013, 11:40

Re: Вопрос по COM объектам

Повідомлення asmer » 22 січня 2013, 12:30

1) Нет возможностей сейчас. Неоднократно обращались, но пока что порадовать нечем. если знаете как подключиться к БД FireBird, тогда может поможет знание таблиц, чтобы напрямую передавать?....
Хоть я и не видел пока структуры БД медка - я думаю это должно помочь

Что я должен знать чтобы подключить? (с БД FireBird хорошо знаком)

Родин Евгений

Re: Вопрос по COM объектам

Повідомлення Родин Евгений » 22 січня 2013, 12:39

Параметры строки подключения (ConnectionString), да и вообще реализацию взаимодействия с БД из 1С.
По идее, если знаете как подключить к Oracle, SQL Server, то и к этой базе проблем не будет.
Вот как обмениваться данными из таблиц 1С в Медок (или наоборот), не пробовал...
База, пользователь и пароль стандартные для FireBird. Верси 2.1 (embedded)

Может вот эти статьи помогут:
http://infostart.ru/public/85844/
http://www.sql.ru/forum/actualthread.aspx?tid=603311
http://devtrainingforum.v8.1c.ru/forum/ ... ?id=577444
http://www.forum.mista.ru/topic.php?id=591335
http://forum.vingrad.ru/forum/s/173aad4 ... 18094.html
http://forum.vingrad.ru/forum/topic-197 ... -базе.html
Все нехватает времени попробовать...
Насчет таблиц, по понятным причинам их разглашение не приветствуется, но если дойдете до этого этапа (или всерьез решите заняться этим вопросом), думаю опыт пригодится многим. Поэтому что-то решим (в личке)...

asmer
Повідомлень: 12
З нами з: 22 січня 2013, 11:40

Re: Вопрос по COM объектам

Повідомлення asmer » 30 січня 2013, 19:07

А есть ли какой то быстрый способ получения списка док-тов НН по дате создания (не путать с датой регистрации)

мне приходится выбирать доки по "CharCode" а потом перебирая список, получать по коду документы ( Doc = App.OpenDocumentByCode(+rsMain.FldVal("Code")); )
и только после

Код: Виділити все

rsMain_ =  Doc.DataSets(0);
		
		rsMain_.First();
		Пока rsMain_.EOF()=0 Цикл
			Датадок =  rsMain_.FldVal("N11");
........
Я получаю дату.... Не многовато ли движений для обычной выборки по дате создания Или я делаю, что-то нетак

Пока получаю так:

Код: Виділити все

	
        Попытка 
		App=СоздатьОбъект("MEDOC.ZApplication");      
	Исключение 
		Сообщить("Приложение M.E.DOC не запущено !"); 
		Возврат; 
	КонецПопытки;
	
	charcode ="J1201004";
	
	rsMain = App.DocumentsDataSet("(CrtDate >= '"+НачДата+"' AND CrtDate <= '"+КонДата+"') AND CharCode='" + charcode + "'");
	
	КвоСтрок = rsMain.RecordCount();     
		
	rsMain.First();
	Пока  rsMain.EOF()=0 Цикл  
		
		Doc = App.OpenDocumentByCode(+rsMain.FldVal("Code"));
			
		rsMain_ =  Doc.DataSets(0);
		
		rsMain_.First();
		Пока rsMain_.EOF()=0 Цикл
			Датадок =  rsMain_.FldVal("N11");
				
			Если (НачДата>= Датадок) И  (КонДата =<Датадок) Тогда    
				rsMain_.Next();
				Продолжить;
			КонецЕсли;
			
			тз.НоваяСтрока();
			тз.ДатаНН = Датадок;	  
			тз.Ном = 	rsMain_.FldVal("N2_1");
			тз.Контра = 	rsMain_.FldVal("N3");
			тз.СуммаБезНДС = 	rsMain_.FldVal("A5_11");
			тз.СуммаНДС = 	rsMain_.FldVal("A6_11");
			тз.СуммаСНДС = 	rsMain_.FldVal("A7_11");
		
			стр="";	
			КвоКолонок = rsMain_.Fields().Count();
			Для ххх=0 по квоКолонок-1 Цикл
				Value = rsMain_.Fields().Item(ххх).Value;
				Name  = rsMain_.Fields().Item(ххх).Name;
				стр=стр+ "("+(ххх+1)+") ["+Name+"]  "+Value +"; ";
			КонецЦикла;
			Сообщить(стр); 			

			Если rsMain_.RecNo = rsMain_.RecordCount Тогда
				Прервать;
			КонецЕсли;
			
			rsMain_.Next();
			
		КонецЦикла;
		
		rsMain.Next();
		
	КонеццИкла;

Родин Евгений

Re: Вопрос по COM объектам

Повідомлення Родин Евгений » 30 січня 2013, 22:18

Недельку если терпит, то будет еще проще.

asmer
Повідомлень: 12
З нами з: 22 січня 2013, 11:40

Re: Вопрос по COM объектам

Повідомлення asmer » 31 січня 2013, 11:33

Добрый день
Недельку если терпит, то будет еще проще.
да, конечно терпит... Просто "бухг-ра" вопрос задали... Сначала на вас все свалил. а потом решил уточнить :))))
Сложно было им объяснить почему реестр в медке открывается быстрее чем в обработке :)

asmer
Повідомлень: 12
З нами з: 22 січня 2013, 11:40

Re: Вопрос по COM объектам

Повідомлення asmer » 31 січня 2013, 11:44

И еще...
Если вы планируете менять/добавлять ,что-то глобальное по СОМ то прошу учесть следующий фактор...

Медок почти всегда используется не как учетная система, а как "инструмент" по работе с органами и практически всегда основной учетной системой используют ПО "1с-предприятия"... Так, что если вы приведете к примерно такому виду справку/классы/методы - народу проще будет разобраться, а Вам будет много "спасибо" :)

Родин Евгений

Re: Вопрос по COM объектам

Повідомлення Родин Евгений » 01 лютого 2013, 00:58

На следующей недел свяжусь с Вами. Мне как раз нужен совет хороших специалистов своего дела. Есть вопросы, которые у меня неполучается решить самомстоятельно ввиду недостаточного опыта программирования в 1С.

asmer
Повідомлень: 12
З нами з: 22 січня 2013, 11:40

Re: Вопрос по COM объектам

Повідомлення asmer » 01 лютого 2013, 15:45

Буду рад Вам помочь...

asmer
Повідомлень: 12
З нами з: 22 січня 2013, 11:40

Re: Вопрос по COM объектам

Повідомлення asmer » 25 березня 2013, 17:09

И опять о наболевшем... :(

Код: Виділити все

	charcode ="J1201004"; //НН   – обязательно указать используемый шаблон
	
	rsMain = App.DocumentsDataSet("PERDATE = '"+формат(PDate,"ДФ=yyyy.MM.dd")+"' AND CharCode='" + charcode + "'", True);
	
	КвоСтрок = rsMain.RecordCount();
	шапка.Очистить();
	rsMain.First();
	Пока Not rsMain.EOF() Цикл
		НомСтроки = rsMain.RecNo();
		Состояние(""+ КвоСтрок+" / "+НомСтроки);
		СтрокаТЗ = Шапка.Добавить();
		КвоКолонок = rsMain.Fields().Count(); 
		//Для ххх=0 по квоКолонок-1 Цикл         //Раскоментить для получения всей табцици
		//	Value = rsMain.Fields().Item(ххх).Value;
		//	Name  = rsMain.Fields().Item(ххх).Name;
		//	ТекКолонка = Шапка.колонки.Найти(Name);
		//	Если  ТекКолонка = неопределено Тогда                
		//  	  ТекКолонка = Шапка.Колонки.Добавить(Name);
		//	КонецЕсли;
		//	СтрокаТЗ[Name] = Value;
		//КонецЦикла;
		СтрокаТЗ.CODE  	= 	rsMain.FldVal("CODE");
		СтрокаТЗ.CRTDATE	=	rsMain.FldVal("CRTDATE");
		СтрокаТЗ.MODDATE 	=	rsMain.FldVal("MODDATE");
			Doc_ = App.OpenDocumentByCode(СтрокаТЗ.Code);
			rsMain_ =  Doc_.DataSets(0);
			rsMain_.First();
			Пока Not rsMain_.EOF() Цикл
				СтрокаТЗ.Num 	=	rsMain_.FldVal("N2_1");
				СтрокаТЗ.Dat 	=	rsMain_.FldVal("N11");   
				// Этого условия не должно быть !!!
				Если rsMain_.RecNo = rsMain_.RecordCount Тогда
					Прервать;
				КонецЕсли;
				rsMain_.Next();
			КонецЦикла;
		// Этого условия не должно быть !!!
		Если НомСтроки = КвоСтрок Тогда
			Прервать;
		КонецЕсли;
		rsMain.Next();
	КонецЦикла;

Допустим надо выбрать данные документа J1201004 № 8 от 10.03.2013, что мы делаем???

Код: Виділити все

	
rsMain = App.DocumentsDataSet("PERDATE = '"+формат(PDate,"ДФ=yyyy.MM.dd")+"' AND CharCode='" + charcode + "'", True);  
РЕЗУЛЬТАТ - таблица с колонками: CODE IDORG FORM CHARCODE PERTYPE PERDATE CRTDATE MODDATE STATUS FLAGS NAME
DELETED IDREPCODE IDPARENT REPCODENUM SPECIF SENDSTT SORTCOLLVAL

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

как пример: ("PERDATE = '"+формат(PDate,"ДФ=yyyy.MM.dd")+"' AND CharCode='" + charcode + "'")
- условие срабатывает оч. быстро (~1 сек - 100 записей) но так мы выберем только док-ты за период... но не тот который нужен....

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

Doc_ = App.OpenDocumentByCode(СтрокаТЗ.Code);
rsMain_ = Doc_.DataSets(0);
rsMain_.First();
Пока Not rsMain_.EOF() Цикл
СтрокаТЗ.Num = rsMain_.FldVal("N2_1");
СтрокаТЗ.Dat = rsMain_.FldVal("N11");

// Этого условия не должно быть !!!
Если rsMain_.RecNo = rsMain_.RecordCount Тогда
Прервать;
КонецЕсли;

rsMain_.Next();
КонецЦикла;

и вот это занимает около 30 секунд...
Получается если нам нужен документ по номеру или за конкретную дату - все равно приходится перебирать лишний
раз таблицу базы с "ШАПКОЙ" документов ...

З.Ы. если есть болие короткий путь - подскажите пожалуйста...

asmer
Повідомлень: 12
З нами з: 22 січня 2013, 11:40

Re: Вопрос по COM объектам

Повідомлення asmer » 29 березня 2013, 13:12

Родин Евгений писав:Недельку если терпит, то будет еще проще.
прошла уже не неделька, а несколько месяцев... результат - 0.

Родин Евгений

Re: Вопрос по COM объектам

Повідомлення Родин Евгений » 29 березня 2013, 13:15

Сейчас над этим работаем. Новые функции требуют тестирования. На всякий случай.

ssv.box
Повідомлень: 44
З нами з: 21 вересня 2011, 09:10

Re: Вопрос по COM объектам

Повідомлення ssv.box » 29 березня 2013, 13:37

Жду с нетерпением новшеств. С удовольствием приму участие в тестировании.

asmer
Повідомлень: 12
З нами з: 22 січня 2013, 11:40

Re: Вопрос по COM объектам

Повідомлення asmer » 29 березня 2013, 14:55

Родин Евгений писав:Сейчас над этим работаем. Новые функции требуют тестирования. На всякий случай.
Как раз бы оказал помощь в тестировании...

ssv.box
Повідомлень: 44
З нами з: 21 вересня 2011, 09:10

Re: Вопрос по COM объектам

Повідомлення ssv.box » 29 березня 2013, 15:00

asmer писав:
Родин Евгений писав:Сейчас над этим работаем. Новые функции требуют тестирования. На всякий случай.
Как раз бы оказал помощь в тестировании...
C удовольствием для 7.7 поучаствовал в тестировании.

asmer
Повідомлень: 12
З нами з: 22 січня 2013, 11:40

Re: Вопрос по COM объектам

Повідомлення asmer » 26 червня 2013, 14:51

Код: Виділити все

	Попытка 
		App=СоздатьОбъект("MEDOC.ZApplication");      
	Исключение 
		Сообщить("Приложение M.E.DOC не запущено !"); 
		Возврат; 
	КонецПопытки;
	фед = 	   App.GetCurrEdrpou();
НА строчке

Код: Виділити все

фед = 	   App.GetCurrEdrpou();
- выпадает ошибка... версия медка ХАХАХА.154

Подскажите пожалуйста как с этим бороться....

asmer
Повідомлень: 12
З нами з: 22 січня 2013, 11:40

Re: Вопрос по COM объектам

Повідомлення asmer » 26 червня 2013, 15:10

asmer писав:

Код: Виділити все

	Попытка 
		App=СоздатьОбъект("MEDOC.ZApplication");      
	Исключение 
		Сообщить("Приложение M.E.DOC не запущено !"); 
		Возврат; 
	КонецПопытки;
	фед = 	   App.GetCurrEdrpou();
НА строчке

Код: Виділити все

фед = 	   App.GetCurrEdrpou();
- выпадает ошибка... версия медка ХАХАХА.154

Подскажите пожалуйста как с этим бороться....
Решилась проблема следующим образом.
Запускаем медок и идем пить чай, курить и т.д... и со временем (от 5 до 20 минут) функция начинает срабатывать... Чудеса...

Відповісти

Повернутись до “Експорт\імпорт”