8.х Отбор/Выбор номенклатуры с заглавными буквами

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем lirikons, 18 окт 2014.

  1. TopicStarter Overlay
    lirikons
    Offline

    lirikons Опытный в 1С

    Регистрация:
    10 июн 2014
    Сообщения:
    63
    Симпатии:
    0
    Баллы:
    26
    Добрый день. В нашей базе есть большое количество номенклатуры, у которой в названии встречаются слова написанные полностью заглавными буквами. Когда стали работать с Яндекс.Маркет, там сказали, что необходимо все привести к стандартному виду, т.е. убрать такие слова. Собственно, поэтому возникла задача - вывести сотруднику список номенклатуры, где возникает такая ситуация. Не стоит проблема, как вывести эту номенклатуру, стоит проблема, как ее отобрать.
    Я решил отталкиваться от того, чтобы искать в наименовании номенклатуры две рядом стоящие заглавные буквы. Но пока не знаю, как это реализовать. Пока остановился вот на чем (упрощенно):

    Запрос = Новый Запрос
    Запрос.Текст =
    "ВЫБРАТЬ
    |Номенклатура.Наименование
    |ИЗ
    |Справочники.Номенклатура КАК Номенклатура";
    Выборка = Запрос.Выполнить.Выбрать();
    МассивНоменклатуры = Новый Массив;
    Пока Выборка.Следующий() Цикл
    Для Ц = 1 ПО 120 Цикл // Там другие коды символов, ну это не важно
    Если Найти(Выборка.Наименование, Символ(Ц)) > 0 Тогда
    МассивНоменклатуры.Добавить(Выборка.Наименование);
    КонецЕсли;
    КонецЦикла;
    КонецЦикла;

    Т.е. я получаю номенклатуру с одной заглавной. А как получить с двумя рядом расположенными (и разными - АБ )?
  2. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.572
    Симпатии:
    717
    Баллы:
    204
    Цикл сразу нет. Использовать конструкцию языка запроса:
    Поле ПОДОБНО %[А-Я][А-Я]%
  3. LordMaverick
    Offline

    LordMaverick Профессионал в 1С

    Регистрация:
    17 мар 2014
    Сообщения:
    3.440
    Симпатии:
    374
    Баллы:
    104
    и какой у них стандартный вид?

    Проще будет просто обойти весь справочник


    самый простой вариант, если он устроит, задействовать
    Код:
    Встроенные функции языка.ТРег (Script functions.Title)
    Встроенные функции языка (Script functions)
    ТРег (Title)
    Синтаксис:
    
    ТРег(<Строка>)
    Параметры:
    
    <Строка> (обязательный)
    
    Тип: Строка.
    Преобразуемая строка.
    Возвращаемое значение:
    
    Тип: Строка.
    
    Описание:
    
    Преобразует строку следующим образом: у каждого слова строки первый символ преобразуется к верхнему регистру. Все остальные символы преобразуются к нижнему регистру.
    
    Доступность:
    
    Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение(клиент), мобильное приложение(сервер).
    
  4. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    LordMaverick это не совсем то я думаю. Эта функция приведет название номенклатуры "МОЕ ТЕСТОВОЕ НАЗВАНИЕ" к виду "Мое Тестовое Название". А я так понимаю нужно "Мое тестовое название". Хотя пусть конечно ТС выскажется. Может проще всю строку в нижний преобразовать, а потом просто первую букву наименования верхним сделать.
    + Там нюансы я думаю могут быть, типа того, что строка то нужна вида "Мое тестовое название", но если в наименовании в середине встречается производитель скажем, то его да, его с большой буквы сделать.
  5. LordMaverick
    Offline

    LordMaverick Профессионал в 1С

    Регистрация:
    17 мар 2014
    Сообщения:
    3.440
    Симпатии:
    374
    Баллы:
    104
    ну это как бы вторая часть марлезонского балета :D
    первой конечно была бы НРег

    чуток мужлежа" и эта пара функций и дадут результат "Мое тестовое название"
    (мухлёж в приложении, под УФ, делался на УТ11)

    PS
    правда тут ещё надо не забыть про ПолноеНаименование :)
    --- Объединение сообщений, 18 окт 2014 ---
    Код:
    &НаСервереБезКонтекста
    Процедура СделатьНаСервере()
        // Вставить содержимое обработчика.
       
    Выборка = Справочники.Номенклатура.Выбрать();
    н=0;
    Пока Выборка.Следующий() Цикл
        Объект = Выборка.ПолучитьОбъект();
       
        ИзменяемоеИмя = НРег(Объект.Наименование);   // делаем всё строчними(нижним регистром)
        Сообщить("1= "+ИзменяемоеИмя);
       
        Объект.Наименование = ТРег(Лев(ИзменяемоеИмя,2))+Сред(ИзменяемоеИмя,3); // берем первых два символа нименования и первый из них делаем Заглавным
        Сообщить("2= "+Объект.Наименование);
       
        Попытка
            //Объект.Записать();  //в рабочем коде раскомметировать
        Исключение
            Сообщить("ваш текст сообщения");
        КонецПопытки;
       
        н=н+1;
        Если н=110 Тогда
            Прервать;
        КонецЕсли;
    КонецЦикла;
       
    КонецПроцедуры
    
    &НаКлиенте
    Процедура Сделать(Команда)
        СделатьНаСервере();
    КонецПроцедуры
    
    сообщить идёт для наглядной проверки
    и по "н" идёт ограничение цикла принудительное

    в рабочем варианте это убирается
    --- Объединение сообщений, 18 окт 2014 ---
    upload_2014-10-18_16-59-58.png

    Вложения:

    Последнее редактирование: 18 окт 2014
  6. LordMaverick
    Offline

    LordMaverick Профессионал в 1С

    Регистрация:
    17 мар 2014
    Сообщения:
    3.440
    Симпатии:
    374
    Баллы:
    104
    хотя глянул мельком
    "Требования к содержанию размещаемых Материалов. Требования к методу передачи. Описание YML."
    там не всё так просто скорее всего
    так что ТС -"Огласите весь список пжалуста"
  7. TopicStarter Overlay
    lirikons
    Offline

    lirikons Опытный в 1С

    Регистрация:
    10 июн 2014
    Сообщения:
    63
    Симпатии:
    0
    Баллы:
    26
    Добрый день. Извиняюсь, что не отвечал - выходные. На самом деле не нужно ничего делать с наименованием, достаточно отобрать такую номенклатуру, а потом уже пользователь, сам, по своему усмотрению будет ее редактировать. Думаю, что Подобно %[А-Я][А-Я]% в запросе должно сработать, спасибо.
  8. TopicStarter Overlay
    lirikons
    Offline

    lirikons Опытный в 1С

    Регистрация:
    10 июн 2014
    Сообщения:
    63
    Симпатии:
    0
    Баллы:
    26
    Правда возникает проблема, что "Подобно %[А-Я][А-Я]%" не распознает строчные и прописные буквы..
  9. alexburn
    Offline

    alexburn Модераторы Команда форума Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    14.781
    Симпатии:
    509
    Баллы:
    204
    %[А-Я][а-я]%
  10. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.572
    Симпатии:
    717
    Баллы:
    204
    Будет тоже самое.
    Это надо настройки базы данных в SQL менять на CS, вместо CI.
  11. TopicStarter Overlay
    lirikons
    Offline

    lirikons Опытный в 1С

    Регистрация:
    10 июн 2014
    Сообщения:
    63
    Симпатии:
    0
    Баллы:
    26
    А база файловая.
  12. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.572
    Симпатии:
    717
    Баллы:
    204
    Тогда имхо только перебором, найдя первый символ заглавный, проверять следующие 2-3 символа.

    Типа такого:
    Код:
    .....
    Алфавит = "АБВГД.....";
    Для Сч = 1 По 3 Цикл
    Если Найти(Алфавит, Сред(Наименование, ПозицияПервойЗаглавнойБуквы + Сч, 1)) > 0 Тогда
    ПрописнойСимвол = Истина;
    ......
    КонецЕсли;
    ......
    КонецЦикла;
    
  13. TopicStarter Overlay
    lirikons
    Offline

    lirikons Опытный в 1С

    Регистрация:
    10 июн 2014
    Сообщения:
    63
    Симпатии:
    0
    Баллы:
    26
    Попробую так, спасибо.
  14. LordMaverick
    Offline

    LordMaverick Профессионал в 1С

    Регистрация:
    17 мар 2014
    Сообщения:
    3.440
    Симпатии:
    374
    Баллы:
    104
    хотя ещё есть вот такое
    Код:
    Встроенные функции языка.КодСимвола (Script functions.CharCode)
    Встроенные функции языка (Script functions)
    КодСимвола (CharCode)
    Синтаксис:
    
    КодСимвола(<Строка>, <НомерСимвола>)
    Параметры:
    
    <Строка> (обязательный)
    
    Тип: Строка.
    Исходная строка.
    <НомерСимвола> (необязательный)
    
    Тип: Число.
    Номер символа в строке, код которого необходимо получить. Нумерация символов в строке начинается с 1.
    Значение по умолчанию: 1.
    Возвращаемое значение:
    
    Тип: Число.
    Код переданного символа. Код возвращается в соответствии с кодировкой Unicode.
    
  15. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.572
    Симпатии:
    717
    Баллы:
    204
    Если элементов номенклатуры много(более 5к), я бы развернул базу в SQL, сделал бы CS, обработал, вернул бы обратно в файловую.
    ну это так......как вариант решения задачи......перелопатить циклами буде ессно быстрее, но вероятность ошибки обработки так же выше.
  16. LordMaverick
    Offline

    LordMaverick Профессионал в 1С

    Регистрация:
    17 мар 2014
    Сообщения:
    3.440
    Симпатии:
    374
    Баллы:
    104
    примерно как-то так
    Код:
        // 1025 код буквы "Ё", она одна выбивается из ряда, как и строчная "ё" = 1105
    
        Если КодСимвола(СтрНаименование,2)=1025 ИЛИ КодСимвола(СтрНаименование,2)>1039 И КодСимвола(СтрНаименование,2)<1072 Тогда
            Сообщить("Вторая буква первого слова наименования ЗАГЛАВНАЯ");
        Иначе
            Сообщить("Вторая буква первого слова наименования НЕ заглавная");
        КонецЕсли;
    
  17. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.572
    Симпатии:
    717
    Баллы:
    204
    все дело в том, что заглавные буквы могут быть и в середине названия, насколько я понял из описания входных данных задачи

    например: ручка ПЛАСТИКОВАЯ черная.
  18. LordMaverick
    Offline

    LordMaverick Профессионал в 1С

    Регистрация:
    17 мар 2014
    Сообщения:
    3.440
    Симпатии:
    374
    Баллы:
    104
    PS
    коды для русского алфавита
    --- Объединение сообщений, 20 окт 2014 ---
    обходить наименование пословно, отталкиваясь на разделитель = пробел
    --- Объединение сообщений, 20 окт 2014 ---
    хотя нет
    наименование разложить в массив слов и их обрабатывать
    --- Объединение сообщений, 20 окт 2014 ---
    алгоритм примерно таков
    разложили наименование в массив слов и в каждом слове проверяем второй символ,
    если заглавная - сообщаем наименование номенклатуры
    если нет - идём дальше

    PS
    при проверке второго символа возрастает вероятность ошибки, из-за того что мог ошибиться вводящий при наборе (банально отпустив SHIFT не после первого, а второго символа)
    так что если проверять на полное написание слова заглавными лучше проверять 3-ий символ слова
    Последнее редактирование: 20 окт 2014
  19. Flash-Dance
    Offline

    Flash-Dance Профессионал в 1С

    Регистрация:
    20 май 2012
    Сообщения:
    365
    Симпатии:
    42
    Баллы:
    54
    А не проще будет вывести данные в Эксель, поиздеваться над ними через строковые функции, затем вернуть обратно полученный результат?
  20. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.572
    Симпатии:
    717
    Баллы:
    204
    В результате издевательств с данными во внешней программе возрастает вероятность изменить символы в названии, т.к. тот же эксель стремится любое значение, похожее на число, преобразовать таки к числу.

Поделиться этой страницей