8.х ОБМЕН Выгрузка из УТ в БП

Тема в разделе "Обмен данными в "1С:Предприятие 8"", создана пользователем BiTree, 27 окт 2010.

  1. TopicStarter Overlay
    BiTree
    Offline

    BiTree

    Регистрация:
    27 окт 2010
    Сообщения:
    10
    Симпатии:
    0
    Баллы:
    1
    Описание проблемы:
    Имеем две конфигурации:
    1. УТ (немножко дописаная)
    2. БП (типовая)
    3. Нужно выгрузить данные из УТ в БП

    1. В УТ в документе "ОтчетОРозничныхПродажах" в табличной части (ТЧ) добавлен реквизит "Склад"

    [​IMG]

    2. В БП в этом же документе "ОтчетОРозничныхПродажах" в табличной части нет реквизита "Склад" - т.е. все типовое.

    [​IMG]

    Задача:
    Сделать корректный перенос документа "ОтчетОРозничныхПродажах".

    Варианты решения:
    1. С использованием конфигурации "Конвертация данных 2" (КД2) сделать правила и произвести выгрузку.
    2. с помощью обработки с выгрузкой в xml
    3. другие...


    Решение:
    Я пока пробовал сделать с помощью КД2. Я не программист, по-этому и обращаюсь к вам за помощью.

    Умные люди мне подсказали вариант решения на основе КД2:
    Я, как мне кажется, понял почти все, но вот алгоритм из второго пункта, я не могу написать чтобы проверить все ли работает.
    накидал что-то типа такое (черновик):

    Код:
    // Номер документа с которым будем работать
    НомерДокумента = Документы.ОтчетОРозничныхПродажах.Выбрать().Номер;
    // Любое название, которого точно нет.
    Склад = "ххх"; 
    
    // Начинаем обход ТЧ источника
    Для Каждого ТекущаяСтрока Из Документы.ОтчетОРозничныхПродажах.Товары Цикл
    
    // Сравниваем склад из первой строки ТЧ с переменной Склад
    // Если склад уникален, записываем его название в переменную и делаем цикл
    Если НЕ Склад = ТекущаяСтрока.Склад Тогда Склад = ТекущаяСтрока.Склад;
    
    // запросом "пытаемся" получить все строки из ТЧ с этим складом
    Запрос = Новый Запрос;
    Запрос.УстановитьПараметр("Склад", Склад);
    
    Запрос.Текст = "ВЫБРАТЬ
    |	ОтчетОРозничныхПродажахТовары.Склад,
    |	ОтчетОРозничныхПродажахТовары.Номенклатура
    |ИЗ
    |	Документ.ОтчетОРозничныхПродажах.Товары КАК ОтчетОРозничныхПродажахТовары
    |ГДЕ
    |	ОтчетОРозничныхПродажахТовары.Склад = &Склад";
    
    Запрос.УстановитьПараметр("Склад", Склад);
    
    // Теперь имея строки только с нужным складом нужно создать новый
    // документ "ОтчетОРозничныхПродажах" с номером "НомерДокумента+К1"
    // К1 - копия 1 (будет столько сколько складов разных в ТЧ)
    
    // в созданном документезаписываем переменную склад в шапку документа
    // "ОтчетОРозничныхПродажах" приемника, а в ТЧ документа запишем позиции (без склада)
    КонецЕсли;
    
    КонецЦикла;
    
    // ||||
    // vvvv Это куда? )
    //ВходящиеДанные = Новый Структура; 
    //ВходящиеДанные.Вставить(<"ИмяТЧ">, <ТекущаяТЧ>); 
    //ВходящиеДанные.Вставить("Склад", <ТекущийСклад>); 
    //ВыгрузитьПоПравилу(Объект, ,ВходящиеДанные, ,<"ИмяПКОДокумента">); 
    
    Отказ = Истина
    
    
    

    Что-то перемудрил с переменной "Склад" как мне кажется )

    Вообщем если вкратце:
    - При выгрузке в документе "ОтчетОРозничныхПродажахТовары" получеаем ТЧ
    - Делаем цикл пока есть позиции в ТЧ:
    - Выбираем все позиции с одним складом
    - Создаем новый документ "ОтчетОРозничныхПродажахТовары" где к номеру добавлем постфикс (к примеру 0000123-К1) (к1 - копия1)


    Кто умный и умеющий, подскажите как сделать. ) :angry:
    рублей писят на мобилу закину вместо спасибо ) :D
  2. TopicStarter Overlay
    BiTree
    Offline

    BiTree

    Регистрация:
    27 окт 2010
    Сообщения:
    10
    Симпатии:
    0
    Баллы:
    1
    Вообщем удалось немножко продвинуться...

    вместо первого куска кода 1С теперь вот этот

    Код:
    МассивСкладов = Объект.Товары.ВыгрузитьКолонку("Склад"); 
    ОбщегоНазначения.УдалитьПовторяющиесяЭлементыМассива(МассивСкладов); 
    
    Индекс = 1; 
    Для Каждого ТекущийСклад Из МассивСкладов Цикл 
    
    ТЧ = Объект.Товары.НайтиСтроки(Новый Структура("Склад", ТекущийСклад)); 
    
    ВходящиеДанные = Новый Структура; 
    // Здесь, может быть ошибка, если не хватить длины номера в приемнике. 
    // Если префикса организации нет, то можно ограничить длину через Прав(СокрП(Объект.Номер), <ДлинаМинус1>) 
    ВходящиеДанные.Вставить("Номер", СокрП(Объект.Номер) + Индекс); 
    ВходящиеДанные.Вставить("Склад", ТекущийСклад); 
    ВходящиеДанные.Вставить("Товары", ТЧ); 
    ВыгрузитьПоПравилу(Объект,,ВходящиеДанные,,"ОтчетОРозничныхПродажах"); 
    
    Индекс = Индекс + 1; 
    
    КонецЦикла; 
    
    Отказ = Истина; // Выход из выгрузки текущего документа
    
    

    В чем удалось продвинуться:
    - Документы разбивает как нужно:
    если в документе в УТ в ТЧ было 9 позиций с 3 скаладами, то в БП будет 3 документа в каждом только его позиции из УТ.
    Это очень хорошо ) :angry:

    НО!

    Есть некоторые незакрытые вопросы:
    1. Заполнение поля склад в БП не происходит. какие на ваш взгляд причины?
    загружаю в пустую бухню, может ли это быть из-за того что там пока не заполнен справочник складов?
    Хотя пробовал сначала выгрузить справочник складов, а потом уже загружать документы, все равно не подхватывает...

    2. Не происходит создание уникальных номеров документа. хоть в коде и есть что-то вроде:
    Код:
    ВходящиеДанные.Вставить("Номер", СокрП(Объект.Номер) + Индекс); 
    
    но в Бухне эти три новых документа имеют номер первончального документа из УТ.


    3. Как контроллировать то, что документы уже есть в базе?
    Т.е. если я дважды один и тот же файл данных подгружу, он создает второй раз все документы.
    как сделать. чтобы он контроллировал это?

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