8.х Еще раз про OLE и 1С7.7

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

  1. TopicStarter Overlay
    Amber
    Offline

    Amber Опытный в 1С

    Регистрация:
    16 ноя 2007
    Сообщения:
    98
    Симпатии:
    0
    Баллы:
    26
    Требуется из 7,7 из справочника "Карты доступа", перенести в 8.1 в справочник "Карты", некоторые реквезиты, в частности "Идентификатор" и "Привязка".
    Делаю так:
    Код:
    БазаОле= Новый ComОбъект("V77.Application");
    ......
    Если БазаОле.Initialize(БазаОле.RMTrade, СтрокаПараметров, "NO_SPLASH_SHOW");
    
    
    К базе 7.7 подключение происходит поэтому первый этап описан только ключевыми моментами.Далее делю так:
    Код:
    Спр=Справочники.Карты;
    СпрОле = БазаОле.CreateObject("Справочник.КартыДоступа");
    ЗапросЗагр = В7.CreateObject("Запрос");
    ТекстЗапроса = 
    "//{{ЗАПРОС(Сформировать)
    |Спр = Справочник.Карты;
    |Влад = Справочник.Карты.Привязка;
    |Штрих = Справочник.Карты.Идентификатор;
    |Группировка Спр упорядочить по Спр.Номер;
    |"//}}ЗАПРОС
    ;
    Пока ЗапросЗагр.Группировка("Спр")=1 Цикл
    //НовыйОбъект=Справочники.Карты.СоздатьЭлемент();
    //НовыйОбъект.ШтрихКод=Прав(13,Запрос.Штрих)
    Вл=ЗапросЗагр.Влад;
    ШтрихК=ЗапросЗагр.Штрих;
    Сообщить(Вл+" *** "+Прав(ШтрихК,13));
    КонецЦикла;
    
    
    Что я делаю не так?Возможно есть более эффективное(или простое, скорость в данном случае не важна обсолютно!) решение задачи? Всем заранее спасибо!
  2. Эмин
    Offline

    Эмин Руководитель проектов

    Регистрация:
    25 май 2007
    Сообщения:
    1.178
    Симпатии:
    1
    Баллы:
    26
    Попробуйте не запросом, а через Выбрать(), я в 7.7 в принципе запросы терпеть не могу, соответственно всегда лениво с ними разбираться.

    Попробуйте
    Код:
    ТЗ = Новый ТаблицаЗначений();
    
    // Здесь вы формируете структуру ТЗ с вашими колонками,
    //соответственно реквизитам
    //ТЗ.Колонки.Добавить()
    
    СпрОле .ВыбратьЭлементы();
    Пока СпрОле.ПолучитьЭлемент() =  1 Цикл
    // Здесь заполняем ТЗ
    Стр = ТЗ.Добавить();
    // Естесственно тут надо под ваши данные сделать 
    Стр.* = СпрОле.*; 
    КонецЦикла;
    
    
    
    Да, и учтите, что некоторые ваши реквизиты надо переводить в строковое представление и искать соответствующие данные по наименованию в справочниках 8, в случае если ваши реквизиты и так строки или числа - все должно работать как надо. Посмотрите в отладчике чему у вас равен на каждом шаге цикла СпрОле.
  3. TopicStarter Overlay
    Amber
    Offline

    Amber Опытный в 1С

    Регистрация:
    16 ноя 2007
    Сообщения:
    98
    Симпатии:
    0
    Баллы:
    26
    Так теперь следующий вопрос: В 7.7 у справочника "КартыДоступа", есть реквизиты "Привязка" и "ШтрихКод". Их то я и переношу в 8.1 в справочник "Карты" в реквизиты "Наиминование" и "ШтрихКод".
    Как правильно обратиться к реквизитам справочника в 77?
    Я делаю вот так:
    Код:
    СпрОле = БазаОле.CreateObject("Справочник.КартыДоступа");
    НовыйОбъект=Справочники.Карты.СоздатьЭлемент();
    СпрОле.ИспользоватьРодителя("Клиенты"); 
    СпрОле.ВыбратьЭлементы();
    Пока СпрОле.ПолучитьЭлемент() Цикл
    Сообщить(СпрОле.Привязка);
    КонецЦикла; 
    
    
    8.1 выдает "СОМОбъект"...а если обращаюсь
    Код:
    Сообщить(СпрОле.Привязка.Наименование);
    
    
    ТО выдается ошибка-
    Подскажите пожалуйста как правильно! Еще раз зарание спасибо!
  4. Эмин
    Offline

    Эмин Руководитель проектов

    Регистрация:
    25 май 2007
    Сообщения:
    1.178
    Симпатии:
    1
    Баллы:
    26
    Привязка - это разве какой-то справочник?
    Скорее всего надо Строка(СпрОле.Привязка), попробуйте такой код в отладчике проверить.
  5. TopicStarter Overlay
    Amber
    Offline

    Amber Опытный в 1С

    Регистрация:
    16 ноя 2007
    Сообщения:
    98
    Симпатии:
    0
    Баллы:
    26
    И еще один вопрос. Как правильно организовать выбырку из группы(Справочник содержит в себе группы- Клинты,Сотрудники..)
    я делаю так-
    Код:
    Спр=Справочники.Карты;
    СпрОле = БазаОле.CreateObject("Справочник.КартыДоступа");
    прОле.ИспользоватьРодителя("Клиенты"); 
    СпрОле.ВыбратьЭлементы();
    Пока СпрОле.ПолучитьЭлемент() Цикл
    Сообщить(СпрОле.Привязка);
    КонецЦикла; 
    
    

    Привязка- это реквизит справочника "КартыДоступа". Как правильно получить текстовое значение данного реквезита?
  6. Эмин
    Offline

    Эмин Руководитель проектов

    Регистрация:
    25 май 2007
    Сообщения:
    1.178
    Симпатии:
    1
    Баллы:
    26
    Какой тип значения у реквизита "Привязка" - это строка или другой справочник или число? В случае другого справочника - придется думать как его получить (если наименования нет), в случае строки или числа - сделать соответственно конвертацию (Строка(*), Число(*), СокрЛП(*)).

    Если вы хотите иерархию перетащить, то, кстати, тут у вас ошибка наверное и была.

    При обходе справочника циклом - делайте проверку на ЭтоГруппа - точно в 7.7 посмотрите как определить является ли элемент группой. У Группы, как я понимаю ни привязки ни чего-то другого нет. Но группу так же можно перенести в 8-ку, синхронизировав по наименованию, например.
  7. TopicStarter Overlay
    Amber
    Offline

    Amber Опытный в 1С

    Регистрация:
    16 ноя 2007
    Сообщения:
    98
    Симпатии:
    0
    Баллы:
    26
    Тип данных -Справочник...Ссылается на справочник "Клиенты". Что подскажите?
  8. Эмин
    Offline

    Эмин Руководитель проектов

    Регистрация:
    25 май 2007
    Сообщения:
    1.178
    Симпатии:
    1
    Баллы:
    26
    У справочника Клиенты должен быть реквизит Код или Наименование, вобщем какой-то способ идентифицировать этого клиента, чтобы найти такого же в 8-ке. Думаю, что наименование отлично пойдет.

    Но не забудьте - нужно сделать проверку на группу, иначе так и будет вылетать с ошибкой. У группового элемента скорее всего привязок нет.
  9. TopicStarter Overlay
    Amber
    Offline

    Amber Опытный в 1С

    Регистрация:
    16 ноя 2007
    Сообщения:
    98
    Симпатии:
    0
    Баллы:
    26
    Теперь вот такой вопрос.
    при вот таком обращении-
    Код:
    Сообщить(СпрОле.Наименование);
    
    
    Я получаю значения наименований...а при таком обращении
    Код:
    Сообщить(СпрОле.Идентификатор);
    
    
    я получаю-
    В чем ошибка? Идинтификато- реквизит справочника, тип- строка.
  10. Эмин
    Offline

    Эмин Руководитель проектов

    Регистрация:
    25 май 2007
    Сообщения:
    1.178
    Симпатии:
    1
    Баллы:
    26
    Идентификатор может быть периодический реквизит? Вы в отладчике посмотрите чему он равен, мне кажется, что все не совсем так, как вы описываете. Кроме того Идентификатор может быть предопределенный какой-нибудь атрибут, а вы его сверху взяли и переназначили, или это в 8-ке важное ключевое слово, тогда попробуйте через
    Код:
    СпрОле.Получить("Идентификатор")
    
    
  11. TopicStarter Overlay
    Amber
    Offline

    Amber Опытный в 1С

    Регистрация:
    16 ноя 2007
    Сообщения:
    98
    Симпатии:
    0
    Баллы:
    26
    Поменял в 7.7 Идентификатор на Номер и все заработало. Спасибо за помощь!
  12. TopicStarter Overlay
    Amber
    Offline

    Amber Опытный в 1С

    Регистрация:
    16 ноя 2007
    Сообщения:
    98
    Симпатии:
    0
    Баллы:
    26
    Продолжаем тему. К сожеланию так и не разобраслся вот с каким вопросом.
    В базе 77 у справочеика КартыДоступа есть реквизит "привязка"..с типом данных "Справочник" и ссылающимся на справочник клиенты...Как мне получить значение этого реквизита. Как я понимаю эо делается методом НайтиПоНаименованию() в справочники клиенты..Вопрос в том как получить это наименование из реквизита "привязка". Посоветуйте как правильно это слелать. заранее спасибо!
  13. tirk
    Offline

    tirk Опытный в 1С

    Регистрация:
    1 сен 2008
    Сообщения:
    1.142
    Симпатии:
    0
    Баллы:
    26
    попробуй так
    Приходник.ПолучитьАтрибут("СтавкаНДС").Идентификатор()

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