V8: COM-соединение. Три кита работы с COM-объектами
01.01.2024
Один из вариантов обмена данными между базами 1С это обмен через COM соединение.
С помощью COM соединения можно из одной базы 1С подключиться к другой и прочитать или записать данные. Пользоваться этим методом можно как в клиент-серверных вариантах баз, так и в файловых базах. В этой статье и разберем примеры такого рода соединений. В примерах используется платформа 8.2.
Можно создать два вида COM объектов для приложения 1С. Это V82.Application
и V82.COMConnector
. В случае с V82.Application
запускается практически полноценный экземпляр приложения 1С. в случае использования V82.COMConnector
запускается небольшая серверная часть.
Скорость работы в этом случае выше, но некоторые функции могут быть недоступны. В частности работа с формами и с общими модулями для которых не установлено свойство работы с внешними соединениями. Преимущественно надо использовать V82.COMConnector
и только в случае нехватки функционала V82.Application
. Особенно сильно разница в скорости работы может быть заметна на базах большого объема.
Итак, приступим
Создадим COM объект
для V82.Application
Соединение =
Новый
COMОбъект("V82.Application"
)
;
для V82.COMConnector
Соединение =
Новый
COMОбъект("V82.COMConnector"
)
;
Сформируем строку подключения
для серверного варианта базы
СтрокаСоединения =
"Srvr = "
"ИмяСервера"
";Ref = "
"ИмяБазы"
;
для файлового варианта базы
СтрокаСоединения =
"File = "
"ПутьКБазе"
"; Usr = ИмяПользователя; Pwd = Пароль"
;
Выполняем подключение к базе
Попытка
Подключение =
Соединение.
Connect(СтрокаСоединения)
;
Исключение
Сообщение =
Новый
СообщениеПользователю;
Сообщение.
Текст =
+
ОписаниеОшибки()
;
Сообщение.
Сообщить()
;
КонецПопытки
;
Разрываем соединение с базой
Соединение =
Неопределено
;
Для объекта V82.Application
выполнять разрыв соединения обязательно, в противном случае останется висеть незавершенный сеанс, который потом придется удалять вручную. В случае с V82.COMConnector
соединение разрывается автоматически при завершении процедуры в которой выполнялось подключение.И есть еще один маленький момент.
Для пользователя под которым выполняется подключение должен быть отключен флажок «Запрашивать подтверждение при закрытии программы» в его настройках.
А теперь соберем весь код в кучу
Соединение =
Новый
COMОбъект("V82.Application"
)
;
//Соединение = Новый COMОбъект("V82.COMConnector");
СтрокаСоединения =
"Srvr = "
"Server1C"
";Ref = "
"MyBase"
"; Usr = Петя; Pwd = 123"
;
//СтрокаСоединения = "File = ""С:\MyBase""; Usr = Петя; Pwd = 123";
Попытка
Подключение =
Соединение.
Connect(СтрокаСоединения)
;
Исключение
Сообщение =
Новый
СообщениеПользователю;
Сообщение.
Текст =
"Не удалось подключиться к базе"
+
ОписаниеОшибки()
;
Сообщение.
Сообщить()
;
КонецПопытки
;
Соединение =
Неопределено
;
Для вида подключения V82.Application
метод применяется для COM объекта, который создавался изначально, а для V82.COMConnector
метод применяется к подключению. далее работа с запросом идет стандартными средствами 1С. в коде это выглядит так:
Запрос =
Подключение.
NewObject("Запрос"
)
;
// для V82.COMConnector
Запрос =
Соединение.
NewObject("Запрос"
)
;
// для V82.Application
Запрос.
Текст =
"ВЫБРАТЬ
| ДолжностиОрганизаций.Код,
| ДолжностиОрганизаций.Наименование
|ИЗ
| Справочник.ДолжностиОрганизаций КАК ДолжностиОрганизаций"
;
Результат =
Запрос.
Выполнить
()
;
Выборка =
Результат.
Выбрать()
;
Пока
Выборка.
Следующий()
Цикл
КонецЦикла
;
Для версии 1С:Предприятие 8.3 все остается без изменений за исключением того, что при создании COMОбъектов надо использовать «V83.COMConnector»
или «V83.Application»
.
Печать (Ctrl+P)
Один из вариантов обмена данными между базами 1С это обмен через COM соединение. С помощью COM соединения можно из одной базы 1С подключиться к другой и прочитать или записать данные. Пользоваться этим методом можно как в клиент-серверных вариантах баз, так и в файловых базах. В этой статье рассматривается такого рода соединений на платформа 8.3
com соединение
Можно создать два вида COM объектов для приложения 1С. Это ole соединения V83.Application
и com соединения V83.COMConnector
. В случае с V83.Application
запускается практически полноценный экземпляр приложения 1С. В случае использования V83.COMConnector
запускается небольшая серверная часть. Скорость работы в этом случае выше, но некоторые функции могут быть недоступны. В частности работа с формами и с общими модулями для которых не установлено свойство работы с внешними соединениями. Преимущественно надо использовать V83.COMConnector
и только в случае нехватки функционала V83.Application
. Особенно сильно разница в скорости работы может быть заметна на базах большого объема. Для платформе 8.2 используется V82.Application или V82.COMConnector
Установить OLE соединение
Соединение =
Новый
COMОбъект(“V83.Application”
)
;
Установить COM соединение
Соединение =
Новый
COMОбъект(“V83.COMConnector”
)
;
Соединение
=
Неопределено
;
Для объекта V83.Application
выполнять разрыв соединения обязательно, в противном случае останется висеть незавершенный сеанс, который потом придется удалять вручную. В случае с V83.COMConnector
соединение разрывается автоматически при завершении процедуры в которой выполнялось подключение.И есть еще один маленький момент. Для пользователя под которым выполняется подключение должен быть отключен флажок «Запрашивать подтверждение при закрытии программы» в его настройках.
Метод NewObject()
Для создания нового объекта можно воспользоваться методом NewObject(),
например:
ЗапросCOM.
Текст =
“ВЫБРАТЬ
| ДолжностиОрганизаций.Код,
| ДолжностиОрганизаций.Наименование
|ИЗ
| Справочник.ДолжностиОрганизаций
КАК ДолжностиОрганизаций”
;
Результат =
ЗапросCOM.
Выполнить
()
;
Выборка =
Результат.
Выбрать
()
;
Пока
Выборка.
Следующий()
Цикл
КонецЦикла
;
Можно также использовать менеджеры объектов конфигурации:
СправочникCOM =
Подключение.
Справочники.
ИмяСправочника;
ДокументCOM =
Подключение.
Документы.
ИмяДокумента;
РегистрCOM
=
Подключение
.
РегистрыСведений
.
ИмяРегистра
;
Получение и сравнение перечисления через COM соединение
Для сравнения значений элементов перечислений, определенных в конфигурации, необходимо выполнить преобразование этих элементов к одному из примитивных типов, сравнение которых не вызывает трудности. Такими типами могут быть либо числовой, либо строковый тип. Преобразовать значение элемента перечисления к числовому типу можно так
Доброго времени суток.!
Вопрос до боли известный, необходимо забрать инфу с сайта. Но есть нюансы:
1. Нет возможности зайти сразу на страницу авторизации (сначала заходим на домашнюю страницу, нажимаем ссылку LogIn, получаем форму авторизации и только потом логинимся).
2. На сайте нужно через поисковую строку искать данные, далее читать их и искать еще (данные могут быть на русском и английском, т.е. если данные для поиска на русском, то искать нужно в "русской версии" сайта, а это еще один переход по ссылке на другую страницу. С английским такая же тема).
В итоге:
- заходим на домашнюю страницу - логинимся - ищем данные - (переходим на др. версию сайта, если нужно) - забираем их.
Проблема:
Не считываются данные в свойство "document" при переходе по ссылке.
Возникает в двух моментах:
- когда переходим по ссылке, чтобы залогиниться (это не кнопка, а просто ссылка);
- когда меняем язык на сайте (тоже ссылка).
Примечание
Если перед переходом по ссылке на этапе авторизации получить ссылку, закрыть ком и открыть снова с переходом через метод IE.navigate("ссылка"), тогда данные в свойство "document" ложатся нормально. Но проделать тоже самое при смене языка на сайте уже не получится, т.к. нужно логиниться снова и плюс не хотелось бы вот именно так решать эту задачку.
Вот код:
&НаКлиенте
Процедура УстановитьОжиданиеИЕ(IE, ВторойВызов=Ложь)
Если НЕ IE.Busy Тогда
Д = ТекущаяДата() + 3;
Пока Д >= ТекущаяДата() Цикл
Если IE.Busy Тогда Прервать; КонецЕсли;
КонецЦикла;
КонецЕсли;
Пока IE.Busy Цикл КонецЦикла;
Пока IE.ReadyState < 4 Цикл КонецЦикла;
Попытка
Если IE.Document.ReadyState = Null Тогда
IE.Refresh(); УстановитьОжиданиеИЕ(IE);
КонецЕсли;
Пока IE.Document.ReadyState <> "complete" Цикл КонецЦикла;
Исключение
Если ВторойВызов Тогда
Возврат;
Иначе
Ссылка = IE.LocationURL; IE.Quit();
IE = ПолучитьCOM("InternetExplorer.Application");
IE.Navigate(Ссылка); УстановитьОжиданиеИЕ(IE, Истина);
КонецЕсли;
КонецПопытки;
КонецПроцедуры
&НаКлиенте
Функция ВыполнитьАвторизациюПользователя(IE, Ссылка, Логин, Пароль, Авторизован=Ложь, СЧ=0)
Попытка
Elements = IE.Document.GetElementsByName("username");
Если Elements.Length = 1 Тогда
Для Каждого El Из Elements Цикл
El.Value = Логин;
КонецЦикла;
КонецЕсли;
Elements = IE.Document.GetElementsByName("password");
Если Elements.Length = 1 Тогда
Для Каждого El Из Elements Цикл
El.Value = Пароль;
КонецЦикла;
КонецЕсли;
IE.Document.GetElementById("ID").Click();
УстановитьОжиданиеИЕ(IE); Авторизован = Истина;
Исключение
Если СЧ > 3 Тогда Возврат Ложь; КонецЕсли;
IE.Quit(); IE.Navigate(Ссылка); УстановитьОжиданиеИЕ(IE); СЧ = СЧ + 1;
Если ВыполнитьАвторизациюПользователя(IE, Ссылка, Логин, Пароль, СЧ) Тогда
Возврат Истина;
КонецЕсли;
КонецПопытки;
Возврат Авторизован;
КонецФункции
&НаКлиенте
Процедура Закачать(Команда)
СпТаблиц = ПолучитьСписокТаблицДляЗагрузки();
Если СпТаблиц = Ложь Тогда Возврат; КонецЕсли;
IE = ПолучитьCOM("InternetExplorer.Application");
Для Каждого Строка Из СпТаблиц.SOURCE_LIST Цикл
РА = Строка.ID; Ресурс = Строка.RESOURCE; IE.Navigate(Ресурс); УстановитьОжиданиеИЕ(IE);
Попытка
Если Строка.NEW_PAGE_IN_LOGIN = 1 Тогда
Classes = IE.Document.GetElementsByClassName("ИмяКласса");
Если Classes.Length = 1 Тогда
Для Каждого Class Из Classes Цикл
Ресурс = Class.All(0).Href; Прервать;
КонецЦикла;
Попытка
IE.Quit(); IE = IE.Navigate(Ресурс); УстановитьОжиданиеИЕ(IE);
Исключение
Сообщить("Подключение к сайту «" +Строка.NAME + "» не удалось!"); Прервать;
КонецПопытки;
Иначе
Сообщить("Подключение к сайту «" +Строка.NAME + "» не удалось!"); Прервать;
КонецЕсли;
КонецЕсли;
Если НЕ ВыполнитьАвторизациюПользователя(IE, Ресурс, Строка.LOGIN, Строка.PASSWORD) Тогда
Сообщить("Авторизация пользователя на сайте «" + Строка.NAME + "» не выполнена!"); Прервать;
КонецЕсли;
Ресурс = IE.LocationURL; СписокЛиц = СпТаблиц.FACE_CODES.НайтиСтроки(Новый Структура("SOURCE", РА)); СписокНеНайденных = Новый Массив;
Для Каждого Лицо Из СписокЛиц Цикл
ИмяЛица = Лицо.NAME_IN_SITE; ЭтоРусский = КодСимвола(ИмяЛица, 1) >= 1040;
ТекРесурс = ?(ЭтоРусский, СтрЗаменить(Ресурс, "en_US", "ru_RU"), СтрЗаменить(Ресурс, "ru_RU", "en_US"));
Если ТекРесурс <> IE.LocationURL Тогда
RootClasses = IE.Document.GetElementsByClassName("ИмяКласса");
Если RootClasses.Length = 1 Тогда
Для Каждого RootClass Из RootClasses Цикл
Classes = RootClass.Children; Прервать;
КонецЦикла;
AmGroup = False; RuGroup = False;
Для Каждого Class Из Classes Цикл
Если НРег(Class.ClassName) = "dropdown-header" Тогда
AmGroup = Найти(Class.InnerText, "Americans") > 0;
RuGroup = Найти(Class.InnerText, "Europe") > 0;
ИначеЕсли НРег(Class.ClassName) <> "selected" Тогда
Если AmGroup И Найти(Class.All(0).InnerText, "English") > 0 ИЛИ
RuGroup И Найти(Class.All(0).InnerText, "Russia") > 0 Тогда
IE.Navigate(Class.All(1).Href); УстановитьОжиданиеИЕ(IE); Прервать;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЕсли;
IE.Document.GetElementById("ИД").Value = ИмяЛица;
FindButton = IE.Document.GetElementById("ИД");
FindButton.Focus(); FindButton.Click();
Попытка
УстановитьОжиданиеИЕ(IE);
//Обход полученных данных
Исключение
СписокНеНайденных.Добавить(Лицо); Продолжить;
КонецПопытки;
КонецЦикла;
Исключение
Сообщить("Ошибка:" + Символы.ПС + ОписаниеОшибки());
Прервать;
КонецПопытки;
КонецЦикла;
IE.Quit();
КонецПроцедуры
Ответ:
Тема очень интересная, но вот лично у меня, к сожалению, нет ни опыта, ни даже возможности хоть как то разобраться в этой проблеме. Если сможете раздобыть информацию на эту тему, то поделитесь ей пожалуйста.
--- Объединение сообщений, 29 апр 2016
---
Я так понимаю доступа к SQl базе нет?
--- Объединение сообщений, 29 апр 2016
---
Ну хотя если парсинг, то какой доступ
Вопрос: COM-соединение 1С 8.3 - 1С 8.3 Есть ли возможность зайти в отладчик в соединении
Хотел спросить форумчан если ли вообще такая возможность отладки когда подключаюсь по СОМ-соединению с помощью обработки из одной базы на платформе 8.3.6 (БП 3.0) к модулю внешнего соединения самописной базы (тоже работающей на платформе 8.3.6) и вызываю из него экспортные процедуры с помощью обработки? Базы пока файловые и находятся на одном ПК, но планируется серверный вариант. До этого времени использовал конструкции приведенные ниже для передачи на выполнение произвольного кода по СОМ-соеднению, а также регистрации ошибок. Вот фрагменты процедур в самописной базе в модуле внешнего соединения:
Функция ИсполнитьВн(КодВыполнить, ВспомПараметр= "") Экспорт
ПроверкаБезопасности();// Защита от попытки выполнения вредоносного кода при внешнем подключении от имени другого пользователя
Ответ = "0
"//Если ничего не нужно будет возвращать, то при отсутствии ошибок в коде
 //вернется просто ОК
 //Т.к. переданный код может быть с ошибками, то завернем его исполнение в попытку.
Попытка
Выполнить(КодВыполнить);// Выполнение кода как строки на другом компьютере по COM-Соединению (Модуль внешнего соединения базы Весы)
Исключение
 //если все таки ошибка, то вернем ее текст
Ответ = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
КонецПопытки
;
Возврат
Ответ;
КонецФункции
Функция
ТестСвязи(ВхПараметр, ВыхПараметр) Экспорт
ПроверкаБезопасности();// Защита от попытки выполнения вредоносного кода при внешнем подключении от имени другого пользователя.
ВыхПараметр = "Есть связь с базой весы по
COM-Соединению!";
Возврат
Истина
;
КонецФункции
Из БП 3.0 выполняю такой фрагмент:
Попытка
Ком = Новый
COMObject("V83.COMConnector");
Соединение = Ком.Connect ("File=""C:\1
c\Базы_1С\Весы""; Usr =""КомОбмен""; Pwd =""1
"";");
СказатьПользователю("Тест пройден! Есть соедение с базой весов");
Исключение
Ошибка = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
СказатьПользователю("Нет КОМ-соединения с базой Весов! Подробно "+Ошибка);
Ком=Неопределено
;
Возврат
;
КонецПопытки
;
Вых = "";
Вх = "1
";
Если
Соединение.ТестСвязи(Вх, Вых) Тогда
СказатьПользователю("Тест связи с конфигурацией весы успешный! Ответ: "+Вых);
Иначе
СказатьПользователю("Тест связи с конфигурацией весы неудачный! Ответ: "+Вых);
КонецЕсли
;
Понимаю, конечно что в оператор Выполнить(СтрокаКода1С8) зайти не удастся, но есть ли такая возможность при вызове удаленной процедуры модуля внешнего подключения из основной базы Соединение.ТестСвязи(Вх, Вых) зайти в ее код в этой же сессии отладчика в функцию ПроверкаБезопасности() их вызывающей процедуры?
Уже смотрел документацию что смог найти по этому вопросу. Ставил везде в обоих конфигурациях опции по разрешению отладки и точки останова. Запускал оба конфигуратора.
Есть ли вообще такая возможность в данной ситуации отладить допустим процедуру ПроверкаБезопасности() и дальше на стороне модуля внешнего подключения?
Вопрос: Неправильный IP-адрес в COM соединении
Есть обработка, которая перекидывает документы через V83.ComСonnector между серверами. Сервер 1 (версия 1С 8.2.19.90) всегда подключается к Серверу 2 (версия 8.3.8.2033). В строке соединения прописан IP адрес сервера 2 и работало все хорошо. На самом сервере 1 видел также установленную платформу как на сервере 2, версии 8.3.9.2033 (если это важно).
Проблема в том, что на Сервере 2 поменялся IP адрес, обработка конечно же перестала работать и когда я прописал новый IP в строке подключения, обработка выдает ошибку, в описании которой по-прежнему старый IP (!) и текст "Попытка установить соединение была безуспешной, т.к. от другого компьютера за требуемое время не получен нужный отклик, или было разорвано уже установленное соединение из-за неверного отклика уже подключенного компьютера."
Все перезагружали, чистили кеши и тд, админы клянутся что с их стороны все ок, по RDP можно зайти с одного сервера на другой и тд.
Что может быть, как решить? Весь интернет перерыл, такой ситуации не нашел!
Ответ:
() 100% уверен! Второй день пробую, как и писал, отладчиком смотрю, даже создал одноклеточную обработку тупо для теста коннекта, вываливается та ошибка и все
Вопрос: COM соединение к разным версиям
Всем привет. Имею базу аля "Консолидация", которая с разных баз собирает разные данные и сводит все в одну кучу. Проблема в том, что необходимо через com подключатся к этим базам, но они разных версий, соответственно в конечном итоге ловлю ошибку типа Ошибка подключения!{
ВнешняяОбработка.
ПереносИстории.
Форма.
Форма.
Форма(12
)}
: Ошибка при вызове метода контекста (Connect)
: Произошла исключительная ситуация (V83.
COMConnector.
1
)
: Несоответствие версий клиента и сервера 1
С:Предприятия
Различаются версии клиента и сервера (8.3
.
8.1964
-
8.3
.
6.2332
),
клиентское приложение: COM-
соединение
настрою одно соединение, отваливается другое...
Знаю что как то через службу компонентов можно создавать "свои классы (конекторы)" для каждой версии и потом создавать Новый COMОбъект соответствующего версии платформы класса... может я и ошибаюсь.
Помогите, победить эту проблемку...
Ответ:
все... вопрос снимаю..
Вопрос: Com Ошибка в ОбработкаЗаполнения
Привет.
8.2 Розница 1.
коннектюсь к 8.1 Не типовая конфа.
Подключаюсь по com к базе и пытаюсь создать документ, но при вызове "СоздатьДокумент()" или "ПолучитьОбъект()" происходит ошибка процедуре ОбработкаЗаполнения
. см рис.
Пробую то же самое в самой базе 8.1 но ни какой ошибки нет, и в ОбработкаЗаполнения тоже не вхожу.
В чем косяк то может быть?
Добавлено через 5 минут
Она не вызывается! Она пытается скомпилироваться! Но так как при подключении через ComConnector РежимДиалогаВопрос НЕ СУЩЕСТВУЕТ, модуль документа не может быть скомпилирован.
Для таких случаев когда в модуле объекта необходимо реализовать работу с диалогом используют инструкции препроцессору
Это не твоя ошибка, а ошибка модуля документа в базе к которой ты подключаешься.
В базе код исполняется на клиенте и РежимДиалогаВопрос есть поэтому все происходит без ошибок
Используй не ComConnector, V8.Application для подключения, тогда тебе будут доступны интерфейсные вещи
Добавлено через 5 минут
=======================================================================================================================
из описания внешнего соединения (СП) Жирным выделил что тебе следует почитать про КомСоединения
Описание
:
В общем и целом работа с 1С:Предприятием 8 через внешнее соединение подобна работе с 1С:Предприятием в режиме Automation сервера. Основные отличия заключаются в следующем:
В случае Automation сервера запускается полноценное приложение 1С:Предприятия 8, а в случае внешнего соединения запускается относительно небольшой внутрипроцессный COM-сервер.
При работе через внешнее соединение не доступны функциональные возможности, так или иначе связанные с организацией пользовательского интерфейса 1С:Предприятия 8;
При работе внешнего соединения не используется модуль управляемого приложения (модуль обычного приложения) конфигурации 1С:Предприятия 8. Его роль при работе с внешним соединением играет модуль внешнего соединения.
При использовании внешнего соединения имеются следующие преимущества по сравнению с использованием Automation сервера:
Более быстрая установка соединения, так как не требуется создания отдельного процесса операционной системы, а все действия производятся в рамках вызывающего процесса;
Более быстрое обращение к свойствам и методам объектов 1C:Предприятия, так как для организации обращения не требуется организации межпроцессной коммуникации;
Меньший расход ресурсов операционной системы.
Для организации доступа к данным 1С:Предприятия 8 через внешнее соединение, выполняется следующая последовательность действий:
создается менеджер COM-соединений, с помощью которого производится установка соединения;
производится обращение к методу Connect менеджера COM-соединений. Метод Connect возвращает внешнее соединение с информационной базой 1С:Предприятия 8;
через внешнее соединение производится обращение к допустимым методам, свойствам и объектам информационной базы, с которой установлено соединение.
Важно! В связи с отсутствием пользовательского интерфейса не все объекты, а также свойства и методы можно использовать во внешнем соединении.
Внешнее соединение предоставляет полный доступ к своему глобальному контексту. Поэтому внешнее соединение в качестве своих методов может иметь: системные константы, значения заданных в конфигураторе объектов, доступ к которым осуществляется с помощью менеджеров (например, константы, перечисления, справочники, документы, журналы документов, отчеты, обработки, планы видов характеристик, планы счетов, планы видов расчета, регистры), а также переменные, объявленные в модуле внешнего соединения с ключевым словом Экспорт.
Доступность:
Интеграция.
Вопрос: COM соединение, план видов характеристик
Задача – программно создать новый элемент в известном плане видов характеристик через COM соединение. Соединение установлено, тут всё нормально.
Последняя строка не срабатывает. И это понятно, он находит такой тип для базы, где 1С запущен, но мне-то нужен тип для присоединённой базы. А как его получить?
В моём варианте просто создаётся элемент с типом значения «Произвольный список». Оно работает в принципе, но некрасиво как-то.
Плватформа 8.3. COM-соединение – непременное условие. Решения без его использования не интересуют.
Ответ:
Прокатывает. Спасибо, оно заработало.
Вопрос: COM соединение. Проблема с параметром запроса
Доброго времени суток.
Проблема с запросом по COM-соединению.
Перем ТЗ;
МассивНоменклатуры = COM.NewObject("Массив");
Для Каждого Строка из ТЗНоменклатуры Цикл
Номенклатура = COM.Справочники.Номенклатура.ПолучитьСсылку(COM.NewObject("УникальныйИдентификатор", СокрЛП(Строка.Номенклатура.Идентификатор)));
МассивНоменклатуры.Add(Номенклатура);
КонецЦикла;
Если МассивНоменклатуры.Количество() <> 0 Тогда
Запрос = COM.NewObject("Запрос");
Запрос.Текст =
"ВЫБРАТЬ
|ЦеныНоменклатурыСрезПоследних.ТМЦ КАК Номенклатура,
|ЦеныНоменклатурыСрезПоследних.ОтпускнаяЦена КАК Цена,
|ЦеныНоменклатурыСрезПоследних.СтавкаНДС,
|ЦеныНоменклатурыСрезПоследних.СтавкаНП
|ИЗ
|РегистрСведений.ЦеныТМЦ.СрезПоследних(|&ДатаДок,
|ТипЦены = &ТипЦены
|И ТМЦ В (&МассивНоменклатуры)
|И ТМЦ.ЭтоГруппа = ЛОЖЬ
|И Регистратор ССЫЛКА Документ.УстановкаОтпускныхЦен) КАК ЦеныНоменклатурыСрезПоследних";
Запрос.УстановитьПараметр("МассивНоменклатуры", МассивНоменклатуры);
Запрос.УстановитьПараметр("ДатаДок", КонецДня(СтруктураПараметров.ДатаДок));
Запрос.УстановитьПараметр("ТипЦены", COM.Справочники.ТипыЦен.GetRef(COM.NewObject("УникальныйИдентификатор", СтруктураПараметров.ТипЦены.Идентификатор)));
ТЗ = COM.NewObject("ТаблицаЗначений");
ТЗ = Запрос.Выполнить().Выгрузить();
Иначе
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("Номенклатура");
ТЗ.Колонки.Добавить("Цена");
ТЗ.Колонки.Добавить("Процент");
ТЗ.Колонки.Добавить("СтавкаНДС");
КонецЕсли;
Проблема именно с номенклатурой или массивом номенклатуры, если их задать в качестве параметра - запрос возвращает пустые цены, если не же не задавать этот параметр вообще, то запрос возвращает правильные данные.
В консоли запросов той самой внешней базы всё отрабатывается без проблем.
В чём может быть сбой?
Ответ:
Попробуйте через ВремТабл сделать. Создайте таблицу значений с колонками соотв. типа, заполните её, подтяните в запрос, и потом наложите обор соединением внутренним.
Вопрос: Com соединение из файловой базы к файловой
Доброе утро. Есть файловая база 8.3, из нее по comсоединению пытаюсь подключиться к другой файловой базе:
Каталог = "C:\Users\1C\Документооборот (тест)";
Пользователь = "Администратор";
Пароль = "";
ПараметрыПодключения = "File="+Каталог+";Usr="+Пользователь+";Pwd="+Пароль+";";
V83 = Новый COMОбъект("V83.COMConnector");
Попытка
Соединение = V83.Connect(ПараметрыПодключения);
Исключение
Сообщить("Не удалось соединится с документооборотом!");
КонецПопытки;
Вызывается исключение, без описания ошибки.
Обе базы принудительно запускаются в 8.3. Каталог и пользователь - указаны верно. В чем может быть причина?
Ответ:
Пишу строку кода V82 = Новый COMОбъект("V83
.COMConnector"); а остальной код как ниже, без изменений.
Когда версии у платформ источника и приёмника различные, возникает ошибка.
Не понятно какой версии регистрировать библиотеку и где её регистрировать?
Думаю нужно регистрировать библиотеку, версии 8.2.18.61, и делаю это через bat-файл
Где регистрировать библиотеку, на клиенте, на сервере 8.2., на сервере 8.3 ? рис.ниже. (для клиент-серверного варианта, и для файлового варианта базы 1С)
Ответ:
Появилась задача через вебсервис сделать общение с одним терминалом. База - нууу допустим легкая ут. Тоже 0.5 или быстрее?
сложно сказать - у меня мало данных. Нас и 0,5 сек порадовали и минус ненужный клиент 1с на сторонней машине, минус синхронизация версий библиотек после обновления движка 1с, минус проклятые богом comsafearray, нормальные имена и типы полей... Думал нас с другой стороны (система которая интегрируется с 1С) "не поймут" когда выяснится, что надо переписывать вызовы 1С у себя на новую "модель общения систем". Но попробовав раз в тестовой базе одну функцию теперь нас теребят "давайте скорее на сервис переходить".
Вопрос: Как использовать ТипСодержит для объектов Com?
Если Реквизит.Тип.СодержитТип(Тип("СправочникСсылка.Номенклатура")) Тогда
ЕстьНоменклатура = Истина;
КонецЕсли;
"Реквизит" получен из com-соединения с другой базой 1с. Вываливается при сравнении ошибка:
{ВнешняяОбработка.ПересчетКоэффициента.Форма.Форма.Форма(183)}: Ошибка при вызове метода контекста (СодержитТип)
Если Реквизит.Тип.СодержитТип(Тип("СправочникСсылка.Номенклатура")) Тогда
по причине:
Произошла исключительная ситуация (1C:Enterprise 8.3.8.1964): Несоответствие типов (параметр номер "1")
Я так подозреваю надо сравнивать с типом в соm? Как правильно проверить тип?
Ответ:
Не не катит. Решил вопрос так:
В базе приемнике в общем модуле с галкой внешнее соединение код:
Функция ПроверитьТипРеквизита(Реквизит, Тип) Экспорт
Возврат Реквизит.Тип.СодержитТип(Тип(Тип));
КонецФункции
В базе из которой подключаюсь вызываю процедуру через Com: