Имя: Пароль:
1C
1С v8
Перебор ТЧ запросом с подставлением реквизита из предыдущей строки
0 F1
 
10.04.12
08:12
Здравствуйте!
Существует ТЧ документа с реквизитами
1. Работа 1
2.          Материал 1
3.          Материал 2
4.          Материал 3
5. Работа 2
6.          Материал 4
7.          Материал 1
8.          Материал 5
Нужно перебрать строки запросом, чтобы для материалов для строк  со 2 по 4 подставилась Работа 1, а для материалов с 6 по 8 строку - Работа 2. Подскажите, как сделать!
1 Wobland
 
10.04.12
08:17
имхо, надо для этих строк первые поля заполнять. что, если вдруг состав строк изменится?
2 Живой Ископаемый
 
10.04.12
08:20
что такое "перебрать запросом"?
3 Wobland
 
10.04.12
08:21
(2) наверное, в цикле выбрать Работа где НомерСтроки=&НомерТекущейСтроки-1 ;)
4 butterbean
 
10.04.12
08:22
этож надо было такой документ бредовый разработать
5 Живой Ископаемый
 
10.04.12
08:23
2(3) интерпретаций я тоже могу нафантазировать... мне интересно что автор имел в виду..
6 butterbean
 
10.04.12
08:23
(0) проще всего записать работу в каждую строку и ипать мосх
7 Defender aka LINN
 
10.04.12
08:32
(0) Ты же в курсе, что соединение возможно не только на равенство, да?
8 F1
 
10.04.12
08:51
(6) Автор имел в виду, что все в запросе нужно сделать, т.к. делается для СКД. Циклы не подходят.
(4) документ давнишний, приходиться работать с тем чем есть
9 F1
 
10.04.12
08:52
(7) ага, в кусре
10 Wobland
 
10.04.12
08:54
(8) приведи давнишний документ к такому виду и попытайся решить:

1. Работа 1
2.          Материал 1
3.          Материал 2
4. Работа 2
5.          Материал 4
6.          Материал 1
7.          Материал 5
8.          Материал 3 (бывшая строка 4)
11 F1
 
10.04.12
08:57
(10) я имею ввиду, что материалы могут повторяться
12 Wobland
 
10.04.12
09:02
(11) тогда вопрос: (0) и (10) - если просто строку передвинули, то получился другой набор работ?
13 DimVad
 
10.04.12
09:02
Предположим, что "Автор имел в виду, что все в запросе нужно сделать, т.к. делается для СКД. Циклы не подходят.
документ давнишний, приходиться работать с тем чем есть".

Самое простое решение - выгружает в ТЗ, заполняем как надо, ТЗ суем в СКД как внешний источник. Если нужен именно запрос для чего-то еще - суем ТЗ в временную таблицу и строим на ней запрос.
14 F1
 
10.04.12
09:06
(13)а если не простое решение? Можно ведь как-то в запросе Выбор написать, чтобы значение работы бралось из предыдущей строки?
15 DimVad
 
10.04.12
09:13
Ну, если честно - можно. Но надо учесть, что количество строк с материалом - переменна в общем случае. 1. Делаем запрос по полям "номер строки и работа" (выбираем только заполненные работы) и кидаем их во временную таблицу.
16 butterbean
 
10.04.12
09:14
(14) с переменным количество материалов - это весьма геморно
17 DimVad
 
10.04.12
09:14
2. Делаем запрос по полям "номер строки и материал" и объединяем с первой таблицей по условию "номер строки больше или равен номеру строки из первой таблицы. И пофигу на количество строк с материалами...
18 butterbean
 
10.04.12
09:17
(17) при таком подходе ВСЕ материалы свалятся на первую работу, ну и далее по списку
19 DimVad
 
10.04.12
09:21
Опс, не правильно написал. Знаете способ, как имитировать "срез последнего" там, где это не предусмотрено ? Объединяем не просто с первой таблицей, а с запросом на базе первой таблицы, где получаем максимальный номер строки, но стоит отбор - он меньше или равен номеру из второй таблицы.
20 DimVad
 
10.04.12
09:26
Я так делал, получал "срез последнего" по датам с документов, объединяя с другим запросом по датам на "больше-меньше". Способ очень полезный. Но честно говорю, что для решения конкретной задачки ТС гораздо проще и НАГЛЯДНЕЕ получить ТЧ, обработать циклом и далее по списку...
21 F1
 
10.04.12
09:31
(20) а можно пример?
22 DimVad
 
10.04.12
09:33
Э... можно. Но я тут работенку делаю одновременно с чтением мисты... Освобожусь где-нибудь через часик. Если к тому времени эту тему не решат - сделаю в пробной конфе такой документик и сговнякаю запрос.
23 F1
 
10.04.12
09:34
(22) Ок, спасибо заранее
24 Buster007
 
10.04.12
09:50
ВЫБРАТЬ
   Таблица.НомерСтроки,
   Таблица.Реквизит1,
   Таблица.Реквизит2
ПОМЕСТИТЬ втТаблица
ИЗ
   &Таблица КАК Таблица
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   втТаблица.НомерСтроки
ПОМЕСТИТЬ втЗаголовки
ИЗ
   втТаблица КАК втТаблица
ГДЕ
   втТаблица.Реквизит1 <> ""
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   втТаблица.НомерСтроки,
   МАКСИМУМ(втЗаголовки.НомерСтроки) КАК НомерСтрокиЗаголовка
ПОМЕСТИТЬ втПодходящиеЗаголовки
ИЗ
   втТаблица КАК втТаблица
       ВНУТРЕННЕЕ СОЕДИНЕНИЕ втЗаголовки КАК втЗаголовки
       ПО втТаблица.НомерСтроки > втЗаголовки.НомерСтроки

СГРУППИРОВАТЬ ПО
   втТаблица.НомерСтроки
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   втТаблица.Реквизит2,
   втТаблица1.Реквизит1
ИЗ
   втТаблица КАК втТаблица
       ВНУТРЕННЕЕ СОЕДИНЕНИЕ втПодходящиеЗаголовки КАК втПодходящиеЗаголовки
           ВНУТРЕННЕЕ СОЕДИНЕНИЕ втТаблица КАК втТаблица1
           ПО втПодходящиеЗаголовки.НомерСтрокиЗаголовка = втТаблица1.НомерСтроки
       ПО втТаблица.НомерСтроки = втПодходящиеЗаголовки.НомерСтроки
           И (втТаблица.Реквизит2 <> "")

Для примера. Я создал табличную часть с двумя реквизитами Реквизит1 и Реквизит2 - оба тип строка.
Сделал такую же таблицу как у тебя всё отлично вывелось
Ну подкорректируй под свои виды проверку на пустые значения, а также источник данных другой сделай, а то я ТЗ загрузил... Ну в общем должен разобраться
25 DimVad
 
10.04.12
11:11
Скажите, F1, эта тема закрыта ?
26 DimVad
 
10.04.12
11:13
Просто я тут обещался сделать документик со справочниками и смастерить отчетик.
27 F1
 
10.04.12
13:09
(25) нет еще, пока не успеваю перевоять предыдущий запрос под свой
28 DimVad
 
10.04.12
13:30
Я в пробной конфе завел два справочника - Материалы и Работы. В работы завел "Работа 1" и "Работа 2", в Материалы - "Материал 1", "Материал 2" ... "Материал 6". Завел документ с именем "ЧудоДокумент", в нем одна ТЧ с именем "ТабличнаяЧасть1", заполнил документ так, как Вы показали в первом посте.
29 DimVad
 
10.04.12
13:31
Начинаю делать запрос. Первая часть :

ВЫБРАТЬ
   ЧудоДокументТабличнаяЧасть1.Ссылка КАК Ссылка,
   ЧудоДокументТабличнаяЧасть1.НомерСтроки КАК НомерСтроки,
   ЧудоДокументТабличнаяЧасть1.Работа
ПОМЕСТИТЬ СписокРабот
ИЗ
   Документ.ЧудоДокумент.ТабличнаяЧасть1 КАК ЧудоДокументТабличнаяЧасть1
ГДЕ
   ЧудоДокументТабличнаяЧасть1.Работа <> ЗНАЧЕНИЕ(Справочник.Работы.ПустаяСсылка)

ИНДЕКСИРОВАТЬ ПО
   Ссылка,
   НомерСтроки
;

т.е. получил таблицу со списками работ
30 DimVad
 
10.04.12
13:33
Вторая часть запроса :

ВЫБРАТЬ
   СписокРабот.Ссылка КАК Ссылка,
   ЧудоДокументТабличнаяЧасть1.НомерСтроки КАК НомерСтроки,
   МАКСИМУМ(СписокРабот.НомерСтроки) КАК НомерСтрокиВСпискеРабот
ПОМЕСТИТЬ СоответствиеНомеровСтрок
ИЗ
   СписокРабот КАК СписокРабот
       ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЧудоДокумент.ТабличнаяЧасть1 КАК ЧудоДокументТабличнаяЧасть1
       ПО СписокРабот.Ссылка = ЧудоДокументТабличнаяЧасть1.Ссылка
           И СписокРабот.НомерСтроки <= ЧудоДокументТабличнаяЧасть1.НомерСтроки

СГРУППИРОВАТЬ ПО
   ЧудоДокументТабличнаяЧасть1.НомерСтроки,
   СписокРабот.Ссылка

ИНДЕКСИРОВАТЬ ПО
   Ссылка,
   НомерСтроки
;

т.е. просто получаю табличку, где беру максимальные номера из первой таблички, но чтоб меньше или равно, чем в ТЧ документа
31 DimVad
 
10.04.12
13:35
Теперь, имея эту волшебную табличку соответствия между номером строки в ТЧ документа и номером в "Списке работ", использую ее как связку :

ВЫБРАТЬ
   ЧудоДокументТабличнаяЧасть1.Ссылка КАК Ссылка,
   ЧудоДокументТабличнаяЧасть1.НомерСтроки КАК НомерСтроки,
   СписокРабот.Работа,
   ЧудоДокументТабличнаяЧасть1.Материал
ИЗ
   Документ.ЧудоДокумент.ТабличнаяЧасть1 КАК ЧудоДокументТабличнаяЧасть1
       ЛЕВОЕ СОЕДИНЕНИЕ СоответствиеНомеровСтрок КАК СоответствиеНомеровСтрок
           ЛЕВОЕ СОЕДИНЕНИЕ СписокРабот КАК СписокРабот
           ПО СоответствиеНомеровСтрок.Ссылка = СписокРабот.Ссылка
               И СоответствиеНомеровСтрок.НомерСтрокиВСпискеРабот = СписокРабот.НомерСтроки
       ПО ЧудоДокументТабличнаяЧасть1.Ссылка = СоответствиеНомеровСтрок.Ссылка
           И ЧудоДокументТабличнаяЧасть1.НомерСтроки = СоответствиеНомеровСтрок.НомерСтроки
ГДЕ
   ЧудоДокументТабличнаяЧасть1.Материал <> ЗНАЧЕНИЕ(Справочник.Материалы.ПустаяСсылка)

УПОРЯДОЧИТЬ ПО
   Ссылка,
   НомерСтроки
32 DimVad
 
10.04.12
13:37
Ну, везде использую еще и связи по ссылке (иначе накроюсь, если документов будет больше, чем один). Попробовал, скопировал первый до, запустил запрос в консоли - вроде все o'k
33 F1
 
10.04.12
13:38
(32)Спасибо большое, попоробую переваять под свою задачу
34 Ахиллес
 
10.04.12
13:43
Автор не будь таким же тупицей, как ток, кто наваял такое уродство, как в (0)
Приведи документ к виду
1. Работа 1 Материал 1
2. Работа 1 Материал 2
3. Работа 1 Материал 3
4. Работа 2 Материал 4
5. Работа 2 Материал 1
6. Работа 2 Материал 5
И все твои проблемы разом решатся.
35 Buster007
 
10.04.12
13:53
(34) вариант решения есть ) если его устраивает, то и приводить не обязательно...
36 Ахиллес
 
10.04.12
13:55
(35) Обязательно. Некрасивые самолёты не летают, а уродские конфы не работают нормально. Если она внешне выглядит, как гомно, то и внутри у ней тоже гомно.
37 Buster007
 
10.04.12
14:27
(36) может он работает во франче и его попросили сделать такой отчет? зачем ему лезть переделывать конфу? тем более, ему скорее всего за это и платить не будут... поэтому выход один, сделать отчет и предложить переделать документ клиенту.
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан