|   |   | 
| 
 | Аналог типа данных 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 | 
 | |||
| 10
    
        H A D G E H O G s 15.04.20✎ 13:17 | 
        Скинь файлик с шаблоном, можно прямо на liveups@yandex.ru     | |||
| 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) Делал через ж..., потому что надо читать документацию. Собственно, как обычно.
 
 | |||
| 16
    
        dezss 15.04.20✎ 17:23 | 
        (15) Ты создал массив из 2-х элементов (нумерация же с 0 вроде должна быть).
 Потом пихаешь в 1, 2 и 3 элемент массива (2 и 3 вроде даже нет) значения. Ну как-то не очень выглядит))) | |||
| 17
    
        nikitaz 15.04.20✎ 17:37 | 
        (16) Спасибо! Переделал. Уже легче, но к элементам нельзя обратиться вот так просто, насколько я понимаю.
 
Вот ошибка: {ВнешняяОбработка.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) Эт понятно. Главное сдвинуть с места паровоз этот. Дальше легче ))     | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |