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

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

  1. TopicStarter Overlay
    Korolev
    Offline

    Korolev Опытный в 1С

    Регистрация:
    20 апр 2010
    Сообщения:
    269
    Симпатии:
    0
    Баллы:
    26
    Я так понимаю, Вы говорите о первом запросе?
    А вот такой вариант не пойдет?:
    Код:
    ...
    |    Контрагенты.Код
    |ИЗ
    |    РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
    |        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты
    |        ПО КонтактнаяИнформация.Объект = Контрагенты.Ссылка";
    </span>
    </FONT></FONT></pre>
  2. shurikvz
    Offline

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

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

    Все зависит от того что вам надо. Если только контактная информация контрагентов, то да, если в запросе выбрать по определенному справочнику, тогда загрузка еще проще. Можно тогда просто поле код оставить.
    Код:
    Для Каждого ТекущаяСтрока из Выборка Цикл
    НайденныйЭлемент = Справочники.Контрагенты.НайтиПоКоду(Выборка.Код);
    Если НайденныйЭлемент <> Неопределено Тогда
    
    Только не чисто так как вы написали, а там условие наверно надо будет добавить, что то типа НЕ (Контрагенты.Код ЕСТЬ NULL).
  3. TopicStarter Overlay
    Korolev
    Offline

    Korolev Опытный в 1С

    Регистрация:
    20 апр 2010
    Сообщения:
    269
    Симпатии:
    0
    Баллы:
    26
    Две одинаковые ИБ. Коды тоже одинаковые. Нужно каждому контрагенту, у кого адрес не записан, добавить этот адрес с другой ИБ.

    Т.е. получается что их проще отследить именно по коду. Мне так кажется..

    К сожалению, на ваш код реакция такая же :(
    В запросе так..
    Код:
    ...
    |	КонтактнаяИнформация.ТипКвартиры КАК ТипКвартиры,
    |	КонтактнаяИнформация.Объект
    |ИЗ
    |	РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация";
    </span>
    </FONT></FONT></pre>
  4. shurikvz
    Offline

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

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Ну да... ну да.. Так, а если вашу таблицу значений убрать, и работать с выборкой? Т.е. Выгрузить() не делайте, а
    Код:
    Выборка = Запрос.Выполнить().Выбрать(); 
    
    Пока Выборка.Следующий() Цикл
    
    и т.д.
    
    
    Там если будет ругаться, попробовать поменять:
    Код:
    НужныйСправочник = Метаданные.Справочники.Найти(Выборка.Объект.Метаданные().Имя);
    НайденныйЭлемент = НужныйСправочник.НайтиПоКоду(Выборка.Код);
    
    
    на
    Код:
    Объект = Выборка.Объект.ПолучитьОбъект();
    НужныйСправочник = Метаданные.Справочники.Найти(Объект.Метаданные().Имя);
    НайденныйЭлемент = НужныйСправочник.НайтиПоКоду(Объект.Код);
    
    
    Ну или свой вариант тоже попробуйте, по конкретному справочнику.. :)
  5. TopicStarter Overlay
    Korolev
    Offline

    Korolev Опытный в 1С

    Регистрация:
    20 апр 2010
    Сообщения:
    269
    Симпатии:
    0
    Баллы:
    26
    В общем пока пробую запрос в цикле, вот к чему пришел
    Код:
    Пока Выборка.Следующий() Цикл
    Запрос1 = Новый Запрос;
    Запрос1.Текст = "ВЫБРАТЬ
    |    КонтактнаяИнформация.Тип,
    |    КонтактнаяИнформация.Вид,
    |    КонтактнаяИнформация.Представление КАК Представление,
    |    КонтактнаяИнформация.Поле1 КАК Поле1,
    |    КонтактнаяИнформация.Поле2 КАК Поле2,
    |    КонтактнаяИнформация.Поле3 КАК Поле3,
    |    КонтактнаяИнформация.Поле4 КАК Поле4,
    |    КонтактнаяИнформация.Поле5 КАК Поле5,
    |    КонтактнаяИнформация.Поле6 КАК Поле6,
    |    КонтактнаяИнформация.Поле7 КАК Поле7,
    |    КонтактнаяИнформация.Поле8 КАК Поле8,
    |    КонтактнаяИнформация.Поле9 КАК Поле9,
    |    КонтактнаяИнформация.Поле10 КАК Поле10,
    |    КонтактнаяИнформация.ТипДома КАК ТипДома,
    |    КонтактнаяИнформация.ТипКорпуса КАК ТипКорпуса,
    |    КонтактнаяИнформация.ТипКвартиры КАК ТипКвартиры,
    |    Контрагенты.Код
    |ИЗ
    |    РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
    |        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты
    |        ПО КонтактнаяИнформация.Объект = Контрагенты.Ссылка
    |ГДЕ
    |    НЕ (Контрагенты.Код ЕСТЬ NULL)";
    
    Выборка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;
    Запись.ТипДома = Выборка.ТипДома;
    Запись.ТипКорпуса = Выборка.ТипКорпуса;
    Запись.ТипКвартиры = Выборка.ТипКвартиры;
    Запись.Представление = Выборка.Представление;
    Запись.Записать();
    КонецЕсли;
    //КонецЕсли;
    КонецЦикла;
    КонецЦикла;    
    
    
    
    Если закомментировать ЗначениеЗаполнено, то попадаем в цикл, и когда доходит до момента Запись.Записать(), вылетает ошибка в конфигураторе:
    В предприятии:
  6. TopicStarter Overlay
    Korolev
    Offline

    Korolev Опытный в 1С

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

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

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    А почему просто Код? Должно быть Выборка.Код, или Объект.Код. А просто Код - это что?
  8. TopicStarter Overlay
    Korolev
    Offline

    Korolev Опытный в 1С

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

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

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Только:
    Код:
    Запись = РегистрыСведений.КонтактнаяИнформация.СоздатьМенеджерЗаписи();
    
    вынесите за цикл.
    И
    Код:
    COMСоединитель = Новый  COMObject("V81.COMConnector");
    COMСоединение = COMСоединитель.Connect("File=""C:\Documents and Settings\ib""; Usr=""Бухгалтер"";");
    
    оберните в Попытка-Исключение.

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