8.х Перенос данных между документами

Тема в разделе "Общие вопросы "1С:Предприятие 8"", создана пользователем bizisoft, 16 авг 2012.

  1. TopicStarter Overlay
    bizisoft
    Offline

    bizisoft

    Регистрация:
    28 июн 2012
    Сообщения:
    13
    Симпатии:
    0
    Баллы:
    1
    Здраствуйте.
    Подскажите пожалуйста как можно сделать следующее:
    Имеються два вида документов "Предварительные заказы" и "Заказы".
    Необходимо скопировать записи из документа "Предварительные заказы" в "Заказы" по определенному условию. Например: берем первую запись из "Предварительных заказов" и если значение одноно из полей удовлетворяет нужному добавляем его в "Заказы".
    Уже голову сломал как это сделать. Если в Interbase для меня все просто -

    Вот так это делается например в С++ Builder
    Код:
    // Выполняем запрос к первой таблице
    IBDataSet1->Close();
    IBDataSet1->SelectSql->Clear();
    IBDataSet1->SelectSql->Add("select * from TABLE");
    IBDataSet1->Open();
    IBDataSet1->First();  // Переходим к первой записи
    do  // Цикл для перебора всех записей в первой таблицы
    {
    if(IBDataSet1->FieldByName("POSTAVSHIK")->AsString == "Поставщик №1")   // Если условие удовлетворяет
    {  // То копируем строку из одной таблицы в другую
    IBDataSet2->Insert();
    IBDataSet2->FieldByName("NOMER")->AsString = IBDataSet1->FieldByName("NOMER")->AsString;
    IBDataSet2->FieldByName("NAME")->AsString = IBDataSet1->FieldByName("NAME")->AsString;
    IBDataSet2->FieldByName("POSTAVSHIK")->AsString = IBDataSet1->FieldByName("POSTAVSHIK")->AsString;
    IBDataSet2->FieldByName("KOLICHESTVO")->AsString = IBDataSet1->FieldByName("KOLICHESTVO")->AsString;  
    IBDataSet2->Post();
    }
    IBDataSet1->Next();  // Переходим к следующей записи
    } while(!IBDataSet1->Eof);   // Цикл пока не дошли до конца таблицы
    
    то здесь в 1C никак не пойму физический механизм копирования, как это сделать

    С перебором вроде разобрался, а вот как дальше никак.

    Код:
    Процедура ДействияФормыДействие7(Кнопка)
    Для Каждого Строка Из ТОВАР Цикл
    ЭлементыФормы.ТОВАР.ТекущаяСтрока = Строка; //Переходим к строке
    Сообщить(Строка(ЭлементыФормы.ТОВАР.ТекущаяСтрока.Товар) +  Строка("   ") + Строка(ЭлементыФормы.ТОВАР.ТекущаяСтрока.Поставщик));
    КонецЦикла;
    КонецПроцедуры
    
    Мне надо понять как подобные действия делаються в 1С, тогда будет легче.

    С Уважением, Дмитрий.
  2. Tiger86
    Offline

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

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    Код:
    Процедура ДействияФормыДействие7(Кнопка)
    Для Каждого стр Из ТОВАР Цикл //лучше не использовать зарезервированные слова (Строка заменила на стр)
    //ЭлементыФормы.ТОВАР.ТекущаяСтрока = Строка; //Переходим к строке       //ВЫ И ТАК В ТЕКУЩЕЙ СТРОКЕ ВНУТРИ ЦИКЛА
    //Сообщить(Строка(ЭлементыФормы.ТОВАР.ТекущаяСтрока.Товар) +  Строка("   ") + Строка(ЭлементыФормы.ТОВАР.ТекущаяСтрока.Поставщик));
    Сообщить(Строка(стр.Товар) +  Строка("   ") + Строка(стр.Поставщик));
    КонецЦикла;
    КонецПроцедуры
  3. TopicStarter Overlay
    bizisoft
    Offline

    bizisoft

    Регистрация:
    28 июн 2012
    Сообщения:
    13
    Симпатии:
    0
    Баллы:
    1
    Спасибо за коректировку, а как быть непосредственно с копированием? Не подскажите?
    С Уважением, Дмитрий.
  4. Tiger86
    Offline

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

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    В цикле заполняйте тз по вашему условию, потом в табчасть нужного дока через Загрузить(тз)
  5. TopicStarter Overlay
    bizisoft
    Offline

    bizisoft

    Регистрация:
    28 июн 2012
    Сообщения:
    13
    Симпатии:
    0
    Баллы:
    1
    Да все получилось, спасибо.
    Вот рабочая процедура, отвечающая за копирование данных ...

    Код:
    Процедура ДействияФормыДействие7(Кнопка)
    СтрПоставщики = Справочники.Поставщики.Выбрать();
    Пока СтрПоставщики.Следующий() цикл
    ТекПоставщик = СтрПоставщики.Наименование;
    ТЗ = Новый ТаблицаЗначений;
    ТЗ.Колонки.Добавить("Товар",,"Товар");
    ТЗ.Колонки.Добавить("Наименование",,"Наименование");
    ТЗ.Колонки.Добавить("Поставщик",,"Поставщик");
    ТЗ.Колонки.Добавить("Количество",,"Количество");
    //Заполняем таблицу значений
    Для Каждого стр Из ТОВАР Цикл //лучше не использовать зарезервированные слова (Строка заменила на стр)
    Если ТекПоставщик = стр.Поставщик.Наименование Тогда
    НоваяСтр = ТЗ.Добавить();
    НоваяСтр.Товар = стр.Товар;
    НоваяСтр.Поставщик = стр.Поставщик;
    НоваяСтр.Наименование = стр.Наименование;
    НоваяСтр.Количество = стр.Количество;
    КонецЕсли;
    КонецЦикла;
    Если ТЗ.Количество() > 0 Тогда
    // Загружаем таблицу значений в табличную часть документа
    НовДок = Документы.Заказы.СоздатьДокумент();
    НовДок.Дата = ТекущаяДата();
    НовДок.ТОВАР.Загрузить(ТЗ);
    НовДок.Записать();
    НовДок.Поставщик = ТекПоставщик;
    НовДок.Описание = ТекПоставщик;
    НовДок.Статус = "Корзина";
    НовДок.НомерЗаказа = "ЗК_" + НовДок.Номер;
    НовДок.Создан = НовДок.Дата;
    НовДок.Записать();
    Сообщить(Строка("Создан документ №") + Строка(НовДок.НомерЗаказа) +
    Строка(" для ") + Строка(ТекПоставщик));
    КонецЕсли;
    КонецЦикла;
    КонецПроцедуры
    Единственно никак не получилось присвоить некоторым реквизитам новых документов, а именно:

    Код:
    НовДок.Поставщик = ТекПоставщик;
    НовДок.Статус = "Корзина";
    Могу предположить, что это связано с типом реквезитов, а именно
    СправочникСсылка.Поставщики
    СправочникСсылка.Статус
    и непосредственное присваивание неприменимо.
    Пробовал методом тыка разные варианты , например как
    НовДок.Статус.Ссылка ...
    НовДок.Статус.Родитель.Ссылка ...
    но ничего не получилось .
    Что я не так делаю, подскажите пожалуйста.
  6. TopicStarter Overlay
    bizisoft
    Offline

    bizisoft

    Регистрация:
    28 июн 2012
    Сообщения:
    13
    Симпатии:
    0
    Баллы:
    1
    Вроде разобрался :icon_avatar-174: .

    Код:
    НовДок.Поставщик = Справочники.Поставщики.НайтиПоНаименованию(ТекПоставщик).Ссылка;
    НовДок.Статус = Справочники.Статусы.НайтиПоНаименованию("Корзина").Ссылка;
    Хотя и так тоже работает
    Код:
    НовДок.Поставщик = Справочники.Поставщики.НайтиПоНаименованию(ТекПоставщик);
    НовДок.Статус = Справочники.Статусы.НайтиПоНаименованию("Корзина");
    Отсюда следует так сказать подозрение - какой вариант верен и не может содержать подводных камней.
  7. shurikvz
    Offline

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

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


    В остальном по коду:
    Вы везде получаете наименование и сравниваете его. Так делать не правильно.
    Например:
    Код:
    ТекПоставщик = СтрПоставщики.Наименование;
    ...
    Если ТекПоставщик = стр.Поставщик.Наименование Тогда
    ...
    ...
    ...
    НовДок.Поставщик = Справочники.Поставщики.НайтиПоНаименованию(ТекПоставщик);
    
    правильно записать в таком виде:
    Код:
    ТекПоставщик = СтрПоставщики.Ссылка;
    ...
    Если ТекПоставщик = стр.Поставщик Тогда
    ...
    ...
    ...
    НовДок.Поставщик = ТекПоставщик;
    

    Кроме того, код конечно написан не оптимально. Но если дела с 1С не имели, то понятно и простительно.

    Например: данные из исходной табличной части можно получать запросом, и группировать по поставщику прямо в запросе. Вариантов более рационального (и красивого) написания - не один.

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