Ошибка во внешнем отчете SDBL

Версия для печатиPDF-версия

На работе дали на изучение отчет, который выдавал множество ошибок. Вначале ошибки были на реквизиты регистра - названия изменились на "УдалитьТакой-тоРеквизит", с этим разобрался.
После исправлений выявилась новая ошибка, которая не дает посмотреть где ошибка (отладчиком нашел, что затык происходит в строчке выполнения запроса)

Ошибка SDBL
недопустимое преобразование типов

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

Вытаскивайте запрос в консоль запросов и проверяйте.

Нужно локализовать проблему в запросе. Если есть вложенные запросы или создание временных таблиц, то проверьте их по отдельности. Если нет, то попробуйте удалять условия и поля из запроса, пока запрос не начнёт работать.

 

Отчет огромный. состоит из 7 пакетов запросов, данные взаимосвязаны - нереально будет удалять кусок - ошибка другая будет и вероятно до возникновения ошибки sdbl

Консолью запросов - попробую. Гугл ответа не дает к сожалению... точнее говорят, что проблема может быть в БД (а именно в СУБД), но там обговаривается клиент-серверный вариант базы, а  у меня база в файловом режиме открывается
 

Проблема оказалась банальной. Оказалось, что не все реквизиты заполняются автоматом перед созданием отчета.
Теперь другая проблема - как сделать грамотно проверку на нуль?
 

В смысле на null?

"ВЫБРАТЬ
    |    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ВЫБОР
    |                КОГДА РаботникиОрганизацийСрезПоследних.УдалитьВидЗанятости = ЗНАЧЕНИЕ(Перечисление.ВидыЗанятостиВОрганизации.ОсновноеМестоРаботы)
    |                    ТОГДА РаботникиОрганизацийСрезПоследних.УдалитьФизлицо
    |            КОНЕЦ) КАК КоличествоРаботниковНаОснМестеРаботы,
    |    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ВЫБОР
    |                КОГДА РаботникиОрганизацийСрезПоследних.УдалитьВидЗанятости = ЗНАЧЕНИЕ(Перечисление.ВидыЗанятостиВОрганизации.Совместительство)
    |                    ТОГДА РаботникиОрганизацийСрезПоследних.УдалитьФизлицо
    |            КОНЕЦ) КАК КоличествоРаботниковСовместительство
    |ПОМЕСТИТЬ КоличествоРаботников
    |ИЗ
    |    РегистрСведений.РаботникиОрганизаций.СрезПоследних(
    |            &КонецПериода,
    |            ОбособленноеПодразделение В (&Организация)
    |                И УдалитьВидЗанятости В (ЗНАЧЕНИЕ(Перечисление.ВидыЗанятостиВОрганизации.ОсновноеМестоРаботы), ЗНАЧЕНИЕ(Перечисление.ВидыЗанятостиВОрганизации.Совместительство))) КАК РаботникиОрганизацийСрезПоследних
    |ГДЕ
    |    (НЕ РаботникиОрганизацийСрезПоследних.ПричинаИзмененияСостояния = ЗНАЧЕНИЕ(Перечисление.ПричиныИзмененияСостояния.Увольнение))
    |
    |СГРУППИРОВАТЬ ПО
    |    РаботникиОрганизацийСрезПоследних.УдалитьВидЗанятости
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |    ЕстьNULL(СУММА(КоличествоРаботников.КоличествоРаботниковНаОснМестеРаботы),0) КАК КоличествоРаботниковНаОснМестеРаботы,
    |    ЕстьNULL(СУММА(КоличествоРаботников.КоличествоРаботниковСовместительство),0) КАК КоличествоРаботниковСовместительство
    |ИЗ
    |    КоличествоРаботников КАК КоличествоРаботников
    |;
Есть ли тут ошибка запроса?

это 8.2

Попробуйте
|СГРУППИРОВАТЬ ПО
| РаботникиОрганизацийСрезПоследних.УдалитьВидЗанятости
убрать из запроса. И временную таблицу создавать не надо. Количество сразу можно получить.
ПС. Структура регистра какая?

Тут структура запроса в том, что сначала берутся и считаются элементы, потом проверяется на Нуль. Разделено на 2 запроса в пакете (и еще сделано то же самое позднее, но хотя бы с этим разобраться)

Регистр

4 измерения - Сотрудник, Организация, УдалитьФизЛицо, УдалитьПриказ

8 ресурсов - Занимаемых ставок, ПодразделенияОрганизации, УдалитьВидЗанятости, ПричинаИзмененияСостояния, ОбособленноеПодразделение, СтруктурноеПодразделение, Должность, ИсчислятьОППВ
 

Запрос вообще сплошная ошибка. Сейчас посмотрел внимательнее. Вот что нужно исправить:

1. В конструкции ВЫБОР перед словом КОНЕЦ надо добавить строку ИНАЧЕ NULL, а то неполное условие получается.

2. Из параметров виртуальной таблицы нужно удалить отбор по полям ОбособленноеПодразделение и УдалитьВидЗанятости. Перенести их в условия (ГДЕ ...). В параметры виртуальной таблицы можно выносить только измерения регистра.

3. Конструкцию СГРУППИРОВАТЬ ПО вообще убрать. Группировка будет общая.

4. Убрать создание временной таблицы (если, конечно, эти же данные не будут использоваться в другом подзапросе). Проверка на null не нужна. Если не будет ни одного подходящего значения, то при группировке будет 0.

На данный момент проблема в том, что он вообще не считает работников... выдает 1 и 0, хотя должно быть около 50+ суммарно
 

А без группировки запускать запрос пробовали?

Да. Никаких изменений... Вот непонятно, вроде взаимодействие то правильное с регистром сведений. Но он выдает не то число, которое должно быть
 

Что значит "никаких изменений"? Уберите группировку из запроса. Запрос должен будет возвращать таблицу работников.

Он возвращает КОЛИЧЕСТВО работников, а не таблицу их
 

Откройте запрос в конструкторе запросов. На вкладке Группировка очистите группируемые поля. Будет возвращать таблицу.

Там в самом начале написано
ВЫБРАТЬ КОЛИЧЕСТВО
потому он число возвращает.

сейчас решил с нуля переписать запрос, более простым его сделать что ли

"ВЫБРАТЬ РАЗЛИЧНЫЕ
    |    РаботникиОрганизацийСрезПоследних.Сотрудник
    |ИЗ
    |    РегистрСведений.РаботникиОрганизаций.СрезПоследних КАК РаботникиОрганизацийСрезПоследних
    |ГДЕ
    |    РаботникиОрганизацийСрезПоследних.Организация.Наименование = &Организация
    |    И РаботникиОрганизацийСрезПоследних.УдалитьВидЗанятости = ЗНАЧЕНИЕ(Перечисление.ВидыЗанятостиВОрганизации.Совместительство)
    |;
    |

Вот Без строчки про вид занятости работает, но стоит добавить - не находит ни одного человека (хотя он есть). Так же с выбором другого вида занятости (а там уже много людей) не находит никого
При этом различие этих двух групп людей ТОЛЬКО в этом поле... Думаю вот как выловить правильно его
 

КОЛИЧЕСТВО (РАЗЛИЧНЫЕ - это и есть группировка.
Добавьте в поля запроса УдалитьВидЗанятости. Посмотрите, что в нём будет выводится.
А вообще, сами данные регистра смотрели? Там вид занятости заполнен?

Посмотрел... Почему-то пустые. Обожаю, когда в типовых какой-то реквизит отправляют на "удаление".

Заменил на значение РаботникиОрганизацийСрезПоследних.Сотрудник.ВидЗанятости - заработало.

Ща новая проблема. Берутся работники из основной организации и из филиала. Ищу, в каком месте можно взять отдельно основную организацию, а где - филиал.
Нынешняя версия выглядит вот так

"ВЫБРАТЬ РАЗЛИЧНЫЕ
    |    РаботникиОрганизацийСрезПоследних.Сотрудник
    |ИЗ
    |    РегистрСведений.РаботникиОрганизаций.СрезПоследних КАК РаботникиОрганизацийСрезПоследних
    |ГДЕ
    |    РаботникиОрганизацийСрезПоследних.Организация.Наименование = &Организация
    |   И РаботникиОрганизацийСрезПоследних.Сотрудник.ВидЗанятости = ЗНАЧЕНИЕ(Перечисление.ВидыЗанятостиВОрганизации.ОсновноеМестоРаботы)
    |   И РаботникиОрганизацийСрезПоследних.ПричинаИзмененияСостояния <> ЗНАЧЕНИЕ(Перечисление.ПричиныИзмененияСостояния.Увольнение)
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ РАЗЛИЧНЫЕ
    |    РаботникиОрганизацийСрезПоследних.Сотрудник
    |ИЗ
    |    РегистрСведений.РаботникиОрганизаций.СрезПоследних КАК РаботникиОрганизацийСрезПоследних
    |ГДЕ
    |    РаботникиОрганизацийСрезПоследних.Организация.Наименование = &Организация
    |    И РаботникиОрганизацийСрезПоследних.Сотрудник.ВидЗанятости = ЗНАЧЕНИЕ(Перечисление.ВидыЗанятостиВОрганизации.Совместительство)
    |   И РаботникиОрганизацийСрезПоследних.ПричинаИзмененияСостояния <> ЗНАЧЕНИЕ(Перечисление.ПричиныИзмененияСостояния.Увольнение)";
 

Всё... Этот кусок отчета вроде как готов. Теперь надо разобраться со следующим... И там бухгалтерская тема... куча счетов.
Запрос 2 частей

ВЫБОР
    |        КОГДА ТиповойОбороты.Счет В ИЕРАРХИИ (ЗНАЧЕНИЕ(ПланСчетов.Типовой.КраткосрочнаяЗадолженностьПоставщикамИПодрядчикам))
    |                И ТиповойОбороты.Субконто1 В (&СубконтоПоставщикЭнергии)
    |                И ТиповойОбороты.КорСчет В ИЕРАРХИИ (&СчетаПроизводственныхРасходов)
    |            ТОГДА ТиповойОбороты.СуммаОборотКт
    |    КОНЕЦ КАК Счет3310_Энергия_1,
типа такого

и в следующем запросе в пакете идет

|    СУММА(ЕСТЬNULL(ОборотыСчетов.Счет3310_Энергия_1, 0)) КАК Счет3310_Энергия_1,    
  вот такое. И почему-то Нуль не работает... то есть в результате дает нуль. счетов несколько десятков... буду лазить ща
 

Проверяйте результат первого запроса.

Запрос.Текст ="ВЫБРАТЬ РАЗЛИЧНЫЕ
    |    РаботникиОрганизацийСрезПоследних.Сотрудник
    |ИЗ
    |    РегистрСведений.РаботникиОрганизаций.СрезПоследних(
    |            &КонецПериода,
    |            ОбособленноеПодразделение В (&ОрганизацияМ)
    |            ) КАК РаботникиОрганизацийСрезПоследних
    |ГДЕ
    |    РаботникиОрганизацийСрезПоследних.Сотрудник.ВидЗанятости = ЗНАЧЕНИЕ(Перечисление.ВидыЗанятостиВОрганизации.ОсновноеМестоРаботы)
    |    И РаботникиОрганизацийСрезПоследних.ПричинаИзмененияСостояния <> ЗНАЧЕНИЕ(Перечисление.ПричиныИзмененияСостояния.Увольнение)
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ РАЗЛИЧНЫЕ
    |    РаботникиОрганизацийСрезПоследних.Сотрудник
    |ИЗ
    |    РегистрСведений.РаботникиОрганизаций.СрезПоследних(
    |            &КонецПериода,
    |            ОбособленноеПодразделение В (&ОрганизацияМ)
    |           ) КАК РаботникиОрганизацийСрезПоследних
    |ГДЕ
    |    РаботникиОрганизацийСрезПоследних.Сотрудник.ВидЗанятости = ЗНАЧЕНИЕ(Перечисление.ВидыЗанятостиВОрганизации.Совместительство)
    |    И РаботникиОрганизацийСрезПоследних.ПричинаИзмененияСостояния <> ЗНАЧЕНИЕ(Перечисление.ПричиныИзмененияСостояния.Увольнение)
    |;

Вот так стал выглядеть первый кусок запроса - появилась проблема, что в прошлом варианте только 1 организация может быть выбрана. Но проявилась проблема, что почему-то считается 1 человек 2 раза (он был переведен из одной организации в другую), думаю вот как его отсеять.
Считаю, что так получилось из-за того, что раньше ВидЗанятости был ресурсом, а теперь реквизитом измерения (и более позднее не перекрывает раннее)

результат запроса выдает либо число (если есть значения), либо нуль. Но второй запрос почему-то не изменяет нуль на 0. То есть если включить отчет пустого периода - он дает ошибку, что нулл нельзя преобразовать в число, а когда период не пустой - выдает числа в отчет

Меня вот интересует конструкция Выбора - правильно ли она реализована (для 8.2)
ну и реализация Сумма ( ЕстьНуль( что-то , 0)

СУММА(ЕСТЬNULL(<Выражение>, <Выражение>)) - правильно.

А в Конструкции ВЫБОР должна быть ветка ИНАЧЕ:

ВЫБОР 
	КОГДА <Выражение> ТОГДА <Выражение>
	ИНАЧЕ <Выражение>
КОНЕЦ

А если ситуация Иначе не предполагается? это же как конструкция Если в обычном коде. Может быть и без ИНАЧЕ

В запросе у поля обязательно должно быть какое-нибудь значение. Вставляйте ИНАЧЕ NULL.

Ну так он сам если не находит значение - выдает НУЛЛ. В чем разница, указывается это явно или нет?
 

Как-то не задавался таким вопросом.

В общем все начало работать. SDBL ошибку исправил окончательно при любых входных данных.
Осталась мелочь, которая не дает мне отдать отчет на эксплуатацию, хотя не думаю, что много кому может понадобиться ЭТО.
В общем, если работник работал в одном подразделении организации, а потом перешел в другую - он учитывается 2 раза... Как и почему - пока разбираюсь, пытаюсь найти тот самый реквизит, проверку которого можно вбухать в запрос.
Вроде нащупал, залезть в справочник и там сверять, но какой-то говнокод получится так. Думаю как через регистр сведений такое вытащить
 

Есть идеи, как проверить, существует ли более поздняя запись в регистре с таким же значением по определеннному измерению?
Как-то выходит так, что в регистре сведений есть 2 записи одного человека в разных филиалах организации. И он считается при считываении списка работников организации

Пробовали Подразделение из параметров виртуальной таблицы в условия запроса вынести?

Страницы