Функция Синоним для наименования

25.09.16

Разработка - Универсальные функции

Аналог встроенной в платформу функции, преобразовывающей наименование в синоним. Пример: СуммаБезНДС -> Сумма без НДС

Увидев эту публикацию и комментарии к ней, я решил выложить свою функцию, так как варианта решения, учитывающего все нюансы, предложено не было. Данная функция преобразует строку без пробелов и других запрещенных в наименованиях символов в ее аналог-синоним. Примеры таких преобразований (проверено на программе):

ТипДокументовРасчета -> Тип документов расчета
Сумма -> Сумма
ДокументыДляЕНВД -> Документы для ЕНВД
СуммаСНДС -> Сумма с НДС
СуммаБезНДС -> Сумма без НДС
ДляФНСЗаКвартал -> Для ФНС за квартал
ПФРДляОтчетности -> ПФР для отчетности

Чаще всего такая функция может понадобится при работе с динамически формируемыми колонками таблиц значений, которые требуется вывести на форму или в табличный документ. Данную функцию можно поместить в общий модуль или в любое другое удобное место. Также можно заметить, что строчка СуммаСНДС преобразовывается корректно (в конфигураторе это не так). Для этого добавлено исключение, которое при необходимости можно доработать и под другие нестандартные ситуации

 

Код функции:

Функция Синоним(Знач Имя) Экспорт
 
 НовоеИмя = "";
 Имя = СтрЗаменить(Имя, "СНДС", "_сНДС"); 
 Длина = СтрДлина(Имя);
 Для Индекс = 1 По Длина Цикл
 
    Символ = Сред(Имя, Индекс, 1);
 
    Если Символ = НРег(Символ) И Найти("1234567890", Символ) = 0 Тогда 
       НовоеИмя = НовоеИмя + Символ;
       Продолжить;
    КонецЕсли;
 
    Если Символ = ВРег(Символ) Тогда
 
       Если Индекс > 1 Тогда
          НовоеИмя = НовоеИмя + " "
       КонецЕсли;
 
       Аббревиатура = (Сред(Имя, Индекс, 3) = ВРег(Сред(Имя, Индекс, 3))) И (Длина - Индекс > 1);
       Предлог = (Сред(Имя, Индекс, 2) = ВРег(Сред(Имя, Индекс, 2))) И (Длина > Индекс);
 
       Если Аббревиатура Тогда
          ДлинаАббревиатуры = 3;
 
          Пока Сред(Имя, Индекс, ДлинаАббревиатуры) = ВРег(Сред(Имя, Индекс, ДлинаАббревиатуры)) 
               И  Индекс + ДлинаАббревиатуры <= Длина + 1 Цикл
 
               ДлинаАббревиатуры = ДлинаАббревиатуры + 1
          КонецЦикла;
 
          ДлинаАббревиатуры = ДлинаАббревиатуры - 1;
 
          Если (Индекс + ДлинаАббревиатуры - 1) = Длина Тогда
               НовоеИмя = НовоеИмя + Сред(Имя, Индекс, ДлинаАббревиатуры);
          Иначе
               ДлинаАббревиатуры = ДлинаАббревиатуры - 1;
               НовоеИмя = НовоеИмя + Сред(Имя, Индекс, ДлинаАббревиатуры) + " " + НРег(Сред(Имя, Индекс + ДлинаАббревиатуры, 1));
          КонецЕсли;
 
          Индекс = Индекс + ДлинаАббревиатуры;
          Продолжить;
       КонецЕсли; 
 
 
       Если Предлог Тогда
          НовоеИмя = НовоеИмя + НРег(Символ) + " " + НРег(Сред(Имя, Индекс + 1, 1)) + " ";
          Индекс = Индекс + 1;
          Продолжить;
       КонецЕсли; 
 
 
       НовоеИмя = НовоеИмя + НРег(Символ); 
 
 
    КонецЕсли; 
 
 КонецЦикла;
 
 НовоеИмя = СтрЗаменить(НовоеИмя, "_", " ");
 НовоеИмя = ВРег(Лев(НовоеИмя, 1)) + Прав(НовоеИмя, СтрДлина(НовоеИмя) - 1);
 Возврат НовоеИмя;
 
КонецФункции  

Синоним Заголовок Преобразование Имя в синоним Представление имени

См. также

Печать любых непроведенных документов для УТ, КА, ERP. Настройка печати по пользователям, документам и печатным формам

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Платные (руб)

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать любые печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

3480 руб.

22.08.2023    1204    1    4    

3

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    5392    YA_418728146    6    

118

Расширение: Быстрые отборы через буфер [Alt+C] Копировать список, [Alt+V] Вставить список, [Ctrl+C] Копировать из файлов

Инструментарий разработчика Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Копирует в буфер значения из списков, из ячеек отчетов, таблиц, настроек списков, других отборов и вставляет в выбранную настройку отбора. Работает с Объект не найден. Работает как в одной так и между разными базами 1С. Использует комбинации [Alt+C] Копировать список, [Alt+V] Вставить список. Также для копирования данных используется стандартная [Ctrl+C] (например из открытого xls, mxl, doc и т.п. файла скопировать список наименований)

1 стартмани

13.10.2022    14360    112    sapervodichka    106    

123

Система контроля ведения учета [БСП]

Универсальные функции Механизмы типовых конфигураций БСП (Библиотека стандартных подсистем) Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

В данном материале рассмотрим типовой алгоритм подсистемы контроля учета БСП в конфигурациях на примерах.

18.07.2022    6646    quazare    8    

107

Хитрости СКД. Часть 3

СКД Универсальные функции Платформа 1С v8.3 Система компоновки данных Конфигурации 1cv8 Бесплатно (free)

Столкнулся с тем, что мне приходится писать гору отчетов. Во многих приходится использовать повторяющиеся приемы. Решил написать шпаргалку, которая, надеюсь пригодится не только мне. В этой статье: Объединение ячеек в отчете только на определенном уровне иерархии, Постобработка итогов в табличном документе, Скрытие колонок в зависимости от количества месяцев в периоде.

28.05.2022    8211    milkers    11    

91

Базовые принципы работы с регламентными заданиями подсистем БСП

Универсальные функции БСП (Библиотека стандартных подсистем) Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

В очередной публикации рассмотрим некоторые базовые приемы работы с регламентными заданиями в рамках библиотеки стандартных подсистем

22.05.2022    14651    quazare    25    

59
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. dmpas 416 06.08.13 11:00 Сейчас в теме

Имя = СтрЗаменить(Имя, "СНДС", "_сНДС");

Читерство:

Передача ВПФР
Сумма СНДФЛ
2. nick-max 248 06.08.13 11:29 Сейчас в теме
(1) ну да, читерство

но платформа сама не умеет отделять предлоги от аббревиатур (см. приложение)
поэтому логично написать это как исключения. Можно, конечно, анализировать первый символ аббревиатуры на предмет его принадлежности к какой-нибудь заранее определенной группе предлогов ("С", "В", "К" и др.), но ведь есть аббревиатуры, начинающиеся с этих букв ("СЗВ", к примеру). Тогда получится БланкСЗВ Бланк с ЗВ.
Полный перечень аббревиатур тоже не хочется заводить, потому что он в любом случае будет неполный.
Прикрепленные файлы:
3. DrAku1a 1609 07.08.13 02:37 Сейчас в теме
Все она умеет, просто подход знать надо (см. приложение).
Прикрепленные файлы:
Oleg_nsk; Diego_Iv; aet; +3 Ответить
4. DrAku1a 1609 07.08.13 02:59 Сейчас в теме
На правах рекламы: в обработке Отладчик запросов в главном модуле есть такая процедура:
// Преобразовывает имя переменной к более читабельному виду, аналогично внутренним алгоритмам 1С
// Например "ОбменСБазой" -> "Обмен с базой"
Функция глозПредставлениеПеременной(знач ИмяПеременной) Экспорт
	Перем МаленькиеБуквы, Цифры, Буква, Ответ, сч, ПредыдущаяБуква, СледующаяБуква;
	ИмяПеременной = СокрЛП(ИмяПеременной);
	МаленькиеБуквы = "абвгдеёжзийклмнопрстуфхцчшщъыьэюя_";
	Цифры="0123456789.";
	Буква = Лев(ИмяПеременной, 1);
	Ответ = ""+Буква;
	Для сч=2 По СтрДлина(ИмяПеременной) Цикл
		ПредыдущаяБуква = Буква;
		Буква = Сред(ИмяПеременной, сч, 1);
		Если (Найти(МаленькиеБуквы, Буква)=0) и (Найти(МаленькиеБуквы, ПредыдущаяБуква)>0) Тогда
			СледующаяБуква = Сред(ИмяПеременной, сч+1, 1);
			Если (СледующаяБуква<>"") и (Найти(МаленькиеБуквы, СледующаяБуква)>0) Тогда
				Буква = НРег(Буква);
			КонецЕсли;
			Буква = " "+Буква;
		ИначеЕсли (Найти(Цифры, Буква)>0) и (Найти(Цифры, ПредыдущаяБуква)=0) Тогда
			Буква = " "+Буква;
		КонецЕсли;
		Ответ = Ответ + Буква;
	КонецЦикла;
	Ответ = СтрЗаменить(Ответ, "_", " ");

	//этого пока нет в релизе - убирает все задвоенные пробелы, типа "Сумма___С_НДС" --> "Сумма   с НДС"
	Пока Найти(Ответ, "  ")>0 Цикл Ответ = СтрЗаменить(Ответ, "  ", " ") КонецЦикла;
	
	Возврат Ответ;
КонецФункции
Показать
5. v.l. 434 07.08.13 12:06 Сейчас в теме
(0)
так как полноценного качественного варианта предложено так и не было
некрасиво как-то. переформулируйте.
6. nick-max 248 08.08.13 17:49 Сейчас в теме
(5) Ок.

Вот, сравнил результаты всех наших функций на деле:
Прикрепленные файлы:
7. v.l. 434 09.08.13 20:58 Сейчас в теме
(6) Вы не поняли. Цитата а-ля "я д'Артаньян".
За проделанную работу плюс. Похвально.
8. ildarovich 7788 09.08.13 22:28 Сейчас в теме
(6) А почему моей функции из комментариев к той же публикации нет?? Она самая короткая! И работает "по платформе"
Функция Синонимайзер(Имя, Ответ = "", Стэйт = 7, б = "") Экспорт
	Для ё = 1 По СтрДлина(Имя) Цикл
		а = Сред(Имя, ё, 1);
		Стэйт = (НРег(а) <> а) * 4 + Цел(Стэйт / 2);
		Ответ = Ответ + ?(Стэйт = 2, НРег(б), ?(ё = 2, ВРег(б), б)) + ?(Стэйт = 4 ИЛИ Стэйт = 5, " ", "");
		б = а
	КонецЦикла;
	Возврат Ответ + б
КонецФункции
Показать

Добавьте к своей таблице число строк в записи функций.
И еще с цифрами должны быть обязательно тесты.
vandalsvq; silberRus; noctar; json; Mechanist; +5 Ответить
13. nick-max 248 13.08.13 17:33 Сейчас в теме
Кстати, функция от ildarovich из (8) судя по таблице и правда работает точно "по платформе". Разве что нижние подчеркивания не учитывает. Но встроенная платформенная функция тоже не идеал. Так уж повелось, что разработчики типовых решений (а за ними и все остальные) каждого новое слово в наименовании начинают с большой буквы, даже если это слово идет за аббревиатурой. Например,
РегламентированныйОтчетНДССправкаОДебиторскойЗадолженности
а не
РегламентированныйОтчетНДСсправкаОдебиторскойЗадолженности

А создатели платформы, наверное, думали, что в ходу будет именно второй вариант
Так что просто слепо следовать платформе тоже не стоит
9. nick-max 248 12.08.13 12:21 Сейчас в теме
(6) Хорошо, сейчас протестирую вашу функцию тоже
Но я считаю, что длина функции в данном случае не играет большой роли
10. nick-max 248 12.08.13 13:36 Сейчас в теме
Чтобы преобразования с цифрами были тоже корректны, поменял строку
 Если Символ = НРег(Символ) Тогда 

На
 Если Символ = НРег(Символ) И Найти("1234567890", Символ) = 0 Тогда 


Вот новые результаты сравнения функций:
Прикрепленные файлы:
11. v.l. 434 13.08.13 06:24 Сейчас в теме
У нас появился юный плагиатор, значит идея интересная.
http://infostart.ru/public/196029/
12. nick-max 248 13.08.13 16:23 Сейчас в теме
(11) Ну, что делать)

Если у нас уже есть четыре функции, то почему бы не быть еще пятой)
15. ZhokhovM 811 11.09.17 10:02 Сейчас в теме
(12)в вашей функции есть опечатка "Передача В ПФР" если судить по скрину
14. Starik 111 20.08.13 10:06 Сейчас в теме
Функция для тех кому лень или некогда разбираться, но нужен результат - спасибо автору)
16. RomanKatPro 10.08.18 12:23 Сейчас в теме
Спасибо автору! Пригодилась.
17. vandalsvq 1443 02.10.23 15:23 Сейчас в теме
Интересно было почитать, взял на вооружение ))))
Оставьте свое сообщение