|
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
|
Все,туплю.Запрос то не посмотрел.Извините
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |