Как правильно написать условие для проверки срока действия паспорта в СКД 1С?

Программист 1С v8.3 (Управляемые формы)
← На главную

При разработке внешних отчетов в системе компоновки данных (СКД) одной из самых частых задач является создание вычисляемых полей со сложной логикой. Одной из таких задач является контроль срока действия документов, например, паспортов. В процессе написания выражений программисты часто сталкиваются с синтаксическими ошибками и логическими нюансами функций работы с датами. В этой статье мы подробно разберем, как избежать ошибок в конструкции ВЫБОР, правильно использовать функции ДобавитьКДате и ТекущаяДата, а также внедрим корректную логику проверки паспортов согласно законодательству.

Анализ синтаксических ошибок в конструкции ВЫБОР

Рассмотрим типичную ситуацию, когда при написании сложного условия в вычисляемом поле СКД конфигуратор выдает ошибку синтаксиса. Основная проблема часто заключается в нарушении структуры оператора ВЫБОР. Проанализируем ошибочный фрагмент кода:


Выбор Когда ДатаВыдачи = 25 И Год(ТекущаяДата) - Год(ДатаРождения) = 45 Тогда ДобавитьКДате(ДатаРождения, "год", 45) Иначе Истина Конец КонецВыбора Тогда Истина Иначе Выбор Когда Год(ТекущаяДата) - Год(ДатаРождения) = 64 Тогда ДобавитьКДате(ДатаРождения, "год", 100) Иначе Истина Конец КонецВыбора Истина Конец

В данном примере допущено сразу несколько критических ошибок, которые мы сейчас разберем:

  1. Ключевое слово КОНЕЦ: Каждая конструкция ВЫБОР должна заканчиваться ключевым словом КОНЕЦ. Использование несуществующих слов типа КонецВыбора недопустимо.
  2. Структура КОГДА...ТОГДА: После каждого условия КОГДА обязательно должно идти ключевое слово ТОГДА, определяющее результат при истинности условия.
  3. Вложенность: При использовании вложенных условий важно соблюдать парность операторов. Если вы открываете новый ВЫБОР внутри блока ИНАЧЕ, он также должен быть закрыт своим КОНЕЦ.

Правильная структура должна выглядеть следующим образом:


ВЫБОР
    КОГДА Условие1 ТОГДА Результат1
    КОГДА Условие2 ТОГДА Результат2
    ИНАЧЕ РезультатИначе
КОНЕЦ

Особенности работы с функциями дат в вычисляемых полях

Теперь рассмотрим функцию ДобавитьКДате. Здесь важно различать контекст использования: пишется ли выражение в тексте запроса или в вычисляемом поле на соответствующей вкладке СКД. Проанализируем использование параметров функции.

В вычисляемых полях строковый идентификатор типа периода (например, "ГОД", "МЕСЯЦ", "ДЕНЬ") обязательно должен быть заключен в кавычки. Если вы забудете кавычки, система воспримет это как обращение к несуществующему полю или переменной. Рассмотрим пример корректного добавления 20 лет к дате рождения:

ДобавитьКДате(ДатаРождения, "ГОД", 20)

Также важно прояснить ситуацию с функцией ТекущаяДата(). В вычисляемых полях СКД функции глобального контекста работают корректно. Однако, если вы попытаетесь использовать ТекущаяДата() непосредственно внутри текста запроса (на вкладке "Набор данных"), 1С выдаст ошибку, так как язык запросов не знает такой функции. В запросах следует использовать параметры, например, &Период.

Реализация корректной логики проверки паспорта РФ

Для создания действительно полезного отчета нам необходимо опираться на действующее законодательство (Постановление Правительства РФ №828). Выясним основные правила: замена паспорта производится при достижении 20 и 45 лет. При этом паспорт остается действительным еще 90 дней после дня рождения.

Рассмотрим, как реализовать проверку просроченного паспорта, учитывая эти нюансы. Мы разделим задачу на два этапа: вычисление даты, когда паспорт должен был быть заменен, и сравнение этой даты с текущим моментом.

Создадим вычисляемое поле ДатаПлановойЗамены. Логика будет следующей:


ВЫБОР
    КОГДА РазностьДат(ДатаРождения, &ТекущаяДата, "ГОД") >= 45 
        ТОГДА ДобавитьКДате(ДатаРождения, "ГОД", 45)
    КОГДА РазностьДат(ДатаРождения, &ТекущаяДата, "ГОД") >= 20 
        ТОГДА ДобавитьКДате(ДатаРождения, "ГОД", 20)
    ИНАЧЕ ДобавитьКДате(ДатаРождения, "ГОД", 14)
КОНЕЦ

Затем мы добавим условие проверки на "просрочку", учитывая льготные 90 дней. Проанализируем ситуацию: паспорт считается недействительным, если с даты плановой замены прошло более 90 дней, а дата выдачи документа меньше, чем дата наступления возраста смены.

Повышение точности расчетов и работа с параметрами

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

Чтобы понять, исполнилось ли человеку 20 лет на текущую дату, проверим условие:

ДобавитьКДате(ДатаРождения, "ГОД", 20) <= &ТекущаяДата

Если это условие истинно — человеку исполнилось 20 лет. Этот метод учитывает и месяц, и день рождения, что исключает погрешности.

Еще один важный совет: старайтесь не использовать ТекущаяДата() жестко в коде вычисляемых полей. Вместо этого используйте параметр данных &Период. Это позволит пользователю формировать отчет не только на "сегодня", но и на любую дату в прошлом или будущем, чтобы проанализировать статистику. В настройках СКД на вкладке "Параметры" для &Период можно установить выражение ТекущаяДатаСеанса(), чтобы по умолчанию подставлялось актуальное время с учетом часового пояса пользователя.

Обработка пустых значений (NULL)

Проанализируем ситуацию, когда в базе данных не заполнены даты рождения или даты выдачи документов. Функции Год() или ДобавитьКДате() при передаче в них пустого значения могут вернуть некорректный результат или привести к ошибке выполнения отчета. Рекомендуется всегда использовать проверку на пустое значение:

ЕСТЬNULL(ДатаРождения, ДАТАВРЕМЯ(1, 1, 1))

В выражениях СКД это можно оформить так:


ВЫБОР 
    КОГДА ДатаРождения = ДАТАВРЕМЯ(1, 1, 1) ТОГДА "Нет данных"
    ИНАЧЕ [Ваше выражение расчета]
КОНЕЦ

Итоговый алгоритм для вычисляемого поля "СтатусПаспорта"

Соберем все знания воедино и составим комплексное выражение, которое определит, просрочен ли паспорт у сотрудника:


ВЫБОР
    КОГДА ДатаРождения = ДАТАВРЕМЯ(1, 1, 1) ТОГДА "Не заполнена дата рождения"
    КОГДА ДатаВыдачи = ДАТАВРЕМЯ(1, 1, 1) ТОГДА "Не заполнена дата выдачи"
    
    // Проверка для тех, кому за 45
    КОГДА ДобавитьКДате(ДатаРождения, "ГОД", 45) < ДобавитьКДате(&Период, "ДЕНЬ", -90) 
          И ДатаВыдачи < ДобавитьКДате(ДатаРождения, "ГОД", 45)
    ТОГДА "Просрочен (свыше 45 лет)"
    
    // Проверка для тех, кому от 20 до 45
    КОГДА ДобавитьКДате(ДатаРождения, "ГОД", 20) < ДобавитьКДате(&Период, "ДЕНЬ", -90) 
          И ДобавитьКДате(ДатаРождения, "ГОД", 45) > &Период
          И ДатаВыдачи < ДобавитьКДате(ДатаРождения, "ГОД", 20)
    ТОГДА "Просрочен (от 20 до 45 лет)"
    
    ИНАЧЕ "Действителен"
КОНЕЦ

Использование такого подхода гарантирует не только отсутствие синтаксических ошибок в конфигураторе, но и высокую точность бизнес-логики вашего отчета. Мы рассмотрели основные подводные камни, научились правильно использовать синтаксис языка компоновки данных и адаптировали техническое решение под требования законодательства.

← На главную