При разработке отчетов или выборок из регистров сведений часто возникает задача отфильтровать записи по возрасту или вывести его значение как дополнительный показатель. Нередко при использовании функции РАЗНОСТЬДАТ разработчики сталкиваются с отсутствием данных в выборке, отрицательными значениями или ошибками типов данных. Давайте разберем, как решить эту задачу и на какие «подводные камни» стоит обратить внимание.
Функция РАЗНОСТЬДАТ(Дата1, Дата2, ЕдиницаИзмерения) в языке запросов 1С имеет строгий порядок аргументов. Главная ошибка, с которой сталкиваются разработчики — это перепутанные местами даты начала и конца интервала. Если вы вычисляете возраст, важно помнить:
Если поменять их местами, результат вычисления будет отрицательным, что приведет к тому, что условие отбора ГДЕ Возраст >= &ВозрастМин просто не сработает для корректных записей. Посмотрим на правильный пример кода:
ВЫБРАТЬ
РАЗНОСТЬДАТ(Статистика.Пациент.ДатаРождения, Статистика.Регистратор.Дата, ГОД) КАК ВозрастВГодах
ИЗ
РегистрСведений.Статистика КАК Статистика
Часто поле ДатаРождения в справочнике Пациенты имеет составной тип данных (например, Дата и Строка). Это может приводить к ошибкам исполнения запроса в СКД или консоли, так как система «не уверена», что с данными можно проводить математические операции. В этом случае нам на помощь приходит функция ВЫРАЗИТЬ.
Рассмотрим, как правильно привести тип данных:
ВЫБРАТЬ
РАЗНОСТЬДАТ(ВЫРАЗИТЬ(Статистика.Пациент.ДатаРождения КАК ДАТА), Статистика.Регистратор.Дата, ГОД) КАК ВозрастВГодах
ИЗ
РегистрСведений.Статистика КАК Статистика
Важно: убедитесь, что в поле ДатаРождения действительно содержатся корректные даты. Если там присутствуют «мусорные» строки, которые невозможно преобразовать в тип ДАТА, запрос может исключить такие записи из выборки целиком.
Необходимо учитывать, что РАЗНОСТЬДАТ с параметром ГОД вычисляет не количество полных лет, а количество переходов через границы календарных лет. Например, если дата рождения — 31 декабря, а дата события — 1 января следующего года, функция вернет 1, хотя фактически прошел лишь один день. Для большинства статистических медицинских отчетов этого достаточно, но если требуется юридическая точность, следует применять более сложные формулы с проверкой месяца и дня рождения.
Чтобы избежать долгих поисков причин отсутствия данных, воспользуемся следующими рекомендациями:
ГДЕ. Выведите вычисляемое поле возраста в результат и посмотрите на реальные значения (не отрицательные ли они).НачалоПериода, КонецПериода, ВозрастМинимум, ВозрастМаксимум. Сортировка имен параметров в консоли часто сбивает с толку, и легко можно перепутать значения местами.ГДЕ, если регистр содержит миллионы записей. Оптимальным решением будет вычисление возраста во временной таблице, а затем наложение фильтра уже по этому готовому результату. Это позволит СУБД работать эффективнее, используя индексы.Применяя данные подходы, вы сможете надежно и корректно настроить фильтрацию по возрасту в любых отчетах на платформе 1С.