Как исправить ошибку сравнения примитивных типов при создании заявки на открытие лицевых счетов в 1С:ЗУП 3

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

При работе с зарплатными проектами в программе 1С:Зарплата и управление персоналом 3 (а также в 1С:ЗГУ) пользователи могут столкнуться с аварийным завершением работы программы при попытке создать документ Заявка на открытие лицевых счетов. Система выдает системное сообщение об ошибке, ссылаясь на общий модуль ОбменСБанкамиПоЗарплатнымПроектам.

В этой статье мы подробно разберем технические причины возникновения данной ошибки (зарегистрированной под кодом 10219671), изучим способ быстрого обхода проблемы силами пользователя, а также рассмотрим варианты окончательного исправления кода в конфигураторе или через механизм расширений.

Технический анализ причины ошибки

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

{ОбщийМодуль.ОбменСБанкамиПоЗарплатнымПроектам.Модуль(5774)}: Greater than/Less than compare operations allowed only for values of similar primitive types (Boolean, Numeric, String, Date)

В русскоязычной локализации платформы это сообщение выглядит так:

Операции сравнения на больше-меньше допустимы только для значений совпадающих примитивных типов (Булево, Число, Строка, Дата)

Перейдем к строке кода, на которую указывает отладчик:


Если ДлинаЭмбоссированногоТекста > ПараметрыПроверки.МаксимальнаяДлинаИмениДержателяКарты Тогда
    Заполнена = Ложь;
КонецЕсли;

В этой строке система выполняет операцию сравнения «больше» (>) между двумя переменными:

  1. ДлинаЭмбоссированногоТекста — эта переменная всегда инициализируется числовым значением (например, длиной строки имени сотрудника латиницей или 0 по умолчанию).
  2. ПараметрыПроверки.МаксимальнаяДлинаИмениДержателяКарты — это свойство структуры параметров, которая считывается из настроек зарплатного проекта.

Сбой происходит из-за того, что при определенных сценариях создания документа свойство МаксимальнаяДлинаИмениДержателяКарты принимает значение Неопределено. Платформа «1С:Предприятие 8» строго типизирована и не поддерживает операции сравнения (больше/меньше) между числом и типом Неопределено. В результате выполнение программного кода аварийно прерывается.

Почему свойство оказывается незаполненным? Это происходит в тот момент, когда новый документ создается напрямую из общего журнала обмена с банками. На момент открытия формы реквизит ЗарплатныйПроект в новом документе еще пуст. Программа пытается прочитать настройки для незаполненного проекта, функция возвращает пустую структуру параметров проверки, и лимит длины имени сбрасывается в Неопределено.

Способ быстрого обхода проблемы (без изменения кода)

Фирмой «1С» предусмотрен официальный способ обхода данной ошибки без привлечения программиста и изменения конфигурации. Для того чтобы успешно создать документ, выполним следующие шаги:

  1. Перейдем в раздел Выплаты и откроем журнал Документы обмена с банками.
  2. В шапке списка документов найдем поле отбора Зарплатный проект и установим в нем конкретный зарплатный проект вашей организации.
  3. Нажмем кнопку Создать и выберем документ Заявка на открытие лицевых счетов.

Почему это помогает? При открытии формы нового документа из списка с установленным отбором платформа автоматически заполняет реквизиты нового документа значениями из отбора. В создаваемом документе поле ЗарплатныйПроект сразу окажется заполненным. Программа сможет корректно считать его настройки, свойство МаксимальнаяДлинаИмениДержателяКарты получит числовое значение (например, 19), и проверка отработает без ошибок.

Диагностика и отладка в конфигураторе

Если вы хотите лично убедиться в причинах сбоя и посмотреть значения переменных «вживую», проделаем процедуру отладки по шагам:

  1. Запустим программу 1С:Предприятие в режиме Конфигуратор.
  2. В меню выберем Отладка -> Подключение... и убедимся, что отладчик подключен к вашему сеансу работы.
  3. Откроем общий модуль ОбменСБанкамиПоЗарплатнымПроектам и перейдем к строке 5774.
  4. Установим точку останова, нажав клавишу F9 (слева от строки появится красный кружок).
  5. В режиме пользователя попытаемся создать документ стандартным способом (вызывающим ошибку).
  6. Система приостановит работу и перенаправит нас в конфигуратор на установленную точку останова.
  7. В меню конфигуратора выберем Отладка -> Табло (или нажмем Ctrl + Alt + W).
  8. Введем в табло выражение ПараметрыПроверки.МаксимальнаяДлинаИмениДержателяКарты и увидим, что его значение действительно равно Неопределено, в то время как ДлинаЭмбоссированногоТекста имеет числовой тип.

Варианты исправления ошибки в кодовой базе

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

Вариант А. Проверка заполненности параметров перед сравнением

Самый надежный и логичный способ — выполнять проверку длины только в том случае, если лимит в настройках зарплатного проекта действительно задан (не равен Неопределено). Изменим исходный код следующим образом:


Если ЗначениеЗаполнено(ПараметрыПроверки.МаксимальнаяДлинаИмениДержателяКарты) 
   И ДлинаЭмбоссированногоТекста > ПараметрыПроверки.МаксимальнаяДлинаИмениДержателяКарты Тогда
    Заполнена = Ложь;
КонецЕсли;

При таком подходе, если проект не выбран и лимит равен Неопределено, первое условие вернет Ложь, и платформа даже не перейдет к сравнению типов во второй части выражения, что полностью исключает ошибку.

Вариант Б. Подстановка дефолтного значения

Другой вариант — принудительно преобразовывать неопределенное значение лимита в безопасное числовое значение по умолчанию (например, в стандартное ограничение большинства банков — 19 символов) непосредственно перед проверкой:


МаксимальнаяДлина = ?(ПараметрыПроверки.МаксимальнаяДлинаИмениДержателяКарты = Неопределено, 
                      19, 
                      ПараметрыПроверки.МаксимальнаяДлинаИмениДержателяКарты);

Если ДлинаЭмбоссированногоТекста > МаксимальнаяДлина Тогда
    Заполнена = Ложь;
КонецЕсли;

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

Реализация исправления через Расширение конфигурации

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

  1. В конфигураторе перейдем в меню Конфигурация -> Расширения конфигурации и создадим новое расширение (например, с именем ИсправлениеОшибокОбмена).
  2. В дереве основной конфигурации найдем общий модуль ОбменСБанкамиПоЗарплатнымПроектам, нажмем по нему правой кнопкой мыши и выберем Добавить в расширение.
  3. В расширении откроем добавленный модуль и найдем процедуру, содержащую ошибочную строку (обычно это процедура проверки данных сотрудников).
  4. Применим к процедуре аннотацию &Вместо или воспользуемся современным механизмом &ИзменениеИКонтроль, чтобы переопределить только проблемный участок кода с использованием любого из вариантов исправлений, описанных выше.

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

← На главную