Как отладить отчет на СКД и исправить ошибку преобразования к типу Булево

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

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

Поиск причины ошибки: с чего начать отладку?

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

Использование консоли запросов

Самый очевидный, но не всегда эффективный метод — это копирование текста запроса из схемы компоновки данных во внешнюю консоль запросов. Рассмотрим этот процесс по шагам:

  1. Откроем отчет в конфигураторе.
  2. Найдем основную схему компоновки данных.
  3. Скопируем текст запроса из набора данных.
  4. Вставим его в консоль запросов и попробуем выполнить.

Однако помните, что в типовых отчетах ЗУП 3.1 запросы часто строятся динамически или используют сложные временные таблицы. Обычная консоль может не «потянуть» параметры, которые передаются системой автоматически (например, &Период или &КлючВарианта). Если в консоли запросов ошибка не воспроизводится, значит, проблема лежит глубже — в механизмах самой компоновки.

Использование консоли системы компоновки данных

Для более глубокого анализа нам потребуется Консоль СКД. В отличие от консоли запросов, она позволяет выполнить не просто текст, а всю схему целиком со всеми настройками, вычисляемыми полями и ресурсами. Проанализируем ситуацию через этот инструмент:

  1. Загрузим схему отчета (файл .dcs) в консоль СКД.
  2. Установим те же настройки (фильтры, параметры), которые были в момент возникновения ошибки у пользователя.
  3. Запустим формирование. Если ошибка возникла здесь, мы сможем поочередно отключать поля в настройках, чтобы выяснить, какое именно поле вызывает сбой.

Разбор ошибки «преобразование значения типа Булево»

Выясним причину, почему 1С выдает именно такое сообщение. Чаще всего в СКД это происходит в следующих случаях:

  1. Вычисляемые поля: Если на вкладке «Вычисляемые поля» прописано выражение типа ВЫБОР КОГДА Поле1 ТОГДА ... Конец, а Поле1 содержит значение NULL или число вместо логического Истина/Ложь, система не сможет вычислить условие.
  2. Условное оформление: Ошибка часто кроется в условиях оформления, где логическое выражение сравнивает несовместимые типы.
  3. Слияние наборов данных (Union): Если в запросе используется ОБЪЕДИНИТЬ ВСЕ, и в одной из частей поле имеет тип Булево, а в другой — NULL, который система ошибочно интерпретирует как другой тип данных, при попытке логического сравнения этого поля в настройках возникнет ошибка.

Программная отладка через макет компоновки

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

В процедуре ПриКомпоновкеРезультата (или в месте программного вызова компоновки) установим точку останова. Нам интересен объект МакетКомпоновки, который генерируется процессором компоновки. Мы можем выгрузить его в XML-файл, чтобы увидеть итоговый запрос, который СКД отправляет к СУБД. Посмотрим на пример кода для отладки:


// Вставьте этот код в точку останова для анализа схемы
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку();
СериализаторXDTO.ЗаписатьXML(ЗаписьXML, МакетКомпоновки);
СтрокаXML = ЗаписьXML.Закрыть();
// Теперь в переменной СтрокаXML находится полная структура сформированного отчета

Анализ этого XML позволит увидеть, какие именно значения подставились в параметры и как выглядят временные таблицы «под капотом».

Анализ данных в документах

Как показывает практика (и случай с отчетом «Остатки отпусков»), проблема часто кроется не в программном коде, а в некорректном заполнении первичных документов. В ЗУП 3.1 отчет по остаткам отпусков собирает данные из множества регистров, которые заполняются документами «Ввод остатков отпусков», «Прием на работу» и др.

Разберем ситуацию: если в документе Ввод остатков отпусков какое-то поле (например, признак компенсации или признак ежегодного отпуска) не заполнено или заполнено противоречивыми данными, запрос может вернуть NULL там, где ожидается Ложь или Истина. При последующей обработке этого поля в выражении СКД система упадет с ошибкой преобразования.

Чтобы найти виновных, можно временно модифицировать запрос отчета, добавив проверку на корректность. Рассмотрим пример изменения условия в запросе для поиска пустых значений:


ВЫБОР
    КОГДА ТипЗначения(ТаблицаДанных.НужноеПоле) <> ТИП(БУЛЕВО)
        ТОГДА "Ошибка в данных у сотрудника: " + ТаблицаДанных.Сотрудник.Наименование
    ИНАЧЕ ""
КОНЕЦ

Использование таких «диагностических» полей поможет быстро вывести список сотрудников, по которым документы заполнены с ошибками.

Рекомендации по исправлению

После того как мы локализовали проблему, у нас есть два пути решения:

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

// Вместо прямого обращения к полю:
// Таблица.ПризнакАктивности

// Используем безопасное приведение:
ЕСТЬNULL(Таблица.ПризнакАктивности, ЛОЖЬ) КАК ПризнакАктивности

Важный нюанс: В СКД важно помнить, что NULL в языке запросов и отсутствие значения в вычисляемом поле — это разные вещи. Всегда старайтесь инициализировать логические поля значениями по умолчанию еще на уровне формирования временных таблиц. Это сделает ваш отчет устойчивым к любым ошибкам человеческого фактора при заполнении документов.

Таким образом, отладка СКД — это комплексный процесс, сочетающий использование специализированных консолей, программный анализ макета и тщательную проверку корректности данных в информационной базе.

← На главную