Имя: Пароль:
1C
1C 7.7
v7: Копировать значение реквизита ТЧ из одного документа в другой
,
0 Vigor06
 
27.10.14
13:37
Доброго дня!
Появилась задача: скопировать содержимое реквизита табличной части из документа основания в документ. Из Заявки покупателя в реализацию.Делаю так:

Процедура Сформировать()
Запрос=СоздатьОбъект("Запрос");
тз="Период с НачДата по КонДата;
|Обрабатывать НеПомеченныеНаУдаление;
|ЗаявкаПокупателя = Документ.ЗаявкаПокупателя.ТекущийДокумент;
|ВидОперации = Документ.ЗаявкаПокупателя.ВидОперации;
|Контрагент = Документ.ЗаявкаПокупателя.Контрагент;
|НомерДок = Документ.ЗаявкаПокупателя.НомерДок;
|Группировка НомерДок ;
|Условие(Контрагент = ВыбКонтрагент);
|Условие(ВидОперации = ВыбВидОперации);
|";
Если Запрос.Выполнить(тз)=0 Тогда
    Сообщить("Ошибка выполнения запроса!");
    Возврат;
КонецЕсли;

Пока Запрос.Группировка(1) = 1 Цикл
    //Сообщить(Запрос.ЗаявкаПокупателя.НомерДок);
    Док = ПолучитьРеализациюПоСчету(Запрос.ЗаявкаПокупателя);  
    Док.ВыбратьСтроки();
    Пока Док.ПолучитьСтроку()=1 Цикл
        Если СокрЛП(Док.ЗаЧто) = "" Тогда
        
            Запрос.ЗаявкаПокупателя.ВыбратьСтроки();
            Пока Запрос.ЗаявкаПокупателя.ПолучитьСтроку()=1 Цикл
                Если Запрос.ЗаявкаПокупателя.Номенклатура  = Док.Номенклатура  Тогда
                    Док.ЗаЧто = Запрос.ЗаявкаПокупателя.ЗаЧто;
                КонецЕсли;
            КонецЦикла;
            
            
        КонецЕсли;
    КонецЦикла;                                              
    //Док.Записать();
    
КонецЦикла;

КонецПроцедуры    

Но,почему то, когда перебираются  строки заявкипокупателя - происходит заикливание,хотя КоличествоСтрок() показывает,что строка то в документе одна..

ЧЯДНТ?

Спасибо
1 Ёпрст
 
27.10.14
13:48
всё в топку
2 Vigor06
 
27.10.14
13:50
(1) есть альтернатива?
3 Ёпрст
 
27.10.14
13:53
(2) есть. Переписать всё. Начиная с текста запроса.
4 Vigor06
 
27.10.14
13:53
(3) в условиях цейтнота ничего лучше придумать не смог
5 Duke1C
 
27.10.14
14:10
(4) Конструктором, как раз в цейтноте, быстрее и лучше бы накидал
6 Vigor06
 
27.10.14
14:14
(5)так я конструктором изначально и накидывал
7 Duke1C
 
27.10.14
14:24
Тогда лучше позвать специалиста, а то по сабжу итак не внятно задача-мнимум проглядывается (...скопировать содержимое реквизита табличной части из документа основания //причем здесь тогда запрос?// в документ. Из Заявки покупателя в реализацию...), а что там на самом деле должно получится одному богу известно. А с таким кодом, как в (0) делов наворотишь, да еще в цейтноте :)
8 Vigor06
 
27.10.14
14:27
(7) Запросом получаем документы заявки за период.Потом для каждой заявки находим реализацию,для которой она является основанием.
Потом перебираем строки реализации и если в строке реквизит "ЗаЧто" пустой,то в документе основании смотрим,что в строке с такой же номенклатурой стоит в столбце "ЗаЧто" и копируем это
9 lavalit
 
27.10.14
14:32
Действительно, зачем запрос то? если документ основание уже известен.. бери его и вот она вся табчасть на руках...далее эффективнее наверно не перебирать строки основания а делать поиск по таблице.... прикинь сотню строк в реализации и будет сотня циклов по перебору строк в основании. в свою очередь будет тоже сотня строк в основании... жуть какая то получается... и не козырная обработка в итоге....
10 lavalit
 
27.10.14
14:35
(8) ну если хочешь уж так запрос.. используй... но пляски вокруг табчастей переписать.. однозначно... не надо кучу цыклов... поиском надо...
11 Vigor06
 
27.10.14
14:47
(9)(10) Про основания известны только типы. И кол-во позиций в таб частях 1-2,не больше
А вот поиск в таб.части документа я не нашел
12 Vigor06
 
27.10.14
14:55
Подумал,пока сделал так


Процедура Сформировать()
Запрос = СоздатьОбъект("Запрос");
    ТекстЗапроса = "
    |Период с ВыбНачПериода по ВыбКонПериода;
    |Обрабатывать НеПомеченныеНаУдаление;
    |Реализация = Документ.Реализация.ТекущийДокумент;
    |НомерДок = Документ.Реализация.НомерДок;
    |Контрагент = Документ.Реализация.Контрагент;
    |Номенклатура = Документ.Реализация.Номенклатура;
    |ЗаЧто = Документ.Реализация.ЗаЧто;
    |ДокОснование = Документ.Реализация.ДокОснование;
    |Группировка НомерДок;
    |Условие(СокрЛП(ЗаЧто) = СокрЛП(ВыбЗаЧто));
    |Условие(Контрагент = ВыбКонтрагент);
    |"//}}ЗАПРОС
    ;
    // Если ошибка в запросе, то выход из процедуры
    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
        Возврат;
    КонецЕсли;

Пока Запрос.Группировка(1) = 1 Цикл
    Док = Запрос.ДокОснование;  

    Док.ВыбратьСтроки();
    Пока Док.ПолучитьСтроку()=1 Цикл
    Если Запрос.Номенклатура  = Док.Номенклатура  Тогда
                    Запрос.реализация.ЗаЧто = Док.ЗаЧто;
                КонецЕсли;  
            
            КонецЦикла;
            
            
        КонецЕсли;
    КонецЦикла;                                              
    //Док.Записать();
    
    
КонецЦикла;

КонецПроцедуры
13 Vigor06
 
27.10.14
14:55
Естессно не работает. Поэтому вопрос:как там записать нужные данные в документ из запроса?
14 Ёпрст
 
27.10.14
14:58
На вот, занимайся

    Запрос = СоздатьОбъект("Запрос");
    ТекстЗапроса =
    "//{{ЗАПРОС(Сформировать)
    |Период с ВыбНачПериода по ВыбКонПериода;
    |Номенклатура = Документ.Реализация.Номенклатура;
    |НомерСтроки = Документ.Реализация.НомерСтроки;
    |ЗаЧТо = Документ.Реализация.ЗаЧто;
    |Заявка = Документ.Реализация.ДокОснование;
    |Условие ((ПустоеЗначение(Заявка)=0)И(Заявка.Вид()=""ЗаявкаПокупателя""));
    |Условие ((ПустоеЗначение(ЗаЧто)=1));
    |Группировка Документ;
    |Группировка СтрокаДокумента;
    |"//}}ЗАПРОС
    ;
    // Если ошибка в запросе, то выход из процедуры
    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
        Возврат;
    КонецЕсли;
    
    ЗапросЗаявка = СоздатьОбъект("Запрос");
    ТекстЗапроса =
    "//{{ЗАПРОС(Сформировать)
    |Период с ВыбНачПериода по ВыбКонПериода;
    |Номенклатура = Документ.ЗаявкаПокупателя.Номенклатура;
    |ЗаЧТо = Документ.ЗаявкаПокупателя.ЗаЧТо;
    |Группировка Документ;
    |Группировка Номенклатура;
    |"//}}ЗАПРОС
    ;
    // Если ошибка в запросе, то выход из процедуры
    Если ЗапросЗаявка.Выполнить(ТекстЗапроса) = 0 Тогда
        Возврат;
    КонецЕсли;

    
    Док = СоздатьОбъект("Документ");
    Пока Запрос.Группировка(1) = 1 Цикл
        Док.НайтиДокумент(Запрос.Документ);
        Пока Запрос.Группировка(2) = 1 Цикл
            Если ЗапросЗаявка.Получить(Запрос.Заявка,Запрос.Номенклатура)=1 Тогда
                Док.ПолучитьСтрокуПоНомеру(Запрос.НомерСтроки);
                Док.ЗаЧто = ЗапросЗаявка.ЗаЧТо;
            КонецЕсли;
        КонецЦикла;
        Док.Записать();
    КонецЦикла;
КонецПроцедуры
15 Vigor06
 
30.10.14
12:46
(14) А я правильно понимаю,что когда мы в запросе указываем,например

|Группировка Номенклатура;

И в документе у нас несколько одинаковых позиций,но с  разным содержанием,то на выходе мы получим только 1 строку,последнюю?

Это я конкретно про второй запрос говорю сейчас)

спасиБо)
16 Vigor06
 
30.10.14
12:48
(15)и достаточно ли будет,чтобы избавиться от этого, включить группировку еще и по полю "ЗаЧто"?
17 Ёпрст
 
30.10.14
13:06
(15) у вас есть дубли по номенклатуре в заказе ?
18 Vigor06
 
30.10.14
13:10
(17) при выставлении счетов за аренду помещения,на конец года, как оказалось, есть счета с табличной частью следующего вида:
Аренда|За январь 2012 года
Аренда|За Февраль 2012 года
...
Аренда|За декабрь 2012 года
19 Ёпрст
 
30.10.14
13:12
(18) очень хорошо.
Если в реализации у вас

Аренда|<пусто>  - то это какая аренда из заказа ?

Может того, что-то в консерватории менять надо ?
20 Vigor06
 
30.10.14
13:16
(19)  Раньше то в реализации все было,но изза...ммм...кривого обновления конфы нашим бывшим сотрудником, реквизит потерли.потом создали заново,но он же пустой остался.
Вот разгребаю сейчас
21 Ёпрст
 
30.10.14
13:18
(20) тогда только - поднять архив - взять реквизит оттуда.
Или, смотреть ЖР - может, пишется туда, или , смотреть движения регистров /проводки, возможно, твоё ЗаЧто пишется туда.
Если нет - то выкинуть нахрен этот реквизит за ненадобностью.
22 Vigor06
 
30.10.14
13:48
(21) а из счета то не достать?) Все же в счетах есть)
23 Ёпрст
 
30.10.14
14:42
(22) достать чего ?
Как ты поставишь в однозначное соответствие Номенклатуру из заказа с номенклатурой в реализации, если строк в заказе с одной номенклатурой 10 штук, а в реализации - 3 , например.
И количество в заказе не совпадает с количеством в реализации.

Эти 3 номенклатуры, это которые из 10 в заказе, сможешь однозначно определить ?
24 Vigor06
 
30.10.14
14:55
ненене)Я,видимо,ввел Вас в заблуждение) Количество строк и там и там одинаковое)
25 Ёпрст
 
30.10.14
15:43
(24)однозначное соответствие возможно только, если еще-какой реквизит будет совпадать. Количество, например. Тогда можно слепить - иначе - болт
26 Vigor06
 
30.10.14
15:46
(25) там все совпадает)И количество,и сумма, и номенклатура. Разница в том,что в одном документе поле "за что" заполнено,а во втором - нет
27 Ёпрст
 
30.10.14
15:53
На вот, занимайся

    Запрос = СоздатьОбъект("Запрос");
    ТекстЗапроса =
    "//{{ЗАПРОС(Сформировать)

    |Период с ВыбНачПериода по ВыбКонПериода;
    |Номенклатура = Документ.Реализация.Номенклатура;
    |НомерСтроки = Документ.Реализация.НомерСтроки;
    |ЗаЧТо = Документ.Реализация.ЗаЧто;
    |Заявка = Документ.Реализация.ДокОснование;
    |Количество = Документ.Реализация.Количество;
    |Условие ((ПустоеЗначение(Заявка)=0)И(Заявка.Вид()=""ЗаявкаПокупателя""));
    |Условие ((ПустоеЗначение(ЗаЧто)=1));
    |Группировка Документ;
    |Группировка СтрокаДокумента;
    |"//}}ЗАПРОС

    ;
    // Если ошибка в запросе, то выход из процедуры

    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
        Возврат;
    КонецЕсли;
    
    ЗапросЗаявка = СоздатьОбъект("Запрос");
    ТекстЗапроса =
    "//{{ЗАПРОС(Сформировать)

    |Период с ВыбНачПериода по ВыбКонПериода;
    |Номенклатура = Документ.ЗаявкаПокупателя.Номенклатура;
    |ЗаЧТо = Документ.ЗаявкаПокупателя.ЗаЧТо;
    |Количество = Документ.ЗаявкаПокупателя.Количество;
    |Группировка Документ;
    |Группировка Номенклатура;
    |Группировка Количество;
    |"//}}ЗАПРОС

    ;
    // Если ошибка в запросе, то выход из процедуры

    Если ЗапросЗаявка.Выполнить(ТекстЗапроса) = 0 Тогда
        Возврат;
    КонецЕсли;

    
    Док = СоздатьОбъект("Документ");
    Пока Запрос.Группировка(1) = 1 Цикл
        Док.НайтиДокумент(Запрос.Документ);
        Пока Запрос.Группировка(2) = 1 Цикл
            Если ЗапросЗаявка.Получить(Запрос.Заявка,Запрос.Номенклатура,Запрос.Количество)=1 Тогда
                Док.ПолучитьСтрокуПоНомеру(Запрос.НомерСтроки);
                Док.ЗаЧто = ЗапросЗаявка.ЗаЧТо;
            КонецЕсли;
        КонецЦикла;
        Док.Записать();
    КонецЦикла;
КонецПроцедуры

это будет работать, при условии, что количество разное для каждой номенклатуры.
28 Vigor06
 
30.10.14
15:58
(27)Может проще тогда к сумме привязать? Она чаще будет разной,чем количество
29 Ёпрст
 
30.10.14
16:03
(28) да хоть все реквизиты перечисли
30 Vigor06
 
30.10.14
16:09
(27)  Ближе к истине,но не хочет перезаписывать данные,если они там уже введены..вот это вообще не пойму,почему
31 Ёпрст
 
30.10.14
16:12
(30) моя твоя не понимат, выражайтесь яснее
32 Vigor06
 
30.10.14
16:17
(30)Ох) В предыдущий раз получили следующее заполнение ТЧ реализации:
Подогрев | Декабрь 2012
Подогрев | Декабрь 2012
Подогрев | Декабрь 2012
Подогрев | Декабрь 2012
...
Подогрев | Декабрь 2012


При этом в заявке все вот так:
Подогрев | Январь 2012
Подогрев | Февраль 2012
....
Подогрев | Декабрь 2012


Сейчас при выполнении нашей обработки все остается как было
Подогрев | Декабрь 2012

Но если мы в столбце "заЧто" очистим данные и выполним обработку, то получаем правильные значения,как и  в счете
33 Ёпрст
 
30.10.14
16:22
(32) Юный чекист ?
Ни разу не понял, что кто запускал и в какой момент
34 Vigor06
 
30.10.14
16:27
(33) сорри.
После запуска первого предложенного Вами варианта получили вот такое:
Подогрев | Декабрь 2012
Подогрев | Декабрь 2012
Подогрев | Декабрь 2012
Подогрев | Декабрь 2012
...
Подогрев | Декабрь 2012

При этом в заявке все заполнено вот так вот так:
Подогрев | Январь 2012
Подогрев | Февраль 2012
....
Подогрев | Декабрь 2012

При выполнении последнего предложенного Вами варианта правильные данные в столбец "За что" попадают тоолько в том случает,Если перед эти очистить его
35 Vigor06
 
30.10.14
16:40
Все,туплю.Запрос то не посмотрел.Извините
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс