Учим внешнюю компоненту правильному склонению не только ФИО, но и должностей, и подразделений (ЗУП 2.5)
Задачи пользователя - Адаптация типовых решений
Метод прост и достаточно эффективен.
Суть решения: разложить фразу, состоящую из нескольких слов на отдельные слова, и просклонять каждое из них отдельно.
Ниже привожу пример кода.
ДолжностьРуководителяРодительный = ПросклонятьФразуПоСловам(ДолжностьРуководителя, 2);
.......................................
................................
....................................
Функция ПросклонятьФразуПоСловам(Знач ИсходнаяСтрока, Падеж) Экспорт
Результат = "";
ИсходнаяСтрока = СокрЛП(ИсходнаяСтрока);
Если СтрДлина(ИсходнаяСтрока) = 0 Тогда
Возврат Результат;
КонецЕсли;
Поз = Найти(ИсходнаяСтрока, " ");
Пока Поз > 0 Цикл
СловоВПадеже = "";
Слово = Лев(ИсходнаяСтрока, Поз-1);
УниверсальныеМеханизмы.Просклонять(глЗначениеПеременной("глКомпонентаСклоненияФИО"), Слово, Падеж, , СловоВПадеже);
Результат = СокрЛП(Результат + " " + НРег(СловоВПадеже));
ИсходнаяСтрока = СокрЛП(Сред(ИсходнаяСтрока, Поз));
Если ПустаяСтрока(ИсходнаяСтрока) Тогда
Прервать; // Это перестраховка. Цикл и так должен прерваться
КонецЕсли;
Поз = Найти(ИсходнаяСтрока, " ");
КонецЦикла;
Если НЕ ПустаяСтрока(ИсходнаяСтрока) Тогда // добавляем заключительное слово
СловоВПадеже = "";
УниверсальныеМеханизмы.Просклонять(глЗначениеПеременной("глКомпонентаСклоненияФИО"), ИсходнаяСтрока, Падеж, , СловоВПадеже);
Результат = СокрЛП(Результат + " " + НРег(СловоВПадеже));
КонецЕсли;
Возврат Результат;
КонецФункции // ПросклонятьФразуПоСловам()
Вступайте в нашу телеграмм-группу Инфостарт
Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».
- 0% комиссии — оплата напрямую исполнителю;
- Исполнители любого масштаба — от отдельных специалистов до команд под проект;
- Прямой обмен контактами между заказчиком и исполнителем;
- Безопасная сделка — при необходимости;
- Рейтинги, кейсы и прозрачная система откликов.
См. также
Разработка Адаптация типовых решений Производство готовой продукции (работ, услуг) Розничная торговля 1С:Управление торговлей 10 Россия Платные (руб)
Доработка для 1С:Управление торговлей 10.3 (релиз 10.3.88.3) добавляет поддержку маркировки новых категорий товаров согласно постановлениям Правительства РФ 2025–2026 гг. Конфигурация УТ 10.3 снята с поддержки — новые маркируемые категории в типовую поставку больше не попадают. Доработка закрывает этот пробел: новые виды номенклатуры, обмен с ГИС МТ «Честный Знак». Поставляется в виде файла .cf
14640 руб.
23.04.2026 5529 49 13
Банковские операции Адаптация типовых решений Бухгалтер Пользователь 1С:Предприятие 8 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Платные (руб)
Решение позволяет автоматически заполнять отдельные реквизиты загружаемых банковских документов, основываясь на известных значениях реквизитов и тексте назначения платежа. Простая настройка, широкие возможности анализа назначения платежа без написания кода и сложных шаблонов.
12200 руб.
17.06.2025 5385 16 0
Печатные формы Адаптация типовых решений Бухгалтер Пользователь 1С:Предприятие 8 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Платные (руб)
Расширение позволяет вывести в табличном документе факсимиле печати и подписей и/или вывести произвольную картинку из прикреплённых файлов организации для 1С УТ 11.5, КА 2.5, ERP 2.5, УНФ 3, Розница 3. Вывод факсимиле возможен в табличные документы УПД, УКД, Счёт-фактура, ТОРГ-12 и другие. Возможно настроить вывод для любых типовых макетов (Акт сверки, М-15, ТТН), для этого потребуется отредактировать макет и разместить на нём картинки с соответствующими именами, при выводе на печать в размещённые картинки будут выводиться факсимиле из прикреплённых рисунков. Редактирование осуществляется через типовой механизм в пользовательском интерфейсе.
6000 руб.
07.02.2023 14539 123 25
Адаптация типовых решений 1С:Предприятие 8 1С:Документооборот Россия Платные (руб)
Расширение конфигурации для «1С:Документооборот КОРП», редакция 3.0. позволяет: 1.использовать произвольные табличные части в качестве дополнительных реквизитов к документу; 2 использовать произвольные табличные части в шаблонах в формате docx для автоматического заполнения таблиц.
32330 руб.
29.06.2023 13340 36 15
Логистика, склад и ТМЦ Адаптация типовых решений Пользователь 1С:Предприятие 8 1С:Управление нашей фирмой 1.6 1С:Управление нашей фирмой 3.0 Россия Управленческий учет Платные (руб)
Чтобы не допустить путаницы с обещаниями клиентам и для четкого контроля исполнения заказов мы используем резервирование товаров. Расширение для УНФ, чтобы автоматически отменять старые резервы и не мешалть эффективно продавать.
9150 руб.
02.08.2023 8998 27 5
Адаптация типовых решений Создание на основании Пользователь 1С:Предприятие 8 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Управленческий учет Платные (руб)
Расширение позволяет в 1 клик поставить весь состав заказа клиента в отгрузку и открыть заполненные формы документов отгрузки по заказу.
4880 руб.
25.08.2023 4336 9 0
Адаптация типовых решений 1С 8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Платные (руб)
Расширение, которое в форму списка и форму выбора справочника «Номенклатура» добавляет табличную часть в виде дерева, в которую выводится информация об остатках и доступности выбранной номенклатурной позиции.
6710 руб.
20.04.2026 1006 1 0
Адаптация типовых решений БСП (Библиотека стандартных подсистем) Кадровый учет ЭДО и ОФД 1C:Бухгалтерия 1С:Зарплата и кадры 7.7 1C:ERP 1С:ЗУП 1С:УТ 1С:ДО Платные (руб)
Наше расширение 1С Госключ обеспечивает интеграцию любой конфигурации 1С на базе БСП с мобильным приложением «Госключ», позволяя сотрудникам подписывать кадровые документы (КЭДО) и документы материальной ответственности (МОЛ, ПБ) усиленной электронной подписью прямо со смартфона. Решение автоматизирует формирование и отправку документов на подпись, отслеживает статусы подписания и хранит подписанные файлы непосредственно в базе 1С
25000 руб.
06.03.2026 2791 4 0
// избавимся от лишних пробелов
// запросто могут быть!
Пока Найти(Стр," ")>0 Цикл
Стр=СтрЗаменить(Стр," "," "); // двойной пробел на одинарный
КонецЦикла;
// делаем многострочной и потом с ней работаем
Стр=СтрЗаменить(Стр," ",Символы.ПС);
Сообщить(Стр);
ПоказатьВ результате вместо:
главный_ _ _ _ _специалист (_ - пробелы)
получим:
главный
специалист
Для А=1 По СтрЧислоСтрок(Стр) Цикл
БудемСклонять=СтрПолучитьСтроку(Стр,А);
КонецЦикла
Отдельное и искренне спасибо (4) за конструктивное пожелание. Код не претендует на максимальную оригинальность, а всего лишь показывает путь объезда узких мест в работе внешней компоненты.
Если кому поможет - буду рад.
заместитель генерального директорЫ
начальника службы управлении персоналома
Буду рад, если покажете, как получить правильное склонение бесплатно.
Да призовете Главные специалисте!!!
И да починита косяки юзерския!!! :)
Кто? — начальник службы
Кого? — начальника службы (родительный падеж)
Кому? — начальнику службы
Кого? — начальника службы (винительный падеж)
Кем? — начальником службы
О ком? — о начальнике службы
и вторая часть управления персоналом, в общем я пользуюсь без компонент
Перем КомпонентаСклоненияФИО;
Функция ПросклонятьФразуПоСловам(Знач Должность, Падеж) Экспорт
Результат = "";
Для каждого Элемент из ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(Должность, " ") Цикл
Результат = Результат + КомпонентаСклоненияФИО.Просклонять(Элемент, Падеж) + " ";
КонецЦикла;
Возврат СокрЛП(Результат);
КонецФункции
КомпонентаСклоненияФИО = глЗначениеПеременной("глКомпонентаСклоненияФИО");
Есть платная внешняя компонента Morpher.dll, вышеупомянутые должности склоняет на ура:
А зачем платить деньги, если можно получить тот же результат - бесплатно?
PS: Если не ошибаюсь, разработчики ЗУП уже включили данный механизм в типовую конфигурацию.
Поскольку фантазия пользователей не ограничена, они вводят такие должности, которые "без разбега" и не выговорить. Как, например, просклонять следующую должность :
Первый заместитель руководителя дивизиона - Управляющий директор ЗАО "Рога и копыта" ?
В дательному падеже нужно бы получить
Первому заместителю руководителя дивизиона - Управляющему директору ЗАО "Рога и копыта" .
Т.е. склонять нужно первое, второе, пятое и шестое слово !
Мне кажется, единственный подходящий способ следующий:
- добавить в конфигурацию регистр сведений "ИсключенияСклонений", который имеет единственное строковое измерение "ИменительныйПадеж" и строковые ресурсы по остальным падежам;
- в общий модуль ввести функцию "Просклонять" с двумя аргументами - склоняемая строка и номер падежа; Эта функция должна вначале искать нормализованное (в одном регистре, без лишних пробелов и знаков препинания) представление строки в регистре "ИсключенияСклонений". Если нашла, возвращать значение ресурса, соответствующее падежу. Если не нашла - возвращать результат склонения каждого слова с помощью компоненты склонения ФИО;
- вынести в интерфейс печатных форм кнопку "Исключение склонений", которая будет вызывать, например, поиск строки выделенного блока результата печати в регистре ИсключенияСклонений и открывать форму для модификации или добавления исключений.
Т.е. общий принцип - пользователь должен проверить результат печати (в табличном или текстовом документе) и, если считает, что фраза "Заместителя директора по кадрама" выведена неверно, выделить ошибочную фразу и нажать кнопку.
Более изящного решения в голову не приходит.
По вашему варианту решения: мое мнение - слишком громоздко и сложно для пользователей.
Подозреваю, что и при этом методе вполне возможны подводные камни. Один изобретает щит, который не берет ни одно копье, другой - копье, которое пробивает любой щит ))))) Велик и многообразен руский язык. Без работы не останемся.
PS: Спасибо за предложенное решение.
Да, возможность проверки и корректировки склонения пользователями могла бы многим упростить жизнь. Жаль, что ее нет в стандартных средствах 1С. А пока можно использовать стороннюю компоненту, которая правильно склоняет приведенный вами пример:
И даже во множественном числе! :) Вот описание компоненты:
Только опять же, не стоит нарушать правила форума, которые не разрешают ссылки на сторонние ресурсы. Надо искать альтернативные способы саморекламы. Вам ведь, как и руководству Инфостарта, было бы неприятно видеть на своем сайте рекламу других ресурсов? Я не прав?
Если нарушил правила форума, прошу прощения. Правила, запрещающего "ссылки на сторонние ресурсы", я не нашел. Было бы глупо запрещать релевантные, полезные ссылки. Пускай нас рассудит модератор.
Да, пожалуйста, собственно я не против, публикация то бесплатная ! :)
ДолжностьРуководителяРодительный=ПросклонятьФразуПоСловам(<<?>>ДолжностьРуководителя,2); (Проверка: Толстый клиент (обычное приложение))
Или где-то надо что-то дописать?
Андрей, для начал необходимо чтоб вы озвучили версию программы. (включая название и номер релиза).
Постараюсь помочь. Правда сейчас сильно отвлекает отчетность.
Поправьте,пожалуйста,если что-то делаю не так...
Добавляю строчку в коде(Общие Модули/Функция Печать(ИмяМакета, КоличествоЭкземпляров = 1, НаПринтер = Ложь, ЭтотОбъект) Экспорт):
ДолжностьРуководителяРодительный = ПросклонятьФразуПоСловам(ДолжностьРуководителя, 2);
Добавляю Функцию...пишет ошибку:Пишет ошибку: {ОбщийМодуль.СотрудникиОрганизацийПереопределяемый.Модуль(280,61)}: Переменная не определена (ДолжностьРуководителя)
Андрей, содержание ошибки говорит о том, что вы, перед тем как вызвать процедуру
"ПросклонятьФразуПоСловам(ДолжностьРуководителя, 2);"
не определили переменную "ДолжностьРуководителя". То есть, программе нужно определить, откуда взять значение этой переменной.
БОлее подробно могу дать совет, тоько после того, как вы дадите кусок редактируемого кода.
Макет.Параметры.ДолжностьРуководителя = ПросклонятьФразуПоСловам(Выборка.ДолжностьРуководителя,2);
и в самом макете задал параметр [ДолжностьРуководителяРП],но теперь на печатную форму вообще не выводится должность.
код:
Функция Печать(ИмяМакета, КоличествоЭкземпляров = 1, НаПринтер = Ложь, ЭтотОбъект) Экспорт
// Получить экземпляр документа на печать
Если ИмяМакета = "Печать" Тогда
ТабДокумент = Новый ТабличныйДокумент;
ТабДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_ТрудовойДоговор_Печать";
// получаем данные для печати
Выборка = ЭтотОбъект.СформироватьЗапросДляПечатиТрудовогоДоговора().Выбрать();
// получаем макет
Макет = ЭтотОбъект.ПолучитьМакет("Макет");
// выводим данные
Если Выборка.Следующий() Тогда
Макет.Параметры.Заполнить(Выборка);
Макет.Параметры.ИспытательныйСрокСтрокой = ?(НЕ ЗначениеЗаполнено(Выборка.ИспытательныйСрок)," месяцев", "" + Выборка.ИспытательныйСрок + " месяца(ев)" );
Макет.Параметры.РежимРаботы = "" + Выборка.ВидГрафика + "; " + Выборка.ДлительностьРабочейНедели + " - часовая рабочая неделя";
Макет.Параметры.ФормаОплаты = "Форма оплаты: " + Выборка.ВидРасчета + "; Оклад (тариф) = " + Выборка.ТарифнаяСтавка + " ("+Выборка.ВалютаТарифнойСтавки+")";
Макет.Параметры.ПолноеНазваниеОрганизации = СокрЛП(Макет.Параметры.ПолноеНазваниеОрганизации);
Макет.Параметры.ДокументКемВыдан = СокрЛП(Макет.Параметры.ДокументКемВыдан);
//***************
Макет.Параметры.ДолжностьРуководителя = ПросклонятьФразуПоСловам(Выборка.ДолжностьРуководителя,2);
//*************
ВыборкаПерсональныхНадбавок = Выборка.ПерсональныеНадбавки.Выбрать();
Если ВыборкаПерсональныхНадбавок.Количество()>0 Тогда
СтрокаНадбавки = "Персональные надбавки: ";
Пока ВыборкаПерсональныхНадбавок.Следующий() Цикл
СтрокаНадбавки = СтрокаНадбавки + ВыборкаПерсональныхНадбавок.Надбавка + "- " + ВыборкаПерсональныхНадбавок.Показатель1 + "; ";
КонецЦикла;
Макет.Параметры.Надбавки = СтрокаНадбавки;
КонецЕсли;
КонецЕсли;
// выводим готовый документ
ТабДокумент.Вывести(Макет);
Возврат УниверсальныеМеханизмы.НапечататьДокумент(ТабДокумент, КоличествоЭкземпляров, НаПринтер, "Трудовой договор");
ИначеЕсли ИмяМакета = "РегламентированныйОтпуск" Тогда
ФормированиеПечатныхФормЗК.ПечатьСправкиПоРегламентированнымОтпускамСотрудника(ЭтотОбъект.Ссылка);
ИначеЕсли ИмяМакета = "УправленческийОтпуск" Тогда
ФормированиеПечатныхФормДополнительный.ПечатьСправкиПоУправленческимОтпускамСотрудника(ЭтотОбъект.Физлицо, ЭтотОбъект.Ссылка);
Иначе
СотрудникиОрганизацийДополнительный.ПечатьДополнительныхПечатныхФорм(ИмяМакета, КоличествоЭкземпляров, НаПринтер, ЭтотОбъект);
КонецЕсли;
КонецФункции // Печать
Макет.Параметры.ДолжностьРуководителя = ПросклонятьФразуПоСловам(Выборка.ДолжностьРуководителя,2);
и в самом макете задал параметр [ДолжностьРуководителяРП],но теперь на печатную форму вообще не выводится должность.
Андрей, а для чего в самом макете вы объявили параметр [ДолжностьРуководителяРП] ?
Посмотрите, выделенную вами красную фразу - там вы присваиваете значение параметру "ДолжностьРуководителя "
Измените либо название параметра в Макете, либо измените красную строку на следующую:
//***************
Макет.Параметры.ДолжностьРуководителяРП = ПросклонятьФразуПоСловам(Выборка.ДолжностьРуководителя,2);
//*************
Если не поможет, тогда рекомендую обратиться к более опытному программисту - подскажет.
Макет.Параметры.ДолжностьРуководителяРП = ПросклонятьФразуПоСловам(Выборка.ДолжностьРуководителя,2);
то должность вообще не выводится.
Если так:
Макет.Параметры.ДолжностьРуководителя = ПросклонятьФразуПоСловам(Выборка.ДолжностьРуководителя,2);
то выводит в именительном падеже.
Но все равно спасибо...
Не работает. Попробуйте: "Заведующий отделением"
Согласен. Корректная работа склонений достигается на 95% словосочетаний.
Считаю, что это невысокая плата за "бесплатное решение проблемы".
Оставшиеся 5% словосочетаний можно поправить врукопашную. Если это так критично, то можно использовать платные внешние компоненты.
Выбор остается за вами.
Функция ПросклонятьФразуПоСловам(Знач ИсходнаяСтрока, Падеж, НР=ложь) Экспорт
...
Результат = СокрЛП(Результат + " " + ?(НР,НРег(СловоВПадеже),СловоВПадеже));
...
Автору респект.
Внесу ясность. Предложенный мной метод не подмена внешней компоненты, а всего лишь более эффективное ее использование.
Компонента не в состоянии 100- процентно определить необходимость склонения.
Но решение все же есть.
Я поступил следующим образом:
= добавил новый регистр сведений. Всего одно измерение "Падеж именит" - тип строка. И 5 ресурсов (все падежи)
= При склонении фраз проверяю, есть ли в данном регистре точное соответствие фразы именительной, если есть, то выбираю склонение.
В случае, если фраза не определена, то использую для склонения внешнюю компоненту (как рассказывал выше)
Достоинство: склонять правильно можно абсолютно все . Правильный вариант определяет сам пользователь.
спасибо автору
Начальник отдела продаж = Начальника отделы продажа
Так что, разделение на слова не панацея, конечно.
Где-то работает, где-то нет.
Проверял в УПП 1.3 и в ЗУП на 23.07.2015 - одинаково.
Наилучший вариант, который смог придумать - дополнительный реквизит в форме справочника должностей для указания должности в родительном падеже.
Избавляет программиста от необходимости ломать голову как впихнуть невпихуемое, от ответственности за неверное склонение, от лишних деньгозатрат на платные компоненты.
Кому надо больше падежей, тому реализовывать более сложные механизмы, а для вывода должности в печатных формах договоров вполне сойдет.
При попытке получить склонение универсальная функция менеджера данного регистра пытается найти требуемую вам фразу по им-му падежу. Если находит - по возвращает требуемый падеж, какой заказал пользователь, ну а если не находит - то пытается просклонять по словам.
Если же конфигурация под замочком, то тогда можно "правильное" склонение хранить в хранилище значения, ключем фразы можно назначить саму фразу + падеж.
С регистром сведений "СклоненияПредставленийОбъектов". А лучше, воспользуйтесь функциями общих модулей библиотеки стандартных подсистем, такие как:
- СклонениеПредставленийОбъектов.ПросклонятьФИОСПомощьюКомпоненты()
- СклонениеПредставленийОбъектов.ПросклонятьПредставление
- СклонениеПредставленийОбъектов.ПросклонятьФИО
- СклонениеПредставленийОбъектов.ПросклонятьПредставлениеПоВсемПадежам
Поступил проще - в расширении к справочнику должности прибабахал поле "должность в родительном", пускай при создании новой должности заполняют сами один раз а потом юзают без вопросов
Сегодня гораздо удобней воспользоваться подсистемой склонение обьектов, входящей в БСП любой конфигурации
Вы можете заказать платную консультацию или разработку у автора. Будет создан приватный заказ на «Бирже заказов» для автора.
№ 78403
Создание 21.11.10 00:27
Обновление 10.12.10 20:34
Просмотры 67913
Загрузки 0
Рейтинг
122
Комментарии 64
Код открыт Да
Рубрики Адаптация типовых решений
Кому Разработчик
Тип файла Нет файла
Платформа 1С:Предприятие 8
Конфигурация 1С:Зарплата и Управление Персоналом 2.5
Операционная система Не имеет значения
Страна Россия
Отрасль Не имеет значения
Налоги Не имеет значения
Вид учета Не имеет значения
Доступ к файлу Бесплатно (free)