Вход | Регистрация


1С:Предприятие :: 1С:Предприятие 8 общая

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

Можно ли из другой системы перебрать соответствие и структуру
Я
   Andy_Yuferov
 
30.01.18 - 14:26
Имеется подключение из C# через OLE к базе 8.3, 8.2 как на тонком, так и на толстом клиенте. Подключение получает внешнюю обработку, которая выполняет вычисление и возвращает результат. Результат, естественно, в формате 1С и надо перегнать его. Результат имеет сложную структуру и содержит разные типы 1С: структуры, списки значений, массивы, соответствия, ссылки и прочий треш. В общем основная проблема в том, что нет методов, которые бы дали коллекцию ключей структур и соответствий а по индексу обращение невозможно. Может кто-нибудь знает вариант, как можно перебрать через соединение с 1С соответствие и структуру, или получить коллекцию ключей? Вариант с добавлением в конфигурацию или обработку методов, которые вернут то, что надо сразу забраковали, так как менять тот функционал запрещено. Можно использовать Выполнить и Вычислить. Но как туда верно что-то прописать - ума не приложу. Есть идея насчет перегона значения в строку и брать ключи оттуда, но у соответствия ключом может быть что угодно и этого хотелось бы избежать.
 
 
   Dotoshin
 
1 - 30.01.18 - 14:34
(0) Такой вариант не подойдет?

Внешнее соединение (External connection)
Методы:

NewObject (NewObject)
String (String)

Описание:

В общем и целом работа с 1С:Предприятием 8 через внешнее соединение подобна работе с 1С:Предприятием в режиме Automation сервера. Основные отличия заключаются в следующем:
В случае Automation сервера запускается полноценное приложение 1С:Предприятия 8, а в случае внешнего соединения запускается относительно небольшой внутрипроцессный COM-сервер.
При работе через внешнее соединение не доступны функциональные возможности, так или иначе связанные с организацией пользовательского интерфейса 1С:Предприятия 8;
При работе внешнего соединения не используется модуль управляемого приложения (модуль обычного приложения) конфигурации 1С:Предприятия 8. Его роль при работе с внешним соединением играет модуль внешнего соединения.
При использовании внешнего соединения имеются следующие преимущества по сравнению с использованием Automation сервера:
Более быстрая установка соединения, так как не требуется создания отдельного процесса операционной системы, а все действия производятся в рамках вызывающего процесса;
Более быстрое обращение к свойствам и методам объектов 1C:Предприятия, так как для организации обращения не требуется организации межпроцессной коммуникации;
Меньший расход ресурсов операционной системы.
Для организации доступа к данным 1С:Предприятия 8 через внешнее соединение, выполняется следующая последовательность действий:
создается менеджер COM-соединений, с помощью которого производится установка соединения; 
производится обращение к методу Connect менеджера COM-соединений. Метод Connect возвращает внешнее соединение с информационной базой 1С:Предприятия 8; 
через внешнее соединение производится обращение к допустимым методам, свойствам и объектам информационной базы, с которой установлено соединение.
Важно! В связи с отсутствием пользовательского интерфейса не все объекты, а также свойства и методы можно использовать во внешнем соединении.
Внешнее соединение предоставляет полный доступ к своему глобальному контексту. Поэтому внешнее соединение в качестве своих методов может иметь: системные константы, значения заданных в конфигураторе объектов, доступ к которым осуществляется с помощью менеджеров (например, константы, перечисления, справочники, документы, журналы документов, отчеты, обработки, планы видов характеристик, планы счетов, планы видов расчета, регистры), а также переменные, объявленные в модуле внешнего соединения с ключевым словом Экспорт.

Доступность:

Интеграция.
Пример:

// Создание объекта-коннектора

cntr = Новый COMObject("V82.COMConnector");
// создается объект COM-соединение

connection = cntr.Connect("File=""c:\InfoBases\Trade"";Usr=""Director"";");
СпрКонтрагенты = connection.Справочники.Контрагенты;
Выборка = СпрКонтрагенты.Выбрать();
Пока Выборка.Следующий() Цикл
    Сообщить(Выборка.Наименование);
КонецЦикла;

// Пример на языке MS Visual Basic

Sub Excel_to_trade()
    Dim cntr As Object
    Dim trade As Object
    Dim Товар As Object
    Set cntr = CreateObject("V82.COMConnector")
    Set trade = cntr.Connect("File=""c:\InfoBases\Trade""; Usr=""Director"";")
    Set Товар = trade.Справочники.Товары
    Группа = Товар.СоздатьГруппу()
    Группа.Наименование = "***** Экспорт из Excel ******"
    Группа.Записать()
    N = 100   'Количество строк в документе
    For Count = 1 To N
        Элемент = Товар.СоздатьЭлемент()
        Элемент.Наименование = Application.Cells(Count, 2).Value
        Элемент.Розн_Цена = Application.Cells(Count, 3).Value
        Элемент.Мел_Опт_Цена = Application.Cells(Count, 4).Value
        Элемент.Опт_Цена = Application.Cells(Count, 5).Value
        Элемент.Родитель = Группа.Ссылка
        Элемент.Записать()
    Next Count
End Sub
 

См. также:

Соединение с рабочим процессом, метод Connect
Менеджер COM-соединений, метод Connect
Глобальный контекст, метод ПолучитьСообщенияПользователю
   бомболюк
 
2 - 30.01.18 - 14:34
IEnumVariant
   Andy_Yuferov
 
3 - 30.01.18 - 14:39
(1) Штука в том, что у структур и соответствий нет Следующий(), её нельзя выбрать, нельзя выгрузить. Они перебираются встроенным методом "для каждого", а как вызвать эту конструкцию через соединение я не нашёл. При этом ключей нет, а по индексу получить ключ-значение никак. Хотя метод получения размера есть.
   Волшебник
 
Модератор
4 - 30.01.18 - 14:42
(3) Есть возможность получения по индексу
Структура.Свойство
Соответствие.Получить
   Волшебник
 
Модератор
5 - 30.01.18 - 14:42
(4)* по ключу
   Serg_1960
 
6 - 30.01.18 - 14:44
(0) "Подключение получает внешнюю обработку, которая выполняет вычисление и возвращает результат. Результат, естественно, в формате 1С... Вариант с добавлением в конфигурацию или обработку методов, которые вернут то, что надо сразу забраковали, так как менять тот функционал запрещено." - хмм...

В принципе, результат может быть в любом другом формате представлен несмотря на озвученные ограничения. Пишите свою внешнюю обработку, которая получает результат работы исходной обработки и конвертирует данные в нужный Вам формат.
   Serg_1960
 
7 - 30.01.18 - 14:53
Может быть я сложно сказал? "Подключение получает внешнюю обработку..." - а далее следует ещё одно подключение, но с вызовом уже вашей обработки - конвектором результата предыдущей обработки.
   Andy_Yuferov
 
8 - 30.01.18 - 14:56
(2) Интерфейс даёт возможность написать свой перебор. Я не знаю, как вызвать перебор 1С.
   Andy_Yuferov
 
9 - 30.01.18 - 14:57
(5) Да, а ключи я не знаю. Результат может быть с совсем разнообразными полями.
   Andy_Yuferov
 
10 - 30.01.18 - 14:58
(7) Да нет, всё в принципе понятно. Костыль, конечно. Но на безрыбье и рак рыба. Спасибо за вариант.
 
 Рекламное место пустует
   lodger
 
11 - 30.01.18 - 14:59
(9) зачем вам костыль к костылю для костыля? напишите потребную отбработку в базе получателе с подключением к источнику.
   Andy_Yuferov
 
12 - 30.01.18 - 15:02
(11) Своя специфика. Данные должны попасть не в базу 1С.
   бомболюк
 
13 - 30.01.18 - 15:04
(8) методы интерфейса позволят организовать перебор на стороне C#. Запрашиваешь интерфейс у объекта, используешь методы - только и делов.
   Serg_1960
 
14 - 30.01.18 - 15:11
Кстати, Выполнить() позволяет исполнить произвольные алгоритмы 1С практически без ограничений для целей автора. я не понимаю в чём проблема? Автор не знает языка 1С?
   Dotoshin
 
15 - 30.01.18 - 15:15
(3) В C# нет оператора for each?
   Serg_1960
 
16 - 30.01.18 - 15:25
*(14) У меня, например, через вызов этой функции, пользователи заполняют однотипные спецификации в конфигурации УПП. Изначально обработчики для тиражирования спецификаций пишу я, а потом передаю пользователям для эксплуатации. Они хранятся в базе в виде текста, доступного пользователям для редактирования. Пользователи, по мере возникновения потребности, могут оперативно изменять различные коэффициенты, формулы расчета и сами исходных комплектующие.
   Andy_Yuferov
 
17 - 30.01.18 - 15:30
(14) Я знаю, что позволяет. Но я написал, что не знаю, как через Выполнить вызвать перебор структуры и вернуть, допустим, массив ключей. Чтобы "Выполнить" отработало нормально нужно сперва объявить переменную и в тексте "Выполнить" указать что с ней сделать, а затем вернуть её. Я не могу так сделать через соединение - нужна функция в 1С.
   Andy_Yuferov
 
18 - 30.01.18 - 15:30
(15) Есть, но для его использования C# должен знать, что делать с объектом для его перебора.
   arsik
 
19 - 30.01.18 - 15:33
(18) Создай в 1с функцию. СоответствиевМассив, структуруВМассив.
   arsik
 
20 - 30.01.18 - 15:36
Ну и у структуры и соответствия есть метод Количество().
Потом делаешь перебор по индексам.
   Serg_1960
 
21 - 30.01.18 - 15:38
(17) Зато у Вас есть возможность изменять непосредственно сам исполняемый алгоритм перед вызовом Выполнить(). Принцип тот же самый как, например, в типовых конфигурациях конструируется текст запроса на лету по мере необходимости.
   Dotoshin
 
22 - 30.01.18 - 15:39
(18) Как понять С# должен знать, что делать с объектом?
Для перебора ничо знать не надо. Ты тупо перебираешь элементы коллекции А вот чо делать с этими элементами, наверно зависит от этих элементов...
   Andy_Yuferov
 
23 - 30.01.18 - 15:43
(20) Ну я же сказал, что у структур и соответствий НЕЛЬЗЯ получить элемент по индексу.
(19) И что нельзя менять код в 1С тоже. Только если сделать отдельную обработку, как предложили выше.
   Вафель
 
24 - 30.01.18 - 15:49
В Automation (интерфейс IDispatch) не предусмотрено штатных средств для реализации обращений к элементам массивов по индексам. Предусмотренные в Automation индексированные свойства допускают неоднозначность толкования и не поддерживаются встроенным языком 1С:Предприятия. Это значит, что для коллекций значений, не опознанных 1С:Предприятием как "свои" объекты, невозможно обращение к элементам по индексам из встроенного языка 1С:Предприятия. Однако, многие коллекции, в том числе и коллекции, определенные в 1С:Предприятии, поддерживают специальный интерфейс IEnumVARIANT, позволяющий совершить последовательный обход всех элементов коллекции. Этот механизм используется оператором Для Каждого ..., который имеется во многих языках программирования, в том числе и во встроенном языке 1С:Предприятия. Этот же механизм используется встроенным отладчиком 1С:Предприятия, когда он показывает элементы коллекции.
   Dotoshin
 
25 - 30.01.18 - 15:52
(23)/// Как обойти все элементы структуры в 1с 8.3, 8.2

 
    Для Каждого Элемент Из ТвояСтруктура Цикл
        Сообщить(Элемент.Ключ + " " + Элемент.Значение);
    КонецЦикла;

Напиши то же самое на шарпе. или что-то мешает вместо "Для каждого" написать "foreach" ?
   Скиурус
 
26 - 30.01.18 - 15:54
Ответ дан в (2) но автор видимо и C# так себе знает :(
   Serg_1960
 
27 - 30.01.18 - 15:57
(17) Кажется я понял автора. Выполнить() может писать результат своей работы в объекты базы конфигурации, к которым позже можно будет обратиться через OLE. После этого эти объекты можно удалить(очистить).
   FIXXXL
 
28 - 30.01.18 - 16:01
(27) Вычислить() возвращает результат
   FIXXXL
 
29 - 30.01.18 - 16:03
(28) http://www.1s-portal.ru/index.php/stati/common-questions/9-introduction/111-execute-111.html#h1-vychislit
1.3. Операция конкатенации

загони ключи в строку и алга :)
   Serg_1960
 
30 - 30.01.18 - 16:11
(28) Спасибо, я знаю :) Просто ранее я предложил использовать Выполнить(); автор обратил внимание на проблему с анализом результата; я с упорством, достойным лучшего применения, продолжаю искать варианты обхода ограничения... Я не упрямый - я упорный. Как баран. Не мешайте мне бодаться в ворота :))
   Andy_Yuferov
 
31 - 30.01.18 - 16:31
(28) Я знаю, что она возвращает результат. Вы знаете, как с помощью Вычислить рассчитать функцию, в которую можно передать значение? Без объявления переменных. Я ведь не нахожусь в среде 1С! У меня есть только COM объект результата, который мне нужно преобразовать.
(29) А если ключом будет структура, или массив, или ещё какая-нибудь НЕХ? Соответствие же!
   Andy_Yuferov
 
32 - 30.01.18 - 16:38
(26) Возможно. Иначе бы я не спрашивал. Интерфейс позволяет реализовать Next. Вы знаете, что там должно быть внутри Next? Я - нет, потому и спрашиваю.
   Andy_Yuferov
 
33 - 30.01.18 - 16:40
(24) Спасибо. Я уже копаю в этом направлении.
 
 
   FIXXXL
 
34 - 30.01.18 - 18:24
(31) (32) ТипЗнч() по очевидным НЕХ?
   FIXXXL
 
35 - 30.01.18 - 18:25
(34) +Попытка
   FIXXXL
 
36 - 30.01.18 - 18:26
(30) а если подряд ТРИ Выполнить()?
1. Инициализируем переменные
2. Присваиваем, основной код разбора НЕХ
3. Читаем результат

:)
   FIXXXL
 
37 - 30.01.18 - 18:32
(36) хрен там :(
   Andy_Yuferov
 
38 - 30.01.18 - 19:06
(37) Я так пробовал. Прежде чем на форум писать уж как только не извращался. Думал, может я дурак.
(34) ТипЗнч не работает из другой среды, увы. Является встроенной функцией языка.
   FIXXXL
 
39 - 31.01.18 - 11:33
(38) ну тогда "трехзвенка" через промежуточную обработку разбора 1Сных НЕХ :)


Список тем форума
Рекламное место пустует  Рекламное место пустует
Пользователь не знает, чего он хочет, пока не увидит то, что он получил.
Э. Йодан
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует