Содержание:
1. Необходимость написания даты прописью 1С
2. Описание правил склонения в самостоятельном алгоритме
1. Необходимость написания даты прописью 1С
Перед разработчиками периодически ставят нетривиальные задачи, связанные скорее с удобством для пользователя. Одной из таких задач является дата прописью в 1С. С одной стороны, для хозяйственного учета это не является вещью первостепенной. С другой стороны, некоторые печатные формы документов 1С могут содержать в себе Дату прописью (различные накладные, Наряд-допуск для производства, Договор или дополнительное соглашение с указанием прописной даты и так далее).
Решить такую задачу можно двумя путями:
1. Простой, но имеющий ограничения: это использование при формировании даты прописью 1С подсистемы «Склонение представлений объектов» из набора «Библиотеки стандартных подсистем» в 1С (в большинство типовых конфигураций такая подсистема встроена). Так как подсистема универсальна и использует веб-сервис «Морфер», для ее работы требуется подключение к сети (что и является ограничением даже сегодня, ведь не везде возможно подключение к сети, иногда, в целях информационной безопасности).
2. Сложный, но трудоемкий в реализации: это написать самостоятельно все правила склонений Даты, но придется указать ограничения в пределах 9999 года.
По простому пути идти рекомендуется в связи с возможностью использования веб-сервиса, а также для получения корректных данных (у сервиса меньше вероятности ошибки склонения).
Об использовании подсистемы «Склонение представлений объектов» есть достаточно подробные статьи, например, моего коллеги Алексея Болдонова (читать здесь). Однако цель текущей статьи – показать пример написания алгоритма в программе 1С.
2. Описание правил склонения в самостоятельном алгоритме
Для того чтобы написать число прописью, потребуется предварительно составить порядок действий для сложных и простых случаев.
Очертим некоторые допущения:
1. согласно нормам русского языка в названии года могут использоваться как порядковые числительные, так и количественные, но, рассматривая текущий пример, мы несколько упростим правила для лучшего понимания примера самостоятельного алгоритма;
2. важно помнить, что для неодушевленных предметов вопрос для именительного падежа будет такой же, как и для винительного, поэтому последний мы указывать в таблице не будем;
3. в примере будет использована формула: для числа с двумя и более знаками все цифры (кроме нуля) будут взяты в именительном падеже, кроме последней (кроме нуля), которая будет взята в родительном падеже;
4. в примере будет рассмотрена упрощенная модель написания даты (месяца) прописью, не берущая во внимание исключения и из правил русского языка.
В прописной дате можно выделить следующие основные блоки чисел прописью на русском языке:
· число дня;
· число месяца прописью;
· число года.
Начнем с простого – число месяца прописью. Для месяца всегда будет использован Родительный падеж, поэтому можно зафиксировать 12 значений в любом удобном виде (массив, список значений, соответствие и иное) используя метод Месяц(), который возвращает числовое значение месяца, поэтому как Ключ записи 1С может использовать число месяца прописью, а как значение записи – наименование месяца в Родительном падеже (для массива ключом записи в 1С может служить индекс значения).
Теперь можно разбирать сложное: числа дня и года. К сожалению, сделать для дня и года какие-то пересекающиеся алгоритмы довольно проблематично (мало пересечений), поэтому сначала разберем день, потом год, рассчитывая, что для них самостоятельный алгоритм будет совершать отдельные операции.
Чтобы мы методом подбора могли брать правильные значения, необходимо создать таблицу значений, где в названии колонок укажем падежи и само значение, и таким образом заполним некоторые данные для нашего алгоритма. Для создания своей наработки можно использовать Регистр сведений 1С 8, но это больше подходит тем пользователям, кому потребуется широко использовать возможности склонений в повседневной работе.
Число дня
Мы можем разбить число дня на две части: единицы и десятки. При этом мы должны понимать, что каждый раз необходимо выделять саму «цифру» дня или года, и ее «позицию».
Итак, зададим переменную и первые несколько строк значений:
И так далее аж до 19-го числа. Начиная с 21-го числа, мы сможем комбинировать значение «двадцать», и «первое», «двадцать», и «второе», «двадцать», и «третье» аж до 99-го:
Для уменьшения количества строк, мы можем пойти следующим путем:
1. для значений от одного до двадцати используем уникальные значения склонений;
2. для значений внутри десятков, начиная со второго, мы будем пользоваться формулой: число дня >= 21 и < 30; значение 21 + значение дня, взятое из второй части цифры дня, например, 25 >= 21 и < 30, значит «двадцать» + «пятое» (всё в именительном падеже).
Используя метод День(), мы можем получить числовое выражение дня, что нам поможет в алгоритме.
При этом можно использовать условие (чтобы было проще понимать):
Так как до сотни значения будут повторяться, считаем, что с ними мы закончили. Для придания универсальности (то есть использования как дней, так и лет), можно добавить условия и заключить в функцию:
Таким образом, мы получаем значение числа прописью для дня – в Именительном падеже, а для года (от первого до девяносто девятого) – в Родительном падеже.
Так как с днями мы разобрались, настал черед годов. Мы разобрали значения лет от одного до девяносто девяти, теперь же разберем состав сотен лет:
При этом следует учитывать, что если в указанном году нет десятков или единиц, то мы подставляем значение «Какого». Если есть десятки или единицы, то – «Какой». Через условие можно это указать и заключить в функцию:
При написания тысяч ситуация будет схожей, а само заполнение будет выглядеть так:
Таким же образом заключим условия для выбора в функцию 1С 8:
Соединяя полученные функции 1С 8, мы сможем из даты получить все, что нам потребуется, чтобы собрать результат в одну строку:
Итак, мы разобрали сначала день, потом месяц. Год мы разобрали по частям: десятки лет, сотни лет и тысячи лет. И уже после собрали все в одну строку.
Вот таким объемным способом можно самостоятельно создать функцию даты прописью в 1С, но, конечно, следует учитывать ограничения.
Для более гибких функции в 1С 8 лучше всего создать отдельный словарь в Регистре Сведений 1С, и использовать более сложный алгоритм, учитывающий необходимые склонения. Однако и в этом случае универсальность такой функции достаточно ограничена.
Специалист компании «Кодерлайн»
Иван Каплин