I am struggling for a few days with this issue and I can’t figure out how can I fix it.
I would like to group by
my table on values 1
,2
,3
,4
,5
so I have created a temporary table with this values.
Now I have to INNER JOIN
this table with other tables on a.value = #myTempTable.num
.
BUT a.value
is ntext
so I need to CONVERT
it what I actually did, but I am getting an error:
Conversion failed when converting the varchar value ‘simple, ‘ to data
type int. (on line 7)
Create table #myTempTable
(
num int
)
insert into #myTempTable (num) values (1),(2),(3),(4),(5)
SELECT a.name, CONVERT(INT, CONVERT(VARCHAR(12), a.value)) AS value, COUNT(*) AS pocet
FROM
(SELECT item.name, value.value
FROM mdl_feedback AS feedback
INNER JOIN mdl_feedback_item AS item
ON feedback.id = item.feedback
INNER JOIN mdl_feedback_value AS value
ON item.id = value.item
WHERE item.typ = 'multichoicerated' AND item.feedback IN (43)
) AS a
INNER JOIN #myTempTable
on CONVERT(INT, CONVERT(VARCHAR(12), a.value)) = #myTempTable.num
GROUP BY a.name, CONVERT(INT, CONVERT(VARCHAR(12), a.value)) ORDER BY a.name
drop table #myTempTable
I am not getting this error without the last INNER JOIN
INNER JOIN #myTempTable on CONVERT(INT, CONVERT(VARCHAR(12), a.value))
= #myTempTable.num
Could someone help me please?
Thanks.
При написании кода 1С или проведения бухгалтерских операций в системе 1С 8.3 и более ранних системах вы можете столкнуться с уведомлением «Преобразование значения к типу Число не может быть выполнено». Причиной ошибки обычно является попытка программиста преобразовать в число значение, которое числовым быть не может. Ниже разберём суть данной ошибки, а также представим возможные варианты её решения.
Содержание
- Причины ошибки выполнения преобразования значения к типу Число
- Обновите вашу систему 1С до самой актуальной версии
- Внимательно проверьте код на наличие переменных
- Например, в примере:
- Измените первый тип слагаемого на число
- Используйте конфигуратор для нахождения исключения кода
- Переиндексируйте ваши файлы
- Используйте функцию «Есть NULL»
- Заключение
Причины ошибки выполнения преобразования значения к типу Число
Обычно данная проблема возникает при запуске кода, выполнении процедуры проверки кода на ошибки или при осуществлении стандартных операцией составления отчётности в системе 1С 8.3 (и ранних системах).
В частности, ошибка фиксировалась в следующих обстоятельствах:
- Вместо переменной числового типа был использован NULL, строка, индекс почты, ИНН, дата и другие значения. В этом случае стандартное арифметическое действие с двумя или несколькими числовыми переменными не может быть выполнено, так как какое-либо из значений не может быть трансформировано в число;
- При выполнении операции по сложению чисел программист указал первым значением строку, а не число, тем самым совершив ошибку;
- Было использовано двойное обозначение для единиц исчисления. К примеру, это может быть руб и RUB. Для устранения ошибки рекомендуем использовать одно унифицированное обозначение, в случае двоих указывайте для них одинаковые ставки и коэффициенты во избежание конфликта;
- В коде указана операция в двух разных направлениях (наиболее часто встречается в 8 версии 1С). Во избежание дисфункции необходимо убрать одну из проводок;
- Пользователь использует устаревшую (неотлаженную) версию 1С, где пытается работать с современными типами данных.
Давайте разберём, как устранить ошибку «Преобразование значения к типу Число не может быть выполнено» в конфигурации 1С 8.3.
Читайте также: Соединение с сервером баз данных разорвано администратором в системе 1С.
Обновите вашу систему 1С до самой актуальной версии
Прежде чем разбирать особенности ошибок в коде 1С, рекомендуем обновить вашу 1С до самой актуальной версии. В некоторых случаях ошибка «преобразование значения к типу число» вызвана устаревшим вариантом системы, на которой специалист пытается вести отчётность. Установите наиболее актуальную версию системы, и рассматриваемая нами ошибка может исчезнуть.
Внимательно проверьте код на наличие переменных
В большинстве случаев рассматриваемая ошибка вызвана невнимательностью программиста, вместо числового значения указавшего не числовое, что не позволяет системе выполнить правильный подсчёт числовых значений. Рекомендуем внимательно проверить создаваемый вами код, найти место в коде вызывающее исключение (ошибку) и пофиксить его.
Например, в примере:
A=3;
B=Текущая Дата();
С=A+B;
переменная B будет вести к ошибке так как её формат не позволяет системе сложить числовое значение «А» и значение в форме даты. Для решения проблемы замените B на строку: B=5 или аналогичную. В этом случае система выдаст вам корректный результат (в данном случае это будет 8).
Измените первый тип слагаемого на число
В некоторых случаях платформа 1С анализирует тип первого слагаемого числа, обнаруживает строку, вследствие чего может решить, что в данном коде речь идёт о сложении строк, а не необходимых программисту числах. Вследствие этого она пытается выполнить преобразование каждого слагаемого в строку, после чего объединить их как строки.
Для решения проблемы необходимо использовать скобки, позволяя системе вначале выполнить вычисление результата в скобках как суммы чисел, а уже потом преобразовать результат в строку.
К примеру, вместо ошибочной строки:
Сообщить(«Результат: » + 7 + 8 + 9);
Будет необходимо использовать строку:
Сообщить(«Результат: » + (7 + 8 + 9));
Вследствие этого вы получите ожидаемый результат в виде числе 24.
Это может помочь: В данной транзакции уже происходили ошибки система 1С 8.3 — как решить?
Используйте конфигуратор для нахождения исключения кода
При возникновении ошибки и соответствующего сообщения «Преобразование значения к типу Число не выполнено» в системе 1С 8.3 рекомендуем использовать конфигуратор для нахождения кода. Последний способен в режиме отладки определить и указать на ошибку.
Порядок действий в этом случае будет следующим:
- Выполните запуск конфигуратора;
- В его настройках поставьте галочку на опцию остановки по ошибке;
- Нажмите на кнопку F5 для запуска 1С;
- Выполните приведшие к ошибке операции. Программа определит строчку, где имеется некорректный код;
- Найдите в данной строчке ошибку и исправьте её. Проблема будете решена.
Переиндексируйте ваши файлы
В некоторых редких случаях исправить ошибку «Преобразование значения к типу Число» может помочь переиндексация ваших файлов. Для версии 1С 8.3 стоит использовать файл chdbfl.exe, запускающий переиндексацию. Обычно данный файл находится по пути C:Program Files (x86) 1cv88.3ХХХbin. Вместо ХХХ у вас могут находиться указатели вашей версии продукта.
Запустите данный файл, укажите имя файла для проверки, поставьте галочку рядом с опцией «Исправлять обнаруженные ошибки», после чего нажмите на «Выполнить внизу». Дождитесь завершения процедуры проверки и исправления, после чего вновь попробуйте выполнить необходимые операции.
Используйте функцию «Есть NULL»
Если выскакивает ошибка, то иногда одна из задействуемых переменных может принимать значение NULL. Для исправления ошибки рекомендуется использовать функцию «ЕСТЬNULL» (переменная, 0), что позволит устранить рассматриваемую в статье проблему.
Это также пригодится: Не удалось определить цифровой сертификат получателя в 1С — как решить?
Заключение
В нашем материале мы рассмотрели причины появления уведомления «Преобразование значения к типу Число не может быть выполнено» в версии системы 1С 8.3, и как исправить возникшую проблему. Поскольку фактором ошибки обычно выступает невнимательность программиста, внимательно изучите ваш код на наличие нечисловой переменной, часто используемой в арифметическом уравнении. Замена данной переменной на числовую, а также выполнение других перечисленных нами советов поможет устранить рассмотренную нами ошибку в вашей системе.
Чаще всего ошибка «Преобразование значения к типу Число не может быть выполнено» выскакивает из-за невнимательности программиста. В одной из переменных указывается не числовое значение, что и приводит к несоответствию.
Например, правильный код будет выглядеть следующим образом:
a = 3;
b = 4;
c = a + b.
Программа вернёт значение 7.
Неправильный код:
a = 3;
b = ТекущаяДата();
c = a + b.
Программа выдаст ошибку.
Исключение возможно только в случае, когда в строке указаны только числа, например:
a = 5;
b= «3»;
c = a + b;
Результат отобразится корректно – 8. Но если пункты a и b поменять местами, программа выдаст результат «35», так как при вычислении тип чисел выбирается по первому пункту.
На месте переменной всегда должно стоять число, то есть значение, предназначенное для арифметических вычислений. Любые другие данные на этой позиции (NULL неопределенно, индекс почты, дата, ИНН и т. д.) приведут к ошибке.
Причины возникновения конфликта
Ситуации, в которых ошибка «Преобразование значения к типу Число не может быть выполнено» возникает чаще всего:
- В проводке не указано числовое значение. Некоторые думают, что по умолчанию это число «0». Даже если это так, значение должно быть прописано;
- Двойное обозначение единиц исчисления. Например, RUB и руб. Нужно использовать одно из обозначений, а если используются оба, необходимо указывать к ним одинаковые ставки и коэффициенты, чтобы не возникало конфликта;
- В программе указывается одна из операций в двух разных направлениях. Допустим, производится начисление налога и перечисление его по банку. Для решения проблемы нужно убрать одну из проводок (ошибка встречается только на 8-ой версии программы).
Решение проблемы
Если возникает подобная ошибка, требуется найти исключение кода, которое не соответствует числовому значению. Для этих целей лучше всего подходит конфигуратор 1С, который в режиме отладки сам указывает на места с ошибками. Порядок действий:
- Запустить конфигуратор;
- В настройках установить галочку «Останов по ошибке» (по окончании работы её необходимо будет убрать);
- Нажать на F5 (откроется 1С);
- Выполнить операции, которые привели к ошибке – программа укажет на строчку, в которой введён некорректный код;
- Затем необходимо найти в этой строчке ошибку.
В некоторых случаях помогает переиндексация файлов:
- На 7-ой версии 1С для этого требуется удалить cdx-файлы;
- На 8-ой версии – файл chdbfl.exe
Конфликт 7-ой и 8-ой версии
Ошибка «Преобразование значения к типу Число не может быть выполнено» часто выскакивает на 8-ой версии там, где на 7-ой никакого конфликта не регистрировалось. Один из примеров:
В свойствах базы указывается развёрнутое сальдо, в том числе и по счёту 68.10. Когда в учёте наступает очередь этого счёта – появляется ошибка (на 8-ой версии). Для решения проблемы есть два пути:
- Необходимо удалить из развёрнутого сальдо счёт 68.10 (это не совсем удобно, так как дебетные и кредитные налоги начинают учитываться вместе, что не является верным);
- Свернуть всю базу (в дополнительных настройках нужно поставить галочку «выводить забалансовые счета»). С установленной галкой ошибка не выскакивает.
Часто найти точную причину вывода ошибки может только программист. При работе с объемными базами разного рода ошибки не редкость, но исправлять их надо правильно, чтобы не были потеряны данные.
|
|||
Fire-Rex
23.10.14 — 11:46 |
Добрый День! |
||
Cube
1 — 23.10.14 — 11:47 |
(0) Зачем тебе в печатной форме число? |
||
Fire-Rex
2 — 23.10.14 — 11:47 |
Там статья и пункт ТК РФ |
||
Cube
3 — 23.10.14 — 11:48 |
(2) И что? Они обижаются, что их строкой записывают? |
||
Fire-Rex
4 — 23.10.14 — 11:48 |
Видимо, да |
||
butterbean
5 — 23.10.14 — 11:49 |
в отладчик! |
||
Cube
6 — 23.10.14 — 11:50 |
(4) Ну, с пунктом ТК можно договориться легко — на мисте сто раз обсасывали. А вот со статей договариваться сложно, но тоже можно… |
||
18_plus
7 — 23.10.14 — 11:50 |
(4) где-то промахнулся с цифирями в сред или циферки плавают в разных значениях. отладчик в зубы и разбираться. |
||
Fire-Rex
8 — 23.10.14 — 11:50 |
СтатьяТКРФПункт = Число(СокрЛП(Сред(СтатьяТКРФ,7,2))); |
||
Fire-Rex
9 — 23.10.14 — 11:50 |
в форме есть два поля, в одно пункт, в другое статью |
||
программистище
10 — 23.10.14 — 11:51 |
и что ни сообщить |
||
Fire-Rex
11 — 23.10.14 — 11:55 |
Отладчик: |
||
Fire-Rex
12 — 23.10.14 — 11:56 |
В зупе строка выглядит так: ст 278 п 2. |
||
Enders
13 — 23.10.14 — 11:58 |
(12) Пиши строкой, в чем проблема? |
||
silent person
14 — 23.10.14 — 11:59 |
значит у тебя в строке которая получается после СокрЛП() кроме цифр есть еще какие то символы
Встроенные функции языка (Script functions) |
||
Cube
15 — 23.10.14 — 12:00 |
(9) Ну так и засунь в эти поля СТРОКИ. Зачем туду сувать ЧИСЛА? |
||
Fire-Rex
16 — 23.10.14 — 12:05 |
Тупо заменить число на строку? |
||
Cube
17 — 23.10.14 — 12:07 |
(16) Тупо удалить преобразование к числу. Вместо СтатьяТКРФПункт = Число(СокрЛП(Сред(СтатьяТКРФ,21,2))); пиши СтатьяТКРФПункт = СокрЛП(Сред(СтатьяТКРФ,21,2)); |
||
МимохожийОднако
18 — 23.10.14 — 12:09 |
А не пробовал получить из строки с разделителями список значений или массив? |
||
Fire-Rex
19 — 23.10.14 — 12:10 |
Терь вот что: |
||
palpetrovich
20 — 23.10.14 — 12:13 |
(19) а она (РазложитьСтрокуВМассивПодстрок) там есть, в ОбщегоНазначения? |
||
Cube
21 — 23.10.14 — 12:14 |
(19) Позови специалиста)))) |
||
Fire-Rex
22 — 23.10.14 — 12:17 |
Заменил на ОбщегоНазначенияЗК |
||
Fire-Rex
23 — 23.10.14 — 12:18 |
Ошибок нет, но форма вышла пустая |
||
palpetrovich
24 — 23.10.14 — 12:18 |
(21) «Позови специалиста» — ваще-т да, 20 постов и наконец-то верный |
||
Cube
25 — 23.10.14 — 12:18 |
(23) Печаль, беда?)) |
||
Fire-Rex
26 — 23.10.14 — 12:19 |
Задница, в целом |
||
Fire-Rex
27 — 23.10.14 — 12:20 |
Была б возможность — вызвал бы) |
||
Fire-Rex
28 — 23.10.14 — 12:24 |
разобрался |
||
palpetrovich
29 — 23.10.14 — 12:24 |
(27) из тюрьмы пишешь? |
||
Fire-Rex 30 — 23.10.14 — 12:24 |
Мужики, Всем спасибо!!! |
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство.
Фредерик Брукс-младший
Входная строка имела неверный формат — означает, что Вы пытаетесь преобразовать строку символов в целое число, при этом в исходной строке символов не все символы являются числами. Для того, чтобы выяснить, что пошло не так — достаточно просто посмотреть, что Вы передаете в метод преобразования. К примеру:
string inputStr = "123a56";
int number;
bool isNumeric = int.TryParse(inputStr, out number);
if(isNumeric)
{
Console.WriteLine("Строка успешно преобразована в число");
}
else
{
Console.WriteLine("Ошибка преобразования. Вы уверены, что '" + inputStr + "' число?");
}
Ошибка, связанная с DateTime
возможно падает, потому что входная строка составного формата. Этот составной формат построен неправильно и похож на дату. И Вам правильно сказали использовать Метод Int32.TryParse.
Полезные ссылки для ознакомления:
- FormatException
- Составное форматирование
- Метод, используемый Вами Метод Int32.Parse (скорее всего)
Если Вы хотите использовать именно Int32.Parse
, то проблему можно решить так:
string inputStr = "123a56";
try
{
int number = Int32.Parse(inputStr);
Console.WriteLine("Строка успешно преобразована в число");
}
catch(Exception ex)
{
Console.WriteLine("Ошибка преобразования. Вы уверены, что '" + inputStr + "' число?");
}
Про операторы try-catch
можно почитать тут:
- try-catch
- try-catch-finally