Разработка и Конфигурация · 8 мин
Как в 1С сформировать даты рождения
Как в 1С сформировать дату рождения: функция Дата(), форматирование, проверка корректности, генерация тестовых данных и типичные ошибки разработчика.
Дата рождения в 1С — это обычное значение типа «Дата», которое хранится в реквизитах справочников (например, «Физические лица»), документов и регистров сведений. Сформировать такую дату можно несколькими способами: через функцию Дата(), преобразование строки, ввод пользователем или программную генерацию для тестовых данных.
Выбор способа зависит от задачи. Если нужно заполнить дату рождения сотрудника из строки, полученной при обмене, подойдёт преобразование. Если требуется массово создать тестовых физлиц — понадобится генератор случайных дат в заданном диапазоне. А при вводе вручную достаточно стандартного поля ввода с типом «Дата».
Важно помнить: тип «Дата» в 1С по умолчанию содержит и время. Для даты рождения время не нужно, поэтому реквизит следует настраивать с составом даты «Дата» (без времени), иначе в отчётах и сравнениях возможны расхождения.
Где в 1С хранится дата рождения
В типовых конфигурациях (ЗУП, УТ, Бухгалтерия) дата рождения обычно хранится в справочнике «Физические лица» в реквизите «ДатаРождения». В самописных решениях реквизит добавляют вручную: в конфигураторе открывают объект, создают реквизит с типом «Дата» и в свойстве «Состав даты» выбирают значение «Дата».
Если оставить состав даты «Дата и время», пользователь увидит в поле ввода ещё и часы с минутами, что для даты рождения избыточно и путает при заполнении. Кроме того, сравнение дат с разным временем может дать неожиданный результат при программных проверках.
Формирование даты функцией Дата()
Основной способ задать конкретную дату программно — функция Дата(Год, Месяц, День). Она принимает числовые параметры и возвращает значение типа «Дата» с нулевым временем.
ДатаРождения = Дата(1985, 3, 17); // 17 марта 1985 года
Сотрудник.ДатаРождения = ДатаРождения;
Сотрудник.Записать();Также существует вариант с литералом даты: ДатаРождения = '19850317';. Литерал записывается в формате ГГГГММДД в одинарных кавычках — это удобно, когда дата известна заранее и зашита в код обработки.
Проверить, что дата сформирована верно, можно выводом: Сообщить(Формат(ДатаРождения, "ДЛФ=D"));. Форматная строка ДЛФ=D выводит только дату без времени.
Преобразование строки в дату рождения
При загрузке данных из файлов, Excel или внешних систем дата рождения часто приходит строкой: «17.03.1985», «1985-03-17» и т.п. Прямое присвоение строки реквизиту типа «Дата» не всегда срабатывает — платформа пытается распознать строку, но формат может не совпасть с ожидаемым.
Надёжный подход — разобрать строку вручную и собрать дату функцией Дата():
СтрокаДаты = "17.03.1985";
Части = СтрРазделить(СтрокаДаты, ".");
Если Части.Количество() = 3 Тогда
ДатаРождения = Дата(Число(Части[2]), Число(Части[1]), Число(Части[0]));
КонецЕсли;Такой разбор защищает от неоднозначности форматов: «03.04.1985» в российской записи — это 3 апреля, а в американской — 4 марта. При явном разборе вы сами контролируете порядок дня и месяца.
Проверка корректности даты рождения
Перед записью даты рождения стоит выполнить базовые проверки: дата не пустая, не в будущем и человеку не более разумного предела лет (например, 120). Это отсекает опечатки вида «2085» вместо «1985».
Если Не ЗначениеЗаполнено(ДатаРождения) Тогда
Сообщить("Дата рождения не заполнена");
ИначеЕсли ДатаРождения > ТекущаяДатаСеанса() Тогда
Сообщить("Дата рождения не может быть в будущем");
ИначеЕсли Год(ТекущаяДатаСеанса()) - Год(ДатаРождения) > 120 Тогда
Сообщить("Проверьте год рождения: значение выглядит ошибочным");
КонецЕсли;Дополнительно полезно проверить саму возможность существования даты: функция Дата(1985, 2, 30) не вызовет исключение во всех случаях так, как ожидает разработчик, поэтому при разборе строк сравнивайте собранную дату с исходными числами — несовпадение означает несуществующую дату.
Как проверить результат
Показана только дата без времени
Рядом с датой видны 0:00:00
День, месяц, год совпадают с источником
День и месяц переставлены местами
Возраст в разумных пределах (0–120 лет)
Дата в будущем или возраст более 120 лет
Генерация дат рождения для тестовых данных
При разработке и тестировании отчётов по персоналу часто нужны десятки физлиц с реалистичными датами рождения. Для этого используют генератор случайных чисел и функцию ДобавитьМесяц() или арифметику с секундами.
Генератор = Новый ГенераторСлучайныхЧисел();
МинГод = 1960;
МаксГод = 2000;
Год = Генератор.СлучайноеЧисло(МинГод, МаксГод);
Месяц = Генератор.СлучайноеЧисло(1, 12);
День = Генератор.СлучайноеЧисло(1, 28); // 28 гарантированно есть в любом месяце
ДатаРождения = Дата(Год, Месяц, День);Обратите внимание на ограничение дня числом 28: это простой способ избежать несуществующих дат вроде 31 февраля. Если нужен полный диапазон дней, определяйте последний день месяца через День(КонецМесяца(Дата(Год, Месяц, 1))).
Вычисление возраста по дате рождения
Частая сопутствующая задача — вычислить возраст. Простое вычитание годов даёт погрешность, если день рождения в текущем году ещё не наступил. Корректный алгоритм сравнивает месяц и день:
ТекДата = ТекущаяДатаСеанса();
Возраст = Год(ТекДата) - Год(ДатаРождения);
Если Месяц(ТекДата) < Месяц(ДатаРождения)
Или (Месяц(ТекДата) = Месяц(ДатаРождения) И День(ТекДата) < День(ДатаРождения)) Тогда
Возраст = Возраст - 1;
КонецЕсли;В запросах возраст вычисляют через РАЗНОСТЬДАТ(ДатаРождения, &ТекущаяДата, ГОД), но эта конструкция имеет ту же особенность с ненаступившим днём рождения — для точных расчётов добавляйте корректировку через ВЫБОР.
Типичные ошибки при работе с датами рождения
Ещё одна распространённая ситуация — хранение даты рождения строкой «для удобства». Это ломает сортировку, отборы по периоду и вычисление возраста в запросах. Дату всегда следует хранить в типе «Дата», а строковое представление формировать только при выводе.
Что важно запомнить
Дату рождения формируют функцией Дата(Год, Месяц, День) или литералом 'ГГГГММДД'. Реквизит настраивайте с составом «Дата» без времени, строки из внешних источников разбирайте явно, а перед записью проверяйте дату на заполненность, будущее время и разумный возраст.
Частые вопросы
Как вывести дату рождения без времени в отчёте?
Используйте функцию Формат() с форматной строкой: Формат(ДатаРождения, "ДЛФ=D"). В СКД аналогичный результат даёт настройка формата поля на закладке «Наборы данных» или в пользовательских настройках поля.
Почему при загрузке из Excel дата рождения смещается или не распознаётся?
Excel хранит даты как числа, и при чтении через COM или табличный документ значение может прийти числом либо строкой в региональном формате. Проверяйте тип полученного значения и при необходимости преобразуйте число через Дата(1899,12,30) + ЧислоДней * 86400, а строку разбирайте вручную.
Как массово заполнить даты рождения из файла?
Напишите обработку: чтение файла (CSV, Excel), разбор строки даты в явном формате, поиск физлица по ФИО или коду, присвоение реквизита и запись. Перед запуском в рабочей базе протестируйте обработку на копии и сделайте резервную копию.
Можно ли ограничить ввод даты рождения в форме?
Да. В событии «ПриИзменении» поля добавьте проверки на будущую дату и максимальный возраст с выводом предупреждения. Дополнительно можно задать свойство поля «Кнопка выбора» и использовать стандартный календарь, который снижает риск ручных опечаток.
Как найти сотрудников, у которых день рождения на этой неделе?
Запросом с условием на месяц и день: сравнивайте МЕСЯЦ(ДатаРождения) и ДЕНЬ(ДатаРождения) с диапазоном ближайших дней. Учтите переход через конец месяца и года — проще вычислить даты «от» и «до» в коде и сопоставить с ними день и месяц рождения.
Что делать, если дата рождения записана строкой в самописном реквизите?
Создайте обработку конвертации: для каждого элемента разберите строку, сформируйте значение типа «Дата» и запишите в новый реквизит с правильным типом. После проверки данных старый строковый реквизит можно удалить. Работу выполняйте в копии базы.