Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Перенести Движения документа
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 8.2 > Программирование обычных форм 1С 8.2 и не интерфейсной логики
maximus
Конфигурация УПП.

Подскажите пожалуйста методику копирования движений по регистрам одного документа в другой, при условии, что типы обеих документов одинаковые.
Я прочитал все движения одного документа, а как их записать в другой?
alex040269
Я всегда предполагал, что каждый док сам создает свои движения при проведении, но если очень хочется, то можно записать через отбор.

набор.отбор.регистратор.установить(докСсылка);
набор.Записать(Истина);


где-то так
maximus
Цитата(alex040269 @ 13.02.13, 9:06) необходимо зарегистрироваться для просмотра ссылки
Я всегда предполагал, что каждый док сам создает свои движения при проведении, но если очень хочется, то можно записать через отбор.

набор.отбор.регистратор.установить(докСсылка);
набор.Записать(Истина);


где-то так



Сейчас я выбираю движения документа вот так:
ДокументИсточник = ДокументИсточник.ПолучитьОбъект();
         ДокументПриемник = ДокументПриемник.ПолучитьОбъект();
        
        
        ДвиженияИсточник = ДокументИсточник.Движения;
        
        ДвиженияПриемник = ДокументОбъект.Движения;
    
        
        Для Каждого НаборЗаписейРегистра из ДвиженияИсточник Цикл
        
            НаборЗаписейРегистра.Прочитать();


а как записать в него новые движения?
Домовик
maximus, поделитесь, пожалуйста, зачем вам такое делать? А если вы будете проводить и перепроводить документ-приемник, как будут формироваться ваши движения? или это какая-то будет разовая обработка данных?






maximus
Цитата(Домовик @ 13.02.13, 10:09) необходимо зарегистрироваться для просмотра ссылки
maximus, поделитесь, пожалуйста, зачем вам такое делать? А если вы будете проводить и перепроводить документ-приемник, как будут формироваться ваши движения? или это какая-то будет разовая обработка данных?



У меня товарищ проходит курсы по программированию 1С и вот там дали такое ДЗ. Мне тоже не совсем ясна логика этого процесса, но интересно)
Домовик
логика такова, что движений может быть по нескольким регистрам, и вам это нужно учесть
тут пример замены движений в одном регистре Расходной Накладной, имя кот ДОходыИРасходы. код не отлаживался, просто в модуле был набран.поэтому не знаю

ТЗ     = Новый ТаблицаЗначений;
//ДокПриемник=Документы.РасходнаяНакладная.СоздатьДокумент();
//ДокИсточник=Документы.РасходнаяНакладная.СоздатьДокумент();
ДвиженияИсточник=Докисточник.Движения;
ДвиженияПриемник=ДокПриемник.Движения;

движенияИсточник.ДоходыиРасходы.Выгрузить(ТЗ);
ТЗ.ЗаполнитьЗначения(ДокПриемник,"Регистратор");
движенияПриемник.ДоходыИРасходы.Загрузить(ТЗ);


в коде определенно есть ошибки. нужно работать с наборами записей. и тогда можно использовать Загрузить(), Выгрузить()
maximus
пишу так:
                             ДокИсточник = ДокументИсточник.ПолучитьОбъект();
         ДокПриемник = ДокументПриемник.ПолучитьОбъект();
        
        
                  ТЗ = Новый ТаблицаЗначений;
        ДвиженияИсточник=Докисточник.Движения;
        ДвиженияПриемник=ДокПриемник.Движения;

        Для Каждого НаборЗаписейРегистра из ДвиженияИсточник Цикл
            
            НаборЗаписейРегистра.Выгрузить(ТЗ);
            ТЗ.ЗаполнитьЗначения(ДокПриемник,"Регистратор");
            движенияПриемник.НаборЗаписейРегистра.Загрузить(ТЗ);
        
        КонецЦикла;


но начинает ругаться на НаборЗаписейРегистра.Выгрузить(ТЗ);
Vofka
ТЗ = НаборЗаписейРегистра.Выгрузить();
maximus
Цитата(Vofka @ 13.02.13, 14:42) необходимо зарегистрироваться для просмотра ссылки
ТЗ = НаборЗаписейРегистра.Выгрузить();


Ошибка ушла - Спасибо!

А как правильно быть в этом куске

движенияПриемник.НаборЗаписейРегистра.Загрузить(ТЗ);


т.к. не находит
Поле объекта не обнаружено (НаборЗаписейРегистра)
движенияПриемник.НаборЗаписейРегистра.Загрузить(ТЗ);
Домовик
тз=НаборЗаписейРегистра.Выгрузить() это одна из интаксических ошибок )


я просто сомневаюсь, что можно вот так движения редактировать. в синтакс-помощнике на Выгрузить() (РегистрНакопленияНАборЗаписей) есть граммотный код.
maximus
не могу сообразить как этот набор движений загрузить в документ приемник?

Цитата(Домовик @ 13.02.13, 14:47) необходимо зарегистрироваться для просмотра ссылки
тз=НаборЗаписейРегистра.Выгрузить() это одна из интаксических ошибок )


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



код в помошнике толковый, но там ведь сосдается набор записей движения по конкретному регистру, а мне нужно выбрать все движения...
Vofka
Цитата(Домовик @ 13.02.13, 14:47) необходимо зарегистрироваться для просмотра ссылки
тз=НаборЗаписейРегистра.Выгрузить() это одна из интаксических ошибок )

Это почему?

Цитата(maximus @ 13.02.13, 14:47) необходимо зарегистрироваться для просмотра ссылки
А как правильно быть в этом куске

Ошибка в том, что НаборЗаписейРегистра - это набор записей источника. В него можно что-то писать или что-то читать. Нельзя через него обратиться к какому-то другому набору записей.
maximus
т.е. мне нужно создать второй набор записей по документу приемнику и в этот набор загрузить набор записей с документа ичсточника?
Домовик
Vofka, моих синтаксических ошибок smile.gif. Код от фонаря пишу. ). идею внедрить выгрузить -загрузить хотелось сделать, а кода не знаю.
Vofka
Цитата(maximus @ 13.02.13, 15:00) необходимо зарегистрироваться для просмотра ссылки
т.е. мне нужно создать второй набор записей по документу приемнику и в этот набор загрузить набор записей с документа ичсточника?

Ну да.

Домовик, а smile.gif .
maximus
Цитата(Vofka @ 13.02.13, 15:07) необходимо зарегистрироваться для просмотра ссылки
Ну да.

Домовик, а smile.gif .


Я прошу прощения конечно, за глупые вопросы, но мне эти действия нужно делать цикл в цикле?
Домовик
в том-то и сложность. может быть движений по нескольким регистрам. нет, не желательно цикл в цикле . а подыскивать соответсвующий набор приемника набору источника по регистру. но как.
alex040269
тз=НаборЗаписейРегистра.Выгрузить();
//изменить тз
набор = РегтистрыЧегото.СоздатьНаборЗаписей();
набор.Загрузить(тз);

//установить отбор
набор.Записать(Истина);
Vofka
maximus, документы разные? Если да - тогда прописывайте обращения к конкретным регистрам, это же не проблема.
maximus
Цитата(Vofka @ 13.02.13, 15:23) необходимо зарегистрироваться для просмотра ссылки
maximus, документы разные? Если да - тогда прописывайте обращения к конкретным регистрам, это же не проблема.



Документы всегда одинаковые
Домовик
документы разные, тип документов один.
maximus
Цитата(maximus @ 13.02.13, 15:25) необходимо зарегистрироваться для просмотра ссылки
Документы всегда одинаковые


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

                            ДокИсточник = ДокументИсточник.ПолучитьОбъект();
         ДокПриемник = ДокументПриемник.ПолучитьОбъект();
        
        
        ТЗ  = Новый ТаблицаЗначений;
        ДвиженияИсточник=Докисточник.Движения;
        ДвиженияПриемник=ДокПриемник.Движения;

                
        ТЗ = ДвиженияИсточник.ПартииТоваровНаСкладахБухгалтерскийУчет.Выгрузить();    
        ТЗ.ЗаполнитьЗначения(ДвиженияПриемник,"Регистратор");
        ДвиженияПриемник.ПартииТоваровНаСкладахБухгалтерскийУчет.Загрузить(ТЗ);
        ДвиженияПриемник.Записать();

После этого вообще в документе приемнике пропадает движение по этому регистру, что не так делаю?
alex040269
Цитата(maximus @ 13.02.13, 16:35) необходимо зарегистрироваться для просмотра ссылки
ТЗ.ЗаполнитьЗначения(ДвиженияПриемник,"Регистратор");//регистратор - ссылка на документ

Цитата(maximus @ 13.02.13, 16:35) необходимо зарегистрироваться для просмотра ссылки
т.е. целым набором залить не получиться?

можно перебрать коллекцию.
sava1
Значение Регистратора надо-бы поменять

Цитата(alex040269 @ 13.02.13, 16:49) необходимо зарегистрироваться для просмотра ссылки
можно перебрать коллекцию

Для Каждого НаборЗаписейРегистра из Движения Цикл
    НаборЗаписейРегистра.Прочитать();

    Для Каждого Запись из НаборЗаписейРегистра Цикл    

        // Чтение и модификация очередного движения.

    КонецЦикла;

КонецЦикла;
maximus
в том то и беда, что пробовал через коллекцию но не получается...

Цитата(maximus @ 13.02.13, 18:07) необходимо зарегистрироваться для просмотра ссылки
в том то и беда, что пробовал через коллекцию но не получается...


вот как в
ДокИсточник.Движения.ПартииТоваровНаСкладахБухгалтерскийУчет.Прочитать();

вместо явного указания регистра подставить значение коллекции?
Домовик
Цитата(maximus @ 13.02.13, 12:35) необходимо зарегистрироваться для просмотра ссылки
После этого вообще в документе приемнике пропадает движение по этому регистру, что не так делаю?



если движения, были и исчезли, значит загрузить() срабатывает. загрузить() затирает старые записи и пишет вместо них те, что в тз.

тут еще ошибка механическая была, alex040269 подсказал
Тз.ЗаполнитьЗначения(ДокПриемник,"Регистратор");

из-за этой ошибки в тз регистратор был не заполнен и загрузка не прошла
maximus
Цитата(Домовик @ 13.02.13, 21:58) необходимо зарегистрироваться для просмотра ссылки
тут еще ошибка механическая была, alex040269 подсказал


Исправил ошибку, результат тот же(
Домовик
если загрузить() поставить в условие на проверку количества строк ТЗ, какой результат?
sava1
Отладчиком пройтись надо-бы
maximus
В итоге добился работоспособности вот таким способом, но опять таки это только по конкретному регистру, буду пытаться залить всю коллекцию)

 ДокИсточник = ДокументИсточник.ПолучитьОбъект();
         ДокПриемник = ДокументПриемник.ПолучитьОбъект();
        
        
        ТЗ  = Новый ТаблицаЗначений;
        ДвиженияИсточник=Докисточник.Движения;
        ДвиженияПриемник=ДокПриемник.Движения;

                
        ТЗ = ДвиженияИсточник.ПартииТоваровНаСкладахБухгалтерскийУчет.Выгрузить();    
        ТЗ.ЗаполнитьЗначения(ДокПриемник,"Регистратор");
        ДвиженияПриемник.ПартииТоваровНаСкладахБухгалтерскийУчет.Загрузить(ТЗ);
        ДвиженияПриемник.Записать();


Цитата(maximus @ 14.02.13, 9:03) необходимо зарегистрироваться для просмотра ссылки
В итоге добился работоспособности вот таким способом, но опять таки это только по конкретному регистру, буду пытаться залить всю коллекцию)

 
ДокИсточник.Движения.РасчетыПоРеализацииВУсловныхЕдиницахОрганизации.Прочитать()
;
         ДвиженияПриемник = ДокПриемник.Движения.РасчетыПоРеализацииВУсловныхЕдиницахОрганизации;
         Для каждого ДвижениеИсточник Из ДокИсточник.Движения.РасчетыПоРеализацииВУсловныхЕдиницахОрганизации Цикл
            ДвижениеПриемник = ДвиженияПриемник.Добавить();    
            ЗаполнитьЗначенияСвойств(ДвижениеПриемник, ДвижениеИсточник);
         КонецЦикла;


В итоге добился работоспособности вот таким способом, но опять таки это только по конкретному регистру, буду пытаться залить всю коллекцию)
Домовик
о переборе наборов "в слепую", без явного задания регистра. работа программы же предсказуема. для одного типа документа в цикле программа обойдет наборы записей регистров в одной и той же последовательности. регистр1, регистр2, регистр3. по источнику и приемнику.

можно обойти циклы, записать наборы в цикле в списокзначенийПриемник и списокзначенийИсточник. потом по индексу обращаться к соотв. наборам.

наборы можно записывать в списки значений?
Домовик
все же пытаюсь решить эту задачу.
выгрузить() почему-то до конца не работает. В отладчике показывает количество строк ТЗ равно 0. в ТЗ копируется полностью структура -имена измерений, ресурсво, реквизитов.
Пример, который в синтакс-помощнике срабатывает так же, нулевая таблица со структурой тек регистра. с чем это может быть связано? конфигурация УНФ, возможно где-то в свойствах запрет или галка, что записи делать только при проведении дока?

 &наСервере
     Процедура Команда11()
   спИсточник= Новый СписокЗначений;                 
        ДвиженияИсточник=докИсточник.ПолучитьОбъект().движения;
        ДвиженияПриемник=ДокПриемник.ПолучитьОбъект().Движения;

        счетчик=0;
        для каждого НаборЗаписейРегистра  из движенияПриемник цикл
            ТЗ = ДвиженияИсточник.Получить(счетчик).Выгрузить();  
        ТЗ.ЗаполнитьЗначения(ДокПриемник,"Регистратор");
        НаборЗаписейРегистра.Загрузить(ТЗ);
         счетчик=счетчик+1;    
    КонецПроцедуры
logist
А "ДвиженияИсточник.Получить(счетчик)" в отладчике что показывает? Может вместо "счетчик" стоит использовать имена регистров? (ну или как-то так)
Домовик
logist, показывает на счетчик= 0 РегистрНакопленияНаборЗаписей. Продажи и далее еще 18 наборов записей регистров ( по движ РасходнаяНакладная). как раз там все нормально.

при явном задании регистра (в синтакс-помощнике пример) точно также формирует пустую таблицу со структурой регистра.




 i 

Правила, 11 пункт
 
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.