1.
YA_1528107375
27.05.26 00:15
Сейчас в теме
Здравствуйте. есть запрос с помощью которого нахожу повторы. Проблема в том что группировка по строке не учитывает регистр букв. Как можно сделать, что бы учитывал.
Если есть идея как можно сделать запрос проще, буду тоже благодарен
ВЫБРАТЬ
ВТ_ТЧСтроки.Строка КАК Строка,
ВТ_ТЧСтроки.НомерСтроки КАК НомерСтроки
ПОМЕСТИТЬ ВТ_ТЧ
ИЗ
&ВТ_ТЧСтроки КАК ВТ_ТЧСтроки
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
ВТ_ТЧ.Строка КАК Строка,
ВТ_ТЧ.НомерСтроки КАК НомерСтроки
ПОМЕСТИТЬ ВТ_Повторы
ИЗ
ВТ_ТЧ КАК ВТ_ТЧ
ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
ВТ_ТЧ.Строка КАК Строка
ИЗ
ВТ_ТЧ КАК ВТ_ТЧ
СГРУППИРОВАТЬ ПО
ВТ_ТЧ.Строка
ИМЕЮЩИЕ
КОЛИЧЕСТВО(ВТ_ТЧ.Строка) > 1) КАК Повторы
ПО ВТ_ТЧ.Строка = Повторы.Строка
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
ВТ_Повторы.Строка КАК ПовторяющаясяСтрока,
ВТ_Повторы.НомерСтроки КАК НомерСтрокиСПовтором
ИЗ
ВТ_Повторы КАК ВТ_Повторы
УПОРЯДОЧИТЬ ПО
ВТ_Повторы.Строка,
ВТ_Повторы.НомерСтроки ПоказатьЕсли есть идея как можно сделать запрос проще, буду тоже благодарен
По теме из базы знаний
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(3) оно и в объектной модели, если не ошибаюсь, к регистру не чувствительно.
и
Дадут одинаковый результат, не говоря уж о ключах структуры/соответствия.
Да и простое сравнение "Значение" = "значение", вроде как, вернет Истину.
Или есть какие-то настройки БД по этому поводу?
Отбор = Новый Структура("Колонка", "Значение")и
Отбор = Новый Структура("Колонка", "значение")Дадут одинаковый результат, не говоря уж о ключах структуры/соответствия.
Да и простое сравнение "Значение" = "значение", вроде как, вернет Истину.
Или есть какие-то настройки БД по этому поводу?
(1)
Если база файловая - никак.
В клиент-серверном варианте это свойствами регистрозависимости решается на уровне СУБД.
Последний запрос не нужен совсем, упорядочивание и во втором запросе можно выполнить
Проблема в том что группировка по строке не учитывает регистр букв. Как можно сделать, что бы учитывал
Если база файловая - никак.
В клиент-серверном варианте это свойствами регистрозависимости решается на уровне СУБД.
Если есть идея как можно сделать запрос проще
Последний запрос не нужен совсем, упорядочивание и во втором запросе можно выполнить
(1) добавить новую колонку Счетчик, заполнить ее значением 1.
Свернуть таблицу по колонке Строка, а по колоне Счетчик - сделать сумму.
В цикле обойти свернутую таблицу - если счетчик больше 1, значит есть дубли.
По значению в колонке Строка этой строки таблицы, где счетчик больше 1 - искать строки в исходной таблице по НайтиСтроки - так получить номера строк с дублями.
Свернуть таблицу по колонке Строка, а по колоне Счетчик - сделать сумму.
В цикле обойти свернутую таблицу - если счетчик больше 1, значит есть дубли.
По значению в колонке Строка этой строки таблицы, где счетчик больше 1 - искать строки в исходной таблице по НайтиСтроки - так получить номера строк с дублями.
4.
YA_1528107375
27.05.26 01:46
Сейчас в теме
(2) и что там мне должно помочь?
ничего связанного с решением моей проблемы я не нашел
ничего связанного с решением моей проблемы я не нашел
8.
vadim1011985
103
27.05.26 08:36
Сейчас в теме
(4) Значит невнимательно смотрели. В статье рассматриваются новые
( на текущий момент уже старые) функции запроса в т.ч. НРЕГ и ВРЕГ.
( на текущий момент уже старые) функции запроса в т.ч. НРЕГ и ВРЕГ.
(8) ТС буквально говорит, что без всяких функций запрос игнорирует регистр символов.
Как ему должны помочь эти функции?
Что именно с ними надо сделать, чтобы запрос стал различать регистр символов и группировал с учетом регистра?
Как ему должны помочь эти функции?
Что именно с ними надо сделать, чтобы запрос стал различать регистр символов и группировал с учетом регистра?
(14) Я далек от мысли что обработку операторов <> = строкового типа 1С на скульной базе переопределяли, а не использовали таковую от самого сиквел-сервера.
А емнип сам сиквел имеет настройку как относится к строковым значениям в каждой конкретной колонке, как работать с регистром. И перенастраивать таблицу теоретически может быть черевато.
А емнип сам сиквел имеет настройку как относится к строковым значениям в каждой конкретной колонке, как работать с регистром. И перенастраивать таблицу теоретически может быть черевато.
5.
Avatarzorro
74
27.05.26 02:35
Сейчас в теме
прям в строке
все будет в нижнем регистре
единственное я не помню с какой версии платформы это работает
ВЫБРАТЬ
Нрег(Таблица.Строка) КАК СТрока
ИЗ Таблица КАК ТАблицавсе будет в нижнем регистре
единственное я не помню с какой версии платформы это работает
16.
Anton_new01
27.05.26 10:55
Сейчас в теме
(1)
Функция НРег() в языке запросов 1С работает начиная с версии платформы 8.3.20.1549
Пс. если платформа более ранняя - то ТЗ обработать в цикле както так:
Функция НРег() в языке запросов 1С работает начиная с версии платформы 8.3.20.1549
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("ВТ_ТЧСтроки", ВТ_ТЧСтроки);
Запрос.Текст = "ВЫБРАТЬ
| втТЧСтроки.Строка КАК Строка,
| НРЕГ(втТЧСтроки.Строка) КАК НрегСтрока,
| втТЧСтроки.НомерСтроки КАК НомерСтроки
|ПОМЕСТИТЬ втТЧСтроки
|ИЗ
| &ВТ_ТЧСтроки КАК втТЧСтроки
|;
|
|//////////////////////////////////////////////////////////// ////////////////////
|ВЫБРАТЬ
| втТЧСтроки.НомерСтроки КАК НомерСтроки,
| МАКСИМУМ(втТЧСтроки.Строка) КАК Строка,
| МАКСИМУМ(втТЧСтроки.НрегСтрока) КАК НрегСтрока
|ИЗ
| втТЧСтроки КАК втТЧСтроки
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ втТЧСтроки КАК Повторы
| ПО втТЧСтроки.НрегСтрока = Повторы.НрегСтрока
| И втТЧСтроки.НомерСтроки <> Повторы.НомерСтроки
|
|СГРУППИРОВАТЬ ПО
| втТЧСтроки.НомерСтроки
|
|УПОРЯДОЧИТЬ ПО
| НомерСтроки"; ПоказатьПс. если платформа более ранняя - то ТЗ обработать в цикле както так:
ВТ_ТЧСтроки.Колонки.Добавить("НрегСтрока");
Для Каждого СтрокаТЧ Из ВТ_ТЧСтроки Цикл
СтрокаТЧ.НрегСтрока = НРег(СтрокаТЧ.Строка);
КонецЦикла;
18.
Anton_new01
27.05.26 11:00
Сейчас в теме
(17) так я по строке не группирую.
я по номеру гурппирую.
если наоброт надо различать строки с разными регистрами.
то все что я написал по НрегСтрока - сделать по обычной Строка.
я по номеру гурппирую.
если наоброт надо различать строки с разными регистрами.
то все что я написал по НрегСтрока - сделать по обычной Строка.
19.
Anton_new01
27.05.26 11:08
Сейчас в теме
(1) без нормального ТЗ - результат ХЗ
чтобы различать регистры симовлов
Ps. проверил - не работает
чтобы различать регистры симовлов
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("ВТ_ТЧСтроки", ВТ_ТЧСтроки);
Запрос.Текст = "ВЫБРАТЬ
| втТЧСтроки.Строка КАК Строка,
| втТЧСтроки.НомерСтроки КАК НомерСтроки
|ПОМЕСТИТЬ втТЧСтроки
|ИЗ
| &ВТ_ТЧСтроки КАК втТЧСтроки
|;
|
|//////////////////////////////////////////////////////////// ////////////////////
|ВЫБРАТЬ
| втТЧСтроки.НомерСтроки КАК НомерСтроки,
| МАКСИМУМ(втТЧСтроки.Строка) КАК Строка
|ИЗ
| втТЧСтроки КАК втТЧСтроки
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ втТЧСтроки КАК Повторы
| ПО втТЧСтроки.Строка = Повторы.Строка
| И втТЧСтроки.НомерСтроки <> Повторы.НомерСтроки
|
|СГРУППИРОВАТЬ ПО
| втТЧСтроки.НомерСтроки
|
|УПОРЯДОЧИТЬ ПО
| НомерСтроки"; ПоказатьPs. проверил - не работает
20.
Anton_new01
27.05.26 11:39
Сейчас в теме
в общем на уровне СУБД и запроса не отличает регистры.
на уровне кода - тоже не различает регистры.
остается только посимвольный перебор с проверкой через КодСимвола(Стр1, Позиция),
но это мягко говоря изврат.
что-то типа предварительно выполнить мой запрос. - отбор дублей без учета регистра и далее обработать посимвольно их...
или как советуют в посте 11.
на уровне кода - тоже не различает регистры.
остается только посимвольный перебор с проверкой через КодСимвола(Стр1, Позиция),
но это мягко говоря изврат.
что-то типа предварительно выполнить мой запрос. - отбор дублей без учета регистра и далее обработать посимвольно их...
или как советуют в посте 11.
(23) В третьем предложении предлагается не использовать запрос. Ну так себе предложение, если данные находятся на стороне СУБД. Поэтому данное предложение было проигнорировано.
В {22} запрос без соединений - в переписке такого не вижу.
В {22} запрос без соединений - в переписке такого не вижу.
(29) Да кто же знает, что Вы имеете в виду. Не понятно и уже не интересно.
Вместо, того что бы суть описать, куча правил и догадок и недомолвок. Как на свидании с дамой... :-)
Без обид, но выглядит это именно так.
В {22} основное это не ВРег() или НРег(), а запрос без соединений.
Вместо, того что бы суть описать, куча правил и догадок и недомолвок. Как на свидании с дамой... :-)
Без обид, но выглядит это именно так.
В {22} основное это не ВРег() или НРег(), а запрос без соединений.
(30)
В 22 запрос возвращает не то.
Надо получить номера строк, у которых регистр и значение совпадает.
В запросе регистр символов не учитывается.
Об этом буквально все сообщения в теме.
В {22} основное это не ВРег() или НРег(), а запрос без соединений.
В 22 запрос возвращает не то.
Надо получить номера строк, у которых регистр и значение совпадает.
В запросе регистр символов не учитывается.
Об этом буквально все сообщения в теме.
32.
Anton_new01
27.05.26 12:40
Сейчас в теме
(1)
в общем как-то так
Ps. проверил - все работает.
1. предварительно отбираем дубли без учета регистра.
2. в цикле доотбираем с учетом регистра.
в общем как-то так
&НаСервере
Процедура Команда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
34.
Anton_new01
27.05.26 12:44
Сейчас в теме
(33) а если там 100500 строк?
а запросом мы их кратно уменьшим... но это на любителя
а запросом мы их кратно уменьшим... но это на любителя
(35)
Ещё необходимо проверить в файловой версии. Но скорее всего отработает. Иначе это ошибка платформы.
Мой вариант в (15)
Мой в {40} запросом и без пред и пост обработки. Есть вариант, когда 1С запрос отличает регистр символа. Но сам запрос в 1С большой получается. И нет агрегатной функции конкатенации строк. Придётся в несколько итераций строку обратно собирать. Но в принципе, работает это не долго. Можно попробовать посчитать символы предварительно и те, что встречаются чаще попробовать поставить в условии раньше.
Ещё необходимо проверить в файловой версии. Но скорее всего отработает. Иначе это ошибка платформы.
(1) Я изначально понял, что наоборот необходимо сравнивать маленькие или большие как одинаковые.
Первое, что в голову пришло, что просто привести всё к одному регистру и сравнить. Как это в SQL обычно и делают. Потом понял, что нужно наоборот разный регистр - это разные строки. В 1С всё через одно место и в запросах все строки перед сравнением приводятся к маленьким символам. Простым сравнением не обойтись.
Но если к задаче подходить чисто академически: возможно / не возможно исключительно запросом в 1С, то да возможно. Решение есть. Через одно место, но запросом тоже можно.
Прикрепил только окончание запроса. Но суть я думаю понятно. В запросах при сравнении "Подобно" с экранированием спецсимвола сам спецсимвол может быть не спецсимволом, а просто символом и отличает большие и маленькие буквы.
Суть думаю понятна.
Первое, что в голову пришло, что просто привести всё к одному регистру и сравнить. Как это в SQL обычно и делают. Потом понял, что нужно наоборот разный регистр - это разные строки. В 1С всё через одно место и в запросах все строки перед сравнением приводятся к маленьким символам. Простым сравнением не обойтись.
Но если к задаче подходить чисто академически: возможно / не возможно исключительно запросом в 1С, то да возможно. Решение есть. Через одно место, но запросом тоже можно.
Прикрепил только окончание запроса. Но суть я думаю понятно. В запросах при сравнении "Подобно" с экранированием спецсимвола сам спецсимвол может быть не спецсимволом, а просто символом и отличает большие и маленькие буквы.
Суть думаю понятна.
Прикрепленные файлы:
39.
user_2194436
27.05.26 21:53
Сейчас в теме
(38)
что в 1С всё через одно место и в запросах строки перед сравнением все приводятся к маленьким символам
Ну надо же. Какие подлецы!
42.
spacecraft
28.05.26 11:30
Сейчас в теме
(38)
Прикольно, учитывая, что регистронезависимое сравнение делается в самой СУБД )
В 1С всё через одно место и в запросах все строки перед сравнением приводятся к маленьким символам.
Прикольно, учитывая, что регистронезависимое сравнение делается в самой СУБД )
(1) Можно не печатный символ использовать. Что бы вероятность нахождения в строке такого символа была почти нулевой. :-)
Решетка в строке может встречаться. А "пика" - маловероятно. Но даже если такое есть, то можно такие строки отдельно обработать.
Решетка в строке может встречаться. А "пика" - маловероятно. Но даже если такое есть, то можно такие строки отдельно обработать.
Прикрепленные файлы:
(1) Сам алгоритм будет выглядеть следующим образом (кратко):
1. Разобрать строки на символы
2. Заменить символы в верхнем регистре на два символа: спецсимвол + Символ.
3. Собрать строки обратно - не сложно, но в несколько итераций - примеров тут на сайте много.
4. Сравнивать не изначальные строки, а уже собранные.
По скорости. Не однократно в 1С баловался с разбором наименований справочников 150, 250 символов и сбором обратно. Не так уж и долго эти алгоритмы работают. В данном варианте сложное условие с множеством Подобно (26+33). Подобно работает не быстро. Тут надо пробовать.
Так как сравнивается всегда один символ с одним - есть вероятность, что отработает не долго.
1. Разобрать строки на символы
2. Заменить символы в верхнем регистре на два символа: спецсимвол + Символ.
3. Собрать строки обратно - не сложно, но в несколько итераций - примеров тут на сайте много.
4. Сравнивать не изначальные строки, а уже собранные.
По скорости. Не однократно в 1С баловался с разбором наименований справочников 150, 250 символов и сбором обратно. Не так уж и долго эти алгоритмы работают. В данном варианте сложное условие с множеством Подобно (26+33). Подобно работает не быстро. Тут надо пробовать.
Так как сравнивается всегда один символ с одним - есть вероятность, что отработает не долго.
(42) Пример в {38} и {40} говорит об обратном.
Скорее всего, регистронезависимое сравнение делает сервер 1С, а не СУБД.
И делает он это, скорее всего, для того, чтобы в разных СУБД поведение было одинаковое. По принципу - безобразно, но однообразно. Но это лишь моё предположение.
Скорее всего, регистронезависимое сравнение делает сервер 1С, а не СУБД.
И делает он это, скорее всего, для того, чтобы в разных СУБД поведение было одинаковое. По принципу - безобразно, но однообразно. Но это лишь моё предположение.
47.
user_2202366
28.05.26 15:53
Сейчас в теме
(43)
Скорее всего, регистронезависимое сравнение делает сервер 1С, а не СУБД
Точно! А то в профайлере постоянно чушь какую-то показывают!
(44) Мой пример на базе MS SQL, но СУБД может быть и не MS SQL. У каждой СУБД могут быть свои нюансы.
Обычно по умолчанию, чаще всего, СУБД отличают буквы разного регистра. Если специально не залезть и не поменять настройки.
Но вопрос заключался в том, можно ли в 1С в запросе отличить букву в верхнем регистре от буквы в нижнем регистре.
Ответ - да можно. Понятное дело, что дело может упереться в настройки СУБД. Но если в настройках СУБД различает, то вариант есть. В файловой не проверял.
Обычно по умолчанию, чаще всего, СУБД отличают буквы разного регистра. Если специально не залезть и не поменять настройки.
Но вопрос заключался в том, можно ли в 1С в запросе отличить букву в верхнем регистре от буквы в нижнем регистре.
Ответ - да можно. Понятное дело, что дело может упереться в настройки СУБД. Но если в настройках СУБД различает, то вариант есть. В файловой не проверял.
46.
user_2202366
28.05.26 15:52
Сейчас в теме
(45)
чаще всего, СУБД отличают буквы разного регистра. Если специально не залезть и не поменять настройки.
Так их, так, неграмотных! Не разу не пробовали, а куда-то лезут!
(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(в зависимости от того что используется) и сервер веб, через него получать результаты.
(53)
Забавно, что автор оставил один комментарий и больше ничего не отвечал))
Нееее... не странно. Появляется раз в два месяца. Ждёт быстрого ответа. Если не дождался, то появится уже с новым вопросом через пару месяцев. По его темам видно.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот