При работе с отчетами в программе 1С:Зарплата и управление персоналом 3 (ЗУП 3) пользователи часто сталкиваются с необходимостью добавить собственные расчетные показатели. Система компоновки данных (СКД) позволяет создавать "Пользовательские поля-выражения", однако малейшая неточность в написании формулы приводит к ошибке Data.SetExpressionsPresentation. Рассмотрим на конкретном примере, как правильно составить выражение для расчета срока замены паспорта и какие нюансы следует учитывать, чтобы избежать синтаксических ошибок.
Рассмотрим ситуацию: в кадровом отчете (например, "Личные данные сотрудников") требуется вычислить дату, когда сотруднику необходимо заменить паспорт (в 20 и 45 лет). Пользователь пытается использовать конструкцию ВЫБОР в сочетании с функцией ДобавитьКДате. Типичное выражение выглядит следующим образом:
Выбор
Когда Возраст < 20
Тогда ДобавитьКДате([Дата рождения], "год", 14)
Когда Возраст >= 20 И Возраст < 45
Тогда ДобавитьКДате([Дата рождения], "год", 20)
Когда Возраст >= 45
Тогда ДобавитьКДате([Дата рождения], "год", 45)
Конец
Проанализируем причину возникновения ошибки. Как выяснилось в ходе обсуждения, наиболее частой причиной является некорректная раскладка клавиатуры или использование "умных" кавычек, которые программа не распознает как технические ограничители строки.
Разберем по шагам, как работать со строковыми параметрами в функциях СКД. Функция ДобавитьКДате принимает три параметра: исходную дату, тип интервала и количество единиц. Тип интервала (например, год, месяц или день) должен передаваться строго как строка.
Важные правила написания:
". Если вы копируете формулу из текстовых редакторов типа Word, там могут стоять кавычки-елочки или кавычки-лапки. Для 1С это недопустимые символы."Год", так и на английском "Year". Хотя СКД часто нечувствительна к регистру, рекомендуется писать название с большой буквы для обеспечения совместимости.Поле не найдено "год", так как система воспринимает слово без правильных кавычек как имя поля данных, а не как литерал.Проанализируем ситуацию, когда в наборе данных отчета отсутствует готовое поле Возраст. В стандартных кадровых отчетах ЗУП 3 это поле может быть недоступно для прямых вычислений в пользовательских выражениях. В таком случае нам необходимо рассчитать его самостоятельно прямо внутри формулы.
Для вычисления возраста на текущую дату или дату отчета используем функцию РазностьДат. Рассмотрим пример вычисления:
РазностьДат([Дата рождения], &Период, "Год")
Здесь &Период — это стандартный параметр отчета, указывающий на дату формирования данных. Если мы хотим видеть возраст на сегодня, можно применить функцию ТекущаяДата().
С учетом всех технических нюансов и правил синтаксиса, итоговое рабочее выражение для пользовательского поля будет выглядеть так:
Выбор
Когда РазностьДат([Дата рождения], &Период, "Год") < 20
Тогда ДобавитьКДате([Дата рождения], "Год", 20)
Когда РазностьДат([Дата рождения], &Период, "Год") >= 20 И РазностьДат([Дата рождения], &Период, "Год") < 45
Тогда ДобавитьКДате([Дата рождения], "Год", 45)
Иначе ДатаВремя(1, 1, 1)
Конец
Обратите внимание: Согласно законодательству РФ, паспорт подлежит замене по достижении возраста 20 и 45 лет. Это значит, что если сотруднику исполнилось 20, он должен заменить паспорт. В формуле выше мы рассчитываем именно дату наступления этого события. Для решения этой задачи можно использовать готовый отчет со списком работников с просроченными паспортами.
Проанализируем современные требования законодательства РФ. С 2021 года паспорт остается действительным еще в течение 90 дней после достижения возраста 20 или 45 лет. Если нам нужно построить отчет, который показывает крайний срок действия документа, мы должны добавить еще 90 дней к полученной дате.
Рассмотрим пример модифицированной формулы:
ДобавитьКДате(
Выбор
Когда РазностьДат([Дата рождения], &Период, "Год") < 20 Тогда ДобавитьКДате([Дата рождения], "Год", 20)
Иначе ДобавитьКДате([Дата рождения], "Год", 45)
Конец,
"День", 90
)
Если при сохранении выражения система продолжает выдавать "Синтаксическую ошибку", проверим следующие моменты:
ВЫБОР (CASE) должна обязательно заканчиваться ключевым словом КОНЕЦ (END).ДобавитьКДате вернет ошибку. Используйте проверку ЕстьNULL([Дата рождения], ДатаВремя(1, 1, 1)).[Дата рождения].Если работа с пользовательскими полями в пользовательском режиме кажется неудобной или система ограничивает сложность выражений, проанализируем альтернативный путь. Вы можете зайти в "Изменить вариант отчета", переключиться в расширенный режим и воспользоваться вкладкой "Вычисляемые поля" (если настройки схемы это позволяют). Там редактор выражений более функционален и предоставляет более подробную диагностику ошибок синтаксиса.
Таким образом, создание пользовательских полей-выражений — это мощный инструмент кастомизации отчетов в ЗУП 3 без привлечения программиста для изменения конфигурации. Главное — строго соблюдать правила написания функций СКД и следить за чистотой используемых символов.