8.х V82.COMConnector как обратиться к свойствам реквизита?

Тема в разделе "Отчеты и обработки для "1С:Предприятие 8"", создана пользователем cvmbackup, 2 май 2012.

  1. TopicStarter Overlay
    cvmbackup
    Offline

    cvmbackup

    Регистрация:
    13 фев 2012
    Сообщения:
    39
    Симпатии:
    0
    Баллы:
    1
    ______________________________________________________________________
    Код в 1С работает

    doc=Документы.ТестовыйДокумент.НайтиПоНомеру("000000001");
    if doc.Метаданные().Реквизиты.Количество() > 0 then
    for doc_rekv_i = 0 to doc.Метаданные().Реквизиты.Количество() - 1 do
    doc_rekv=doc.Метаданные().Реквизиты.Получить(doc_rekv_i);
    znachenie=doc[doc_rekv.имя];
    rekvizit=doc_rekv.Представление();
    Сообщить(rekvizit+" - "+znachenie);
    КонецЦикла;
    КонецЕсли;

    // в сообщении имя и значение реквзита


    ______________________________________________________________________
    Код в delphi

    .. содинились с базой через V82.COMConnector

    var
    doc, doc_rekv: OleVariant;
    doc_rekv_i:Integer;
    rekvizit, znachenie:string;
    ..
    begin
    ..

    doc:=V8Connect.Документы.ТестовыйДокумент.НайтиПоНомеру('000000001');

    if doc.Метаданные().Реквизиты.Количество() > 0 then begin
    for doc_rekv_i := 0 to doc.Метаданные().Реквизиты.Количество() - 1 do begin
    doc_rekv:=doc.Метаданные().Реквизиты.Получить(doc_rekv_i);
    znachenie:=doc[doc_rekv.имя]; //здесь выскакивает ошибка Could not convert variant of type (OleStr) into type (Boolean)
    rekvizit:=doc_rekv.Представление();
    ShowMessage(rekvizit+' - '+znachenie);
    end;
    end;

    ..
    end.

    Весь инет перекопал, не могу найти решение или обходной путь. Помогите плиззз.
  2. TopicStarter Overlay
    cvmbackup
    Offline

    cvmbackup

    Регистрация:
    13 фев 2012
    Сообщения:
    39
    Симпатии:
    0
    Баллы:
    1
    Что никто не знает? Есть тут профессионалы, которые смогут объяснить в чем ошибка?
  3. mialord
    Offline

    mialord Модераторы Команда форума Модератор

    Регистрация:
    31 июл 2009
    Сообщения:
    5.398
    Симпатии:
    40
    Баллы:
    54
    Профессионалов тут нет, только учимся.
    Что сказал отладчик на doc_rekv.имя, какой тип данных содержится
  4. TopicStarter Overlay
    cvmbackup
    Offline

    cvmbackup

    Регистрация:
    13 фев 2012
    Сообщения:
    39
    Симпатии:
    0
    Баллы:
    1
    В том то и дело что delphi не может вытянуть значение в переменную. Не получается произвести конвертацию при выполнении команды. В реквизитах есть как строковые значения так и числовые, на тех и тех выдается та же ошибка. Не могу сообразить от куда там берется тип Boolean? Возможно при обращении к значениям которые заключены в квадратные скобки после объекта, 1С выполняет какую то функцию которая что то проверяет и использует Boolean? Или возврат этой функции значение Boolean?

    Вот "копипаст" ошибки отладчика:
    First chance exception at $7C812AFB. Exception class EVariantTypeCastError with message 'Could not convert variant of type (OleStr) into type (Boolean)'. Process Project1.exe (872)
  5. Tiger86
    Offline

    Tiger86 Модераторы Команда форума Модератор

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    znachenie - вот эта переменная судя по всему типа boolean, проверьте....

    Ошибка то ясно вам дает понять, что не может преобразовать значение в тип Булево
  6. TopicStarter Overlay
    cvmbackup
    Offline

    cvmbackup

    Регистрация:
    13 фев 2012
    Сообщения:
    39
    Симпатии:
    0
    Баллы:
    1
    Есть ли ещё способы вытащить значение из реквизита используя переменную?

    Документ = Документы.ТестовыйДокумент.НайтиПоНомеру("000000001");
    Переменная = Документ.Метаданные().Реквизиты.Получить(1);

    Смысл такой ->
    ЗначениеРеквизита = Документ.Переменная;

    Знаю что неправильно, но как то так.
  7. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Тут дело не в значении переменной doc_rekv.имя, тут дело в делфи. Насколько помню в делфи оператор [] используется для обращения к элементам массива. Когда мы пишем код работы с 1С в среде отличной от 1С, мы ведь используем синтаксис именно того языка, на котором пишем, а не синтаксис 1С. Делфи пытается обратиться к doc как к массиву, да еще и получить элемент этого массива по индексу, который имеет тип строка, а не число (не помню в делфи вообще возможно такое или нет). Отсюда и валится с ошибкой.
  8. TopicStarter Overlay
    cvmbackup
    Offline

    cvmbackup

    Регистрация:
    13 фев 2012
    Сообщения:
    39
    Симпатии:
    0
    Баллы:
    1
    каким образом?
    в первом посту видно в блоке VAR что это znachenie:string;

    Есть ли какой нибудь обходной путь, чтобы заменить эти гребанные квадратные скобки?
  9. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Именно через метаданные - хз. Подумать надо. Суть вы уже вроде правильно поняли: надо избежать обращения через [].

    Через запрос - думаю должно получиться.
  10. TopicStarter Overlay
    cvmbackup
    Offline

    cvmbackup

    Регистрация:
    13 фев 2012
    Сообщения:
    39
    Симпатии:
    0
    Баллы:
    1
    Через запрос не пытался!
    Да и не видел ни разу примеров как использовать конструктор 1С в delphi типа Запрос = Новый Запрос();
    Есть ли пример как использовать конструктор "Новый" ???
  11. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Ну я могу только на c# дать пример. На дэлфи не знаю как будет. В любом случае "Новый" это будет метод "NewObject".
  12. TopicStarter Overlay
    cvmbackup
    Offline

    cvmbackup

    Регистрация:
    13 фев 2012
    Сообщения:
    39
    Симпатии:
    0
    Баллы:
    1
    Типа так Zapros:=V8Connect.NewObject('Запрос'); ?
  13. mialord
    Offline

    mialord Модераторы Команда форума Модератор

    Регистрация:
    31 июл 2009
    Сообщения:
    5.398
    Симпатии:
    40
    Баллы:
    54
    Для создания запроса используется метод NewObject("Запрос")
    Короче, надо встроить проверку перед отправкой сообщения на форуме на наличие новых
  14. TopicStarter Overlay
    cvmbackup
    Offline

    cvmbackup

    Регистрация:
    13 фев 2012
    Сообщения:
    39
    Симпатии:
    0
    Баллы:
    1
    Сделал запросом.
    Как теперь вытащить значение используя переменные, а не жестко привязанные синонимы в запросе?

    zapros:=V8Connect.NewObject('Запрос');
    zapros.Текст :=
    'ВЫБРАТЬ'+
    ' ТестовыйДокумент.ТестовыйРеквизит1 КАК Тестовый,'+
    ' ТестовыйДокумент.ТестовыйРеквизит2,'+
    ' ТестовыйДокумент.ТабличнаяЧасть1.('+
    'Ссылка,'+
    ' НомерСтроки,'+
    ' ТестовыйРеквизитТабл1,'+
    ' ТестовыйРеквизитТабл2)'+
    ' ИЗ'+
    ' Документ.ТестовыйДокумент КАК ТестовыйДокумент';

    rezultat:=zapros.Выполнить();
    viborka := rezultat.Выбрать();

    rekvizit:='Тестовый';
    while viborka.Следующий() do begin
    Memo1.Lines.Add(viborka.rekvizit);
    end;
  15. vartanet
    Offline

    vartanet Опытный в 1С Команда форума

    Регистрация:
    16 ноя 2010
    Сообщения:
    2.698
    Симпатии:
    15
    Баллы:
    29
    непонятен вопрос. если у вас проблемы с использованием русского языка в дельфи, то 1с-ный код можно писать на английском. или "синонимы" в запросе англоязычные сделать.
  16. TopicStarter Overlay
    cvmbackup
    Offline

    cvmbackup

    Регистрация:
    13 фев 2012
    Сообщения:
    39
    Симпатии:
    0
    Баллы:
    1
    Вопрос не в языке написания кода, а в универсальности по отношению к объектам. Т.е. запрос будет производится к любому объекту с любым количеством реквизитов и любыми именами этих реквизитов! Необходимо перебрать все реквизиты и их значения и вывести в MEMO

    Реквизит1 - Значение
    Реквизит2 - Значение
    ...
  17. vartanet
    Offline

    vartanet Опытный в 1С Команда форума

    Регистрация:
    16 ноя 2010
    Сообщения:
    2.698
    Симпатии:
    15
    Баллы:
    29
    для того, чтобы обойти все реквизиты обЪекта не зная их количество и имя, нужно использовать метод обЪекта Метаданные().

    Код:
    Для каждого РеквизитОбъекта Из Реквизит1.Метаданные().Реквизиты Цикл
    
    сообщить(РеквизитОбъекта.Имя);
    
    КонецЦикла;
    чтобы перебрать все обЪекты конфигурации нужно использовать обЪект глобального контекста Метаданные.



    Код:
    Для каждого Справочник Из Метаданные.Справочники Цикл
    
    сообщить(Справочник.Имя);
    
    КонецЦикла;
  18. TopicStarter Overlay
    cvmbackup
    Offline

    cvmbackup

    Регистрация:
    13 фев 2012
    Сообщения:
    39
    Симпатии:
    0
    Баллы:
    1
    сообщить(РеквизитОбъекта.Имя);

    "Имя" - это что? Это жестко привязанное наименование реквизита. А если реквизит называется Имя1?
    Как использовать переменную вместо Имя ???

    сообщить(РеквизитОбъекта.ПЕРЕМЕННАЯ);
  19. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Запрос перепишите в таком виде:

    Таким образом вы получите все поля обЪекта.
    Дальше выгрузите результат запроса в таблицу значений. И работайте уже с таблицой значений.
    У таблицы значений там вроде для всего есть метод Получить(<Индекс>).
    Т.е. наименование полей будете получать через (условно) :
    МояCOMТаблицаЗначений.Колонки.Получить(<Индекс>).Имя;
    А значения полей через
    МояCOMТаблицаЗначений.Получить(0).Получить(<Индекс>);
  20. vartanet
    Offline

    vartanet Опытный в 1С Команда форума

    Регистрация:
    16 ноя 2010
    Сообщения:
    2.698
    Симпатии:
    15
    Баллы:
    29
    поставьте точку останова и поизучайте Метаданные и Метаданные().

Поделиться этой страницей