![]() | [1] [2] |
Как через COM-соединение получить значение перечисления? Есть некая 77. Есть УТ 11. Из 77 нужно по КОМ соединиться к УТ и перебрать доки определенного вида. Найти нужные и в 77 породить документы из данных, взятых из УТ. Вот кусок кода: БазаТорговли = СоздатьОбъект("V83.COMConnector"); v8 = БазаТорговли.Connect("Srvr="+ИмяСервера+";Ref="+БазаДанных+";Usr="+Пользователь+";Pwd="+Пароль+""); ЗаявкиУТ = v8.Документы.ЗаказПоставщику; ДокЗаявкаКОМ = ЗаявкиУТ.Выбрать((РабДата-1), (РабДата+1)); //переберём заявки в УТ Пока ДокЗаявкаКОМ.Следующий() = -1 Цикл Контр = ДокЗаявкаКОМ.Контрагент.Наименование; Сообщить(Контр); Отдел = ДокЗаявкаКОМ.ОтделОбработки.Идентификатор(); Сообщить(Отдел); КонецЦикла; Так вот, Контр - наименование контрагента - показывает отлично, а отдел (ОтделОбработки - суть перечисление) возвращать не хочет, пишет: "Поле агрегатного объекта не обнаружено (Идентификатор)" Вопрос: как мне программно вытащить значение реквизита ОтделОбработки? |
а так: Отдел = ДокЗаявкаКОМ.ОтделОбработки.Наименование |
v8.XMLСтрока(ДокЗаявкаКОМ.ОтделОбработки) |
[quote=Trinitron;47777160]а так: Отдел = ДокЗаявкаКОМ.ОтделОбработки.Наименование[/quote] Не, то же самое: Поле агрегатного объекта не обнаружено (Наименование) |
[quote=US1C;47777316]v8.XMLСтрока(ДокЗаявкаКОМ.ОтделОбработки)[/quote] Фууух! Спасибо, заработало! Но, блин, почему так сложно-то? Где логика? Как понять, когда к реквизиту можно обратиться просто, как в случае с контрагентом, а когда через задний проход? |
[quote=ПереходимНа8;47777472]Где логика?[/quote] Как говорил наш старшина, чтобы солдат ни делал, лишь бы за.бался. |
[quote=US1C;47777480]Как говорил наш старшина, чтобы солдат ни делал, лишь бы за.бался.[/quote] Ну так всё-таки: как понять, когда к реквизиту можно обратиться просто, как в случае с контрагентом, а когда через задний проход? |
(6)Понять это не просто, а очень просто. Надо только внимательнее посмотреть на строчку Контр = ДокЗаявкаКОМ.Контрагент.Наименование; Наименование имеет строковый тип. Получать напрямую можно только примитивные типы - строка, число. дата. А все остальное уже с дополнительными упражнениями. И не дай бог, если твое наименование контрагента не является уникальным в базе (или в базах) |
[quote=USSR;47777589]Понять это не просто, а очень просто. Надо только внимательнее посмотреть на строчку Контр = ДокЗаявкаКОМ.Контрагент.Наименование; Наименование имеет строковый тип. Получать напрямую можно только примитивные типы - строка, число. дата. А все остальное уже с дополнительными упражнениями.[/quote] В этой строке: Отдел = ДокЗаявкаКОМ.ОтделОбработки.Наименование тоже наименование, а вот не сработало, как пишет автор |
8-Trinitron >А где ты у перечисления видел свойство "Наименование"? |
[quote=ПереходимНа8;47777545]Ну так всё-таки: как понять, когда к реквизиту можно [/quote] Проверяйте сначала тип значения реквизита, а потом уже получайте его свойства. |
Перечисление не является примитивным типом и нет у него свойства "Наименование", никогда не было и не будет ) |
Про примитивные объекты понял. Спасибо всем, что разъяснили. |
[quote=Billi;47777644] 8-Trinitron >А где ты у перечисления видел свойство "Наименование"? [/quote] [quote=USSR;47778631] Перечисление не является примитивным типом и нет у него свойства "Наименование", никогда не было и не будет ) [/quote] ОК, усвоил |
Во, ещё вопрос: как теперь разорвать КОМ-соединение? Как отключиться? |
[quote=ПереходимНа8;47779854]как теперь разорвать КОМ-соединение? Как отключиться?[/quote] Когда завершится процедура, в которой определена переменная БазаТорговли и эта переменная исчезнет - отключение произойдет автоматически. Или можно принудительно: БазаТорговли = ""; |
[quote=Ткачик;47779895]БазаТорговли = "";[/quote] принято, спасибо. |
в мануалах пишут : БазаТорговли = Неопределено; но и в (15) сойдёт |
[quote=Jimbo;47780174]БазаТорговли = Неопределено;[/quote] в 77 не прокатит. |
[quote=ПереходимНа8;47780440] Цитата: Сообщение от Jimbo БазаТорговли = Неопределено; в 77 не прокатит. [/quote] точно, не сразу понял что из 7 к 8 подключаетесь |
Проблема в том, что по моему начиная с 8.3.14 при соединении из 7.7 процесс остаётся в памяти. На 8.3.12 все чудесно работало. |
[quote=USSR;47780820]Проблема в том, что по моему начиная с 8.3.14 при соединении из 7.7 процесс остаётся в памяти[/quote] Какой? УТшный? А почему? Разве при КОМ-соединении запускается полноценный сеанс УТ? Вроде как при ОЛЕ сеанс создаётся.. Или я не прав? |
[quote=Ткачик;47779895] Или можно принудительно: БазаТорговли = ""; [/quote] Ага,или БазаТорговли = 0; |
Ещё вопрос: теперь понадобилось перебрать в 77 записи регистра сведений. Как к нему подобраться-то? |
(23)Точно также как и из самой 8.3, например: НаборЗаписей = V83.РегистрыСведений.ЦеныНоменклатуры.СоздатьНаборЗаписей(); |
[quote=USSR;47816473]Точно также как и из самой 8.3, например[/quote] понял, спасибо. |
Если обработкой будут пользоваться постоянно, то можно создать общий модуль (например, в расширении) , который будет выполнять действие. А вызывать процедуру из этого модуля и передавать данные по ole из 7.7. Так проще кодить и чем меньше Олька работает тем лучше (ИМХО) |
[quote=Begemot;47817010]Так проще кодить[/quote] Я в этой кухне вызовов 8 из 77 абсолютный профан, так что мне везде кодить непросто. Но совет на заметку возьму, спасибо. А почему, кстати, ОЛЕ? Речь про КОМ.. |
(27)если особых наработок нет, которых жалко терять, то попробуй другой подход с использованием HTTP сервиса. Его реализуешь в 8-ой базе, из 7.7 шлешь запрос с параметрам в JSON, обратно получаешь от 8-ки jSON. Разбираешь его и радуешься жизни. Работает очень быстро. Я так переписал экспорт одиночного документа из 7.7 в 8.3 и сбор банковских выписок из нескольких баз 8.3 в 7.7. И забыл про COM. Единственно, что почему то не всегда с первого раза устанавливается соединение с базой, превышается время ожидания. Причем первый раз может не соединиться, а потом просто летает |
[quote=ПереходимНа8;47817054]ОЛЕ? Речь про КОМ..[/quote]Да без разницы. Тут главное механизм. Просмотрел. Тебе нужно из 8ки в 77 тащить. Тогда проще в обработке кодить. |
Блин.. Всё равно затык ( Вот цикл: НаборЗаписей = V8.РегистрыСведений.ДанныеДляСвязи.СоздатьНаборЗаписей(); НаборЗаписей.Прочитать(); Для Сч = 1 По НаборЗаписей.Количество() Цикл ТекЗапись = НаборЗаписей.ПолучитьЗапись(Сч); Сообщить(ТекЗапись.ШтрихКод); КонецЦикла; Штрихкод - это текстовый ресурс регистра сведений "ДанныеДляСвязи". Как его прочитать, чёрт бы его побрал? |
[quote=Begemot;47817202]Тебе нужно из 8ки в 77 тащить[/quote] я бы рад.. Но вот на данный момент - такая вот идеология. |
[quote=ПереходимНа8;47817281]НаборЗаписей = V8.РегистрыСведений.ДанныеДляСвязи.СоздатьНаборЗап исей(); НаборЗаписей.Прочитать();[/quote] В чем сакральный смысл вот этих строк? |
28-USSR >Работает только если база опубликована на веб ? |
33-Begemot > если сервис опубликован на веб, база не причем. |
[quote=USSR;47817165](27)если особых наработок нет, которых жалко терять, то попробуй другой подход с использованием HTTP сервиса. [/quote] А можешь код для примера выложить, как на стороне 7-ки и 8-ки это работает? |
[quote=Uho;47817418]В чем сакральный смысл вот этих строк?[/quote] сакрального - никакого. А так - хочу записи из РС прочесть. |
[quote=USSR;47817165]запрос с параметрам в JSON[/quote] JSON тоже планируется. Но это следующим этапом. Пока вот так, через КОМ. |
Цикл по записям победил. Спасибо откликнувшимся. |
(35)Могу, пиши почту, скину обработку на 7.7 и расширение на 8.3 |
Текущее время: 00:58. Часовой пояс GMT +3. | [1] [2] |