Имя: Пароль:
1C
1С v8
Как отследить последний проход цикла?
0 svird
 
22.08.17
11:42
Леплю в запросе такую конструкцию:
    |            ГДЕ";
                 Для Инд = 0 По СписокОбрабатываемыхДокументов.Количество()-1 Цикл
                     Запрос.Текст = Запрос.Текст + " ПартииТоваровНаСкладахОстаткиИОбороты.Регистратор ССЫЛКА Документ."+ СписокОбрабатываемыхДокументов.Получить(Инд).Значение + " ИЛИ ";
                 КонецЦикла;
                 Запрос.Текст=Запрос.Текст+       "

Ругается на последнее ИЛИ
1 Вафель
 
22.08.17
11:43
трезай последние ххх символов
2 h-sp
 
22.08.17
11:46
Для Инд = 0 По СписокОбрабатываемыхДокументов.Количество()-1 Цикл
                  
  Если Инд = СписокОбрабатываемыхДокументов.Количество()-1 Тогда
Запрос.Текст = Запрос.Текст + " ПартииТоваровНаСкладахОстаткиИОбороты.Регистратор ССЫЛКА Документ."+ СписокОбрабатываемыхДокументов.Получить(Инд).Значение;

Иначе

            Запрос.Текст = Запрос.Текст + " ПартииТоваровНаСкладахОстаткиИОбороты.Регистратор ССЫЛКА Документ."+ СписокОбрабатываемыхДокументов.Получить(Инд).Значение + " ИЛИ ";

  КонецЕсли;

               КонецЦикла;
3 svird
 
22.08.17
11:49
Спасибо
4 FIXXXL
 
22.08.17
11:52
(2) лучше переопределяй текст " ИЛИ " по условию
ибо потом глаза сломаешь сопровождать такие дубли типа

Запрос.Текст = Запрос.Текст + " ПартииТоваровНаСкладахОстаткиИОбороты.Регистратор ССЫЛКА Документ."+ СписокОбрабатываемыхДокументов.Получить(Инд).Значение;

Иначе

            Запрос.Текст = Запрос.Текст + " ПартииТоваровНаСкладахОстаткиИОбороты.Регистратор ССЫЛКА Документ."+ СписокОбрабатываемыхДокументов.Получить(Инд).Значение + " ИЛИ ";

типа:

Если Инд = СписокОбрабатываемыхДокументов.Количество()-1 Тогда
ТекстИЛИ = "";
Иначе
ТекстИЛИ = " ИЛИ ";
Запрос.Текст = Запрос.Текст + " ПартииТоваровНаСкладахОстаткиИОбороты.Регистратор ССЫЛКА Документ."+ СписокОбрабатываемыхДокументов.Получить(Инд).Значение + ТекстИЛИ;
5 vde69
 
22.08.17
11:56
|            ГДЕ ЛОЖЬ";
                 Для Инд = 0 По СписокОбрабатываемыхДокументов.Количество()-1 Цикл
                     Запрос.Текст = Запрос.Текст + " ИЛИ   ПартииТоваровНаСкладахОстаткиИОбороты.Регистратор ССЫЛКА Документ."+ СписокОбрабатываемыхДокументов.Получить(Инд).Значение;
                 КонецЦикла;
                 Запрос.Текст=Запрос.Текст+       "
6 Злопчинский
 
22.08.17
11:59
Цикл
А = А+РазделительСтрок
КонецЦикла

А = СтрЗаменить(СокрЛП(А),РазделительСтрок," ИЛИ ");
7 Галахад
 
гуру
22.08.17
12:00
(6) А последнее или? :-)
8 Timon1405
 
22.08.17
12:07
в типовых есть
Процедура УдалитьПоследнийСимволВСтроке(Текст, ЧислоСимволов) Экспорт
    Текст = Лев(Текст, СтрДлина(Текст) - ЧислоСимволов);
КонецПроцедуры
9 VladZ
 
22.08.17
12:15
(0) Поставь "ИЛИ вначале:

+ "ИЛИ ПартииТоваровНаСкладахОстаткиИОбороты.Регистратор ССЫЛКА Документ."+ СписокОбрабатываемыхДокументов.Получить(Инд).Значение;
10 Лефмихалыч
 
22.08.17
12:15
Хосспади!

Текст = "";
Для счц=1 по 10 цикл
   Текст = Текст + символы.ПС + "(текст условия)";
КонецЦикла

Текст = СтрЗаменить(СокрЛП(Текст), Символы.ПС, " ИЛИ ");
11 1dvd
 
22.08.17
12:17
ТекстУсловия = "";
Для Каждого ОбрабатываемыйДокумент Из СписокОбрабатываемыхДокументов Цикл
    Если ТекстУсловия = "" Тогда
        ТекстУсловия = "ПартииТоваровНаСкладахОстаткиИОбороты.Регистратор ССЫЛКА Документ."+ ОбрабатываемыйДокумент.Значение;
    Иначе
        ТекстУсловия = ТекстУсловия + "ИЛИ ПартииТоваровНаСкладахОстаткиИОбороты.Регистратор ССЫЛКА Документ."+ ОбрабатываемыйДокумент.Значение;
    КонецЕсли;
КонецЦикла;
Запрос.Текст = Запрос.Текст + ТекстУсловия;
12 Злопчинский
 
22.08.17
12:23
(7) ну так как раз отрезаем последнее ИЛИ после которого ничего не идет
13 singlych
 
22.08.17
12:24
ГДЕ ТИПЗНАЧЕНИЯ(ПартииТоваровНаСкладахОстаткиИОбороты.Регистратор) В (&МассивТипов)
14 Злопчинский
 
22.08.17
12:24
(10) опоздун! ;-)
15 Вафель
 
22.08.17
12:34
(10) нельзя так ибоусловие будет начинаться с ИЛИ
16 1dvd
 
22.08.17
12:36
(15) там СокрЛП
17 Вафель
 
22.08.17
12:37
За такое использование хаков нужно по рукам линейкой
18 Basilio
 
22.08.17
12:38
(15) ЭтоПервыйПроход = Истина

НачалоЦикла
...
ТекстЗапроса = ТекстЗапроса + ?(ЭтоПервыйПроход, "", " Или ") + ТекстУсловия;
ЭтоПервыйПроход = Ложь;
...
КонецЦикла
19 Злопчинский
 
22.08.17
12:38
(17) ага, а за
Флаг = 3-Флаг
- 5 лет без права переписки?
20 Лефмихалыч
 
22.08.17
12:39
(15) можно. Не будет. Потому что СокрЛП().
21 Fragster
 
гуру
22.08.17
12:39
текст = "...
|Где
|Ложь ";

Цикл
"| ИЛИ " + Условие
КонецЦикла;
22 Fragster
 
гуру
22.08.17
12:39
ну, или воспользоваться функцией СтрСоединить(<Строки>, <Разделитель>) с массивом условий
23 Лефмихалыч
 
22.08.17
12:40
(17) это за 10 строк там, где хватит и одной, надо по рукам линейкой
24 Вафель
 
22.08.17
12:41
(23) Читабельность важнее минимального количества строк
25 Лефмихалыч
 
22.08.17
12:42
(24) одна строчка в десять раз читабельнее десяти. Особенно, когда речь про образчики из этой ветки
26 Fragster
 
гуру
22.08.17
12:42
ну а вообще за формирование текст запроса через соединение строк - сразу по рукам линейкой.
Есть за СтрЗаменить(Запрос.Текст, "&_УсловиеТипов", СформированнаяСтрокаУсловия)
27 Лефмихалыч
 
22.08.17
12:45
У дельфина вообще - 50 сантиметров. Расходимся
28 Вафель
 
22.08.17
12:46
(25) далеко не факт
29 Вафель
 
22.08.17
12:47
Эта задача решается на СКД вообще без всякого кода
30 lexasan
 
22.08.17
12:47
Внесу свою лепту

Для Инд = 0 По СписокОбрабатываемыхДокументов.Количество()-1 Цикл
    Запрос.Текст = Запрос.Текст + ?(Инд=0, "", " ИЛИ ") +" ПартииТоваровНаСкладахОстаткиИОбороты.Регистратор ССЫЛКА Документ."+ СписокОбрабатываемыхДокументов.Получить(Инд).Значение;
КонецЦикла;
31 Лефмихалыч
 
22.08.17
12:49
(29) или на построителе хотя б.
Но бывает, что нагородить вот такой частокол эффективнее, чем существующий 100500лет механизм на скд переводить
32 Базис
 
naïve
22.08.17
13:02
ГДЕ
   Ложь

(Или 1 условие)
(Или 1 условие)
...
(Или N условие)
33 Вафель
 
22.08.17
13:03
(31) технический долг потом скажет о себе
34 dmpl
 
22.08.17
13:04
(0) Добавь в конце ИСТИНА.
35 1dvd
 
22.08.17
13:05
(34) Садись, два!
36 dmpl
 
22.08.17
13:07
(35) Эх, вот зачем ты? Я же научить хотел ;)
37 dmpl
 
22.08.17
13:07
+(36) И да, цель-то будет достигнута - на последнее ИЛИ ругаться перестанет :)
38 Быдло замкадное
 
22.08.17
13:20
Добавь в конце  + " ЛОЖЬ"
39 1dvd
 
22.08.17
14:12
(36) <Любое условие> ИЛИ ИСТИНА
всегда вернёт истину
40 r_i_n_i_k
 
22.08.17
14:13
Тогда ЛОЖЬ подойдёт же
41 Мыш
 
22.08.17
14:27
Конструктор запросов решит проблему )
42 dmpl
 
23.08.17
07:11
(39) Дык нельзя же готовое на блюдечке подавать - надо чтобы и ТС немного подумал ;)
43 Интересно интересно
 
23.08.17
07:19
(41) Нет. Его забанили: http://www.forum.mista.ru/users.php?name=Конструктор%20Запросов
44 1dvd
 
23.08.17
07:26
Чем тут КЗ поможет?
45 Segate
 
23.08.17
08:30
(0) а зачем отслеживать последнее или, когда можно отследить первый прогон?

Если не  первый тогда
ТекстЗапроса = текстзапроса+ "Или"
Конецесли

и будет тебе счастье... не?
46 Рэйв
 
23.08.17
08:40
(45)У него это ИЛИ должно в последнем не ставиться:)
47 Злопчинский
 
23.08.17
08:40
(45) какая нафиг разница - отслеживать первый или последний?
48 vde69
 
23.08.17
08:49
самое простое решение уже давно было... например в (5)
49 Segate
 
23.08.17
08:52
(45) ну... последний прогон в цикле "Пока" ты толком не отследишь без доп манипуляций типа вычисления количества итераций цикла заранее... а так ничего вычеслять не надо и от количества итераций ничего не зависит...
50 Segate
 
23.08.17
08:53
(49) просто добавить ложь - это не спортивно же xD
51 Asmody
 
23.08.17
09:27
(0) Для кого в 1С схему запроса придумали?
52 Мыш
 
23.08.17
09:30
(44) Ошибся. Схема, конечно же.
(51) Для тех, кто читает документацию.
53 Мыш
 
23.08.17
09:32
ОператорВыбратьСхемыЗапроса (QuerySchemaSelectOperator)
Отбор (Filter)
Использование:

Только чтение.
Описание:

Тип: ВыраженияСхемыЗапроса.
Содержит выражения отбора.
Соответствует выражению ГДЕ языка запросов.

Доступность:

Сервер, толстый клиент, внешнее соединение.
54 Fragster
 
гуру
23.08.17
10:58
(51) схема запроса относительно СКД недоделанная, причем очень сильно. построитель и СтрЗаменить (когда его не хватает) намного меньше букв требуют и проще для дальнейшего сопровождения.
55 Мыш
 
23.08.17
11:05
(54) Грузовик КамАЗ сильно недоделан относительно роторного экскаватора.
56 Fragster
 
гуру
23.08.17
11:16
(55) ну вот, например, кусок для обновления одной записи РС без её чтения через менеджер:

    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    ДокЗаявкаКлиента.Ссылка КАК ЗаявкаКлиента,
    |    // тут новые значения, которые надо проставить в запись РС
    |    &Звездочка
    |ИЗ
    |    Документ.ЗаявкаКлиента КАК ДокЗаявкаКлиента
    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДанныеЗаявкиКлиента КАК ДанныеЗаявкиКлиента
    |        ПО ДокЗаявкаКлиента.Ссылка = ДанныеЗаявкиКлиента.ЗаявкаКлиента
    |        ЛЕВОЕ СОЕДИНЕНИЕ ///
    |ГДЕ
    |    ДокЗаявкаКлиента.Ссылка В(&ЗаявкаКлиента)";

    //СхемаЗапроса = Новый СхемаЗапроса;
    //СхемаЗапроса.УстановитьТекстЗапроса(Запрос.Текст);
    //ОператорВыбор = СхемаЗапроса.ПакетЗапросов[0].Операторы[0]; // тут мы вынуждены завязываться на порядок подзапросов и таблиц секции ИЗ, т.е. тут можно выстрелить себе в ногу
    //Для каждого ИсточникСхемы Из ОператорВыбор.Источники цикл // куча бессмысленных обходов
    //    Если ТипЗНЧ(ИсточникСхемы.Источник) = Тип("ТаблицаСхемыЗапроса") И ИсточникСхемы.Источник.ИмяТаблицы = "РегистрСведений.ДанныеЗаявкиКлиента" Тогда
    //        Для каждого Поле Из ИсточникСхемы.Источник.ДоступныеПоля Цикл
    //            ОператорВыбор.ВыбираемыеПоля.Добавить(Поле);
    //        КонецЦикла;
    //    КонецЕсли;
    //КонецЦикла;
    //
    //Запрос.Текст = СхемаЗапроса.ПолучитьТекстЗапроса();

    Запрос.Текст = СтрЗаменить(Запрос.Текст, "&
Звездочка", "ДанныеЗаявкиКлиента.*"); // ну, либо сделать это одной строкой.
57 1dvd
 
23.08.17
11:18
развели, блин, демагогию
58 Вафель
 
23.08.17
11:18
(56) А зачем так? Почему бы стразу звездочку не на написать?
59 Мыш
 
23.08.17
11:19
(57) Можно накидать обратных примеров. Но какой смысл?
Инструмент подбирается под задачу. И если он не подходит к энному количеству задач, то не значит, что он в принципе не годится. Не говоря уж о том, что "недоделан". Топор недоделан, пилить не может.
60 Fragster
 
гуру
23.08.17
11:19
(58) потому что как только ты воспользуешься конструктором - звездочка превратится в тыкву. А потом ты превратишься в тыкву после добавления или удаления поля в регистр
61 Мыш
 
23.08.17
11:20
(59) на (56), конечно
62 Fragster
 
гуру
23.08.17
11:23
(59) Ну накидай.
пока нашел одно использование, где без нее никак (ну, или сильно сложнее) - это удаление прям целых таблиц из запросов (например для запроса ДС с колонкой внешних пользователей для пользователей, у которых нет доступа к внешним пользователям). Но из-за того, что для этого нужно делать кучу циклов в циклах, это также неудобно. Да и случай не самый частый.
63 Вафель
 
23.08.17
11:24
(60) Зачем конструктором такой простой запрос?
64 Fragster
 
гуру
23.08.17
11:26
(63) во первых, он не простой - из него вырезаны куски получения обновленных значений для полей РС. во вторых - конструктор - самый простой способ проверить запрос на корректность и отформатировать его.
65 Мыш
 
23.08.17
11:26
(62) Программное добавление своего поля в запрос динамического списка.
66 Мыш
 
23.08.17
11:27
+(65) > Да и случай не самый частый

Я и не пишу, что это исключительный инструмент. Но своя область применения есть.
67 Fragster
 
гуру
23.08.17
11:31
(66) ИМХО, в (0) случай, когда схема запроса проигрывает СтрЗаменить ;)
68 Мыш
 
23.08.17
11:35
(67) Это уже дискутабельно ;)