Почему 1С пишет «Неверные параметры» и как найти виновный вызов

· 10 мин

Содержание

Ошибка «Неверные параметры» в 1С означает одно: функция или операция получила аргумент не того типа или не в той форме, которую она принимает. Чаще всего это функция языка запросов (ПОДСТРОКА, ДАТАВРЕМЯ, РАЗНОСТЬДАТ) или сравнение поля неограниченной длины. Исправляют её не настройкой базы, а правкой запроса, отчёта или кода, где передаётся неподходящее значение.

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

Откуда платформа берёт ошибку «Неверные параметры»

Платформа 1С проверяет аргументы встроенных функций до выполнения. В запросе проверка идёт ещё на этапе разбора текста: запрос даже не уходит в СУБД. Поэтому ошибка возникает сразу при открытии отчёта или нажатии кнопки, а не «через раз».

Типичные тексты сообщений:

  • 🔹 Неверные параметры "ПОДСТРОКА" — первым аргументом передано не строковое поле.
  • 🔹 Неверные параметры "ДАТАВРЕМЯ" — в функцию переданы не числовые литералы, а параметры или поля.
  • 🔹 Неверные параметры "РАЗНОСТЬДАТ" или "НАЧАЛОПЕРИОДА" — неверно указан вид периода или аргумент не дата.
  • 🔹 Неверные параметры в операции сравнения. Нельзя сравнивать поля неограниченной длины и поля несовместимых типов. — самый частый вариант.

В тексте сообщения обычно есть место ошибки: имя модуля и номер строки в фигурных скобках, например {Отчет.АнализПродаж.МодульОбъекта(42)}, а для запроса — фрагмент с маркером <<?>>. Маркер стоит прямо перед местом, которое не понравилось платформе.

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

Во встроенном языке похожая проблема выглядит иначе. При передаче не того типа в метод платформа часто пишет Несоответствие типов (параметр номер '1') или Недопустимое значение параметра. Механизм тот же, поэтому методы поиска причины ниже подходят ко всем этим текстам.

Как искать причину неверных параметров в типовой конфигурации

Если вы пользователь или администратор и в Конфигуратор не заходите, начните с того, что можно проверить без кода.

Шаг 1. Определите, чей это код

Посмотрите на имя модуля в сообщении:

Что в тексте ошибкиЧто это значитКто исправляет
ВнешняяОбработка.… или ВнешнийОтчет.…Внешний файл .epf/.erfАвтор обработки или ваш программист
Имя объекта с префиксом расширенияРасширение конфигурацииТот, кто делал расширение
Типовой объект, доработок нетОшибка релиза или данныеОбновление, обращение на линию поддержки
Типовой объект, база доработанаИзменённый кодПрограммист, сопровождающий базу

Шаг 2. Проверьте журнал регистрации

В БП 3.0, ЗУП 3.1 и УТ 11 журнал открывается так: Администрирование → Обслуживание → Журнал регистрации. Установите отбор по уровню «Ошибка» и по времени, когда возникло сообщение. В событии будет полный текст с модулем и строкой, даже если пользователь закрыл окно.

Шаг 3. Отключите расширения и внешние файлы

Расширения в типовых конфигурациях находятся в разделе Администрирование → Печатные формы, отчеты и обработки → Расширения. Снимите флажок активности у подозрительного расширения, перезапустите сеанс и повторите действие.

Отключение расширения затрагивает всех пользователей базы. Делайте это в тестовой копии или вне рабочего времени, когда никто не проводит документы.

Если ошибка пропала — виновник найден. Если нет, смотрите, после чего она появилась: после обновления релиза ошибка часто идёт от внешнего отчёта, написанного под старую структуру данных. Поле, которое раньше было строкой фиксированной длины, могло стать строкой неограниченной длины или составным типом — и старый запрос перестаёт разбираться.

Разбор кода: NULL, Неопределено и составные типы

Во встроенном языке 1С тип переменной определяется значением. Одна и та же переменная в разных ветках кода бывает числом, строкой, Неопределено или NULL. Отсюда большая часть «плавающих» ошибок, которые возникают только на некоторых документах.

Откуда берутся неожиданные значения:

  • ❗ NULL из запроса — поле из таблицы, присоединённой через ЛЕВОЕ СОЕДИНЕНИЕ, для строк без пары.
  • ❗ Неопределено — результат поиска, который ничего не нашёл, пустое значение реквизита составного типа.
  • ❗ Строка вместо числа или даты — данные пришли из файла, обмена или пользовательского поля ввода.
  • ❗ Ссылка другого типа — реквизит составного типа, где кроме контрагента может лежать, например, физическое лицо.

Как поймать место отладчиком

  1. Откройте базу в Конфигураторе и запустите отладку.
  2. Включите в меню Отладка режим Остановка по ошибке.
  3. Повторите действие пользователя. Отладчик остановится на строке, где возникло исключение.
  4. Посмотрите значения аргументов в окне «Табло» или наведя курсор на переменную. Проверьте не только значение, но и тип.

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

Как защитить код от неверного типа

NULL лучше убрать ещё в запросе:

ВЫБРАТЬ
    Товары.Номенклатура КАК Номенклатура,
    ЕСТЬNULL(Остатки.КоличествоОстаток, 0) КАК Остаток
ИЗ
    Справочник.Номенклатура КАК Товары
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки КАК Остатки
        ПО Товары.Ссылка = Остатки.Номенклатура

В коде перед вызовом функции, которая ждёт конкретный тип, проверяйте его явно:

Если ТипЗнч(Значение) <> Тип("Число") Тогда
    ВызватьИсключение СтрШаблон("Ожидалось число, получено значение типа %1", ТипЗнч(Значение));
КонецЕсли;

Своё исключение с понятным текстом лучше, чем системное: в журнале сразу будет видно, какой тип пришёл и откуда.

Неверные параметры в запросах и отчётах на СКД

Это самая частая группа. Разберём основные случаи по порядку.

Сравнение строки неограниченной длины

Реквизиты вроде Комментарий у документов обычно имеют неограниченную длину. Такое поле нельзя сравнивать через =, использовать в СГРУППИРОВАТЬ ПО и в условии соединения. Запрос с ошибкой:

ВЫБРАТЬ
    Док.Ссылка
ИЗ
    Документ.РеализацияТоваровУслуг КАК Док
ГДЕ
    Док.Комментарий = &Текст

Исправление — привести поле к строке фиксированной длины:

ГДЕ
    ВЫРАЗИТЬ(Док.Комментарий КАК СТРОКА(200)) = &Текст

Учтите, что ВЫРАЗИТЬ обрежет значение до 200 символов. Если нужен поиск по фрагменту, используйте ПОДОБНО с шаблоном "%" + текст + "%", собранным в коде.

Функции, которые принимают только литералы

ДАТАВРЕМЯ в запросе принимает только числа, записанные прямо в тексте. Вариант ДАТАВРЕМЯ(&Год, 1, 1) вызовет ошибку. Дату собирают в коде и передают параметром:

Запрос.УстановитьПараметр("НачалоГода", Дата(Год, 1, 1));

Похожая история с видом периода в РАЗНОСТЬДАТ, ДОБАВИТЬКДАТЕ и НАЧАЛОПЕРИОДА: это ключевое слово (ДЕНЬ, МЕСЯЦ, ГОД и т.д.), а не строка в кавычках.

ПОДСТРОКА по нестроковому полю

ПОДСТРОКА работает только со строками. Если первым аргументом стоит ссылка, число или поле составного типа, платформа вернёт Неверные параметры "ПОДСТРОКА". Проверьте тип поля в конфигураторе. Для числа нужно сначала получить строку на стороне кода — в запросе нет прямого преобразования числа в строку.

Отбор в отчёте на СКД

Пользователь сам может «сломать» отчёт: добавить в настройках отбор Комментарий Равно или группировку по полю неограниченной длины. СКД соберёт запрос с таким условием, и платформа выдаст ошибку сравнения.

Что делать пользователю:

  1. Открыть настройки отчёта и убрать последний добавленный отбор или группировку.
  2. Для поиска по тексту выбрать вид сравнения Содержит вместо Равно.
  3. Если настройки отчёта уже испорчены, вернуть стандартные: в меню Ещё формы отчёта есть команда восстановления стандартных настроек.

Разработчику: в наборе данных СКД можно ограничить использование поля в группировках и условиях на закладке «Поля», либо вывести в набор уже приведённое через ВЫРАЗИТЬ поле.

Диагностика: выберите симптом

Внешние вызовы и интеграции: ошибка в чужих данных

Вторая «плавающая» группа — интеграции. Обмен через COM-соединение, HTTP-сервис, загрузка из Excel или JSON. Здесь 1С получает значения извне, и тип у них не всегда тот, которого ждёт код.

Частые сценарии:

  • 📥 Дата приходит строкой "2026-10-07T00:00:00" и без преобразования попадает в параметр запроса или в арифметику.
  • 📥 Число приходит строкой с пробелом-разделителем разрядов или запятой, например "1 250,50".
  • 📥 Через COM передаётся объект внешнего приложения туда, где ожидается примитивное значение.
  • 📥 Пустое поле в файле превращается в Неопределено или пустую строку, а не в 0.

Правило простое: данные извне преобразуйте и проверяйте на входе, в одной функции, а дальше по коду передавайте уже значения нужного типа. Для строки с числом подходит преобразование через Число() внутри Попытка … Исключение, для даты в формате ISO 8601 — функция ПрочитатьДатуJSON().

Попытка
    Сумма = Число(СтрЗаменить(СтрЗаменить(СтрокаСуммы, " ", ""), ",", "."));
Исключение
    ВызватьИсключение СтрШаблон("Некорректная сумма в строке %1: %2", НомерСтроки, СтрокаСуммы);
КонецПопытки;

При COM-соединении ошибка возникает на стороне вызываемой базы, а внешний клиент получает лишь её текст. Смотрите журнал регистрации той базы, к которой подключались, — там будет модуль и строка.

Как исправить ошибку и не допустить её снова

Сводная таблица по способам исправления:

СпособКогда подходитРиски
Вернуть стандартные настройки отчётаОшибка только у одного пользователя в отчётеПотеря его личных настроек отчёта
Отключить расширение или внешний файлОшибка после обновления, есть доработкиПропадёт функциональность расширения
Поправить текст запросаВидно место с маркером <<?>>Нужно перепроверить результат отчёта
Добавить проверку типа в кодОшибка «плавает» на части документовПочти нет, если исключение понятное
Обновить конфигурациюОшибка в типовом коде без доработокОбновление само по себе требует подготовки

Правьте код и запросы в копии базы, а не в рабочей. Изменение в рабочей базе с типовой конфигурацией снимает её с поддержки, а это затруднит следующие обновления. Типовую логику безопаснее менять расширением.

Чтобы ошибка не возвращалась:

  • ✅ Оборачивайте поля из ЛЕВОГО СОЕДИНЕНИЯ в ЕСТЬNULL сразу в запросе.
  • ✅ Не сравнивайте строки неограниченной длины напрямую — сразу пишите ВЫРАЗИТЬ или ПОДОБНО.
  • ✅ Проверяйте тип реквизитов составного типа через ТипЗнч() перед обработкой.
  • ✅ Внешние отчёты и обработки после каждого обновления релиза проверяйте в тестовой копии.
  • ✅ Помните, что синтаксический контроль модуля не проверяет текст запроса внутри строки. Запрос проверяется только при выполнении, поэтому каждый новый отчёт прогоняйте на реальных данных, включая пустые и «странные» документы.

Если ошибка в типовом коде без доработок

Так бывает редко, но бывает. Соберите данные перед обращением на линию поддержки или к партнёру:

  1. Полный текст ошибки с модулем и номером строки.
  2. Номер релиза конфигурации и версию платформы — их видно в окне «О программе».
  3. Последовательность действий, которая воспроизводит ошибку, и пример документа.
  4. Признак: возникает ли ошибка в файловой копии базы и в чистой демобазе того же релиза.

Если в демобазе ошибки нет, причина в данных вашей базы — например, в реквизите составного типа с неожиданным значением.

Частые вопросы

Можно ли исправить «Неверные параметры» без программиста?
Да, если ошибка в отчёте после изменения настроек или в отключаемом внешнем файле. Если сообщение указывает на модуль конфигурации, нужен специалист с доступом к Конфигуратору.
Поможет ли «Тестирование и исправление» базы?
Нет. Это ошибка логики запроса или кода, а не повреждение данных. Тестирование не меняет тексты запросов и код модулей.
Почему ошибка появляется только на некоторых документах?
В этих документах реквизит имеет другой тип или пуст: NULL, Неопределено, ссылка на другой справочник. Отладчик с остановкой по ошибке покажет конкретное значение.
Помогает ли очистка кэша или перезапуск 1С?
Как правило, нет: проверка аргументов срабатывает каждый раз одинаково. Кэш имеет смысл чистить, только если после обновления кода у клиента осталась старая версия модулей.
Чем «Неверные параметры» отличается от «Несоответствие типов»?
По сути это одно и то же — неподходящий аргумент. Первый текст чаще выдаёт язык запросов, второй — методы встроенного языка с номером параметра.