Запросы

1. YA_1528107375 27.05.26 00:15 Сейчас в теме
Здравствуйте. есть запрос с помощью которого нахожу повторы. Проблема в том что группировка по строке не учитывает регистр букв. Как можно сделать, что бы учитывал.


ВЫБРАТЬ
	ВТ_ТЧСтроки.Строка КАК Строка,
	ВТ_ТЧСтроки.НомерСтроки КАК НомерСтроки
ПОМЕСТИТЬ ВТ_ТЧ
ИЗ
	&ВТ_ТЧСтроки КАК ВТ_ТЧСтроки
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВТ_ТЧ.Строка КАК Строка,
	ВТ_ТЧ.НомерСтроки КАК НомерСтроки
ПОМЕСТИТЬ ВТ_Повторы
ИЗ
	ВТ_ТЧ КАК ВТ_ТЧ
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
			ВТ_ТЧ.Строка КАК Строка
		ИЗ
			ВТ_ТЧ КАК ВТ_ТЧ
		
		СГРУППИРОВАТЬ ПО
			ВТ_ТЧ.Строка
		
		ИМЕЮЩИЕ
			КОЛИЧЕСТВО(ВТ_ТЧ.Строка) > 1) КАК Повторы
		ПО ВТ_ТЧ.Строка = Повторы.Строка
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВТ_Повторы.Строка КАК ПовторяющаясяСтрока,
	ВТ_Повторы.НомерСтроки КАК НомерСтрокиСПовтором
ИЗ
	ВТ_Повторы КАК ВТ_Повторы

УПОРЯДОЧИТЬ ПО
	ВТ_Повторы.Строка,
	ВТ_Повторы.НомерСтроки
Показать


Если есть идея как можно сделать запрос проще, буду тоже благодарен
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
3. Sashares 33 27.05.26 01:17 Сейчас в теме
(1)
Как можно сделать, что бы учитывал.

Не использовать запрос
orakool2; SlavaKron; +2 Ответить
7. nomad_irk 84 27.05.26 08:34 Сейчас в теме
(3) оно и в объектной модели, если не ошибаюсь, к регистру не чувствительно.
Отбор = Новый Структура("Колонка", "Значение")

и
Отбор = Новый Структура("Колонка", "значение")

Дадут одинаковый результат, не говоря уж о ключах структуры/соответствия.

Да и простое сравнение "Значение" = "значение", вроде как, вернет Истину.

Или есть какие-то настройки БД по этому поводу?
10. Sashares 33 27.05.26 08:48 Сейчас в теме
11. nomad_irk 84 27.05.26 08:54 Сейчас в теме
(10) Проверил:
Отбор = Новый Структура("Колонка", "Значение")

и
Отбор = Новый Структура("Колонка", "значение")

Учитывают регистр.
12. Sashares 33 27.05.26 09:17 Сейчас в теме
(11)
Да и простое сравнение "Значение" = "значение", вроде как, вернет Истину.

Тут вернет ложь.
Bukaska; orakool2; nomad_irk; +3 Ответить
6. nomad_irk 84 27.05.26 08:23 Сейчас в теме
(1)
Проблема в том что группировка по строке не учитывает регистр букв. Как можно сделать, что бы учитывал

Если база файловая - никак.
В клиент-серверном варианте это свойствами регистрозависимости решается на уровне СУБД.
Если есть идея как можно сделать запрос проще

Последний запрос не нужен совсем, упорядочивание и во втором запросе можно выполнить
15. Sashares 33 27.05.26 10:50 Сейчас в теме
(1) добавить новую колонку Счетчик, заполнить ее значением 1.
Свернуть таблицу по колонке Строка, а по колоне Счетчик - сделать сумму.
В цикле обойти свернутую таблицу - если счетчик больше 1, значит есть дубли.
По значению в колонке Строка этой строки таблицы, где счетчик больше 1 - искать строки в исходной таблице по НайтиСтроки - так получить номера строк с дублями.
4. YA_1528107375 27.05.26 01:46 Сейчас в теме
(2) и что там мне должно помочь?
ничего связанного с решением моей проблемы я не нашел
8. vadim1011985 103 27.05.26 08:36 Сейчас в теме
(4) Значит невнимательно смотрели. В статье рассматриваются новые
( на текущий момент уже старые) функции запроса в т.ч. НРЕГ и ВРЕГ.
14. Sashares 33 27.05.26 10:47 Сейчас в теме
(8) ТС буквально говорит, что без всяких функций запрос игнорирует регистр символов.
Как ему должны помочь эти функции?
Что именно с ними надо сделать, чтобы запрос стал различать регистр символов и группировал с учетом регистра?
56. truba 03.06.26 10:57 Сейчас в теме
(14) Я далек от мысли что обработку операторов <> = строкового типа 1С на скульной базе переопределяли, а не использовали таковую от самого сиквел-сервера.
А емнип сам сиквел имеет настройку как относится к строковым значениям в каждой конкретной колонке, как работать с регистром. И перенастраивать таблицу теоретически может быть черевато.
49. Said-We 29.05.26 21:55 Сейчас в теме
(4)
ничего связанного с решением моей проблемы я не нашел
Теперь нашлось, но не факт, что будете использовать. :-)
5. Avatarzorro 74 27.05.26 02:35 Сейчас в теме
прям в строке

ВЫБРАТЬ
Нрег(Таблица.Строка) КАК СТрока
ИЗ Таблица КАК ТАблица


все будет в нижнем регистре

единственное я не помню с какой версии платформы это работает
9. nomad_irk 84 27.05.26 08:45 Сейчас в теме
(5) ТС-у нужно различать регистр букв.
ВЫБРАТЬ
      Нрег(Таблица.Строка) КАК СТрока
ИЗ Таблица КАК ТАблица

Объединить

ВЫБРАТЬ
      Врег(Таблица.Строка) КАК СТрока
ИЗ Таблица КАК ТАблица
Показать

По-умолчанию вернет 1 запись, а не 2.
13. dehro 14 27.05.26 10:24 Сейчас в теме
&ВТ_ТЧСтроки - таблица значений?
Пробежать по ней циклом и "замаскировать" символы верхнего регистра, например, &
16. Anton_new01 27.05.26 10:55 Сейчас в теме
(1)
Функция НРег() в языке запросов 1С работает начиная с версии платформы 8.3.20.1549

Запрос = Новый Запрос;
Запрос.УстановитьПараметр("ВТ_ТЧСтроки", ВТ_ТЧСтроки);
Запрос.Текст =  "ВЫБРАТЬ
                |	втТЧСтроки.Строка КАК Строка,
                |	НРЕГ(втТЧСтроки.Строка) КАК НрегСтрока,
                |	втТЧСтроки.НомерСтроки КАК НомерСтроки
                |ПОМЕСТИТЬ втТЧСтроки
                |ИЗ
                |	&ВТ_ТЧСтроки КАК втТЧСтроки
                |;
                |
                |////////////////////////////////////////////////////////////­////////////////////
                |ВЫБРАТЬ
                |	втТЧСтроки.НомерСтроки КАК НомерСтроки,
                |	МАКСИМУМ(втТЧСтроки.Строка) КАК Строка,
                |	МАКСИМУМ(втТЧСтроки.НрегСтрока) КАК НрегСтрока
                |ИЗ
                |	втТЧСтроки КАК втТЧСтроки
                |		ВНУТРЕННЕЕ СОЕДИНЕНИЕ втТЧСтроки КАК Повторы
                |		ПО втТЧСтроки.НрегСтрока = Повторы.НрегСтрока
                |			И втТЧСтроки.НомерСтроки <> Повторы.НомерСтроки
                |
                |СГРУППИРОВАТЬ ПО
                |	втТЧСтроки.НомерСтроки
                |
                |УПОРЯДОЧИТЬ ПО
                |	НомерСтроки";
Показать


Пс. если платформа более ранняя - то ТЗ обработать в цикле както так:
ВТ_ТЧСтроки.Колонки.Добавить("НрегСтрока");

Для Каждого СтрокаТЧ Из ВТ_ТЧСтроки Цикл
	СтрокаТЧ.НрегСтрока = НРег(СтрокаТЧ.Строка);	
КонецЦикла;
17. Sashares 33 27.05.26 10:57 Сейчас в теме
(16) Попробуй прочитать третье предложение в посте ТС))
18. Anton_new01 27.05.26 11:00 Сейчас в теме
(17) так я по строке не группирую.
я по номеру гурппирую.

если наоброт надо различать строки с разными регистрами.
то все что я написал по НрегСтрока - сделать по обычной Строка.
19. Anton_new01 27.05.26 11:08 Сейчас в теме
(1) без нормального ТЗ - результат ХЗ

чтобы различать регистры симовлов

Запрос = Новый Запрос;
Запрос.УстановитьПараметр("ВТ_ТЧСтроки", ВТ_ТЧСтроки);
Запрос.Текст =  "ВЫБРАТЬ
                |	втТЧСтроки.Строка КАК Строка,
                |	втТЧСтроки.НомерСтроки КАК НомерСтроки
                |ПОМЕСТИТЬ втТЧСтроки
                |ИЗ
                |	&ВТ_ТЧСтроки КАК втТЧСтроки
                |;
                |
                |////////////////////////////////////////////////////////////­////////////////////
                |ВЫБРАТЬ
                |	втТЧСтроки.НомерСтроки КАК НомерСтроки,
                |	МАКСИМУМ(втТЧСтроки.Строка) КАК Строка
                |ИЗ
                |	втТЧСтроки КАК втТЧСтроки
                |		ВНУТРЕННЕЕ СОЕДИНЕНИЕ втТЧСтроки КАК Повторы
                |		ПО втТЧСтроки.Строка = Повторы.Строка
                |			И втТЧСтроки.НомерСтроки <> Повторы.НомерСтроки
                |
                |СГРУППИРОВАТЬ ПО
                |	втТЧСтроки.НомерСтроки
                |
                |УПОРЯДОЧИТЬ ПО
                |	НомерСтроки";
Показать



Ps. проверил - не работает
20. Anton_new01 27.05.26 11:39 Сейчас в теме
в общем на уровне СУБД и запроса не отличает регистры.
на уровне кода - тоже не различает регистры.

остается только посимвольный перебор с проверкой через КодСимвола(Стр1, Позиция),
но это мягко говоря изврат.

что-то типа предварительно выполнить мой запрос. - отбор дублей без учета регистра и далее обработать посимвольно их...

или как советуют в посте 11.
21. nomad_irk 84 27.05.26 11:42 Сейчас в теме
(20)
на уровне кода - тоже не различает регистры.

Различает. Сообщения (11) и (12)
22. Said-We 27.05.26 11:53 Сейчас в теме
(1) Как-то так пойдёт?
Прикрепленные файлы:
23. Sashares 33 27.05.26 11:58 Сейчас в теме
(22) До 3 предложения тоже не дочитал, я смотрю)))
24. Said-We 27.05.26 12:02 Сейчас в теме
(23) В третьем предложении предлагается не использовать запрос. Ну так себе предложение, если данные находятся на стороне СУБД. Поэтому данное предложение было проигнорировано.
В {22} запрос без соединений - в переписке такого не вижу.
25. Sashares 33 27.05.26 12:04 Сейчас в теме
(24) Я про это.
Здравствуйте. есть запрос с помощью которого нахожу повторы. Проблема в том что группировка по строке не учитывает регистр букв. Как можно сделать, что бы учитывал.

Технически оно 4.
26. Said-We 27.05.26 12:05 Сейчас в теме
(25)
Технически оно 4.
Четвертое сообщение от автора. Я не понимаю как вы считаете порядок сообщений и зачем, если они пронумерованы.
27. Sashares 33 27.05.26 12:06 Сейчас в теме
(26) Сообщение 1, предложение 4.
Просто ты не первый, кто до него не дочитывает.
Прям деградация внимания на лицо)
Забавная тема.
28. Said-We 27.05.26 12:10 Сейчас в теме
(27) Сообщение {1} это первое сообщение от автора.
29. Sashares 33 27.05.26 12:13 Сейчас в теме
(28) Молодец, считать сообщения у тебя получилось.
Осталось разделить слова в сообщении на предложения и найти нужное.
Ну то есть прочитай первое сообщение автора все же.

Если не считать текст запроса, там 5 предложений.
30. Said-We 27.05.26 12:19 Сейчас в теме
(29) Да кто же знает, что Вы имеете в виду. Не понятно и уже не интересно.
Вместо, того что бы суть описать, куча правил и догадок и недомолвок. Как на свидании с дамой... :-)
Без обид, но выглядит это именно так.
В {22} основное это не ВРег() или НРег(), а запрос без соединений.
31. Sashares 33 27.05.26 12:30 Сейчас в теме
(30)
В {22} основное это не ВРег() или НРег(), а запрос без соединений.

В 22 запрос возвращает не то.
Надо получить номера строк, у которых регистр и значение совпадает.
В запросе регистр символов не учитывается.
Об этом буквально все сообщения в теме.
32. Anton_new01 27.05.26 12:40 Сейчас в теме
(1)
в общем как-то так

&НаСервере
Процедура Команда1НаСервере()

ТЧСтроки = Новый ТаблицаЗначений;
ТЧСтроки.Колонки.Добавить("Строка", Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(50)));
ТЧСтроки.Колонки.Добавить("НомерСтроки", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(9, 0)));
Строка1 = ТЧСтроки.Добавить();
Строка1.Строка = "МояСтрока";
Строка1.НомерСтроки = 1;

Строка2 = ТЧСтроки.Добавить();
Строка2.Строка = "моястрока";
Строка2.НомерСтроки = 2;

Строка3 = ТЧСтроки.Добавить();
Строка3.Строка = "моястрока";
Строка3.НомерСтроки = 3;

Строка4 = ТЧСтроки.Добавить();
Строка4.Строка = "моястрокА";
Строка4.НомерСтроки = 4;

Строка5 = ТЧСтроки.Добавить();
Строка5.Строка = "УникальнаяСтрока";
Строка5.НомерСтроки = 5;



Запрос = Новый Запрос;
Запрос.УстановитьПараметр("ВТ_ТЧСтроки", ТЧСтроки);
Запрос.Текст =  "ВЫБРАТЬ
                |	втТЧСтроки.Строка КАК Строка,
                |	втТЧСтроки.НомерСтроки КАК НомерСтроки
                |ПОМЕСТИТЬ втТЧСтроки
                |ИЗ
                |	&ВТ_ТЧСтроки КАК втТЧСтроки
                |;
                |
                |////////////////////////////////////////////////////////////­////////////////////
                |ВЫБРАТЬ
                |	втТЧСтроки.НомерСтроки КАК НомерСтроки,
                |	МАКСИМУМ(втТЧСтроки.Строка) КАК Строка
				|ИЗ
                |	втТЧСтроки КАК втТЧСтроки
                |		ВНУТРЕННЕЕ СОЕДИНЕНИЕ втТЧСтроки КАК Повторы
                |		ПО втТЧСтроки.Строка = Повторы.Строка
                |			И втТЧСтроки.НомерСтроки <> Повторы.НомерСтроки
                |
                |СГРУППИРОВАТЬ ПО
                |	втТЧСтроки.НомерСтроки
                |
                |УПОРЯДОЧИТЬ ПО
                |	НомерСтроки";

ТЗДублей = Запрос.Выполнить().Выгрузить();

Выборка = Запрос.Выполнить().Выбрать();
   
Пока Выборка.Следующий() Цикл
	Отбор = Новый Структура("Строка", Выборка.Строка);
	МассивДУблей = ТЗДублей.НайтиСтроки(Отбор);
	
	Если МассивДУблей.Количество() = 1 Тогда
		ТЗДублей.Удалить(МассивДУблей[0]);
	КонецЕсли;
	
КонецЦикла;

Для Каждого Строка Из ТЗДублей Цикл

	Сообщить( "НомерСтроки:" + Строка.НомерСтроки +"	Строка:" + Строка.Строка ); 	

КонецЦикла;

КонецПроцедуры
Показать


Ps. проверил - все работает.
1. предварительно отбираем дубли без учета регистра.
2. в цикле доотбираем с учетом регистра.
Прикрепленные файлы:
Отбор повторов.epf
Sashares; +1 Ответить
33. Sashares 33 27.05.26 12:42 Сейчас в теме
(32)
2. в цикле доотбираем с учетом регистра.

Как будто тогда проще совсем без запроса.
34. Anton_new01 27.05.26 12:44 Сейчас в теме
(33) а если там 100500 строк?
а запросом мы их кратно уменьшим... но это на любителя
35. Sashares 33 27.05.26 12:45 Сейчас в теме
(34) Мой вариант в (15)
36. Anton_new01 27.05.26 12:47 Сейчас в теме
(35) по свертке тоже учитывает регистр?

автор хотел решить задачу запросом )))
37. Sashares 33 27.05.26 12:55 Сейчас в теме
(36)
по свертке тоже учитывает регистр?

Да
Прикрепленные файлы:
Отбор повторов.epf
Anton_new01; +1 Ответить
50. Said-We 01.06.26 15:34 Сейчас в теме
(35)
Мой вариант в (15)
Мой в {40} запросом и без пред и пост обработки. Есть вариант, когда 1С запрос отличает регистр символа. Но сам запрос в 1С большой получается. И нет агрегатной функции конкатенации строк. Придётся в несколько итераций строку обратно собирать. Но в принципе, работает это не долго. Можно попробовать посчитать символы предварительно и те, что встречаются чаще попробовать поставить в условии раньше.
Ещё необходимо проверить в файловой версии. Но скорее всего отработает. Иначе это ошибка платформы.
Sashares; +1 Ответить
38. Said-We 27.05.26 21:48 Сейчас в теме
(1) Я изначально понял, что наоборот необходимо сравнивать маленькие или большие как одинаковые.
Первое, что в голову пришло, что просто привести всё к одному регистру и сравнить. Как это в SQL обычно и делают. Потом понял, что нужно наоборот разный регистр - это разные строки. В 1С всё через одно место и в запросах все строки перед сравнением приводятся к маленьким символам. Простым сравнением не обойтись.
Но если к задаче подходить чисто академически: возможно / не возможно исключительно запросом в 1С, то да возможно. Решение есть. Через одно место, но запросом тоже можно.
Прикрепил только окончание запроса. Но суть я думаю понятно. В запросах при сравнении "Подобно" с экранированием спецсимвола сам спецсимвол может быть не спецсимволом, а просто символом и отличает большие и маленькие буквы.
Суть думаю понятна.
Прикрепленные файлы:
39. user_2194436 27.05.26 21:53 Сейчас в теме
(38)
что в 1С всё через одно место и в запросах строки перед сравнением все приводятся к маленьким символам
Ну надо же. Какие подлецы!
Sashares; +1 Ответить
42. spacecraft 28.05.26 11:30 Сейчас в теме
(38)
В 1С всё через одно место и в запросах все строки перед сравнением приводятся к маленьким символам.

Прикольно, учитывая, что регистронезависимое сравнение делается в самой СУБД )
40. Said-We 27.05.26 22:23 Сейчас в теме
(1) Можно не печатный символ использовать. Что бы вероятность нахождения в строке такого символа была почти нулевой. :-)
Решетка в строке может встречаться. А "пика" - маловероятно. Но даже если такое есть, то можно такие строки отдельно обработать.
Прикрепленные файлы:
41. Said-We 28.05.26 11:07 Сейчас в теме
(1) Сам алгоритм будет выглядеть следующим образом (кратко):
1. Разобрать строки на символы
2. Заменить символы в верхнем регистре на два символа: спецсимвол + Символ.
3. Собрать строки обратно - не сложно, но в несколько итераций - примеров тут на сайте много.
4. Сравнивать не изначальные строки, а уже собранные.

По скорости. Не однократно в 1С баловался с разбором наименований справочников 150, 250 символов и сбором обратно. Не так уж и долго эти алгоритмы работают. В данном варианте сложное условие с множеством Подобно (26+33). Подобно работает не быстро. Тут надо пробовать.
Так как сравнивается всегда один символ с одним - есть вероятность, что отработает не долго.
43. Said-We 28.05.26 11:36 Сейчас в теме
(42) Пример в {38} и {40} говорит об обратном.
Скорее всего, регистронезависимое сравнение делает сервер 1С, а не СУБД.
И делает он это, скорее всего, для того, чтобы в разных СУБД поведение было одинаковое. По принципу - безобразно, но однообразно. Но это лишь моё предположение.
47. user_2202366 28.05.26 15:53 Сейчас в теме
(43)
Скорее всего, регистронезависимое сравнение делает сервер 1С, а не СУБД
Точно! А то в профайлере постоянно чушь какую-то показывают!
45. Said-We 28.05.26 11:56 Сейчас в теме
(44) Мой пример на базе MS SQL, но СУБД может быть и не MS SQL. У каждой СУБД могут быть свои нюансы.
Обычно по умолчанию, чаще всего, СУБД отличают буквы разного регистра. Если специально не залезть и не поменять настройки.
Но вопрос заключался в том, можно ли в 1С в запросе отличить букву в верхнем регистре от буквы в нижнем регистре.
Ответ - да можно. Понятное дело, что дело может упереться в настройки СУБД. Но если в настройках СУБД различает, то вариант есть. В файловой не проверял.
46. user_2202366 28.05.26 15:52 Сейчас в теме
(45)
чаще всего, СУБД отличают буквы разного регистра. Если специально не залезть и не поменять настройки.
Так их, так, неграмотных! Не разу не пробовали, а куда-то лезут!
48. Said-We 28.05.26 18:58 Сейчас в теме
(44) Я не знаю SQL. Но в PosgSQL сравнение строк может зависеть от типа строк. Есть специальный тип строк CITEXT, в котором сравнение идёт регистронезависимое.
-------------------------------------
CREATE  EXTENSION IF NOT EXISTS citext;
CREATE  TABLE vt (
    n integer,
    s1 CITEXT,
    s2 TEXT
);
INSERT  INTO  vt (n, s1, s2)
VALUES (1, 'Text1', 'Text1'), (2, 'TEXT1', 'TEXT1'), (3, 'TexT1', 'TexT1'), (4, 'TeXt1', 'TeXt1')
;
select 
    *,
    case WHEN s1='Text1' THEN 'равны' ELSE 'НЕ равны' END as q,
    case WHEN s2='Text1' THEN 'равны' ELSE 'НЕ равны' END as w
from  vt
;
DROP  table IF EXISTS vt
Показать
Прикрепленные файлы:
51. SweetSweetLoot 01.06.26 15:41 Сейчас в теме
есть очень тупой вариант, написать запрос на postgres\mysql(в зависимости от того что используется) и сервер веб, через него получать результаты.
52. Said-We 01.06.26 16:02 Сейчас в теме
(51) Вариантов много разных. Но задача стояла только запрос 1С.
Почему? Вопрос к автору. Может быть просто спортивный интерес: можно / НЕ можно :-)
А может быть есть и практический интерес.
53. Sashares 33 01.06.26 16:35 Сейчас в теме
(52) Забавно, что автор оставил один комментарий и больше ничего не отвечал))
54. Said-We 02.06.26 19:10 Сейчас в теме
(53)
Забавно, что автор оставил один комментарий и больше ничего не отвечал))
Нееее... не странно. Появляется раз в два месяца. Ждёт быстрого ответа. Если не дождался, то появится уже с новым вопросом через пару месяцев. По его темам видно.
55. Sashares 33 02.06.26 19:44 Сейчас в теме
(54) Вот и кто после этого тролль?
Вбросил и свалил.
Для отправки сообщения требуется регистрация/авторизация

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот