Дерево значений по com

Обмен данными между базами 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»

Источник

Оцените статью