Функция формирует синоним переменной из идентификатора, как это делает платформа 1С8.
Функция формирует синоним переменной из идентификатора, как это делает платформа 1С8.
Используется при визуализации таблицы значений, давая читабельные для пользователей названия колонок:
- «СуммаБезНДС» => «Сумма без НДС»,
- «СуммаЗадолженностиКонтрагента» => «Сумма задолженности контрагента»,
- «СинонимПеременной» => «Синоним переменной».
Для 7.7 переделывается легко.
// Формирует синоним переменной.
// Пример: на входе "ИмяПеременнойАБВГ", на выходе "Имя переменной АБВГ"
//
// Параметры
// ИмяРеквизита - Строка. Имя переменной, имя колонки таблицы
//
// Возвращаемое значение:
// Строка - Представление переменной
//
Функция СформироватьСиноним(ИмяРеквизита)
Перем Синоним, ъ, Символ, ПредСимвол, СледСимвол, Прописная, ПредПрописная, СледПрописная, ДлинаСтроки;
Синоним = ВРег(Сред(ИмяРеквизита, 1, 1));
ДлинаСтроки = СтрДлина(ИмяРеквизита);
Для ъ=2 По ДлинаСтроки Цикл
Символ = Сред(ИмяРеквизита, ъ, 1);
ПредСимвол = Сред(ИмяРеквизита, ъ-1, 1);
СледСимвол = Сред(ИмяРеквизита, ъ+1, 1);
Прописная = Символ = ВРег(Символ);
ПредПрописная = ПредСимвол = ВРег(ПредСимвол);
СледПрописная = СледСимвол = ВРег(СледСимвол);
// Варианты:
Если НЕ ПредПрописная И Прописная Тогда
Синоним = Синоним + " " + Символ;
ИначеЕсли Прописная И НЕ СледПрописная Тогда
Синоним = Синоним + " " + Символ;
Иначе
Синоним = Синоним + Символ;
Конецесли;
КонецЦикла;
Возврат Синоним;
КонецФункции // СформироватьСиноним()
А вот обратное преобразование:
Показать
P.S. ъ — как счетчик цика… мда… оригинально.
Мура
(2) Иногда требуется и так поизвращаться…
Если для счетчика вместо ъ использовать Ё, то работает быстрее.
<…>
СледСимвол = Сред(ИмяРеквизита, ъ+1, 1);
Дальше можно не смотреть.
(4) bulas, многолетние опыты британских учёных подтвердили использование именно маленького твёрдого знака «ъ» вместо заглавной «Ё».
(5) wolfsoft, предложи свой вариант, мне интересно.
А что вернет по идентификатору СуммаСНДС? Не тестировал, но кажется получается «Сумма СНДС».
Я бы вместо маленького твёрдого знака использовал большой мягкий Ь
(7) лень копаться, навскидку, чтобы не было выходов за границы строки, например так:
Показать
(8) SPID, да так и вернёт «Сумма СНДС»
(10) wolfsoft, вроде ошибок не было. СледСимвол в последней итерации возвращает пустую строку (8-ка). В 7.7 нет возможности попробовать.
(12) Сред() не будет ругаться на выход за границы, а просто вернёт пустоту. это ж не си/паскали вам
не думал, что подобного рода вспомогательные процедурки, коих пишешь по несколько за день, тянут на публикацию.
(14) andrewks, да вот сам не думал )))
(1) DrAku1a, гиде взял? ))
Вот пару строк для этого: (8-ка)
(16) что она даст для «Цена закупки» ?
(17) andrewks, ну если пошагово, то так:
(12) в (13) уже ответили
(16) у нас прямо конкурс решений образовался 🙂
«ленивый» вариант для обратного преобразования
Показать
(19) О! А это уже универсальное решение для любой платформы. Респект и уважуха.
Конкурс! да! профинтерес размяться )))
Я вот думаю над параметром «ЦенаСНДС», чтобы его в «Цена с НДС» перевести, наверно, составить словарь односимвольных слов «С», «а», «в», «к». Если массив прописных букв начинается с этого слова, отедалить её как слово.
«СлаваКПСС» тогда сработает как «Слава к ПСС», зато «СуммаСНДС» будет правильно — «Сумма с НДС»!
—-
upd: Хотя нет, Символы.ПС — это ж для 8-ки, а в 7.7 РазделительСтрок.
Да и отталкиваться тогда удобнее от пробелов.
(18) допустим. а для «Сумма НУ» ?
(19) wolfsoft, вот это нормально. сам именно такой алгоритм утвердил «в голове», да писАть лень было )
Чуть позже, дома проверю)))
(16),(18) блин… протупил я… это не обратное преобразование — это аналог получается… 🙂
(20) По-идее правильно преобразовывать: «Слава КПСС» <-> «Слава_КПСС», а «Цена закупки» <-> «ЦенаЗакупки», так что, (16) — не совсем верно.
(20) про СлаваКПСС — улыбнул. Спасибо.
не в тему:
Разбор предложения: Дочь генерала.
Дочь — «кто?», генерала — «что делала?».
(24) DrAku1a, Трям!
А это идея — аббревиатуры отделять знаком подчёркивания.
Да и подчёркивание я не учел в начальной процедуре.
Внесу и свою лепту — в прикрепленной обработке функции преобразования, которые я использую.
Результат их выполнения:
«Сумма_С_НДС», «СуммаСНДС» => «Сумма с НДС»
«Сумма с НДС», «Сумма _ с НДС» => «СуммаСНДС»
(27) sstar90, зачёт.
(20) надо создать слова-исключения, передавать через параметр, выделять из строки целиком, как раз кажется так и реализовано в (27)
да, по мне можно было красивее найти выход
(30) eugen91, предлагай!
Проверка на прописные буквы делается просто:
// 7.х
Прописная = Символ>=»А» И Символ<=»Я» ИЛИ Символ>=»A» И Символ<=»Z»;
// 8.х
Прописная = КодСимвола(Символ)>=КодСимвола(«А») И КодСимвола(Символ)<=КодСимвола(«Я»)
ИЛИ КодСимвола(Символ)>=КодСимвола(«A») И КодСимвола(Символ)<=КодСимвола(«Z»);
(32) maloi_a, точно. Для 7.7 сгодится. Но ведь в 8-ке куда проще написать
. С латиницей понятно, там действительно алфавит находится в одной последовательности, не прерываясь.
Что же делать с национальными кодировками? Украинский, белорусский, казахский языки имеют свои буквы, которые не вписываются в диапазон А..Я, они часто стоят отдельно. Та же Ё и ё не вписываются в диапазон «а»..»я», они раньше. Так же и с «Ґ» и «ґ», «Є» и «є», «І» и «і», «Ї» и «ї», «Ў» и «ў». Да и КодСимвола(«Z») ведь постоянный, можно просто заменить на диапазон 0x41..0x5a. Правда? )))
За подсказку спасибо, в 7.7 код не тестировал, честно.
(33)
Всё правильно.
Да и с русским языком тоже проблема с «Ё».
В 7.х простое сравнение строк не пойдёт.
Проверил, там «=» к строкам правильно, а «>», «<» для строк применяются без учёта регистра.
Надо использовать КодСимв() и проверку на Ё.
(34) maloi_a, не только Ё, но и на другие буквы с диакритическими знаками. Не помню уже, но в каком-то типовом семёрочном клиент-банке при выгрузке/загрузке в/из ДБФ все эти буквы с диакритическими знаками конвертировались туда-сюда. Уже не помню, во что, но эти белорусские Ў были вместе с украинскими Є и Ї. Потому что в ДБФ они терялись (((
Обсуждение пошло явно не в то русло 🙂
Предлагаю альтернативное решение проблемы:
Показать
Зацените мощЪ мысли… 😀
Пс… И не говорите мне про НРЕГ! Тогда оно уже почти перестанет быть быдлокодом…
(37)
Процедуру заменить на функцию
и
Стр=Лев(Стр,Х-1)+» «+Сред(Махонькие,П,1)+Сред(Стр,Х+1);
Тогда будет всё правильно.
да хороший вариант:
Стр=Лев(Стр,Х-1)+» «+Сред(Махонькие,П,1)+Сред(Стр,Х+1);
(38) точно, П
А вот интересно, на какой длине строки этот вариант начнёт работать быстрее, чем оригинальный в статье?
Предложу свой вариант на основе стэйт-машины
Показать
Выгодное отличие здесь в том, что символ вырезается из строки и проверяется на регистр только один раз. Если б не надо было первую букву делать заглавной — было бы еще красивее.
непорядок 🙂
СинКосТан32Котан
Син кос тан32 котан — преобразование 1с-ки
Син кос тан 32Котан — преобразование Синонимайзера
(41)
При длине имени больше 200 ВариацияЪ() будет быстрее.
Увы.
Мой вариант самый эффективный — сравнение «<>» работает быстрее встроенной Врег().
(43) Внес исправления, теперь должно работать правильно…
(42) Класс!
Значения параметров что обозначают? // сплю я еще
(46) Значения параметров обозначают начальные значения переменных цикла. Делая их параметрами, мы, кроме сокращения количества строк в записи функции, добиваемся некоторого расширения ее возможностей. Например, присвоив параметру Ответ значение «Синоним:» мы получим результат, начинающийся со строки «Синоним:». Присвоив параметру Стэйт значение 7 * 2 * 2 * 2 * 2 * 2 (7 умножить на два в некоторой степени), мы «защитим от преобразования» соответствующее количество символов в имени. Присвоив параметру б некоторое значение, мы получим результат, начинающийся с этого значения, записанного в верхнем регистре.
(47) ildarovich, вона, как… Для меня пока слишком умнО.
Немного подумал и решил использовать в рабочем проекте.
Вот мой вариант:
http://infostart.ru/public/196681/
Хотел здесь найти функцию, которая вернет правильный идентификатор по произвольной строке, но не нашел(:
Пришлось самому писать, вот может кому пригодиться:
Показать
(51) nalivai-chai, «нижнее подчеркивание»… Хм… навеяло: «В подвале клуба любителей тавтологии обнаружен смертельно убитый труп погибшего мертвеца».
А можно ж и переделать: убрать недопустимые символы и символ после пробела преобразовать к верхнему регистру, а пробел удалить.
http://infostart.ru/public/16635
Аналог такой функции я использовал в отчете по менеджерам в 2008 году
Там динамически формируются колонки в таблице значений по фамилиям менеджеров.
В типовых есть процедура,разлагающая строку на массив слов. Обходя массив делать первый символ верхним. Навскидку:
(52) однако, не один такой, из Википедии: