Имя: Пароль:
1C
1С v8
Запрос с разделителями ...
0 crisalis
 
20.12.18
17:18
Добрый день , помогите кто чем может, есть таблица с разделителями, например:
(1)
|НомерСтроки|Номенклатура|
|1          |Разделитель1|
|2          |Товар1      |
|3          |Товар2      |
|4          |Разделитель2|
|3          |Товар3      |

Как превратить (1) в (2), например:
(2)
|НомерСтроки|Номенклатура||Разделитель|
|1          |Разделитель1|Разделитель1|
|2          |Товар1      |Разделитель1|
|3          |Товар2      |Разделитель1|
|4          |Разделитель2|Разделитель2|
|3          |Товар3      |Разделитель2|

Но хочу чтобы это было в запросе без доп.манипуляций с выгрузкой в ТЗ и потом перебор и тд и тп (это у меня есть) Даранее благодарен за любой совет.
1 dka80
 
20.12.18
17:47
Выбрать НомерСтроки, Номенклатура Из Данные
Поместить в ВТ
Где Номенклатура В (Список разделителей)
;
Выбрать Данные.НомерСтроки,
Данные.Номенклатура
ВТ.Номенклатура Как разделитель
Из данные
Левое Соединение ВТ По Данные.НомерСтроки > ВТ.НомерСтроки
2 Очевидно
 
20.12.18
17:54
ВЫБРАТЬ 1 КАК НомерСтроки, "Разделитель1" КАК Номенклатура
ПОМЕСТИТЬ ВТ_НачальнаяТаблица

ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 2, "Товар1"
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 3, "Товар2"
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 4, "Разделитель2"
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 5, "Товар3"
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 6, "Разделитель3"
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 7, "Товар4"
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 8, "Товар5"
;

ВЫБРАТЬ
    ОпределениеСтрокРазделителя.НомерСтроки КАК НачальнаяСтрока,
    МИНИМУМ(ЕСТЬNULL(ОпределениеСтрокРазделителя2.НомерСтроки, ПоследняяСтрока.НомерСтроки + 1)) КАК КонечнаяСтрока,
    ОпределениеСтрокРазделителя.Номенклатура КАК Разделитель
Поместить ВТ_ДиапозоныРазделителей    
    ИЗ
            (ВЫБРАТЬ
                МАКСИМУМ(ВТ_НачальнаяТаблица.НомерСтроки) КАК НомерСтроки,
                ВТ_НачальнаяТаблица.Номенклатура КАК Номенклатура
            ИЗ
                ВТ_НачальнаяТаблица КАК ВТ_НачальнаяТаблица
            ГДЕ
                ВТ_НачальнаяТаблица.Номенклатура ПОДОБНО "Разделитель%"
            
            СГРУППИРОВАТЬ ПО
                ВТ_НачальнаяТаблица.Номенклатура) КАК ОпределениеСтрокРазделителя
                ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
                    МАКСИМУМ(ВТ_НачальнаяТаблица.НомерСтроки) КАК НомерСтроки,
                    ВТ_НачальнаяТаблица.Номенклатура КАК Номенклатура
                ИЗ
                    ВТ_НачальнаяТаблица КАК ВТ_НачальнаяТаблица
                ГДЕ
                    ВТ_НачальнаяТаблица.Номенклатура ПОДОБНО "Разделитель%"
                
                СГРУППИРОВАТЬ ПО
                    ВТ_НачальнаяТаблица.Номенклатура) КАК ОпределениеСтрокРазделителя2
                ПО ОпределениеСтрокРазделителя.НомерСтроки < ОпределениеСтрокРазделителя2.НомерСтроки,
            (ВЫБРАТЬ
                МАКСИМУМ(ВТ_НачальнаяТаблица.НомерСтроки) КАК НомерСтроки
            ИЗ
                ВТ_НачальнаяТаблица КАК ВТ_НачальнаяТаблица) КАК ПоследняяСтрока
        
        СГРУППИРОВАТЬ ПО
            ОпределениеСтрокРазделителя.НомерСтроки,
            ОпределениеСтрокРазделителя.Номенклатура
            ;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ_НачальнаяТаблица.НомерСтроки КАК НомерСтроки,
    ВТ_НачальнаяТаблица.Номенклатура КАК Номенклатура,
    ДиапазоныРазделителей.Разделитель КАК Разделитель
ИЗ
    ВТ_НачальнаяТаблица КАК ВТ_НачальнаяТаблица
        ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ДиапозоныРазделителей КАК ДиапазоныРазделителей
        ПО ВТ_НачальнаяТаблица.НомерСтроки >= ДиапазоныРазделителей.НачальнаяСтрока
            И ВТ_НачальнаяТаблица.НомерСтроки < ДиапазоныРазделителей.КонечнаяСтрока
3 crisalis
 
20.12.18
18:31
(1) Не работает корректно
(2) Спасибо, в консольке вроде всё корректно )))
4 crisalis
 
20.12.18
18:43
(2) Ничего не понял по запросу от Очевидно, но это работает , спасибо ...
5 Alexandr_U1982
 
20.12.18
19:32
(4) Вот так, может быть, будет проще разобраться как работает:

ВЫБРАТЬ
    1 КАК НомерСтроки,
    "Разделитель1" КАК Номенклатура
ПОМЕСТИТЬ ВТ_НачальнаяТаблица

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    2,
    "Товар1"

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    3,
    "Товар2"

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    4,
    "Разделитель2"

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    5,
    "Товар3"

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    6,
    "Разделитель3"

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    7,
    "Товар4"

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    8,
    "Товар5"
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ_НачальнаяТаблица.НомерСтроки КАК НомерСтроки,
    ВТ_НачальнаяТаблица.Номенклатура КАК Номенклатура
ПОМЕСТИТЬ ВТ_ОпределениеСтрокРазделителя
ИЗ
    ВТ_НачальнаяТаблица КАК ВТ_НачальнаяТаблица
ГДЕ
    ВТ_НачальнаяТаблица.Номенклатура ПОДОБНО "Разделитель%"
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    МАКСИМУМ(ВТ_НачальнаяТаблица.НомерСтроки) КАК НомерСтроки
ПОМЕСТИТЬ ВТ_ПоследняяСтрока
ИЗ
    ВТ_НачальнаяТаблица КАК ВТ_НачальнаяТаблица
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ_ОпределениеСтрокРазделителя1.НомерСтроки КАК НачальнаяСтрока,
    МИНИМУМ(ЕСТЬNULL(ВТ_ОпределениеСтрокРазделителя2.НомерСтроки - 1, ВТ_ПоследняяСтрока.НомерСтроки)) КАК КонечнаяСтрока,
    ВТ_ОпределениеСтрокРазделителя1.Номенклатура КАК Разделитель
ПОМЕСТИТЬ ВТ_ДиапозоныРазделителей
ИЗ
    ВТ_ОпределениеСтрокРазделителя КАК ВТ_ОпределениеСтрокРазделителя1
        ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ОпределениеСтрокРазделителя КАК ВТ_ОпределениеСтрокРазделителя2
        ПО ВТ_ОпределениеСтрокРазделителя1.НомерСтроки < ВТ_ОпределениеСтрокРазделителя2.НомерСтроки
        ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ПоследняяСтрока КАК ВТ_ПоследняяСтрока
        ПО (ИСТИНА)

СГРУППИРОВАТЬ ПО
    ВТ_ОпределениеСтрокРазделителя1.НомерСтроки,
    ВТ_ОпределениеСтрокРазделителя1.Номенклатура
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ_НачальнаяТаблица.НомерСтроки КАК НомерСтроки,
    ВТ_НачальнаяТаблица.Номенклатура КАК Номенклатура,
    ДиапазоныРазделителей.Разделитель КАК Разделитель
ИЗ
    ВТ_НачальнаяТаблица КАК ВТ_НачальнаяТаблица
        ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ДиапозоныРазделителей КАК ДиапазоныРазделителей
        ПО (ВТ_НачальнаяТаблица.НомерСтроки МЕЖДУ ДиапазоныРазделителей.НачальнаяСтрока И ДиапазоныРазделителей.КонечнаяСтрока)
6 Конструктор1С
 
20.12.18
20:10
Зачем лепить многоэтажные запросы, если можно обойтись несколькими строками кода?
7 Alexandr_U1982
 
20.12.18
20:31
(6)Запрос может отработать быстрее.
Затраты памяти могут быть меньше, чем при работе с таблицами значений.
8 crisalis
 
20.12.18
20:46
(7) спасибо!!!
9 Конструктор1С
 
21.12.18
09:09
(7) очень спорное утверждение. Код получился бы более компактным и удобочитаемым, чем запрос. На написание кода ушло бы меньше времени, чем на написание сложного запроса. Так в чем профит-то? Сомнительный выигрыш в производительности там, где вопрос производительности скорее всего и не стоял?
10 Конструктор1С
 
21.12.18
09:11
"До создания полностью работоспособной программы найти узкие места в коде почти невозможно. Программисты очень плохо угадывают, на какие 4% кода приходятся 50% времени выполнения, поэтому, оптимизируя код по мере его написания, они будут тратить примерно 96% времени на оптимизацию кода, который не нуждается в оптимизации. На оптимизацию по-настоящему важных 4% кода времени у них уже не останется"

(с) С. Макконел, "Совершенный код"
11 crisalis
 
21.12.18
11:11
(9) да вы правы, но запрос будет отрабатывать быстрее...
Да и очень удобно в запросе группировать, обходить по группировка, фильтровать и тд и тп

ТАК ЧТО ЗАПРОСЫ ЭТО ТО ЧТО ДОКТОР ПРОПИСАЛ...
12 Конструктор1С
 
21.12.18
11:36
(11) запрос не панацея. Нужно использовать его к месту, а не везде, где вздумается
Закон Брукера: Даже маленькая практика стоит большой теории.