Почему возникает ошибка «ДоступныеЗначения» в отчете СКД при использовании ТекущаяДата() и как её исправить

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

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

В этой статье мы подробно разберем, почему платформа выдает такую ошибку, проверим, не «сломала» ли 1С использование функций в параметрах, и научимся правильно диагностировать подобные проблемы в управляемых формах.

Разбираем истинную причину ошибки «ДоступныеЗначения»

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

Рассмотрим механизм возникновения ошибки. Когда вы копируете существующий отчет, чтобы создать на его основе новый, вместе с ним копируются и модули. Часто в обработчике ПриОткрытии или ПриСозданииНаСервере содержится код, который программно управляет доступностью или значениями параметров. Ошибка возникает в следующей строке кода:


// Пример проблемного кода в модуле формы
ЭлементПараметра = Отчет.КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("ДатаНачала");
СписокЗначений = ЭлементПараметра.ДоступныеЗначения; 

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

Как правильно диагностировать проблему

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

  1. Проверьте обработчики событий формы. Загляните в модуль формы отчета. Ищите методы ПриСозданииНаСервере и ПриОткрытии. Если там есть обращения к КомпоновщикНастроек, убедитесь, что имена параметров в коде (строковые литералы в методе Найти) полностью совпадают с именами параметров в схеме СКД.
  2. Используйте кнопку «Подробно». Никогда не игнорируйте окно ошибки. Нажав «Подробно», вы увидите стек вызова. Там будет указано имя модуля и номер строки, где возникла ошибка. Это кратчайший путь к решению.
  3. Тестирование «чистой» схемы. Попробуйте создать пустой отчет, добавить туда один параметр с выражением ТекущаяДата() и открыть его. Если он открывается без ошибок — значит, проблема в обвязке (коде формы) вашего основного отчета.

Особенности использования ТекущаяДата() и ТекущаяДатаСеанса()

Разберем важный нюанс, касающийся времени. Хотя использование ТекущаяДата() в СКД допустимо, в современных конфигурациях на платформе 8.3 (особенно в клиент-серверном варианте) крайне рекомендуется использовать ТекущаяДатаСеанса().

Проанализируем разницу:

Если сервер находится в Москве, а пользователь во Владивостоке, то использование просто ТекущаяДата() в отчете за «сегодня» может привести к тому, что пользователь не увидит часть своих данных, так как для сервера «сегодня» наступит на 7 часов позже. Поэтому в поле «Выражение» параметров СКД лучше писать ТекущаяДатаСеанса().

Профессиональная работа с периодами в СКД

Вместо того чтобы вручную прописывать функции даты для каждого параметра, мы рекомендуем использовать объект СтандартныйПериод. Это упрощает жизнь и разработчику, и пользователю.

Посмотрим на алгоритм настройки:

  1. Создайте параметр ПериодОтчета с типом СтандартныйПериод.
  2. Для параметров ДатаНачала и ДатаОкончания (которые используются в тексте запроса) снимите галочку «Включать в доступные поля».
  3. В поле «Выражение» для ДатаНачала укажите: &ПериодОтчета.ДатаНачала.
  4. В поле «Выражение» для ДатаОкончания укажите: &ПериодОтчета.ДатаОкончания.

Это позволит пользователю выбирать удобные периоды («Прошлый месяц», «Этот квартал») в один клик, а СКД сама корректно подставит даты в запрос.

Конфликты имен и кэширование настроек

Иногда ошибка может возникать из-за конфликта имен. Если в наборе данных (в запросе) есть поле с тем же именем, что и параметр, автоматическая генерация формы СКД может «запутаться». Рекомендуется добавлять префиксы к параметрам, например, пДатаНачала или ВыбДата.

Также не стоит забывать о кэшировании. 1С сохраняет пользовательские настройки отчетов. Если вы изменили структуру параметров в схеме, но пытаетесь открыть отчет со старыми сохраненными настройками, система может попытаться применить их к несуществующим полям. В таких случаях помогает сброс настроек в пользовательском режиме («Еще» — «Установить стандартные настройки») или программная очистка настроек в методе ПриСозданииНаСервере:


// Программный сброс настроек при изменении схемы
Если ЭтаФорма.Отчет.КомпоновщикНастроек.Настройки.ДоступныеПоляВыбора.Элементы.Количество() = 0 Тогда
    ЭтаФорма.Отчет.КомпоновщикНастроек.ЗагрузитьНастройки(ЭтаФорма.Отчет.СхемаКомпоновкиДанных.НастройкиПоУмолчанию);
КонецЕсли;

Резюме

Мы выяснили, что ошибка «Значение не является значением объектного типа (ДоступныеЗначения)» в 99% случаев не связана с «поломкой» функций 1С. Это следствие обращения кода к несуществующему элементу коллекции ПараметрыДанных. Будьте внимательны при копировании отчетов, всегда проверяйте соответствие имен в коде и в схеме, и отдавайте предпочтение функции ТекущаяДатаСеанса() для корректной работы в разных часовых поясах.

← На главную