Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Запрос с разделителями ...

Запрос с разделителями ...
Я
   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|

Но хочу чтобы это было в запросе без доп.манипуляций с выгрузкой в ТЗ и потом перебор и тд и тп (это у меня есть) Даранее благодарен за любой совет.
 
 
   dka80
 
1 - 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.НомерСтроки,
            (ВЫБРАТЬ
                МАКСИМУМ(ВТ_НачальнаяТаблица.НомерСтроки) КАК НомерСтроки
            ИЗ
                ВТ_НачальнаяТаблица КАК ВТ_НачальнаяТаблица) КАК ПоследняяСтрока
        
        СГРУППИРОВАТЬ ПО
            ОпределениеСтрокРазделителя.НомерСтроки,
            ОпределениеСтрокРазделителя.Номенклатура
            ;

////////////////////////////////////////////////////////////////////////////////

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

////////////////////////////////////////////////////////////////////////////////

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

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

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

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует