8.х Записать из одной ИБ в другую

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

  1. TopicStarter Overlay
    Korolev
    Offline

    Korolev Опытный в 1С

    Регистрация:
    20 апр 2010
    Сообщения:
    269
    Симпатии:
    0
    Баллы:
    26
    Доброе утро!

    В общем суть в том, чтобы записать часть информации (а именно адреса) из одной ИБ в другую.
    С подобным столкнулся впервые, поэтому пока не могу разобраться.

    Код:
    Процедура КнопкаВыполнитьНажатие(Кнопка)
    
    COMСоединитель = Новый  COMObject("V81.COMConnector");
    COMСоединение = COMСоединитель.Connect("File=""C:\Documents and Settings\ib""; Usr=""Бухгалтер"";");
    
    ТекстЗапроса = "ВЫБРАТЬ
    |	КонтактнаяИнформация.Объект.Код КАК Код,
    |	КонтактнаяИнформация.Тип,
    |	КонтактнаяИнформация.Вид,
    |	КонтактнаяИнформация.Представление КАК Представление,
    |	КонтактнаяИнформация.Поле1 КАК Поле1,
    |	КонтактнаяИнформация.Поле2 КАК Поле2,
    |	КонтактнаяИнформация.Поле3 КАК Поле3,
    |	КонтактнаяИнформация.Поле4 КАК Поле4,
    |	КонтактнаяИнформация.Поле5 КАК Поле5,
    |	КонтактнаяИнформация.Поле6 КАК Поле6,
    |	КонтактнаяИнформация.Поле7 КАК Поле7,
    |	КонтактнаяИнформация.Поле8 КАК Поле8,
    |	КонтактнаяИнформация.Поле9 КАК Поле9,
    |	КонтактнаяИнформация.Поле10 КАК Поле10,
    |	КонтактнаяИнформация.ТипДома КАК ТипДома,
    |	КонтактнаяИнформация.ТипКорпуса КАК ТипКорпуса,
    |	КонтактнаяИнформация.ТипКвартиры КАК ТипКвартиры
    |ИЗ
    |	РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
    |ГДЕ
    |	КонтактнаяИнформация.Тип <> NULL
    |	И КонтактнаяИнформация.Вид <> NULL";
    
    Запрос = COMСоединение.NewObject("Запрос", ТекстЗапроса);
    Выборка = Запрос.Выполнить().Выгрузить();
    
    Для Каждого ТекущаяСтрока из Выборка Цикл
    Запрос1 = Новый Запрос;
    Запрос1.Текст = "ВЫБРАТЬ
    |	КонтактнаяИнформация.Объект.Код КАК Код,
    |	КонтактнаяИнформация.Тип,
    |	КонтактнаяИнформация.Вид,
    |	КонтактнаяИнформация.Тип,
    |	КонтактнаяИнформация.Вид,
    |	КонтактнаяИнформация.Представление КАК Представление,
    |	КонтактнаяИнформация.Поле1 КАК Поле1,
    |	КонтактнаяИнформация.Поле2 КАК Поле2,
    |	КонтактнаяИнформация.Поле3 КАК Поле3,
    |	КонтактнаяИнформация.Поле4 КАК Поле4,
    |	КонтактнаяИнформация.Поле5 КАК Поле5,
    |	КонтактнаяИнформация.Поле6 КАК Поле6,
    |	КонтактнаяИнформация.Поле7 КАК Поле7,
    |	КонтактнаяИнформация.Поле8 КАК Поле8,
    |	КонтактнаяИнформация.Поле9 КАК Поле9,
    |	КонтактнаяИнформация.Поле10 КАК Поле10,
    |	КонтактнаяИнформация.ТипДома КАК ТипДома,
    |	КонтактнаяИнформация.ТипКорпуса КАК ТипКорпуса,
    |	КонтактнаяИнформация.ТипКвартиры КАК ТипКвартиры
    |ИЗ
    |	РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация";
    Выборка2 = Запрос1.Выполнить().Выбрать();
    Пока Выборка2.Следующий() Цикл
    Если НЕ ЗначениеЗаполнено(Выборка2.Представление) тогда
    Если Выборка2.Код = ТекущаяСтрока.Код тогда
    Запись = РегистрыСведений.КонтактнаяИнформация.СоздатьМенеджерЗаписи();
    Запись.Представление = Выборка.Представление;
    Запись.Поле1 = Выборка.Поле1;
    Запись.Поле2 = Выборка.Поле2;
    Запись.Поле3 = Выборка.Поле3;
    Запись.Поле4 = Выборка.Поле4;
    Запись.Поле5 = Выборка.Поле5;
    Запись.Поле6 = Выборка.Поле6;
    Запись.Поле7 = Выборка.Поле7;
    Запись.Поле8 = Выборка.Поле8;
    Запись.Поле9 = Выборка.Поле9;
    Запись.Поле10 = Выборка.Поле10;
    Запись.ТипДома = Выборка.ТипДома;
    Запись.ТипКорпуса = Выборка.ТипКорпуса;
    Запись.ТипКвартиры = Выборка.ТипКвартиры;
    Запись.Записать();
    КонецЕсли;
    КонецЕсли;
    КонецЦикла;
    КонецЦикла;	
    КонецПроцедуры
    
    
    Делаю внешнюю обработку и привязываю процедуру к кнопке "Выполнить".
    Не уверен что он так что-то сможет записать, но проблема пока не в этом.
    Ставлю точка останова на
    Код:
    	Для Каждого ТекущаяСтрока из Выборка Цикл
    
    и вижу, что попадая на это место, после указатель не заходит в цикл, а прыгает на конец процедуры.
    По идее, "Выгрузить" - создает ТЗ, которой является Выборка..

    Суть в том, что не могу понять что ему мешает зайти в цикл.

    p.s. запрос в цикле - плохо, это я помню, но пока по-другому не получается. :unsure:
  2. TopicStarter Overlay
    Korolev
    Offline

    Korolev Опытный в 1С

    Регистрация:
    20 апр 2010
    Сообщения:
    269
    Симпатии:
    0
    Баллы:
    26
    Не могу отредактировать первый пост:
    Конфиг: "Управление торговлей", редакция 10.3 (10.3.11.4)
  3. shurikvz
    Offline

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

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Ну первое самое вероятное предположение - потому что результат запроса пустой. Вставьте текст запроса в консоль запросов и посмотрите не пустая ли выборка получается.
  4. shurikvz
    Offline

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

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    О, только заметил:
    Код:
        "|    КонтактнаяИнформация.Тип  NULL
    |    И КонтактнаяИнформация.Вид  NULL"
    
    
    это у вас что такое?
    Код:
    НЕ (КонтактнаяИнформация.Тип  ЕСТЬ NULL)
    
    
    надо писать так. Используйте конструктор запросов.

    И они не будут никогда NULL! Это лишние условия! посмотрите на регистр сведений - на них стоит запрет незаполненых значений!
  5. TopicStarter Overlay
    Korolev
    Offline

    Korolev Опытный в 1С

    Регистрация:
    20 апр 2010
    Сообщения:
    269
    Симпатии:
    0
    Баллы:
    26
    Дада, спасибо, я это тоже убрал, но все равно выборка пустая. Просто вчера вечером с этим уже разбирался, и выборка была заполнена. Забыл что исправлял, но удаление этих условий не приводит к должному результату (заходу в цикл).
  6. shurikvz
    Offline

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

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Не понял.. :) Так в итоге у вас выборка сейчас заполнена или нет? Вставьте после
    Код:
    Выборка = Запрос.Выполнить().Выгрузить();
    
    Код:
    Сообщить(Выборка.Количество());
    
  7. Stack_G
    Offline

    Stack_G Опытный в 1С

    Регистрация:
    10 дек 2007
    Сообщения:
    786
    Симпатии:
    2
    Баллы:
    26
    (1) Запрос в цикле... нехорошо :)
  8. TopicStarter Overlay
    Korolev
    Offline

    Korolev Опытный в 1С

    Регистрация:
    20 апр 2010
    Сообщения:
    269
    Симпатии:
    0
    Баллы:
    26
    shurikvz, так, извините. Сам себя запутал. В общем Вы верно заметили, этот NULL мешал. Вчера как раз его удалял тоже, с утра видимо не проснулся еще. Выборка заполнена. :unsure:

    Теперь вот как раз суть проблемы в том, чтобы данные из базы "\ib" закинуть с базу, где будет проходить обработка.

    Закидываются адреса в : Справочники > Контрагенты > Контрагенты > "Контрагент1" > Контакты.

    Там есть колонки: Тип, Вид, Представление. Именно представление не заполнено и его нужно заполнить. (Думаю Поле1, Поле2 и т.п. тоже нужны для корректного переноса).

    Спасибо, но это я помню еще со слов Draco :))

    Вложения:

  9. shurikvz
    Offline

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

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

    Т.е. на данный момент - первый запрос у вас написан, он работает, выборка заполнена, так?
    В цикл теперь входит? В каком месте проблема?

    Далее - в принципе запрос в цикле вам не нужен. Используйте сразу Менеджер записи, зачем вы из базы получателя выбираете эти записи, что это вам дает? Отбирайте сразу в менеджере. Кроме того - вы синхронизируете только по коду, а почему не учитываете тип и вид контактной информации - у вас же в итоге хз что получится.
    Кроме того вы записываете неправильно. :)
    Вот вам пример из хелпа.
    Обратите внимание на Курс.Прочитать();. Нужно спозиционировать менеджер регистра сведений перед тем как попытаетесь писать, иначе при отсутствие отбора у вас перезапишутся все данные в регистре.
  10. TopicStarter Overlay
    Korolev
    Offline

    Korolev Опытный в 1С

    Регистрация:
    20 апр 2010
    Сообщения:
    269
    Симпатии:
    0
    Баллы:
    26
    Сейчас при одинаковых кодах заходит в цикл, но вылетает после :
    Код:
                    Если Выборка2.Код = ТекущаяСтрока.Код тогда
    [b]    Запись = РегистрыСведений.КонтактнаяИнформация.СоздатьМенеджерЗаписи();[/b]
    Запись.Поле1 = Выборка.Поле1;
    
    
    У меня есть условие что работать нужно только с теми контактами, где представление пустое:
    Код:
    Если НЕ ЗначениеЗаполнено(Выборка2.Представление) тогда
    
    
    Не смотря на это условие, данные всё равно все перезапишутся?

    На данный момент вылетает с цикла после создания менеджера записи. Т.Е. Он получает данные с базы "\ib", находит одинаковые коды, но вылетает с цикла после строки с созданием менеджера.

    Извините, если не понятно объясняю)
  11. shurikvz
    Offline

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

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    это же у вас не отбор менеджера записи, а просто условие.

    А на счет вылета - не знаю. Вынесите
    Код:
    Запись = РегистрыСведений.КонтактнаяИнформация.СоздатьМенеджерЗаписи();
    
    вообще за все циклы. Зачем вы в цикле каждый раз его создаете?
  12. TopicStarter Overlay
    Korolev
    Offline

    Korolev Опытный в 1С

    Регистрация:
    20 апр 2010
    Сообщения:
    269
    Симпатии:
    0
    Баллы:
    26
    Сделал вот так:
    Код:
        
    ...
    Запрос = COMСоединение.NewObject("Запрос", ТекстЗапроса);
    Выборка = Запрос.Выполнить().Выгрузить();
    
    Запись = РегистрыСведений.КонтактнаяИнформация.СоздатьМенеджерЗаписи();
    Запись.Прочитать();
    Для Каждого ТекущаяСтрока из Выборка Цикл
    Если НЕ ЗначениеЗаполнено(Запись.Представление) тогда
    Если (Запись.Код = ТекущаяСтрока.Код) И (Запись.Тип = ТекущаяСтрока.Тип) И (Запись.Вид = ТекущаяСтрока.Вид) тогда    
    Запись.Поле1 = Выборка.Поле1;
    Запись.Поле2 = Выборка.Поле2;
    Запись.Поле3 = Выборка.Поле3;
    Запись.Поле4 = Выборка.Поле4;
    Запись.Поле5 = Выборка.Поле5;
    Запись.Поле6 = Выборка.Поле6;
    Запись.Поле7 = Выборка.Поле7;
    Запись.Поле8 = Выборка.Поле8;
    Запись.Поле9 = Выборка.Поле9;
    Запись.Поле10 = Выборка.Поле10;
    Запись.ТипДома = Выборка.ТипДома;
    Запись.ТипКорпуса = Выборка.ТипКорпуса;
    Запись.ТипКвартиры = Выборка.ТипКвартиры;
    Запись.Представление = Выборка.Представление;
    Запись.Записать();
    КонецЕсли;
    КонецЕсли;
    КонецЦикла;    
    
    
    
    
    
    Вылетает ошибка:
    Как правильно его (поле объекта) определить для записи (без запроса как было)?:)
  13. TopicStarter Overlay
    Korolev
    Offline

    Korolev Опытный в 1С

    Регистрация:
    20 апр 2010
    Сообщения:
    269
    Симпатии:
    0
    Баллы:
    26
    Как я понял, Запись.Прочитать() - позволяет нам передать какую информацию мы хотим использовать. Но вот как правильно передать (точнее что указать до этой строки) пока не могу разобраться.
  14. shurikvz
    Offline

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

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    А что у вас такое "Запись.Код"? :)
    Тут сложность может быть, но попробуйте: (Запись.Объект.Код = ТекущаяСтрока.Код)

    Нет.. :) Вы неправильно написали, так работать не будет. Прочитать - именно делает то как называется, читает текущую запись по установленным значениям измерений. При этом.. ммм.. ну как бы внутренний указатель позиционируется на этой записи.
  15. TopicStarter Overlay
    Korolev
    Offline

    Korolev Опытный в 1С

    Регистрация:
    20 апр 2010
    Сообщения:
    269
    Симпатии:
    0
    Баллы:
    26
    В общем с Объектом вылетает тоже самое :unsure:
  16. shurikvz
    Offline

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

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Код:
    Запись = РегистрыСведений.КонтактнаяИнформация.СоздатьМенеджерЗаписи();
    Для Каждого ТекущаяСтрока из Выборка Цикл
    Запись.Объект.Код = ТекущаяСтрока.Код;
    Запись.Тип = ТекущаяСтрока.Тип;
    Запись.Вид = ТекущаяСтрока.Вид;
    Запись.Прочитать();
    Если НЕ Запись.Выбран() ИЛИ НЕ ЗначениеЗаполнено(Запись.Представление) Тогда
    Запись.Объект.Код = ТекущаяСтрока.Код;
    Запись.Тип = ТекущаяСтрока.Тип;
    Запись.Вид = ТекущаяСтрока.Вид;
    Запись.Поле1 = Выборка.Поле1;
    Запись.Поле2 = Выборка.Поле2;
    Запись.Поле3 = Выборка.Поле3;
    Запись.Поле4 = Выборка.Поле4;
    Запись.Поле5 = Выборка.Поле5;
    Запись.Поле6 = Выборка.Поле6;
    Запись.Поле7 = Выборка.Поле7;
    Запись.Поле8 = Выборка.Поле8;
    Запись.Поле9 = Выборка.Поле9;
    Запись.Поле10 = Выборка.Поле10;
    Запись.ТипДома = Выборка.ТипДома;
    Запись.ТипКорпуса = Выборка.ТипКорпуса;
    Запись.ТипКвартиры = Выборка.ТипКвартиры;
    Запись.Представление = Выборка.Представление;
    Запись.Записать();
    КонецЕсли;
    КонецЦикла;
    
    Надо как-то так (писал прям здесь так что скорее всего с ошибками), НО так работать не будет. Надо все таки заполнять не Объект.Код, а Объект. Надо подумать.
  17. TopicStarter Overlay
    Korolev
    Offline

    Korolev Опытный в 1С

    Регистрация:
    20 апр 2010
    Сообщения:
    269
    Симпатии:
    0
    Баллы:
    26
    Спасибо, но все равно он ругается :(
    ох уж этот код)

    Вот когда выдергиваешь его через запрос, то получается:
    Код:
     "ВЫБРАТЬ
    |    КонтактнаяИнформация.Объект.Код
    |ИЗ
    |    РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация"
    
    
    
    Может какой-то подвох в том, что Запись у нас это РегистрЫ, а здесь он через Регистр?:)

    Просто через тот же запрос думаю мне бы было понятней, но многие говорят что делать запрос в цикле это плохо, а сейчас наконец-то мне объясняют как уйти от запроса в цикле, поэтом извините если туплю х)
  18. shurikvz
    Offline

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

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    ООО.. нефига у вас не выйдет.. :)
    Какой же нафиг Код в запросе? Измерение Объект ведь имеет составной тип данных!!! Т.е. у вас в запросе туда может попасть элементы с нескольких справочников, а в выборке то они под кодом под одним будут. Как же вы при загрузке хотите разобрать какая контактная информация к какому объекту относилась? Вам полюбому в запросе Объект нужен.

    Ну я же сразу написал, что работать не будет.
  19. TopicStarter Overlay
    Korolev
    Offline

    Korolev Опытный в 1С

    Регистрация:
    20 апр 2010
    Сообщения:
    269
    Симпатии:
    0
    Баллы:
    26
    Ясно, благодарю за ответы, буду разбираться.
  20. shurikvz
    Offline

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

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Вобщем надо в запросе оставить объект, а не объект код.
    Далее:
    Код:
    Запись = РегистрыСведений.КонтактнаяИнформация.СоздатьМенеджерЗаписи();
    Для Каждого ТекущаяСтрока из Выборка Цикл
    НужныйСправочник = Метаданные.Справочники.Найти(Выборка.Объект.Метаданные().Имя);
    НайденныйЭлемент = НужныйСправочник.НайтиПоКоду(Выборка.Код);
    Если НайденныйЭлемент <> Неопределено Тогда
    Запись.Объект = НайденныйЭлемент;
    Запись.Тип = ТекущаяСтрока.Тип;
    Запись.Вид = ТекущаяСтрока.Вид;
    Запись.Прочитать();
    Если НЕ Запись.Выбран() ИЛИ НЕ ЗначениеЗаполнено(Запись.Представление) Тогда
    Запись.Объект = НайденныйЭлемент;
    Запись.Тип = ТекущаяСтрока.Тип;
    Запись.Вид = ТекущаяСтрока.Вид;
    Запись.Поле1 = Выборка.Поле1;
    Запись.Поле2 = Выборка.Поле2;
    Запись.Поле3 = Выборка.Поле3;
    Запись.Поле4 = Выборка.Поле4;
    Запись.Поле5 = Выборка.Поле5;
    Запись.Поле6 = Выборка.Поле6;
    Запись.Поле7 = Выборка.Поле7;
    Запись.Поле8 = Выборка.Поле8;
    Запись.Поле9 = Выборка.Поле9;
    Запись.Поле10 = Выборка.Поле10;
    Запись.ТипДома = Выборка.ТипДома;
    Запись.ТипКорпуса = Выборка.ТипКорпуса;
    Запись.ТипКвартиры = Выборка.ТипКвартиры;
    Запись.Записать();
    КонецЕсли;
    КонецЕсли;
    КонецЦикла;
    
    
    
    вот как-то так наверное.

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