powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / [игнор отключен] [закрыт для гостей] / Маленький вопрос по применению COMОбъект("V77.Application")
20 сообщений из 20, страница 1 из 1
Маленький вопрос по применению COMОбъект("V77.Application")
    #37916933
Gennadiy83
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем здравствуйте! Мне необходимо из Бух 2.0 подключиться к ТиС 9.2 и перегрузить 4 документа - Реализацию, СчФ, ПКО, Возвраты от покупателя. Решил попробовать OLE. Подключиться к базе не составило труда, теперь не могу понять как делать выборку документов. Подскажите, пожалуйста! Спасибо за помощь.
...
Рейтинг: 0 / 0
Маленький вопрос по применению COMОбъект("V77.Application")
    #37916966
pail
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gennadiy83Всем здравствуйте! Мне необходимо из Бух 2.0 подключиться к ТиС 9.2 и перегрузить 4 документа - Реализацию, СчФ, ПКО, Возвраты от покупателя. Решил попробовать OLE. Подключиться к базе не составило труда, теперь не могу понять как делать выборку документов. Подскажите, пожалуйста! Спасибо за помощь.
Как писать семерочный код - вопросов нет?
Тогда - использовать такой код, обращающийся к объектам ТиС 9.2, в восьмерочной обработке.
Объекты эти создавать в контексте базы-источника, например так:
Код: vbnet
1.
объект7=БазаОле.EvalExpr("СоздатьОбъект("""+имя+""")");


где "имя" - полное имя объектного класса в 7.7
Обращаться через БазаОле можно к любым экспортированным функциям и процедурам глобального модуля, и к методам созданных в её контексте объектов.
...
Рейтинг: 0 / 0
Маленький вопрос по применению COMОбъект("V77.Application")
    #37917244
Gennadiy83
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pail,

Под 1С 77 не программировал, занимаюсь 1С с 8.1. Я так понимаю, после создания объекта "объект7" вызываем функцию типа ВыбратьДокументы(НачПер, КонПериода)
...
Рейтинг: 0 / 0
Маленький вопрос по применению COMОбъект("V77.Application")
    #37917261
AHDP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, потом их перебрать.
...
Рейтинг: 0 / 0
Маленький вопрос по применению COMОбъект("V77.Application")
    #37917266
pail
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
объект7.ВыбратьДокументы(началоПериода,КонецПериода);
пока Объект7.ПолучитьДокумент()=1 цикл
       Дата=Объект7.датадок;
       номер=объект7.НомероДок;
       // и прочие реквизиты шапки извлекаем
       объект7.ВыбратьСтроки();
       пока Объект7.получитьСтроку()=1 цикл
       // извлекаем реквизиты табличной части


       конецЦикла;

конецЦикла;
 



Примерно так. Не забываем, что справочники и другие ссылочные типы в базе-получатели - другие,и надо там соответствующий элемент найти по содержанию аналогичного элемента из базы источника. Или создать новый.
...
Рейтинг: 0 / 0
Маленький вопрос по применению COMОбъект("V77.Application")
    #37917347
Gennadiy83
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pail,

Огромное спасибо! Картина ясна. Интересно быстрее будет работать выгрузка 4 типов документов через OLE или через правила обмена? Я начал сначала правила обмена делать, но там практически все соответствия вручную делать, терпения не хватило.
...
Рейтинг: 0 / 0
Маленький вопрос по применению COMОбъект("V77.Application")
    #37920202
Gennadiy83
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pail
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
объект7.ВыбратьДокументы(началоПериода,КонецПериода);
пока Объект7.ПолучитьДокумент()=1 цикл
       Дата=Объект7.датадок;
       номер=объект7.НомероДок;
       // и прочие реквизиты шапки извлекаем
       объект7.ВыбратьСтроки();
       пока Объект7.получитьСтроку()=1 цикл
       // извлекаем реквизиты табличной части


       конецЦикла;

конецЦикла;
 



Примерно так. Не забываем, что справочники и другие ссылочные типы в базе-получатели - другие,и надо там соответствующий элемент найти по содержанию аналогичного элемента из базы источника. Или создать новый.

А если реквизит объект7 будет содержать ссылку на элемент справочника?
...
Рейтинг: 0 / 0
Маленький вопрос по применению COMОбъект("V77.Application")
    #37920309
The Dim!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну таки и работать с ним как с элементом справочника, так же, как это было бы в самой 7.7. Ну естественно, с учетом COM.
...
Рейтинг: 0 / 0
Маленький вопрос по применению COMОбъект("V77.Application")
    #37921439
Gennadiy83
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
The Dim!Ну таки и работать с ним как с элементом справочника, так же, как это было бы в самой 7.7. Ну естественно, с учетом COM.
Я создаю ТаблицуЗначений, колонки которой - реквизиты ПКО

ПКОТаблЗнач = Новый ТаблицаЗначений();
ПКОТаблЗнач.Колонки.Добавить("ИД"); //порядковый номер в таблице !!!возможно не понадобиться
ПКОТаблЗнач.Колонки.Добавить("Номер");
ПКОТаблЗнач.Колонки.Добавить("Дата");
ПКОТаблЗнач.Колонки.Добавить("Сумма");
ПКОТаблЗнач.Колонки.Добавить("СтавкаНДС");
.... и т.д.

//Заполним таблицу значений ПКО
Пока ПКО_77.ПолучитьДокумент() = 1 Цикл
строкаТаблЗнач = ПКОТаблЗнач.Добавить();
строкаТаблЗнач.Номер = ПКО_77.НомерДок;
строкаТаблЗнач.Дата = ПКО_77.ДатаДок;
строкаТаблЗнач.Сумма = ПКО_77.Сумма;
строкаТаблЗнач.СтавкаНДС = ПКО_77.СтавкаНДС;
строкаТаблЗнач.Валюта = ПКО_77.Валюта;
строкаТаблЗнач.Контрагент = ПКО_77.Контрагент;
строкаТаблЗнач.Договор = ПКО_77.Договор;
строкаТаблЗнач.ПринятоОт = ПКО_77.ПринятоОт;
КонецЦикла;

ПКО_77.Договор, ПКО_77.Контрагент - представляют собой элементы справочника

Цикл формирования документов:

Для Каждого строкаТаблЗнач Из ПКОТаблЗнач Цикл
докПКО = Документы.ПриходныйКассовыйОрдер.СоздатьДокумент();

докПКО.ВалютаДокумента = Справочники.Валюты.НайтиПоКоду(строкаТаблЗнач.ХХХХХ); - КАК ОБРАТИТЬСЯ К ЭЛЕМЕНТУ? В ОТЛАДЧИКЕ ОПРЕДЕЛЯЕТ КАК COMОБЪЕКТ

//докПКО.ВидОперации = ;
//докПКО.Контрагент = ;
//докПКО.ДоговорКонтрагента = ;
КонецЦикла;

Покажите фрагмент кода, дальше разберусь. Под 77 вообще не приходилось кодить.
...
Рейтинг: 0 / 0
Маленький вопрос по применению COMОбъект("V77.Application")
    #37921444
Gennadiy83
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Т.е. как мне вытянуть код, например, валюты, чтобы найти ее в справочнике Бух 2.0
...
Рейтинг: 0 / 0
Маленький вопрос по применению COMОбъект("V77.Application")
    #37921519
pail
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gennadiy83Т.е. как мне вытянуть код, например, валюты, чтобы найти ее в справочнике Бух 2.0
Обращаться к реквизиту объекта, полученного из базы-источника. Отладчик действительно такие значения извлекать не умеет.
А если в коде написать - сработает. Да, и заменять объекты источника своими, найденными или созданными в получателе, лучше максимально рано, не нагружая OLE-соединение кучей ссылок. Примерно так:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
//Заполним таблицу значений ПКО
Пока ПКО_77.ПолучитьДокумент() = 1 Цикл
строкаТаблЗнач = ПКОТаблЗнач.Добавить();
строкаТаблЗнач.Номер = ПКО_77.НомерДок;
строкаТаблЗнач.Дата = ПКО_77.ДатаДок;
строкаТаблЗнач.Сумма = ПКО_77.Сумма;
строкаТаблЗнач.СтавкаНДС = ПКО_77.СтавкаНДС;// если это ссылочный тип - найти ему свой эквивалент сразу
строкаТаблЗнач.Валюта = НайтиВалюту(ПКО_77.Валюта);
строкаТаблЗнач.Контрагент = НайтиКлиента(ПКО_77.Контрагент);
строкаТаблЗнач.Договор = НайтиДоговор(ПКО_77.Договор,строкаТаблЗнач.Контрагент); // договор - зависит не только от контрагента, но и от организации
строкаТаблЗнач.ПринятоОт = ПКО_77.ПринятоОт;
КонецЦикла;


с простой реализацией найти/создать:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
Функция НайтиКлиента(спр5)  
	элем=справочники.Контрагенты.НайтиПоНаименованию(спр5.Наименование,истина);
	если  элем = Справочники.Контрагенты.ПустаяСсылка() тогда
		элем=справочники.Контрагенты.СоздатьЭлемент();	
		Состояние(спр5.Наименование); 
		элем.Наименование = СокрЛП(спр5.Наименование);  
		элем.НаименованиеПолное = СокрЛП(спр5.ПолнНаименование);
		элем.ЮрФизЛицо=перечисления.ЮрФизЛицо.ЮрЛицо;
		элем.инн=СокрЛП(спр5.инн);
		элем.кпп=СокрЛП(спр5.кпп);
		элем.Комментарий=СокрЛП(спр5.комментарий);
		элем.КодПоОКПО=СокрЛП(спр5.ОКПО);
		элем.Записать();
		возврат элем.Ссылка;
		
	иначе возврат элем;
	конецЕсли;
конецфункции


или со сложной (сопоставление контрагентов в первую очередь по ИНН/КПП, и только во вторую - по имени
...
Рейтинг: 0 / 0
Маленький вопрос по применению COMОбъект("V77.Application")
    #37922387
Gennadiy83
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прошу прощение, за то что туплю, но давайте рассмотрим еще раз. В моем примере ПКО_77 содержит выборку приходников за период. Приходник имеет реквизит "Контрагент". В ПКО_77.Контрагенты содержится COMОбъект.

Я так понимаю, что надо создать объект справочника 1С 77, например так:

спрКонтрагенты77 = База.EvalExpr("СоздатьОбъект(""" + Справочник.Контрагенты + """)");

и далее ПКО_77.Контрагенты как-то привести к типу спрКонтрагенты77, т.е. показать что это за объект, верно? А затем уже обращаться к реквизитам элемента справочника 77.

Покажите фрагмент кода.
...
Рейтинг: 0 / 0
Маленький вопрос по применению COMОбъект("V77.Application")
    #37922520
The Dim!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет нет нет и ещё раз нет.

Когда вы обходите выборку ПОК, у вас уже всё есть :)
То, что 8-рка любую ссылку на объект представляет как COMОбъект, это наследие 7-рки.

1. Если, вы получаете из 7-рки простой тип данных - число или строку - то работать с ними можно без каких-либо преобразований.
(вот про булево не помню... то-ли 1 и 0, то-ли понимает Истина/Ложь...)
2. Если, вы получаете из 7-рки ссылочный тип данных - ссылка на справочник, документ... то тут есть тонкость. Если в 7.7 (и в 8.х) обращение подобного рода

Код: sql
1.
2.
3.
Спр = СоздатьОбъект("Справочник.Контрагенты");
Спр.НайтиПоКоду("123321");
Сообщить(Спр.ТекущийОбъект());



Приведет к тому, что "Спр.ТекущийОбъект()" - по сути ссылка на объект - будет преобразована к представлению объекта, то в случае с COM-интерфейсом, всегда нужно четко указывать свойство объекта. Com-интерфейс "не понимает" представления.

3. Объекты ссылочных типов "не разворачиваются" в 8-рке в отладчике, хотя обращаться к методам и свойствам такого объекта можно.
...
Рейтинг: 0 / 0
Маленький вопрос по применению COMОбъект("V77.Application")
    #37932396
Gennadiy83
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
The Dim!2. Если, вы получаете из 7-рки ссылочный тип данных - ссылка на справочник, документ... то тут есть тонкость. Если в 7.7 (и в 8.х) обращение подобного рода

Код: sql
1.
2.
3.
Спр = СоздатьОбъект("Справочник.Контрагенты");
Спр.НайтиПоКоду("123321");
Сообщить(Спр.ТекущийОбъект());



Приведет к тому, что "Спр.ТекущийОбъект()" - по сути ссылка на объект - будет преобразована к представлению объекта, то в случае с COM-интерфейсом, всегда нужно четко указывать свойство объекта. Com-интерфейс "не понимает" представления.



А если мне необходимо передать ссылку на документ. Например, для документа Реализация необходимо найти подчиненные - ПКО, СчетФактураВыданный. Я пытаюсь сделать так:

Документ_77 = База.EvalExpr("СоздатьОбъект(""Документ"")");
Документ_77.ВыбратьПодчиненныеДокументы( , , Реализация_77);
Пока Документ_77.ПолучитьДокумент() = 1 Цикл
Если Документ_77.Вид() = "СчетФактураВыданный" Тогда
........

возникает ошибка, т.к. Реализация_77 - COMОбъект, а требуется ссылка на документ. Как выйти из положения? SOS...

2. и вторая проблема: объект7=БазаОле.EvalExpr("СоздатьОбъект("""+имя+""")"); если "имя" - справочники, документы, то всё ОК, пытаюсь подсунуть Перечисление.СтавкиНДС, то генерируется ошибка метода EvalExpr.
...
Рейтинг: 0 / 0
Маленький вопрос по применению COMОбъект("V77.Application")
    #37932884
The Dim!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gennadiy83А если мне необходимо передать ссылку на документ.
Куда, откуда и для чего требуется передать какую ссылку?

Gennadiy83Например, для документа Реализация необходимо найти подчиненные - ПКО, СчетФактураВыданный. Я пытаюсь сделать так:

Документ_77 = База.EvalExpr("СоздатьОбъект(""Документ"")");
Документ_77.ВыбратьПодчиненныеДокументы( , , Реализация_77);
Пока Документ_77.ПолучитьДокумент() = 1 Цикл
Если Документ_77.Вид() = "СчетФактураВыданный" Тогда
........

возникает ошибка, т.к. Реализация_77 - COMОбъект, а требуется ссылка на документ. Как выйти из положения? SOS...
Т.к. кто-то не удосужился прочесть то, что ему писали уже не однократно.
Т.к. было бы хорошо видеть определение всех используемых переменных, а не строить предположения.

Не так
Документ_77.ВыбратьПодчиненныеДокументы( , , Реализация_77);

а так
Документ_77.ВыбратьПодчиненныеДокументы( , , Реализация_77.ТекущийДокумент());

Разумеется, если Реализация_77 с позиционирована на каком-либо документе.

Gennadiy832. и вторая проблема: объект7=БазаОле.EvalExpr("СоздатьОбъект("""+имя+""")"); если "имя" - справочники, документы, то всё ОК, пытаюсь подсунуть Перечисление.СтавкиНДС, то генерируется ошибка метода EvalExpr. Это не вторая проблема, а следствие первой(не желание хоть чуть-чуть прочесть документацию по языку 7.7 и контекстах работы).
С какого перепуга вы начали создать объекты для обращения к перечислениям?
тынц
...
Рейтинг: 0 / 0
Маленький вопрос по применению COMОбъект("V77.Application")
    #37934380
Gennadiy83
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
The Dim!Не так
Документ_77.ВыбратьПодчиненныеДокументы( , , Реализация_77);

а так
Документ_77.ВыбратьПодчиненныеДокументы( , , Реализация_77.ТекущийДокумент());

Разумеется, если Реализация_77 с позиционирована на каком-либо документе.

При использовании ТекущийДокумент() генерируется ошибка несовпадение типов.

Информация по переменным:
База=Новый COMОбъект("V77.Application");

док Реализация создаю т.о.:
Реализация_77 = База.EvalExpr("СоздатьОбъект(""Документ.Реализация"")");

делаю выборку:
Реализация_77.ВыбратьДокументы(НачПериода, КонПериода);
Пока Реализация_77.ПолучитьДокумент() = 1 Цикл
...
работа с документом
...
КонецЦикла
...
Рейтинг: 0 / 0
Маленький вопрос по применению COMОбъект("V77.Application")
    #37934385
The Dim!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gennadiy83, как бы не так :)
Ошибка не совпадения типов, должны появляться были и без ТекущийДокумент().
Потому что: при работе с COM необходимо указывать ВСЕ параметры которые есть у методов.

Это мне нужно тянуть из вас сведения или кому?
Не интересно... и лень(мне).
...
Рейтинг: 0 / 0
Маленький вопрос по применению COMОбъект("V77.Application")
    #37934484
Gennadiy83
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
The Dim!Gennadiy83, как бы не так :)
Ошибка не совпадения типов, должны появляться были и без ТекущийДокумент().
Потому что: при работе с COM необходимо указывать ВСЕ параметры которые есть у методов.

Это мне нужно тянуть из вас сведения или кому?
Не интересно... и лень(мне).

Хочу поблагодарить за то что откликнулись на просьбу о помощи) Я сейчас в отпуске, а меня глав бух и тут достала, в результате уже 3 дня на нервах, программлю вместо отдыха.

Задача такая - перегрузка документов из ТиС 9.2 в Бух 2.0. Обработку пишу под 8.2. Алгоритм такой - делаю выборку реализации, затем в цикле, когда перебираю документы (фрагмент привел в пред посте) хочу сделать выборку подчиненных документов (Сч-Ф, ПКО). Возникла проблема, при вызове метода Документ_77.ВыбратьПодчиненныеДокументы( , , Реализация_77);, в качестве параметра требуется ссылка на документ, а у меня СОМобъект.
...
Рейтинг: 0 / 0
Маленький вопрос по применению COMОбъект("V77.Application")
    #37934632
pail
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gennadiy83,
Ссылки, которые требуются процедурам-функциям-методам COM-приложения - их надо у него же и получать, любым подходящим способом.
Это на стороне вызывающего приложения они "COM-объект". А на своей стороне - обычные данные, свои собственные
...
Рейтинг: 0 / 0
Маленький вопрос по применению COMОбъект("V77.Application")
    #37936151
Gennadiy83
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
The Dim!Gennadiy83, как бы не так :)
Ошибка не совпадения типов, должны появляться были и без ТекущийДокумент().
Потому что: при работе с COM необходимо указывать ВСЕ параметры которые есть у методов.

Это мне нужно тянуть из вас сведения или кому?
Не интересно... и лень(мне).

Разобрался, если в методе ВыбратьПодчиненныеДокументы() указать дата1, дата2, то всё отрабатывает как надо! Огромное спасибо за помощь! Спасибо, что научили работать с ОЛЕ!
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / [игнор отключен] [закрыт для гостей] / Маленький вопрос по применению COMОбъект("V77.Application")
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]