Имя: Пароль:
1C
1С v8
Аналог типа данных VBA Enum в 1С
0 nikitaz
 
14.04.20
23:29
Добрый день.
В VBA есть тип данных Enum. Например:
Enum SecurityLevel
IllegalEntry = -1
SecurityLevel1 = 0
SecurityLevel2 = 1
End Enum

Какой аналог Enum в 1с? Мне нужна эта информация при работе с COM-объектом CorelDraw, а именно для вызова процедуры COM-объекта, в которой параметры имеют тип Enum.
Просто подставлять числа в качестве параметров не получается - пишет несоответствие типов.
1 080808Ник
 
14.04.20
23:51
(0) так и пишешь:
КомСЭнамом = новый сом объект;
КомСЭнамом.ТвояПроцедура(КомСЭнамом.SecurityLevel2);
2 H A D G E H O G s
 
14.04.20
23:55
"Просто подставлять числа в качестве параметров не получается - пишет несоответствие типов."

получается.
3 nikitaz
 
15.04.20
11:16
(1) Да, спасибо, так и есть.

CorelApp = Новый COMОбъект("CorelDraw.Application");
Сообщить (CorelApp.cdrAlignDistributeH.cdrAlignDistributeHAlignCenter);
cdrAlignDistributeH - это и есть переменная с типом Enum.

(2) Фу, как не красиво.
4 nikitaz
 
15.04.20
11:28
(1) Не, не находит свойство. Это он завис прошлый раз, я думал, что отработал нормально )
Какой вообще правильный путь к этому свойству?
CorelApp.Application.Имя_переменной.Значение_Переменной?
или
CorelApp.Application.Значение_Переменной?


Вот такой это выглядит в VBA
CorelApp.ActiveDocument.Pages(1).Layers(2).Shapes(6).AlignAndDistribute(cdrAlignDistributeHDistributeCenter,cdrAlignDistributeVDistributeCenter,cdrAlignShapesToCenterOfPage)
5 H A D G E H O G s
 
15.04.20
11:36
(4) Посмотри в отладчике VBA, по точке останова значения перечислений в числовом виде и используй их в 1С. Это работает
6 H A D G E H O G s
 
15.04.20
11:37
Ну или
msgbox(cdrAlignDistributeHDistributeCenter)
msgbox(cdrAlignDistributeVDistributeCenter)
msgbox(cdrAlignShapesToCenterOfPage)
7 nikitaz
 
15.04.20
12:17
(5) Я понимаю, о чем Вы говорите. Я документацию посмотрел по Корелу.

Syntax:
Enum cdrAlignDistributeH

Name     Value     Description
cdrAlignDistributeHNone     0     Specifies no horizontal alignment and distribution
cdrAlignDistributeHAlignRight     1     Specifies right alignment
cdrAlignDistributeHAlignLeft     2     Specifies left alignment

Но при вызове из 1с процедуры с указанием числовых параметров, например вот так, как ниже, возвращается ошибка "Несоответствие типов".

shp.AlignAndDistribute (0, 1, 3)

Проблема, видимо, в том, что в 1с нету типа числа integer. А процедура требует тип Integer. Как привести к этому типу в 1с - ума не приложу. Поэтому решил поискать путь к самой константе. Но пока безуспешно.
8 H A D G E H O G s
 
15.04.20
12:46
(7) Покажите весь код
9 nikitaz
 
15.04.20
13:09

    CorelApp = Новый COMОбъект("CorelDraw.Application");
    CorelApp.Application.CreateDocumentFromTemplate (Справочники.ПутиКИнформацииНаСервере.ШаблонЭскиза.ПолныйПуть);
    Сообщить (CorelApp.Application.ActiveDocument.Name);

    CorelApp.Application.Visible = True;
    Для каждого pg Из CorelApp.Application.ActiveDocument.Pages Цикл
    
        Сообщить (pg.Name);
        
        Для каждого lyr Из pg.Layers Цикл
        
            Сообщить (" - " + lyr.Name);
            
            Для каждого shp Из lyr.Shapes Цикл
            
                Сообщить (" -- " + shp.Name);
                
                Если shp.Name = "Название наряда" Тогда
                    
                           shp.Text.Frame.Range.Text = "146-8. КАКОЙ_ТО НАРЯД";
                        shp.AlignAndDistribute (3,0,2)
                            
                КонецЕсли;    
                
            КонецЦикла;
        
        КонецЦикла;
        
    КонецЦикла;
10 H A D G E H O G s
 
15.04.20
13:17
Скинь файлик с шаблоном, можно прямо на [email protected]
11 Serginio1
 
15.04.20
14:14
Вообщето есть Новый COMSafeArray(<ТипЭлемента>, <<разм0>,...,<размN-1>>)
Параметры:
<ТипЭлемента> (обязательный)
Тип: Строка.
Определяет тип элемента COMSafeArray.
Тип элемента задается строкой и может принимать одно из следующих значений:
VT_I4 - знаковое целое 4 байта;

Можно создать 1 элемент и засунуть в него значение. Но ввообще то enum в сом это отдельный тип
12 nikitaz
 
15.04.20
16:50
(11) Сейчас попробую через COMSafeArray.

Вот у меня вопрос основной - как достучаться до переменной типа Enum в COM объекте? Не могу я до нее добраться никак.

Вот так пробовал:

CorelApp.Application.Имя_Переменной.Значение_Переменной
CorelApp.Имя_Переменной.Значение_Переменной
CorelApp.Значение_Переменной
CorelApp.Application.Значение_Переменной
13 nikitaz
 
15.04.20
17:02
(11) На скорую руку через SafeArray не вышло. Есть есть возможность - напишите, пожалуйста, пример для моего случая.

Мне нужно в метод AlignAndDistribute передать из 1с три значения Integer. Т.е. shp.AlignAndDistribute (0, 1, 3)

Т.е. создание массива, добавление трех элементов 0, 1, 3 и передача значений в метод AlignAndDistribute
14 dezss
 
15.04.20
17:10
(13) Показывай как делал.
15 nikitaz
 
15.04.20
17:14
(14) Делал через ж..., потому что надо читать документацию. Собственно, как обычно.


Массив = Новый COMSafeArray("VT_I4", 2);
Массив.SetValue(1, 3);
Массив.SetValue(2, 0);
                        Массив.SetValue(3, 2);
                        
shp.AlignAndDistribute (Массив[0],Массив[1],Массив[2])
16 dezss
 
15.04.20
17:23
(15) Ты создал массив из 2-х элементов (нумерация же с 0 вроде должна быть).
Потом пихаешь в 1, 2 и 3 элемент массива (2 и 3 вроде даже нет) значения.
Ну как-то не очень выглядит)))
17 nikitaz
 
15.04.20
17:37
(16) Спасибо! Переделал. Уже легче, но к элементам нельзя обратиться вот так просто, насколько я понимаю.


Массив = Новый COMSafeArray("VT_I4", 3);
Массив.SetValue(0, 3);
Массив.SetValue(1, 0);
Массив.SetValue(2, 2);

shp.AlignAndDistribute (Массив[0],Массив[1],Массив[2])


Вот ошибка:

{ВнешняяОбработка.CorelTest.Форма.Форма.Форма(31)}: Получение элемента по индексу для значения не определено
                        shp.AlignAndDistribute (Массив[0],Массив[1],Массив[2])
18 v77
 
15.04.20
17:47
(0) Да ну нафиг. Всю жизнь числами передавали
19 nikitaz
 
15.04.20
17:50
(18) Excel.Application принимает числа из 1с, CorelDraw.Application - нет.
20 nikitaz
 
15.04.20
17:58
Вот текст ошибки дословно:

{ВнешняяОбработка.CorelTest.Форма.Форма.Форма(31)}: Ошибка при вызове метода контекста (AlignAndDistribute)
                        shp.AlignAndDistribute (3,0,2)
по причине:
Типы не совпадают (3)
21 v77
 
15.04.20
17:59
(19) Да прям
22 nikitaz
 
15.04.20
18:03
Самое идиотское, что в VBA вот этот код отрабатывает без ошибок

CorelApp.ActiveDocument.Pages(1).Layers(3).Shapes(8).AlignAndDistribute 3, 0, 2
23 v77
 
15.04.20
18:15
А если так :)

shp.AlignAndDistribute (Цел(3),Цел(0),Цел(2))
24 nikitaz
 
15.04.20
18:25
(23) Пробовал уже

{ВнешняяОбработка.CorelTest.Форма.Форма.Форма(31)}: Ошибка при вызове метода контекста (AlignAndDistribute)
                        shp.AlignAndDistribute (Цел(3),Цел(0),Цел(2))
по причине:
Типы не совпадают (3)
25 v77
 
15.04.20
19:02
Щас проверил. 1С передает тип vt_i4
26 v77
 
15.04.20
19:08
В справке Corel для C++ и C# стоит int
всё должно работать
27 nikitaz
 
15.04.20
19:11
(25) А как проверили? Научите, плиз.

Вот именно, что должно работать... Но выдает ошибку.
Причем вот это, например, отрабатывает нормально:
CorelApp.Application.CreateDocumentFromTemplate (Справочники.ПутиКИнформацииНаСервере.ШаблонЭскиза.ПолныйПуть)
Справочники.ПутиКИнформацииНаСервере.ШаблонЭскиза.ПолныйПуть - строка.

Вот ссылка на этот метод AlignAndDistribute

https://community.coreldraw.com/sdk/api/draw/20/m/shape.alignanddistribute
28 Serginio1
 
15.04.20
19:29
shp.AlignAndDistribute (Массив.GetValue(0),Массив.GetValue(1),Массив.GetValue(2))
По умолчанию в 1С вроде как VT_I4
ну и понятие Integer это знаковое попробуй
VT_I1 - знаковое целое 1 байт;
VT_I2 - знаковое целое 2 байта;
VT_I4 - знаковое целое 4 байта;
VT_I8 - знаковое целое 8 байт;
VT_INT - знаковое целое;
VT_UI1 - беззнаковое целое 1 байт;
VT_UI2 - беззнаковое целое 2 байта;
VT_UI4 - беззнаковое целое 4 байта;
VT_UI8 - беззнаковое целое 8 байт;
VT_UINT - беззнаковое целое;
29 v77
 
15.04.20
19:35
(28) А чо толку. 1С прочитает из массива в свое значение и отправит в AlignAndDistribute как VT_I4
30 v77
 
15.04.20
19:35
Хотя щас попробую
31 Serginio1
 
15.04.20
19:35
https://en.wikipedia.org/wiki/Enumerated_type#Visual_Basic/VBA
Enumerated datatypes in Visual Basic (up to version 6) and VBA are automatically assigned the "Long" datatype and also become a datatype themselves:

Попробуй VT_I8 VT_INT
32 Serginio1
 
15.04.20
19:37
Проще тогда написать на бейсике дллку или другом языке и дернуть через Ком
33 v77
 
15.04.20
19:45
Да не в бабине дело
34 v77
 
15.04.20
19:47
Фокус с массивом не прокатывает кстати
35 v77
 
15.04.20
19:54
А попробуй shp.AlignAndDistribute(3,3,2)
36 Serginio1
 
15.04.20
20:03
Работа 1С в внешними COM-объектами
Смотри другой аналог либо пиши на васике дллку
37 H A D G E H O G s
 
15.04.20
20:10
Киньте пример, где не нужен какой то файл или с файлом
38 nikitaz
 
15.04.20
20:37
(35) Попробовал. Та же ошибка.
{ВнешняяОбработка.CorelTest.Форма.Форма.Форма(33)}: Ошибка при вызове метода контекста (AlignAndDistribute)
                        shp.AlignAndDistribute(3,3,2)
по причине:
Типы не совпадают (3)


(36) Ссылка битая.

(37) Я сбросил кореловский файл на почту выше. Могу сбросить обработку. Но, в принципе, код я написал выше полностью.


Мужики, это смешно, но вот этот метод работает. shp перемещается на экране куда нужно, ошибок нет.
shp.SetPosition (10,30)
39 Serginio1
 
15.04.20
21:17
Работа 1С в внешними COM-объектами там почему то склеилась ссылка
Суть в том, что с типами в 1С беда, а в VBA  конвертация типов которая должна быть автоматом
То есть нужно искать аналог этой функции с простыми типами
40 nikitaz
 
15.04.20
21:34
(39) Спасибо!
Как минимум радует, что это не только я индеец, но 1с тоже
41 nikitaz
 
15.04.20
21:44
Но все-таки может как-то можно добраться до этих Enum констант через точку?
42 v77
 
15.04.20
23:59
Короче, раскопал я. Enum тут вабще не причем. Параметры по умолчанию в OLE Corel не работают. Нужно передавать все параметры и всё будет работать. Если в параметрах структуры, то создавать структуры методами типа Application.CreateStructPaletteOptions()
Application.CreateStructCreateOptions()
и т.д.
43 v77
 
16.04.20
00:18
так вот попробуй

AlignAndDistribute(3,0,2,0,Ложь,2,0,0,Неопределено)
44 v77
 
16.04.20
10:24
Автор, ты бы хоть доложил о результатах и спасибу сказал. Полдня на тебя убили вчера и ни ответа ни привета.
45 nikitaz
 
16.04.20
12:42
(44) Спасибо огромное за помощь! Только добрался до компа обратно.
К сожалению, имеем вот такое

{ВнешняяОбработка.CorelTest.Форма.Форма.Форма(33)}: Ошибка при вызове метода контекста (AlignAndDistribute)
                        shp.AlignAndDistribute(3,0,2,0,Ложь,2,0,0,Неопределено)
по причине:
Типы не совпадают (0)

Попробовал Неопределено поменять на 0 (так как последний параметр, если копнуть глубже, заканчивается типом Real), не вышло

{ВнешняяОбработка.CorelTest.Форма.Форма.Форма(33)}: Ошибка при вызове метода контекста (AlignAndDistribute)
                        shp.AlignAndDistribute(3,0,2,0,Ложь,2,0,0,0)
по причине:
Типы не совпадают (0)

Логику я понял. Сейчас погоняю с разными параметрами, отпишусь.
46 nikitaz
 
16.04.20
12:45
{ВнешняяОбработка.CorelTest.Форма.Форма.Форма(33)}: Ошибка при вызове метода контекста (AlignAndDistribute)
                        shp.AlignAndDistribute(3,1,2,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1)
по причине:
Типы не совпадают (9)
47 nikitaz
 
16.04.20
12:46
{ВнешняяОбработка.CorelTest.Форма.Форма.Форма(33)}: Ошибка при вызове метода контекста (AlignAndDistribute)
                        shp.AlignAndDistribute(3,1,2,1,1)
по причине:
Типы не совпадают (5)
48 nikitaz
 
16.04.20
12:47
{ВнешняяОбработка.CorelTest.Форма.Форма.Форма(33)}: Ошибка при вызове метода контекста (AlignAndDistribute)
                        shp.AlignAndDistribute(3)
по причине:
Неверное число параметров
49 nikitaz
 
16.04.20
12:48
{ВнешняяОбработка.CorelTest.Форма.Форма.Форма(33)}: Ошибка при вызове метода контекста (AlignAndDistribute)
                        shp.AlignAndDistribute(3,0,2,0,Ложь,2,0,0,Неопределено,1)
по причине:
Типы не совпадают (1)
50 v77
 
16.04.20
12:58
да шош такоя
51 v77
 
16.04.20
13:04
А так

AlignAndDistribute(3,0,2,0,Ложь,2,0,0,NULL)
52 v77
 
16.04.20
13:35
Короче, ему нужно в последний параметр засунуть вместо Неопределено Rect
Application.CreateRect(0,0,0,0)
или пустой IDispatch

и будет работать
53 v77
 
16.04.20
13:36
Как в 1с создать пустой IDispatch я не знаю
54 nikitaz
 
16.04.20
13:37
{ВнешняяОбработка.CorelTest.Форма.Форма.Форма(33)}: Ошибка при вызове метода контекста (AlignAndDistribute)
                        shp.AlignAndDistribute(3,0,2,0,Ложь,2,0,0,NULL)
по причине:
Типы не совпадают (0)
55 nikitaz
 
16.04.20
13:38
Стоп, есть идея. Последний параметр - это класс. Сейчас создам класс и передам этой скотине
56 nikitaz
 
16.04.20
13:40
Отработало!!!!

v77, спасибо громадное за помощь!

RectClass = Новый COMОбъект("CorelDraw.Rect");
shp.AlignAndDistribute(3,0,2,0,Ложь,2,0,0,RectClass)
57 v77
 
16.04.20
13:52
(56) только в цикле не надо такое делать :)
58 Serginio1
 
16.04.20
13:57
NULL это DBNull, аналог null это неопределено
59 v77
 
16.04.20
13:58
(58) мы в курсе. просто методом тыка тыкали
60 v77
 
16.04.20
13:59
Там надо именно IDispatch подсунуть
61 nikitaz
 
16.04.20
14:25
(57) Эт понятно. Главное сдвинуть с места паровоз этот. Дальше легче ))
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.