- Обмен данными между базами 1С через COM соединение
- Com соединение
- Установить OLE соединение
- Установить COM соединение
- Строка подключения
- Разрыв соединения
- Метод NewObject()
- Получение и сравнение перечисления через COM соединение
- Получение объекта через COM по идентификатору
- Поделиться ссылкой:
- Как выгрузить результаты запроса по COM-соединению в дерево значений в 1С 8.3?
- Как выгрузить результаты запроса по COM-соединению в дерево значений в 1С 8.3? #796916
- Похожие вопросы 1С
- В этой группе 1С
Обмен данными между базами 1С через COM соединение
Один из вариантов обмена данными между базами 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");
Строка подключения
//Для варианта клиент- сервер СтрокаСоединения = "Srvr = ""ИмяСервера"";Ref = ""ИмяБазы""; Usr = ИмяПользователя; Pwd = Пароль"; //Для варианта файлового режима: СтрокаСоединения = "File = ""ПутьКБазе""; Usr = ИмяПользователя; Pwd = Пароль"; Попытка Подключение = Соединение.Connect(СтрокаСоединения); Исключение Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Не удалось подключиться к базе" + ОписаниеОшибки(); Сообщение.Сообщить(); КонецПопытки;
Разрыв соединения
Для объекта V83.Application выполнять разрыв соединения обязательно, в противном случае останется висеть незавершенный сеанс, который потом придется удалять вручную. В случае с V83.COMConnector соединение разрывается автоматически при завершении процедуры в которой выполнялось подключение.И есть еще один маленький момент. Для пользователя под которым выполняется подключение должен быть отключен флажок «Запрашивать подтверждение при закрытии программы» в его настройках.
Метод NewObject()
Для создания нового объекта можно воспользоваться методом NewObject(), например:
// для V83.COMConnector Подключение = Соединение.Connect(СтрокаСоединения); ЗапросCOM = Подключение.NewObject("Запрос"); ТаблицаCOM = Подключение.NewObject("ТаблицаЗначений"); МассивCOM = Подключение.NewObject("Массив"); УидCOM =Подключение.NewObject("УникальныйИдентификатор",СтрокаУИД); //для V83.Application Соединение = Новый COMОбъект("V83.COMConnector"); ЗапросOLE = Соединение.NewObject("Запрос"); ТаблицаOLE = Соединение.NewObject("ТаблицаЗначений"); МассивOLE = Соединение.NewObject("Массив"); УидCOM =Соединение.NewObject("УникальныйИдентификатор",СтрокаУИД);
После создания Com объекта можно далее работать с ним, например
ЗапросCOM.Текст ="ВЫБРАТЬ | ДолжностиОрганизаций.Код, | ДолжностиОрганизаций.Наименование |ИЗ | Справочник.ДолжностиОрганизаций КАК ДолжностиОрганизаций"; Результат = ЗапросCOM.Выполнить(); Выборка = Результат.Выбрать(); Пока Выборка.Следующий() Цикл // . КонецЦикла;
Можно также использовать менеджеры объектов конфигурации:
СправочникCOM = Подключение.Справочники.ИмяСправочника; ДокументCOM = Подключение.Документы.ИмяДокумента; РегистрCOM = Подключение.РегистрыСведений.ИмяРегистра;
Получение и сравнение перечисления через COM соединение
Для сравнения значений элементов перечислений, определенных в конфигурации, необходимо выполнить преобразование этих элементов к одному из примитивных типов, сравнение которых не вызывает трудности. Такими типами могут быть либо числовой, либо строковый тип. Преобразовать значение элемента перечисления к числовому типу можно так
ЭлементПеречисления = Подключение.Справочники.Справочник1.НайтиПоКоду(1).Реквизит1; ВозможныеЗначения = ЭлементПеречисления.Метаданные().ЗначенияПеречисления; НомерЭлементаПеречисления = ВозможныеЗначения.Индекс(ВозможныеЗначения.Найти(Соединение.XMLString(ЭлементПеречисления))); Если НомерЭлементаПеречисления = 0 Тогда Сообщить("ЗначениеПеречисления1"); ИначеЕсли НомерЭлементаПеречисления = 1 Тогда Сообщить("ЗначениеПеречисления2"); КонецЕсли;
Получение объекта через COM по идентификатору
Через менеджеры объектов конфигурации получаем com объект, например :
ДокументCOM = Соединение.Документы.ИмяДокумента;
Затем получаем строку уникального идентификатора :
СтрокаУИД=Соединение.string(ДокументCOM.УникальныйИдентификатор());
Затем в базе данных можно найти по ссылке нужный документ, таким образом:
Идентификатор= Новый УникальныйИдентификатор(СтрокаУИД); СсылкаПоИдентификатору = Документы[ИмяДокумента].ПолучитьСсылку(Идентификатор);
Если нужно найти com объект по идентификатору, то тогда нужно написать так:
УидCOM = Соединение.NewObject("УникальныйИдентификатор",СтрокаУИД); СсылкаПоИдентификатору = Соединение.Документы[ИмяДокумента].ПолучитьСсылку(УидCOM);
Поделиться ссылкой:
Источник
Как выгрузить результаты запроса по COM-соединению в дерево значений в 1С 8.3?
Всем привет и с наступающим праздником!
Прошу помощи у специалистов, т.к. сам зашел в тупик.
Задача: получить содержимое справочника у удаленной базе по COM-соединению и вывести на управляемую форму в дерево значений. Я делаю вот так:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
УдаленнаяБаза = ВнешниеСоединения.ПолучитьПодключениеКСервернойБД();
Запрос = УдаленнаяБаза.NewObject(«Запрос»);
Запрос.Текст =
«ВЫБРАТЬ
| Автомобили.Наименование КАК Наименование,
| Автомобили.Код КАК Код
|ИЗ
| Справочник.Автомобили КАК Автомобили
|
|УПОРЯДОЧИТЬ ПО
| Автомобили.Ссылка ИЕРАРХИЯ УБЫВ»;
КонецПроцедуры
Но на шаге ЗначениеВРеквизитФормы(Дерево, “Автомобили”); 1С ругается: Ошибка при вызове метода контекста (ЗначениеВРеквизитФормы)
ЗначениеВРеквизитФормы(Дерево, «Автомобили»);
по причине:
Недопустимое значение параметра (параметр номер ‘2’)
Если все то же самое делать локально, то данные из запроса попадают в форму без проблем. В чем может быть проблема?
(0) В чем может быть проблема?
И еще: если убрать УдаленнаяБаза.ОбходРезультатаЗапроса.ПоГруппировкамСИерархией и выгружать в таблицу значений, а на форме реквизит Автомобили сделать таблицей, все выгружается отлично. С теми же колонками, что и в дереве.
(2) Дерево — это дерево другой базы. Поэтому напрямую ЗначениеВРеквизитФормы(Дерево не прокатит.
Надо самому в цикле обходить это дерево и каждую строчку переписывать в автомобили.
Ссылку, то в другую базу передать проблематично. Если только не перепаковывать каждую ссылку Через ЗначениеВстрокуВнутр. Например задав это в функции представления.
А так то дерево в строку или в файл в одной базе засунуо, а в другой базе вынул из строки из файла.
И будет счастье
(5)
Ну вот смотрите, код с перебором
&НаСервере
Процедура ПолучитьНаСервере()
Время1 = Формат(ТекущаяДата(), «ДФ=mm:ss»);
ДеревоАвтомобили = Новый ДеревоЗначений;
ДеревоАвтомобили.Колонки.Добавить(«Наименование»);
ДеревоАвтомобили.Колонки.Добавить(«Код»);
Запрос = Новый Запрос;
Запрос.Текст = «ВЫБРАТЬ
| Автомобили.Ссылка КАК Ссылка,
| Автомобили.Код КАК Код,
| Автомобили.Наименование КАК Наименование,
| Автомобили.Родитель.Наименование КАК НаименованиеРодителя,
| Автомобили.Родитель.Код КАК КодРодителя
|ИЗ
| Справочник.Автомобили КАК Автомобили
|
|УПОРЯДОЧИТЬ ПО
| Автомобили.Ссылка ИЕРАРХИЯ,
| Автомобили.Наименование»;
Выборка = РезультатЗапроса.Выбрать();
Время2 = Формат(ТекущаяДата(), «ДФ=mm:ss»);
Пока Выборка.Следующий() Цикл
Если НЕ Выборка.Ссылка.Родитель.ЭтоГруппа Тогда
НоваяСтрока = ДеревоАвтомобили.Строки.Добавить();
НоваяСтрока.Наименование = Выборка.Наименование;
НоваяСтрока.Код = Выборка.Код;
Иначе
СтрокаПоиска = ДеревоАвтомобили.Строки.Найти(Выборка.КодРодителя, «Код», Истина);
НоваяСтрока = СтрокаПоиска.Строки.Добавить();
НоваяСтрока.Наименование = Выборка.Наименование;
НоваяСтрока.Код = Выборка.Код;
КонецЕсли;
КонецЦикла;
Время3 = Формат(ТекущаяДата(), «ДФ=mm:ss»);
ЗначениеВРеквизитФормы(ДеревоАвтомобили, «Автомобили»);
Время4 = Формат(ТекущаяДата(), «ДФ=mm:ss»);
Сообщить(«Время1 » + Время1);
Сообщить(«Время2 » + Время2);
Сообщить(«Время3 » + Время3);
Сообщить(«Время4 » + Время4);
КонецПроцедуры
Для удаленной базы меняется только строка:
Время1 25:36
Время2 25:36
Время3 26:02
Время4 26:02
Время1 39:30
Время2 39:30
Время3 39:39
Время4 39:39
Если НЕ Выборка.Ссылка.Родитель.ЭтоГруппа Тогда
в запросе это сделайте. Выигрыш по времени в 100 раз.
СтрокаПоиска = ДеревоАвтомобили.Строки.Найти(Выборка.КодРодителя, «Код», Истина);
«ВЫБРАТЬ
| Автомобили.Наименование КАК Наименование,
.
| Автомобили.Родитель.ЭтоГруппа КАК РодительЭтоГруппа
|ИЗ
| Справочник.Автомобили КАК Автомобили
|ИТОГИ ПО Иерархия
тогда в выборке будет дерево
(11) Ах, Вы об этом… Запрос я подкорректировал, вместо 30 секунд стало 20.
А вот насчет “тогда в выборке будет дерево” — будет. Только дерево не вставляется в форму, что собственно и побудило меня написать этот пост, почитайте (0). Проблема до сих пор не решена.
(13)
Ну как же нет, а вот это:
Но на шаге ЗначениеВРеквизитФормы(Дерево, “Автомобили”); 1С ругается: Ошибка при вызове метода контекста (ЗначениеВРеквизитФормы)
ЗначениеВРеквизитФормы(Дерево, «Автомобили»);
по причине:
Недопустимое значение параметра (параметр номер ‘2’) ?
(14) ну ты там хочешь com-объекты впихнуть в реквизит формы. Это дебилизм согласись. Надо просто создать дерево в это базе, и построчно переписать из того дерева в это дерево.
(16) не получается рекурсивно обойти дерево и передать его в другое дерево. Пожалуйста, покажите как это можно сделать.
Источник
Как выгрузить результаты запроса по COM-соединению в дерево значений в 1С 8.3? #796916
Всем привет и с наступающим праздником! Прошу помощи у специалистов, т.к. сам зашел в тупик. Задача: получить содержимое справочника у удаленной базе по COM-соединению и вывести на управляемую форму в дерево значений. Я делаю вот так: КонецПроцедуры Но на шаге ЗначениеВРеквизитФормы(Дерево, “Автомобили”); 1С ругается: Ошибка при вызове метода контекста (ЗначениеВРеквизитФормы) ЗначениеВРеквизитФормы(Дерево, «Автомобили»); по причине: Недопустимое значение параметра (параметр номер ‘2’) Если все то же самое делать локально, то данные из запроса попадают в форму без проблем. В чем может быть проблема?
И еще: если убрать УдаленнаяБаза.ОбходРезультатаЗапроса.ПоГруппировкамСИерархией и выгружать в таблицу значений, а на форме реквизит Автомобили сделать таблицей, все выгружается отлично. С теми же колонками, что и в дереве.
Дерево — это дерево другой базы. Поэтому напрямую ЗначениеВРеквизитФормы(Дерево не прокатит. Надо самому в цикле обходить это дерево и каждую строчку переписывать в автомобили.
Ссылку, то в другую базу передать проблематично. Если только не перепаковывать каждую ссылку Через ЗначениеВстрокуВнутр. Например задав это в функции представления. А так то дерево в строку или в файл в одной базе засунуо, а в другой базе вынул из строки из файла. И будет счастье
Ах, Вы об этом… Запрос я подкорректировал, вместо 30 секунд стало 20. А вот насчет “тогда в выборке будет дерево” — будет. Только дерево не вставляется в форму, что собственно и побудило меня написать этот пост, почитайте . Проблема до сих пор не решена.
Ну как же нет, а вот это: Но на шаге ЗначениеВРеквизитФормы(Дерево, “Автомобили”); 1С ругается: Ошибка при вызове метода контекста (ЗначениеВРеквизитФормы) ЗначениеВРеквизитФормы(Дерево, «Автомобили»); по причине: Недопустимое значение параметра (параметр номер ‘2’) ?
ну ты там хочешь com-объекты впихнуть в реквизит формы. Это дебилизм согласись. Надо просто создать дерево в это базе, и построчно переписать из того дерева в это дерево.
не получается рекурсивно обойти дерево и передать его в другое дерево. Пожалуйста, покажите как это можно сделать.
Похожие вопросы 1С
В этой группе 1С
- Партии в УТ 11.3
- Эквайринг сбера в 1С
- v7: При интерактивной пометке на удаление документа изменить реквизит документа.
- Выгрузка результата СКД в ТЗ
- Сеанс отсутствует или удален file=src (помогите!)
- УНФ. Запрет смены склада.
- ЗУП 2.5 Выгрузка в Райффайзен банк
- Конвертация данных. Не выгружается независимый регистр сведений.
- Невозможно создание объекта контейнером ActiveX: V81.COMConnector
- Задвоение сумм при группировке в СКД
- АТОЛ 11ф возврат не «день в день»
- Авторизация в 1С 8.2 УТ
- Розница Аптека, как быстрей перейти с 1.0 на на 2.2?
- Публикация базы 1С 8.3 на веб-сервере Apache + Linux ( CentOS 7 )
- Управление отборами СКД в параметрах виртуальных таблиц регистров
- Отображение схемы склада и нахождения товаров на плане на смартфоне
- Установка самописной конфигурации у клиента
- Как отловить момент нажатия на кнопку (до отпускания)?
- Реализация списания себестоимости по-среднему в 1С 8.3
- Беда после обновления: ERROR: relation «_reference5091»
Источник