При разработке отчетов на базе Системы компоновки данных (СКД) программисты часто сталкиваются с ситуацией, когда стандартные, казалось бы, функции вызывают критические сбои. Одной из самых «неинформативных» и раздражающих ошибок является сообщение: «Значение не является значением объектного типа (ДоступныеЗначения)». Особенно часто это происходит при попытке установить значение параметра через выражение ТекущаяДата() или при копировании настроек из одного отчета в другой.
В этой статье мы подробно разберем, почему платформа выдает такую ошибку, проверим, не «сломала» ли 1С использование функций в параметрах, и научимся правильно диагностировать подобные проблемы в управляемых формах.
Давайте проанализируем ситуацию: разработчик прописывает в схеме СКД на вкладке «Параметры» в поле «Выражение» стандартную функцию ТекущаяДата(). На первый взгляд, всё верно. Однако при открытии отчета система аварийно завершает работу. Проблема здесь кроется не в самой функции ТекущаяДата(), а в том, как программный код формы или модуля объекта взаимодействует с параметрами схемы.
Рассмотрим механизм возникновения ошибки. Когда вы копируете существующий отчет, чтобы создать на его основе новый, вместе с ним копируются и модули. Часто в обработчике ПриОткрытии или ПриСозданииНаСервере содержится код, который программно управляет доступностью или значениями параметров. Ошибка возникает в следующей строке кода:
// Пример проблемного кода в модуле формы
ЭлементПараметра = Отчет.КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("ДатаНачала");
СписокЗначений = ЭлементПараметра.ДоступныеЗначения;
Если в новом отчете (в схеме СКД) параметр был переименован или удален, метод Найти("ИмяПараметра") возвращает значение Неопределено. В следующей строке система пытается обратиться к свойству ДоступныеЗначения у объекта Неопределено, что и вызывает пресловутое исключение. Таким образом, платформа сообщает нам не о проблеме в выражении СКД, а о потере объекта в программном коде.
Если ваш отчет перестал открываться с подобной ошибкой, рекомендуем выполнить следующие шаги по диагностике:
ПриСозданииНаСервере и ПриОткрытии. Если там есть обращения к КомпоновщикНастроек, убедитесь, что имена параметров в коде (строковые литералы в методе Найти) полностью совпадают с именами параметров в схеме СКД.ТекущаяДата() и открыть его. Если он открывается без ошибок — значит, проблема в обвязке (коде формы) вашего основного отчета.Разберем важный нюанс, касающийся времени. Хотя использование ТекущаяДата() в СКД допустимо, в современных конфигурациях на платформе 8.3 (особенно в клиент-серверном варианте) крайне рекомендуется использовать ТекущаяДатаСеанса().
Проанализируем разницу:
ТекущаяДата() — возвращает время сервера, на котором работает кластер 1С.ТекущаяДатаСеанса() — возвращает время с учетом часового пояса конкретного пользователя.Если сервер находится в Москве, а пользователь во Владивостоке, то использование просто ТекущаяДата() в отчете за «сегодня» может привести к тому, что пользователь не увидит часть своих данных, так как для сервера «сегодня» наступит на 7 часов позже. Поэтому в поле «Выражение» параметров СКД лучше писать ТекущаяДатаСеанса().
Вместо того чтобы вручную прописывать функции даты для каждого параметра, мы рекомендуем использовать объект СтандартныйПериод. Это упрощает жизнь и разработчику, и пользователю.
Посмотрим на алгоритм настройки:
ПериодОтчета с типом СтандартныйПериод.ДатаНачала и ДатаОкончания (которые используются в тексте запроса) снимите галочку «Включать в доступные поля».ДатаНачала укажите: &ПериодОтчета.ДатаНачала.ДатаОкончания укажите: &ПериодОтчета.ДатаОкончания.Это позволит пользователю выбирать удобные периоды («Прошлый месяц», «Этот квартал») в один клик, а СКД сама корректно подставит даты в запрос.
Иногда ошибка может возникать из-за конфликта имен. Если в наборе данных (в запросе) есть поле с тем же именем, что и параметр, автоматическая генерация формы СКД может «запутаться». Рекомендуется добавлять префиксы к параметрам, например, пДатаНачала или ВыбДата.
Также не стоит забывать о кэшировании. 1С сохраняет пользовательские настройки отчетов. Если вы изменили структуру параметров в схеме, но пытаетесь открыть отчет со старыми сохраненными настройками, система может попытаться применить их к несуществующим полям. В таких случаях помогает сброс настроек в пользовательском режиме («Еще» — «Установить стандартные настройки») или программная очистка настроек в методе ПриСозданииНаСервере:
// Программный сброс настроек при изменении схемы
Если ЭтаФорма.Отчет.КомпоновщикНастроек.Настройки.ДоступныеПоляВыбора.Элементы.Количество() = 0 Тогда
ЭтаФорма.Отчет.КомпоновщикНастроек.ЗагрузитьНастройки(ЭтаФорма.Отчет.СхемаКомпоновкиДанных.НастройкиПоУмолчанию);
КонецЕсли;
Мы выяснили, что ошибка «Значение не является значением объектного типа (ДоступныеЗначения)» в 99% случаев не связана с «поломкой» функций 1С. Это следствие обращения кода к несуществующему элементу коллекции ПараметрыДанных. Будьте внимательны при копировании отчетов, всегда проверяйте соответствие имен в коде и в схеме, и отдавайте предпочтение функции ТекущаяДатаСеанса() для корректной работы в разных часовых поясах.