Имя: Пароль:
1C
1С v8
Запрос
0 ОффПланктон
 
30.10.12
16:02
Как сделать Запрос на количество символов, предположим в Реквизите ИНН >=10
1 ОффПланктон
 
30.10.12
16:02
лучше <=
2 Maxus43
 
30.10.12
16:03
запрос чистый? или СКД?
3 ОффПланктон
 
30.10.12
16:07
Процедура КнопкаВыполнитьНажатие(Кнопка)
   МойЗапрос = Новый Запрос();
   МойЗапрос.Текст = "ВЫБРАТЬ
   |    Контрагенты.Ссылка,
   |    Контрагенты.Комментарий,
   |    Контрагенты.ИНН
   |ИЗ
   |    Справочник.Контрагенты КАК Контрагенты
   |ГДЕ
   |    Контрагенты.Наименование ПОДОБНО ""%завод%""
   |    И Контрагенты.Комментарий <> &ПустоеЗначение
   |    И Контрагенты.ИНН <> &ПустоеЗначение";
   МойЗапрос.УстановитьПараметр("ПустоеЗначение","");
   Выборка = МойЗапрос.Выполнить().Выбрать();
4 ОффПланктон
 
30.10.12
16:08
не хочет перезаписывать из-за того что параметр ИНН в некоторых случаях больше допустимого значения (вроде 10 знаков)
5 Defender aka LINN
 
30.10.12
16:10
НЕ (ИНН ПОДОБНО [0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9])
И НЕ (ИНН ПОДОБНО [0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9])
6 palpetrovich
 
30.10.12
16:11
(4) кто "не хочет перезаписывать"?
может проще на этапе выборки из запроса проверять?
7 Лефмихалыч
 
30.10.12
16:12
ПОДОБНО "___________"
"_" - это любой символ
8 Лефмихалыч
 
30.10.12
16:13
а, даже так "_________%" - 10 и более, а не 11
9 ОффПланктон
 
30.10.12
16:15
как в коде это будет выглядеть, сорь за наивность - новичек
10 palpetrovich
 
30.10.12
16:16
(8) плюсик те за это, не знал. правда и сейчас не знаю где может пригодится  :)
11 palpetrovich
 
30.10.12
16:17
(10)
ВЫБРАТЬ
   Контрагенты.Ссылка
ИЗ
   Справочник.Контрагенты КАК Контрагенты
ГДЕ
   НЕ Контрагенты.Наименование ПОДОБНО  "_________%"
12 palpetrovich
 
30.10.12
16:17
(11) - > (9) :)
13 Reset
 
30.10.12
16:21
Условие "длина меньше N"
Подстрока(Контрагенты.Наименование,N,1)=""

Условие "длина меньше или равно N"
Подстрока(Контрагенты.Наименование,N+1,1)=""

Условие "длина больше N"
Подстрока(Контрагенты.Наименование,N+1,1)<>""
14 GANR
 
30.10.12
16:34
(0) Под справочник "Контрагенты" допили уже сам...

ВЫБРАТЬ
   НаборСтрок.Строчка КАК Строчка,
   МАКСИМУМ(Числа_до_125.ОчередноеЧисло) КАК НомерСимвола
ИЗ
   (ВЫБРАТЬ
       "123456789" КАК Строчка
   
   ОБЪЕДИНИТЬ ВСЕ
   
   ВЫБРАТЬ
       "1234567890"
   
   ОБЪЕДИНИТЬ ВСЕ
   
   ВЫБРАТЬ
       "123456789011156") КАК НаборСтрок,
   (ВЫБРАТЬ
       5 * 5 * Цифры_1.Цифра + 5 * Цифры_2.Цифра + Цифры_3.Цифра КАК ОчередноеЧисло
   ИЗ
       (ВЫБРАТЬ
           0 КАК Цифра
       
       ОБЪЕДИНИТЬ ВСЕ
       
       ВЫБРАТЬ
           1
       
       ОБЪЕДИНИТЬ ВСЕ
       
       ВЫБРАТЬ
           2
       
       ОБЪЕДИНИТЬ ВСЕ
       
       ВЫБРАТЬ
           3
       
       ОБЪЕДИНИТЬ ВСЕ
       
       ВЫБРАТЬ
           4) КАК Цифры_1
           ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
               0 КАК Цифра
           
           ОБЪЕДИНИТЬ ВСЕ
           
           ВЫБРАТЬ
               1
           
           ОБЪЕДИНИТЬ ВСЕ
           
           ВЫБРАТЬ
               2
           
           ОБЪЕДИНИТЬ ВСЕ
           
           ВЫБРАТЬ
               3
           
           ОБЪЕДИНИТЬ ВСЕ
           
           ВЫБРАТЬ
               4) КАК Цифры_2
           ПО (ИСТИНА)
           ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
               0 КАК Цифра
           
           ОБЪЕДИНИТЬ ВСЕ
           
           ВЫБРАТЬ
               1
           
           ОБЪЕДИНИТЬ ВСЕ
           
           ВЫБРАТЬ
               2
           
           ОБЪЕДИНИТЬ ВСЕ
           
           ВЫБРАТЬ
               3
           
           ОБЪЕДИНИТЬ ВСЕ
           
           ВЫБРАТЬ
               4) КАК Цифры_3
           ПО (ИСТИНА)) КАК Числа_до_125
ГДЕ
   ПОДСТРОКА(НаборСтрок.Строчка, Числа_до_125.ОчередноеЧисло, 1) <> ""

СГРУППИРОВАТЬ ПО
   НаборСтрок.Строчка
15 GANR
 
30.10.12
16:36
+(14) В запросе поле "НомерСимвола" означает "КоличествоСимволовВСтроке"
16 GANR
 
30.10.12
16:38
(0) попробуй (14) прямо в консоли - там нет привязки к конфигурации
17 ОффПланктон
 
30.10.12
16:51
(14) мозгодробильный код, ниче не понял
18 GANR
 
30.10.12
16:58
(17) Это, к сожалению, единственное, что сработает в рамках 1С-запросов. Стандартной нумерации нет. Он не столько сложен, сколько длинен. Например, этот подзапрос

ВЫБРАТЬ
       5 * 5 * Цифры_1.Цифра + 5 * Цифры_2.Цифра + Цифры_3.Цифра КАК ОчередноеЧисло
   ИЗ
       (ВЫБРАТЬ
           0 КАК Цифра
       
       ОБЪЕДИНИТЬ ВСЕ
       
       ВЫБРАТЬ
           1
       
       ОБЪЕДИНИТЬ ВСЕ
       
       ВЫБРАТЬ
           2
       
       ОБЪЕДИНИТЬ ВСЕ
       
       ВЫБРАТЬ
           3
       
       ОБЪЕДИНИТЬ ВСЕ
       
       ВЫБРАТЬ
           4) КАК Цифры_1
           ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
               0 КАК Цифра
           
           ОБЪЕДИНИТЬ ВСЕ
           
           ВЫБРАТЬ
               1
           
           ОБЪЕДИНИТЬ ВСЕ
           
           ВЫБРАТЬ
               2
           
           ОБЪЕДИНИТЬ ВСЕ
           
           ВЫБРАТЬ
               3
           
           ОБЪЕДИНИТЬ ВСЕ
           
           ВЫБРАТЬ
               4) КАК Цифры_2
           ПО (ИСТИНА)
           ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
               0 КАК Цифра
           
           ОБЪЕДИНИТЬ ВСЕ
           
           ВЫБРАТЬ
               1
           
           ОБЪЕДИНИТЬ ВСЕ
           
           ВЫБРАТЬ
               2
           
           ОБЪЕДИНИТЬ ВСЕ
           
           ВЫБРАТЬ
               3
           
           ОБЪЕДИНИТЬ ВСЕ
           
           ВЫБРАТЬ
               4) КАК Цифры_3
           ПО (ИСТИНА)
Предназначен для генерации последовательности чисел до 124 включительно

0
1
...
123
124

Эта функция
ПОДСТРОКА(НаборСтрок.Строчка, Числа_до_125.ОчередноеЧисло, 1)
вернет "" если 2-й аргумент Числа_до_125.ОчередноеЧисло больше длины строки

Ну а

МАКСИМУМ(Числа_до_125.ОчередноеЧисло) - максимальный номер символа в строке

Вот и всё!
19 palpetrovich
 
30.10.12
16:58
(17) поддерживаю :)
а чем (11) не нравится?
20 GANR
 
30.10.12
16:59
(19) как вычислить длину строки при необходимости?
21 Reset
 
30.10.12
17:00
(17) Код для определения длины строки (названного НомерСимвола) в запросе.
Если само значение длины не важно, а важно только больше/меньше ли оно какого-л значения, достаточно (13), ну или вариантов с Подобно
22 palpetrovich
 
30.10.12
17:03
(20) а где в сабже "вычислить длину строки "?
там только про "<=10"
23 GANR
 
30.10.12
17:03
(17) Открой (14) и генератор чисел (18) в обработке "консоль запросов" - и всё станет ясно
24 Reset
 
30.10.12
17:04
(14) Я бы Цифры в отдельную ВТ сначала положил - меньше текст запроса почти в 3 раза
25 GANR
 
30.10.12
17:04
(22) >Как сделать Запрос на количество символов
26 Лефмихалыч
 
30.10.12
17:04
Запрос не умеет вычислять длину строки
27 1Страх
 
30.10.12
17:05
(26) смотря какой ))
28 Reset
 
30.10.12
17:06
(26) Это можно сымитировать через соединение с таблицей числовых констант, выше пример
29 GANR
 
30.10.12
17:06
(27) 1С. Можно прямой запрос к SQL, конечно, сваять, но... Имхо, проще (14).
30 ОффПланктон
 
30.10.12
17:14
(11) пишет
31 ОффПланктон
 
30.10.12
17:15
(11)
Неопознанный оператор
   |   НЕ Контрагенты.ИНН ПОДОБНО  "__________<<?>>%"
32 Reset
 
30.10.12
17:16
(31) Кавычки нужно двойные
33 ОффПланктон
 
30.10.12
17:17
у меня проблема в том, что в некоторых полях докумета больше символов забито, больше 10-ти, и когда я пытаюсь перепровести спомощью запроса, он мне кукишь)
34 ОффПланктон
 
30.10.12
17:18
(32) |   НЕ Контрагенты.ИНН ПОДОБНО  ""__________%""

все равно
Проверка клиентского приложения {Форма.Форма(13,49)}: Ожидается символ ';'
   |   НЕ Контрагенты.ИНН ПОДОБНО  ""__________%""<<?>>
35 Reset
 
30.10.12
17:20
(34) Ожидается символ ';'
36 ОффПланктон
 
30.10.12
17:22
Ставил в конце ; пишет тоже самое
37 Reset
 
30.10.12
17:23
ять.

НЕ Контрагенты.ИНН ПОДОБНО  ""__________%""";
38 GANR
 
30.10.12
17:24
(36) Код процедуры, целиком, в студию !!!
39 ОффПланктон
 
30.10.12
17:24
Процедура КнопкаВыполнитьНажатие(Кнопка)
   МойЗапрос = Новый Запрос();
   МойЗапрос.Текст = "ВЫБРАТЬ
   |    Контрагенты.Ссылка,
   |    Контрагенты.Комментарий,
   |    Контрагенты.ИНН
   |ИЗ
   |    Справочник.Контрагенты КАК Контрагенты
   |ГДЕ
   |    Контрагенты.Наименование ПОДОБНО ""%завод%""
   |    И Контрагенты.Комментарий <> &ПустоеЗначение
   |   НЕ Контрагенты.ИНН ПОДОБНО ""__________%""
   МойЗапрос.УстановитьПараметр("ПустоеЗначение","");
   //МойЗапрос.УстановитьПараметр("10",)
   Выборка = МойЗапрос.Выполнить().Выбрать();
   Пока Выборка.Следующий() Цикл
       //Если Выборка.ИНН  Тогда Иначе
       НоваяСтрока = ТабличноеПоле1.Добавить();
       НоваяСтрока.Ссылка = Выборка.Ссылка;
       НоваяСтрока.КоментДо = Выборка.Комментарий;
       Объект = Выборка.Ссылка.ПолучитьОбъект();
       Объект.Комментарий = "№№№" + Выборка.Комментарий;
       Объект.Записать();
       НоваяСтрока.КоментПосле = Объект.Комментарий;
   КонецЦикла
КонецПроцедуры
40 GANR
 
30.10.12
17:27
(39) Замени его у себя на это - 2 символа после текста запроса "; добавил

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

   Выборка = МойЗапрос.Выполнить().Выбрать();
   Пока Выборка.Следующий() Цикл
       //Если Выборка.ИНН  Тогда Иначе

       НоваяСтрока = ТабличноеПоле1.Добавить();
       НоваяСтрока.Ссылка = Выборка.Ссылка;
       НоваяСтрока.КоментДо = Выборка.Комментарий;
       Объект = Выборка.Ссылка.ПолучитьОбъект();
       Объект.Комментарий = "№№№" + Выборка.Комментарий;
       Объект.Записать();
       НоваяСтрока.КоментПосле = Объект.Комментарий;
   КонецЦикла
КонецПроцедуры
41 ОффПланктон
 
30.10.12
17:34
(40) ошибка в конф. ушла, захожу в отладку пишет

{Форма.Форма(16)}: Ошибка при вызове метода контекста (Выполнить): {(10, 4)}: Синтаксическая ошибка "НЕ"
<<?>>НЕ Контрагенты.ИНН ПОДОБНО "__________%"
   Выборка = МойЗапрос.Выполнить().Выбрать();
по причине:
{(10, 4)}: Синтаксическая ошибка "НЕ"
<<?>>НЕ Контрагенты.ИНН ПОДОБНО "__________%"
42 GANR
 
30.10.12
17:38
(41) Добавь И перед последним условием
МойЗапрос.Текст = "ВЫБРАТЬ
   |    Контрагенты.Ссылка,
   |    Контрагенты.Комментарий,
   |    Контрагенты.ИНН
   |ИЗ
   |    Справочник.Контрагенты КАК Контрагенты
   |ГДЕ
   |    Контрагенты.Наименование ПОДОБНО ""%завод%""
   |    И Контрагенты.Комментарий <> &ПустоеЗначение
   |   И НЕ Контрагенты.ИНН ПОДОБНО ""__________%""";
43 ОффПланктон
 
30.10.12
17:41
(41) он тогда вообще меняет у тех Контрагентов у которых нет ИНН вообще (только)
44 Reset
 
30.10.12
17:43
(43) Ты сам такое условие задал, длина меньше 10. Ноль - меньше.
45 GANR
 
30.10.12
17:49
(43) А если запрос заменить на это?

   МойЗапрос.Текст =
   "ВЫБРАТЬ
   |    Контрагенты.Ссылка,
   |    Контрагенты.Комментарий,
   |    Контрагенты.ИНН
   |ИЗ
   |    Справочник.Контрагенты КАК Контрагенты
   |ГДЕ
   |    Контрагенты.Наименование ПОДОБНО ""%завод%""
   |    И Контрагенты.Комментарий <> &ПустоеЗначение
   |    И ПОДСТРОКА(Контрагенты.ИНН, 10, 1) <> """"";
46 GANR
 
30.10.12
18:01
МойЗапрос = Новый Запрос;
   МойЗапрос.Текст =
   "ВЫБРАТЬ
   |    Контрагенты.Ссылка,
   |    Контрагенты.Комментарий,
   |    Контрагенты.ИНН
   |ИЗ
   |    Справочник.Контрагенты КАК Контрагенты
   |ГДЕ
   |    Контрагенты.Наименование ПОДОБНО ""%завод%""
   |    И (ВЫРАЗИТЬ(Контрагенты.Комментарий КАК СТРОКА(500))) <> """"
   |    И ПОДСТРОКА(Контрагенты.ИНН, 10, 1) <> """"";
47 GANR
 
30.10.12
18:02
(ВЫРАЗИТЬ(Контрагенты.Комментарий КАК СТРОКА(500))) - это для строк неограниченной длины, коим является реквизит "Комментарий"
48 GANR
 
30.10.12
18:02
ну?
49 ОффПланктон
 
30.10.12
18:02
мин.
50 ОффПланктон
 
30.10.12
18:03
висит база)
51 GANR
 
30.10.12
18:04
Этот цикл

  Пока Выборка.Следующий() Цикл
       //Если Выборка.ИНН  Тогда Иначе

       НоваяСтрока = ТабличноеПоле1.Добавить();
       НоваяСтрока.Ссылка = Выборка.Ссылка;
       НоваяСтрока.КоментДо = Выборка.Комментарий;
       Объект = Выборка.Ссылка.ПолучитьОбъект();
       Объект.Комментарий = "№№№" + Выборка.Комментарий;
       Объект.Записать();
       НоваяСтрока.КоментПосле = Объект.Комментарий;
   КонецЦикла

наверное?
52 GANR
 
30.10.12
18:11
(50) Всё висит? Отладка \ остановить, если через отладчик делаешь сделай и Отладка \ Текущая строка сделай. Где он хоть висит?
53 GANR
 
30.10.12
18:23
Тьху-ё это
(ВЫРАЗИТЬ(Контрагенты.Комментарий КАК СТРОКА(500))) <> """"
надо заменить на это
(ВЫРАЗИТЬ(Контрагенты.Комментарий КАК СТРОКА(500))) <> ""
54 GANR
 
30.10.12
18:25
+(50). (53)  отбой! это для консоли запросов
55 ОффПланктон
 
31.10.12
09:53
Пока сделал через Попытку), сейчас другой вопрос, как сделать так чтобы он находил вначале примечания символ № (количество любое) и удалил, поможете?
56 ОффПланктон
 
31.10.12
09:54
то есть обратную процедуру (с помощью запроса)
57 GANR
 
31.10.12
10:04
(55) Запрос должен быть приблизительно такой:

   МойЗапрос = Новый Запрос;
   МойЗапрос.Текст =
   "ВЫБРАТЬ
   |    Контрагенты.Ссылка
   |ИЗ
   |    Справочник.Контрагенты КАК Контрагенты
   |ГДЕ
   |    ПОДСТРОКА(ВЫРАЗИТЬ(Контрагенты.Комментарий КАК СТРОКА(500)), 1, 1) = ""№""";
58 ОффПланктон
 
31.10.12
10:17
а можете написать где все это можно прочитать (синтаксис-условия) запросов...
59 GANR
 
31.10.12
10:26
(58) Конфигуратор, меню Справка \ Содержание справки, далее по дереву 1С:Предприятие \ Встроенный язык \ Работа с запросами \ Синтаксис текста запросов.

А вообще, чтобы как следует научиться работать с запросами рекомендую sql-ex.ru (те же приемы прекрасно применимы и в 1С-запросах). Через месяц будешь шлепать (14) не задумываясь, если возьмешься плотно.

ВЫРАЗИТЬ(Контрагенты.Комментарий КАК СТРОКА(500)) следует использовать для строк неограниченной длины - иначе запрос в ошибку вылетит, а если бы длина была ограничена то Контрагенты.Комментарий прокатило-бы.
60 ОффПланктон
 
31.10.12
10:29
(59) спасибо за инфу, займусь плотно, а то работа 60% запросы...
61 ОффПланктон
 
31.10.12
10:58
(59) а вот смотри, мне сейчас надо удалить спереди стоящие знаки №№№№№№ (их может быть любое кол-во, но только вначале строки Комментарий)как привильно потом задать условие?

Пока Выборка.Следующий() Цикл
       НоваяСтрока = ТабличноеПоле1.Добавить();
       НоваяСтрока.Ссылка = Выборка.Ссылка;
       НоваяСтрока.КоментДо = Выборка.Комментарий;
       Объект = Выборка.Ссылка.ПолучитьОбъект();
               НоваяСтрока.КоментПосле = Объект.Комментарий;
               ????
62 Reset
 
31.10.12
11:01
(59) Терпеливы Вы, батенька, однако
63 ОффПланктон
 
31.10.12
11:07
(61) за это ему БОЛЬШОЕ СПАСИБО!!!
64 GANR
 
31.10.12
11:33
(62) Простой на рабочем месте образовался (сидел ждал, пока юзеры выйдут из базы) - вот и решил посидеть на мисте.
65 GANR
 
31.10.12
11:44
(61) Идею подскажу, дальше - думай сам, я не вижу данные в базе и не понимаю задачу до конца, да и пора мне за свои дела:

Для Индекс = 0 По 20 Цикл
   ТвояСтрока = СтрЗаменить(ТвояСтрока, "№№", "№");
КонецЦикла
66 Светлый Гений
 
31.10.12
11:49
можно еще

СтараяСтрока = ТвояСтрока;
ТвояСтрока = СтрЗаменить(ТвояСтрока, "№№", "№");
Пока СтрДлина(СтараяСтрока ) <> СтрДлина(ТвояСтрока) Цикл
   СтараяСтрока = ТвояСтрока;
   ТвояСтрока = СтрЗаменить(ТвояСтрока, "№№", "№");
КонецЦикла;
67 ОффПланктон
 
31.10.12
14:59
(66)заработало, спасибо
Процедура КнопкаВыполнитьНажатие(Кнопка)
   МойЗапрос  = Новый Запрос();
   МойЗапрос.Текст = "ВЫБРАТЬ
   |    Контрагенты.Ссылка,
   |    Контрагенты.Комментарий
   |ИЗ
   |    Справочник.Контрагенты КАК Контрагенты
   |ГДЕ
   |    ПОДСТРОКА(ВЫРАЗИТЬ(Контрагенты.Комментарий КАК СТРОКА(500)), 1, 1) = ""№""";
   Выборка = МойЗапрос.Выполнить().Выбрать();
   Пока Выборка.Следующий() Цикл
       НоваяСтрока = ТабличноеПоле1.Добавить();
       НоваяСтрока.Ссылка = Выборка.Ссылка;
       НоваяСтрока.КоментДо = Выборка.Комментарий;
       Объект = Выборка.Ссылка.ПолучитьОбъект();
       
       СтараяСтрока = Выборка.Комментарий;
       СтараяСтрока = СтрЗаменить(СтараяСтрока, "№", "");
       Если СтрДлина(СтараяСтрока ) <> СтрДлина(Объект.Комментарий) Тогда
           Объект.Комментарий = СтараяСтрока;
           СтараяСтрока = СтрЗаменить(СтараяСтрока, "№", "");
           Попытка
               Объект.Записать();
           Исключение
               Сообщить(ОписаниеОшибки());
           КонецПопытки;    
       КонецЕсли;
       НоваяСтрока.КоментПосле = Объект.Комментарий;
   КонецЦикла;
КонецПроцедуры
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.