Заказы на доработку 1С (сервис удаленной работы)

Хранилище

База знаний
Неназначенных незавершенных заказов: 2
Бесплатные отчеты, обработки, конфигурации, внешние компоненты для 1С Статьи, описание работы, методики по работе с 1С

Здравствуйте, гость ( Вход | Зарегистрироваться )



> COM Соединение с другой базой , Помогите / набросайте короткий пример COM 2 страниц V   1 2 >          
Profi_1C77 Подменю пользователя
сообщение 27.05.25, 9:48
Сообщение #1

Завсегдатай
****
Группа: Пользователи
Сообщений: 141
Из: Черкассы
Спасибо сказали: 32 раз
Рейтинг: 32

Есть база BAS UT , и есть база BAS бух CORP
В базе УТ нужно построить отчет по остаткам товаров ( бех проблем ) + создать соединение к бух базе ( она кстати SQL ) - получить тоже остатки по 281 , выгрузить их в ТЗ и потом соединить в отчете остатков UT;
Номенклатура / Склады - синхронизированы ( Код - Артикул - ШтрихКод)

1. Не не писал такое ни разу , накидайте пож пример соединения и как через объект COM пишется запрос на 281.
2. В отчете как инициализировать ТЗ с бух базы и передать его как ИсточникДанных ?

UmbertoVasyl`ovi... Подменю пользователя
сообщение 27.05.25, 10:30
Сообщение #2

Молчаливый
*
Группа: Пользователи
Сообщений: 2
Спасибо сказали: 2 раз
Рейтинг: 2

Profi_1C77 @ Сегодня, 9:48 * ,
щось типу цього
Функция ПодключениеВыполнено(ткошибка) Экспорт
    ПодклУстановлено = Истина;
    СомСоединение = Новый COMОбъект("V83.ComConnector");    
        
    СтрокаСоединения = ПутьКБазе+"Usr = """+СокрЛП(Логин)+"""; Pwd = """+СокрЛП(Пароль)+"""";
    Если НЕ Серверная Тогда                
        СтрокаСоединения = "File = """+СокрЛП(ПутьКБазе)+"""; Usr = """+СокрЛП(Логин)+"""; Pwd = """+СокрЛП(Пароль)+"""";
    КонецЕсли;  
                
    Попытка
        Подключение = СомСоединение.Connect(СтрокаСоединения);
    Исключение
        ткошибка = ОписаниеОшибки();
        Если ПустаяСтрока(ткошибка) Тогда
            ткошибка = НСтр("ru='ошибка подключения';uk='помилка підключення'");
        КонецЕсли;    
        Подключение = Неопределено;
        СомСоединение = Неопределено;
        ПодклУстановлено = Ложь;
    КонецПопытки;
    
    Возврат ПодклУстановлено;
    
КонецФункции


Profi_1C77 @ Сегодня, 9:48 * ,
запрос так само як звичайний
Запрос = Подключение.NewObject("Запрос");

Спасибо сказали: Profi_1C77,

Slon747 Подменю пользователя
сообщение 27.05.25, 10:32
Сообщение #3

Завсегдатай
****
Группа: Пользователи
Сообщений: 121
Спасибо сказали: 16 раз
Рейтинг: 16

После успешного соединения со сторонней базой:
ЗапросВнешнейБазы = ВнешняяБаза.NewObject("Запрос");
ЗапросВнешнейБазы.Текст = ""; //тут текст запроса, как бы он выглядел в бухгалтерии
ЗапросВнешнейБазы.УстановитьПараметр(.....);
Выборка = ЗапросВнешнейБазы.Выполнить().Выбрать();


P.S. уже ответили

Profi_1C77 Подменю пользователя
сообщение 27.05.25, 10:36
Сообщение #4

Завсегдатай
****
Группа: Пользователи
Сообщений: 141
Из: Черкассы
Спасибо сказали: 32 раз
Рейтинг: 32

Slon747 @ Сегодня, 11:32 * ,
После этого Запрос в ТЗ , и в модуле объекта отчета ПриКомпоновкеРезультата ?

Slon747 Подменю пользователя
сообщение 27.05.25, 10:40
Сообщение #5

Завсегдатай
****
Группа: Пользователи
Сообщений: 121
Спасибо сказали: 16 раз
Рейтинг: 16

Цитата(Profi_1C77 @ 27.05.25, 11:36) *
После этого Запрос в ТЗ , и в модуле объекта отчета ПриКомпоновкеРезультата ?

Тут не скажу. Не загружал данные в СКД.

TohaMonster Подменю пользователя
сообщение 27.05.25, 11:13
Сообщение #6

Говорящий
***
Группа: Пользователи
Сообщений: 91
Спасибо сказали: 38 раз
Рейтинг: 38

Выборка - это будет COM-объект. Если Вы сделаете ТЗ = ЗапросВнешнейБазы.Выполнить().Выгрузить(), то ТЗ - ето тоже COM-объект, если я ничего не путаю. И, если это не примитивные типы, колонки будут тоже COM-объектом.
Поэтому, если Вам нужна, например, Номенклатура в Вашей Базе, нужно потом еще полученную ТЗ обработать и сопоставить её элементы элементам в Вашей Базе

andytg Подменю пользователя
сообщение 27.05.25, 11:54
Сообщение #7

Общительный
**
Группа: Пользователи
Сообщений: 31
Из: Киев
Спасибо сказали: 7 раз
Рейтинг: 7

Profi_1C77 @ Сегодня, 11:36 * ,
вам, как я понимаю, надо сравнить данные управленческого учета (УТ) с бухгалтерским (КОРП), так?

ну вот и делайте как выше написали, сперва в бухии КОРП через com-объект получаете данные из УТ и кладете их в одну таблицу значений (назовем Тз1), затем закрываем подключение и удаляем com-объект за ненадобностью, затем то же самое в УТ и результат кладете в другую таблицу (Тз2), затем сравниваете эти таблицы, перед сравнением постройте в каждой из таблиц поисковый индекс (чтоб удобнее и быстрее было искать) такого примерно вида (колонку "Ключ" добавьте)

Ключ = [код].[артикул].[штрихкод]

таблицы перед добавлением индекса сворачиваем по кодам/артикулам/штрихкодам

если как вы говорите, у вас вся номенклатура синхронизирована, то проблем быть не должно

и потом сравнение двух таблиц по этому индексу -- есть / нет

ну и результат -- в отчет


TohaMonster @ Сегодня, 12:13 * ,
колонки в ТЗ нужно делать примитивными типами (строка/число), т.е. код/артикул/наименование/количество/стоимость -- для сравнения остатков в двух базах будет достаточно

Спасибо сказали: Profi_1C77,

xlmel Подменю пользователя
сообщение 28.05.25, 9:13
Сообщение #8

Говорящий
***
Группа: Пользователи
Сообщений: 56
Из: Харьков
Спасибо сказали: 28 раз
Рейтинг: 30.7

В Бухгалтерии КОРП можно создать webservice, опубликовать его на web-сервере, и опубликовать метод, который будет возвращать таблицу значений. Я везде, где мог, уходил от COM в пользу webservice.
Во-первых существенно быстрее устанавливается соединение.
Во-вторых запросы пишутся в родной базе, а если через COM, то приходится делать запрос в консоли запросов в одной базе, потом его переносить во вторую. Это дополнительная работа.
В-третьих, при возврате через COM приходится использовать пару функций ЗначениеВСтрокуВнутр и ЗначениеИзСтрокиВнутр, или перегонять в JSON. С JSON проблема в том, что для обработки таблицы в запросе, она должна быть типизирована. То есть надо на стороне приемника создать таблицу, заполнить ее из JSON. Касательно 2 функций - вендор не рекомендует их использовать, о причине не знаю. А проверить получится ли работать с СериализаторXDTO через COM у меня как-то руки не дошли. В webservice, если добавите пакет XDTO [необходимо зарегистрироваться для просмотра ссылки], то станет доступен тип ValueTable и сможете на стороне приемника использовать СериализаторXDTO.ПрочитатьXDTO(), а на стороне источника СериализаторXDTO.ЗаписатьXDTO();
В расширение можно добавить webservice, режим совместимости 8.3.12 вроде как позволяет это сделать.

Спасибо сказали: TohaMonster,

andytg Подменю пользователя
сообщение 28.05.25, 13:12
Сообщение #9

Общительный
**
Группа: Пользователи
Сообщений: 31
Из: Киев
Спасибо сказали: 7 раз
Рейтинг: 7

Цитата(xlmel @ 28.05.25, 10:13) *
В расширение можно добавить webservice, режим совместимости 8.3.12 вроде как позволяет это сделать

оно-то так, но как показывает отечественная практика, практически везде для бухий и подач документов в налоговые (особенно в массовом режиме) уже больше 12 лет используется что-то из серии Медок/Фредо, а оно существует только под винду (ибо написано на net framework), поэтому на буховских машинах 100% будет именно винда, так что эквилибристика с линуксами, апачами, веб-сервисами и тому подобным imho в наших условиях излишня, разве что если специально не попросят smile.gif

а при взаимодействии через com надо только не забывать, что передать можно только простые типы, и в другой базе нужны будут дополнительные поиски и сопоставления (клиенты, номенклатура и т.д.), но и тут все решается поисками по ЕДРПОУ, артикулам, штрих-кодам и т.д. (которые и задаются именно простыми типами -- строка/чиало), так что в итоге не проблема



Цитата(xlmel @ 28.05.25, 10:13) *
Касательно 2 функций - вендор не рекомендует их использовать, о причине не знаю.

если это про ЗначениеВСтрокуВнутр(), то в мануалах написано, что оставлено только для совместимости с клюшками (как по мне, отличная функция, крайне удобная и нужная smile.gif)

xlmel Подменю пользователя
сообщение 28.05.25, 14:45
Сообщение #10

Говорящий
***
Группа: Пользователи
Сообщений: 56
Из: Харьков
Спасибо сказали: 28 раз
Рейтинг: 30.7

andytg @ Сегодня, 13:12 * ,
так я не возражаю, каждый ищет то, что ему удобнее. У меня 4 базы на Винде, которые должны обмениваться данными и все реализовано через веб-сервисы. Можно было сделать через COM, но открытие COM обычно в 5-7 раз медленнее, чем веб-сервис. И сделаны аналогичные отчеты, которые собирают данные из разных баз и удалось добиться разумных времен ожидания

andytg Подменю пользователя
сообщение 28.05.25, 15:10
Сообщение #11

Общительный
**
Группа: Пользователи
Сообщений: 31
Из: Киев
Спасибо сказали: 7 раз
Рейтинг: 7

Цитата(xlmel @ 28.05.25, 15:45) *
но открытие COM обычно в 5-7 раз медленнее

тут соглашусь для случая, когда com на разных серверах, удаленных друг от друга
в нашем случае тоже 4 базы (3 бух корп и 1 типа управленческая унф), обмен идет из унф в бух, на com в пределах локалки 100 мбит -- соединение за пару секунд
в роли "серверов" -- i7 3770k и i5 2320, винда, postgresql
а вот если базы находятся в разных местах и соединение через интернет -- тогда соглашусь, да, com сильно тупит, веб-сервис наверное будет быстрее (не пробовал, лень переписывать smile.gif)

xlmel Подменю пользователя
сообщение 28.05.25, 15:31
Сообщение #12

Говорящий
***
Группа: Пользователи
Сообщений: 56
Из: Харьков
Спасибо сказали: 28 раз
Рейтинг: 30.7

andytg @ Сегодня, 15:10 * ,
пока простые запросы, еще терпимо, когда нужно использовать МенеджерВременныхТаблиц, то я лучше буду через сервисы делать

Profi_1C77 Подменю пользователя
сообщение 03.06.25, 11:30
Сообщение #13

Завсегдатай
****
Группа: Пользователи
Сообщений: 141
Из: Черкассы
Спасибо сказали: 32 раз
Рейтинг: 32

UmbertoVasyl`ovich @ 27.05.25, 11:30 * ,
Хелп.
&НаСервере

Функция ПодключениеВыполнено(ткошибка) Экспорт
    ПодклУстановлено = Истина;
    СомСоединение = Новый COMОбъект("V83.ComConnector");    
     // параметры
     ПутьКБазе  = "C:\BAS бух\";
     Логин         = "Ольга";
     Пароль     = "261080";
     Серверная = Ложь;
     Подключение = Неопределено;
    СтрокаСоединения = ПутьКБазе+"Usr = """+СокрЛП(Логин)+"""; Pwd = """+СокрЛП(Пароль)+"""";
    Если НЕ Серверная Тогда                
        СтрокаСоединения = "File = """+СокрЛП(ПутьКБазе)+"""; Usr = """+СокрЛП(Логин)+"""; Pwd = """+СокрЛП(Пароль)+"""";
    КонецЕсли;  
                
    Попытка
        Подключение = СомСоединение.Connect(СтрокаСоединения);
    Исключение
        ткошибка = ОписаниеОшибки();
        Если ПустаяСтрока(ткошибка) Тогда
            ткошибка = НСтр("ru='ошибка подключения';uk='помилка підключення'");
        КонецЕсли;    
        Подключение = Неопределено;
        СомСоединение = Неопределено;
        ПодклУстановлено = Ложь;
    КонецПопытки;
    
    Возврат ПодклУстановлено;
    
КонецФункции

такое вышло , не создает и все, все время в отладке на исключение уходит ;
Что может быть не так?

Vofka Подменю пользователя
сообщение 03.06.25, 11:41
Сообщение #14

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 14050
Из: Киев
Спасибо сказали: 4612 раз
Рейтинг: 3748.8

Цитата(Profi_1C77 @ 03.06.25, 12:30) *
ОписаниеОшибки()

Так а что здесь возвращается?

Profi_1C77 Подменю пользователя
сообщение 03.06.25, 12:11
Сообщение #15

Завсегдатай
****
Группа: Пользователи
Сообщений: 141
Из: Черкассы
Спасибо сказали: 32 раз
Рейтинг: 32

Vofka @ Сегодня, 12:41 * ,
СтрокаСоединения = File = "C:\BAS бух\"; Usr = "Ольга"; Pwd = "261080"
СомСоединение = COMОбъект
Ошибка = {ВнешнийОтчет.ОстаткиТоваровUT_BAS.МодульОбъекта(17)}: Метод об’єкта не виявлено (Connect)

может права / не установлена длл?

andytg Подменю пользователя
сообщение 03.06.25, 12:12
Сообщение #16

Общительный
**
Группа: Пользователи
Сообщений: 31
Из: Киев
Спасибо сказали: 7 раз
Рейтинг: 7

Цитата(Profi_1C77 @ 03.06.25, 12:30) *
Что может быть не так?


всё smile.gif

у вас время жизни подключения равно времени жизни вашей функции, которая возвращает булево значение, а само подключение закрывается после отработки функции

Profi_1C77 Подменю пользователя
сообщение 03.06.25, 12:18
Сообщение #17

Завсегдатай
****
Группа: Пользователи
Сообщений: 141
Из: Черкассы
Спасибо сказали: 32 раз
Рейтинг: 32

andytg @ Сегодня, 13:12 * ,
Я код потом код перенесу ""правильно" " мне важно что что б Подключение было

andytg Подменю пользователя
сообщение 03.06.25, 12:23
Сообщение #18

Общительный
**
Группа: Пользователи
Сообщений: 31
Из: Киев
Спасибо сказали: 7 раз
Рейтинг: 7

Цитата(Profi_1C77 @ 03.06.25, 13:11) *
Метод об’єкта не виявлено (Connect)

в этом случае надо зарегистрировать comcntrl.dll в системе (причем, если их несколько, то надо именно от нужной версии платформы)



Цитата(Profi_1C77 @ 03.06.25, 13:18) *
Я код потом код перенесу ""правильно" " мне важно что что б Подключение было

можете не переносить, а обернуть в структуру и засунуть во временное хранилище, потом доставать и использовать, адрес хранилища запоминать -- так работает и ком-объект существует между вызовами функций до момента закрытия, когда необходимо

[необходимо зарегистрироваться для просмотра ссылки]

        V7 = _V7.Connect(СтрокаСоединения);

        _СтруктураCOM = Новый Структура;
        _СтруктураCOM.Вставить("COMОбъект", V7);
        _КонтейнерCOM = ПоместитьВоВременноеХранилище(_СтруктураCOM, Новый УникальныйИдентификатор);


Сообщение отредактировал Vofka - 03.06.25, 12:47

Спасибо сказали: Profi_1C77,

Profi_1C77 Подменю пользователя
сообщение 03.06.25, 12:56
Сообщение #19

Завсегдатай
****
Группа: Пользователи
Сообщений: 141
Из: Черкассы
Спасибо сказали: 32 раз
Рейтинг: 32

andytg @ Сегодня, 13:23 * ,
эта зараза не регается
Regsvr32 comcntr.dll

Profi_1C77 @ Сегодня, 13:41 * ,
regsvr32 /i "C:\Program Files\1cv8\8.3.23.2236\bin\comcntr.dll"
так прошло

andytg Подменю пользователя
сообщение 03.06.25, 12:59
Сообщение #20

Общительный
**
Группа: Пользователи
Сообщений: 31
Из: Киев
Спасибо сказали: 7 раз
Рейтинг: 7

Цитата(Profi_1C77 @ 03.06.25, 13:56) *
так прошло

так полный путь надо указывать же!

upd: можете через com+ [необходимо зарегистрироваться для просмотра ссылки]
у меня так зарегистрирована 8.5 (для тестов) и 8.3 с ней прекрасно работает, т.к. ком-коннекторы разных версий v83.ComConnector и v85.ComConnector

Не нашли ответа на свой вопрос?
Зарегистрируйтесь и задайте новый вопрос.


2 страниц V   1 2 >
Ответить Новая тема
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

RSS Текстовая версия Сейчас: 14.06.25, 14:48
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!