[РЕШЕНО] Работа с другой конфигурацией через COM. Обработка результата запроса

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем roofless, 12 фев 2015.

  1. TopicStarter Overlay
    roofless
    Offline

    roofless Опытный в 1С

    Регистрация:
    27 июн 2014
    Сообщения:
    260
    Симпатии:
    7
    Баллы:
    29
    приведу фрагмент кода:
    Код:
       
        Запрос = СоединениеС1С.NewObject("Запрос");
        Запрос.Текст = "
        |ВЫБРАТЬ
        |    ЗаказКлиента.Номер,
        |    ЗаказКлиента.Дата,
        |    ЗаказКлиента.Проведен
        |ИЗ
        |    Документ.ЗаказКлиента КАК ЗаказКлиента
        |ГДЕ
        |    ЗаказКлиента.Проведен = &Проведен
        |    И ЗаказКлиента.Дата > &Дата";
       
        Запрос.УстановитьПараметр("Проведен", Истина);
        Запрос.УстановитьПараметр("Дата", ТекущаяДата()-5000000);
       
        ЗаказыСписок = Запрос.Выполнить().Выбрать();
       
        ВсегоСтрок = ЗаказыСписок.Count()-1;
       
        ТаблицаЗаказов = Новый ТаблицаЗначений;
           ТаблицаЗаказов.Колонки.Добавить("НомерДокумента",    Новый ОписаниеТипов("Строка",Новый КвалификаторыСтроки(11)));
           ТаблицаЗаказов.Колонки.Добавить("Дата",            Новый ОписаниеТипов("Дата"));
           ТаблицаЗаказов.Колонки.Добавить("Проведен",        Новый ОписаниеТипов("Булево"));
           
    
           Для НомерСтроки = 1 По ВсегоСтрок Цикл
               Строка = ЗаказыСписок.Get(НомерСтроки);
               НоваяСтрока = ТаблицаЗаказов.Добавить();
               НоваяСтрока.НомерДокумента = Строка.Номер;
               НоваяСтрока.Дата = Строка.Дата;
               НоваяСтрока.Проведен = Строка.Проведен;
           КонецЦикла;
    
    
    где СоединениеС1С - com-объект,
    ЗаказыСписок в отладчике выглядит так:
    заказысписок.JPG
    а ВсегоСтрок=101.

    Имеем ошибку:
    Код:
    {Обработка.ПолучитьДанныеИзИсточника.Форма.Форма.Форма(49)}: Значение не является значением объектного типа (Номер)
               НоваяСтрока.НомерДокумента = Строка.Номер;
    как обрабатывать такой результат запроса?
  2. nomad_irk
    Online

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.576
    Симпатии:
    717
    Баллы:
    204
    Вы пытаетесь обойти выборку как ТЗ, что не есть правильно даже при работе в локальной базе.
    Код:
    Пока ЗаказыСписок.Следующий()(может быть Пока ЗаказыСписок.Next()) Цикл
    ......
    КонецЦикла;
  3. TopicStarter Overlay
    roofless
    Offline

    roofless Опытный в 1С

    Регистрация:
    27 июн 2014
    Сообщения:
    260
    Симпатии:
    7
    Баллы:
    29
    стало лучше, но до номера достучаться не могу
    пробовал и
    Код:
    НоваяСтрока.НомерДокумента = Строка.Number;
    , но всё равно "Значение не является значением объектного типа"
    Строка имеет тип "дата" почему-то
    заказысписок.JPG
  4. shurikvz
    Offline

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

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Ниче не понял.

    Код:
    Пока ЗаказыСписок.Следующий() Цикл
      НоваяСтрока = ТаблицаЗаказов.Добавить();
      НоваяСтрока.НомерДокумента = ЗаказыСписок.Номер;
    КонецЦикла;
    
    roofless нравится это.
  5. nomad_irk
    Online

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.576
    Симпатии:
    717
    Баллы:
    204
    С-П по ВыборкаИзРезультатаЗапроса почитайте.

    Код:
    ТаблицаЗаказов = Новый ТаблицаЗначений;
    ТаблицаЗаказов.Колонки.Добавить("НомерДокумента",    Новый ОписаниеТипов("Строка",Новый КвалификаторыСтроки(11)));
    ТаблицаЗаказов.Колонки.Добавить("Дата",            Новый ОписаниеТипов("Дата"));
    ТаблицаЗаказов.Колонки.Добавить("Проведен",        Новый ОписаниеТипов("Булево"));
    
    Пока ЗаказыСписок.Next() Цикл
           НоваяСтрока = ТаблицаЗаказов.Добавить();
           ЗаполнитьЗначенияСвойств(НоваяСтрока, ЗаказыСписок);
    КонецЦикла;
    
  6. TopicStarter Overlay
    roofless
    Offline

    roofless Опытный в 1С

    Регистрация:
    27 июн 2014
    Сообщения:
    260
    Симпатии:
    7
    Баллы:
    29
    точно. спасибо
    доверился нагугленному куску кода
  7. shurikvz
    Offline

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

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    nomad_irk так не надо. Во-первых у ТС наименование полей запроса не соответствуют наименованиям колонок ТЗ. Это не проблема, но все же. Во-вторых он работает с COM объектом, в данном случает там примитивные типы, оно прокатит, но в общем случае, если не преобразовывать их, то в ТЗ хрень будет.
  8. TopicStarter Overlay
    roofless
    Offline

    roofless Опытный в 1С

    Регистрация:
    27 июн 2014
    Сообщения:
    260
    Симпатии:
    7
    Баллы:
    29
    апнул тему

    подскажите, как достучаться до перечислений в базе-источнике


    Код:
        ТзДокументов = Новый ТаблицаЗначений;
        //запрос к базе-источнику
        ЗапросОЛЕ        = СоединениеС1С.NewObject("Запрос");
        ЗапросОЛЕ.Текст = "ВЫБРАТЬ
        |    ИсходящийОЛЕ.Ссылка КАК Ссылка,
        |    ИсходящийОЛЕ.Дата КАК Дата,
        |   ИсходящийОЛЕ.Номер КАК Номер
        |Из
        |    Документ.ЗаказКлиента КАК ИсходящийОЛЕ
        |ГДЕ ИсходящийОЛЕ.Дата МЕЖДУ &ДатаНач И &ДатаКон
        |    И ИсходящийОЛЕ.Проведен = ИСТИНА";
        ЗапросОЛЕ.УстановитьПараметр("ДатаНач", НачалоГода(ТекущаяДата()));
        ЗапросОЛЕ.УстановитьПараметр("ДатаКон", КонецГода(ТекущаяДата()));
       
        Попытка
            //выполняем запрос
            ТзДокументовОЛЕ = ЗапросОЛЕ.Execute().Unload();
            ЗаказыСписок = ЗапросОЛЕ.Выполнить().Выбрать();
            ВсегоСтрок = ЗаказыСписок.Count();
           
        Исключение
            Сообщить("Ошибка выборки документа в базе 1С "+ " по причине: " + Символы.ПС + ОписаниеОшибки(), СтатусСообщения.Важное);
            Возврат Ложь;
        КонецПопытки;
               
        //обрабатываем результат
        Пока ЗаказыСписок.Следующий() Цикл
           
            ДокументМодуля = ЗаказыСписок.Ссылка.ПолучитьОбъект();
           
            //если документ с таким номером уже загржуался, то удаляем его
            РезультатПоиска = Документы.Заказ.НайтиПоНомеру(ДокументМодуля.Number);
           
            Если НЕ ЗначениеЗаполнено(РезультатПоиска) Тогда
                          Иначе
                РезультатПоиска.ПолучитьОбъект().Удалить();
                           
            КонецЕсли;
           
            //создаем новый документ в модуле
            Док = Документы.Заказ.СоздатьДокумент();
            Док.Номер = ДокументМодуля.Number;
            Док.Дата = ДокументМодуля.Date;
            Док.ДатаОтгрузки = ДокументМодуля.ДатаОтгрузки;
            Док.Контрагент = ДокументМодуля.Контрагент.НаименованиеПолное;
           
            КоличествоПозиций = ДокументМодуля.Товары.Count()-1;
            //перебираем ТЧ документа
            Для НомерСтроки = 0 По КоличествоПозиций Цикл
               
                СписокПозиций = ДокументМодуля.Товары.Get(НомерСтроки);
                ДокСтрока = Док.Товары.Добавить();
                ДокСтрока.Номенклатура = СписокПозиций.Номенклатура.НаименованиеПолное;
                ДокСтрока.Количество = СписокПозиций.Количество;
               
                //пробуем достучаться до перечисления
                Перем1 = СписокПозиций.Номенклатура.СкладКапитан.Метаданные();
                           
               
            КонецЦикла;
           
            Попытка
                //пишем документ
                Док.Записать(РежимЗаписиДокумента.Проведение);
            Исключение
               
                Сообщить("не гуд");
            КонецПопытки;
        КонецЦикла;
    
    хотелось бы получить текущее значение перечисления у данной номенклатуры
    в отладчике видно:
    upload_2015-2-14_9-45-4.png

    вот тут вот видно все значения данного перечисления, но насчет текущего всё равно не понятно
    upload_2015-2-14_9-46-36.png
  9. TopicStarter Overlay
    roofless
    Offline

    roofless Опытный в 1С

    Регистрация:
    27 июн 2014
    Сообщения:
    260
    Симпатии:
    7
    Баллы:
    29
    решено, может кому пригодится.

    получить имя можно только через индекс

    Код:
                //пробуем достучаться до перечисления
                Попытка
                НомерПеречисления = СоединениеС1С.Перечисления.СкладыКапитан.Индекс(СписокПозиций.Номенклатура.СкладКапитан);       
                ИмяПеречисления = СоединениеС1С.Метаданные().Перечисления.СкладыКапитан.EnumValues.Get(НомерПеречисления).Name;
    
                Если ИмяПеречисления="ШтучныйТовар" Тогда
                    ДокСтрока.Склад = Перечисления.Склад.СкладСоленойПродукции
                ИначеЕсли ИмяПеречисления="ХК"
                    Тогда ДокСтрока.Склад = Перечисления.Склад.СкладКопченойПродукции
                ИначеЕсли ИмяПеречисления="СМ"
                    Тогда ДокСтрока.Склад = Перечисления.Склад.СкладСМПродукции
                КонецЕсли;
            Исключение
            КонецПопытки;
Похожие темы
  1. planfin
    Ответов:
    1
    Просмотров:
    511
Загрузка...

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