При работе с зарплатными проектами в программе 1С:Зарплата и управление персоналом 3 (а также в 1С:ЗГУ) пользователи могут столкнуться с аварийным завершением работы программы при попытке создать документ Заявка на открытие лицевых счетов. Система выдает системное сообщение об ошибке, ссылаясь на общий модуль ОбменСБанкамиПоЗарплатнымПроектам.
В этой статье мы подробно разберем технические причины возникновения данной ошибки (зарегистрированной под кодом 10219671), изучим способ быстрого обхода проблемы силами пользователя, а также рассмотрим варианты окончательного исправления кода в конфигураторе или через механизм расширений.
Давайте проанализируем текст ошибки, который выводится на экран пользователя и фиксируется в журнале регистрации:
{ОбщийМодуль.ОбменСБанкамиПоЗарплатнымПроектам.Модуль(5774)}: Greater than/Less than compare operations allowed only for values of similar primitive types (Boolean, Numeric, String, Date)
В русскоязычной локализации платформы это сообщение выглядит так:
Операции сравнения на больше-меньше допустимы только для значений совпадающих примитивных типов (Булево, Число, Строка, Дата)
Перейдем к строке кода, на которую указывает отладчик:
Если ДлинаЭмбоссированногоТекста > ПараметрыПроверки.МаксимальнаяДлинаИмениДержателяКарты Тогда
Заполнена = Ложь;
КонецЕсли;
В этой строке система выполняет операцию сравнения «больше» (>) между двумя переменными:
ДлинаЭмбоссированногоТекста — эта переменная всегда инициализируется числовым значением (например, длиной строки имени сотрудника латиницей или 0 по умолчанию).ПараметрыПроверки.МаксимальнаяДлинаИмениДержателяКарты — это свойство структуры параметров, которая считывается из настроек зарплатного проекта.Сбой происходит из-за того, что при определенных сценариях создания документа свойство МаксимальнаяДлинаИмениДержателяКарты принимает значение Неопределено. Платформа «1С:Предприятие 8» строго типизирована и не поддерживает операции сравнения (больше/меньше) между числом и типом Неопределено. В результате выполнение программного кода аварийно прерывается.
Почему свойство оказывается незаполненным? Это происходит в тот момент, когда новый документ создается напрямую из общего журнала обмена с банками. На момент открытия формы реквизит ЗарплатныйПроект в новом документе еще пуст. Программа пытается прочитать настройки для незаполненного проекта, функция возвращает пустую структуру параметров проверки, и лимит длины имени сбрасывается в Неопределено.
Фирмой «1С» предусмотрен официальный способ обхода данной ошибки без привлечения программиста и изменения конфигурации. Для того чтобы успешно создать документ, выполним следующие шаги:
Почему это помогает? При открытии формы нового документа из списка с установленным отбором платформа автоматически заполняет реквизиты нового документа значениями из отбора. В создаваемом документе поле ЗарплатныйПроект сразу окажется заполненным. Программа сможет корректно считать его настройки, свойство МаксимальнаяДлинаИмениДержателяКарты получит числовое значение (например, 19), и проверка отработает без ошибок.
Если вы хотите лично убедиться в причинах сбоя и посмотреть значения переменных «вживую», проделаем процедуру отладки по шагам:
ОбменСБанкамиПоЗарплатнымПроектам и перейдем к строке 5774.F9 (слева от строки появится красный кружок).Ctrl + Alt + W).ПараметрыПроверки.МаксимальнаяДлинаИмениДержателяКарты и увидим, что его значение действительно равно Неопределено, в то время как ДлинаЭмбоссированногоТекста имеет числовой тип.Если ваша конфигурация находится на поддержке с возможностью изменения или вы используете расширения, проблему можно решить раз и навсегда программным путем. Рассмотрим два наиболее эффективных способа исправления.
Самый надежный и логичный способ — выполнять проверку длины только в том случае, если лимит в настройках зарплатного проекта действительно задан (не равен Неопределено). Изменим исходный код следующим образом:
Если ЗначениеЗаполнено(ПараметрыПроверки.МаксимальнаяДлинаИмениДержателяКарты)
И ДлинаЭмбоссированногоТекста > ПараметрыПроверки.МаксимальнаяДлинаИмениДержателяКарты Тогда
Заполнена = Ложь;
КонецЕсли;
При таком подходе, если проект не выбран и лимит равен Неопределено, первое условие вернет Ложь, и платформа даже не перейдет к сравнению типов во второй части выражения, что полностью исключает ошибку.
Другой вариант — принудительно преобразовывать неопределенное значение лимита в безопасное числовое значение по умолчанию (например, в стандартное ограничение большинства банков — 19 символов) непосредственно перед проверкой:
МаксимальнаяДлина = ?(ПараметрыПроверки.МаксимальнаяДлинаИмениДержателяКарты = Неопределено,
19,
ПараметрыПроверки.МаксимальнаяДлинаИмениДержателяКарты);
Если ДлинаЭмбоссированногоТекста > МаксимальнаяДлина Тогда
Заполнена = Ложь;
КонецЕсли;
Этот способ гарантирует, что программа всегда будет производить сравнение чисел, даже если зарплатный проект не определен в документе.
Чтобы не снимать основную конфигурацию с поддержки и сохранить возможность беспрепятственного обновления программы в будущем, настоятельно рекомендуется вносить изменения через механизм Расширений. Для этого выполним следующие действия:
ИсправлениеОшибокОбмена).ОбменСБанкамиПоЗарплатнымПроектам, нажмем по нему правой кнопкой мыши и выберем Добавить в расширение.&Вместо или воспользуемся современным механизмом &ИзменениеИКонтроль, чтобы переопределить только проблемный участок кода с использованием любого из вариантов исправлений, описанных выше.После применения расширения и перезапуска сеанса пользователи смогут беспрепятственно создавать новые заявки на открытие лицевых счетов прямо из журналов обмена, не сталкиваясь с аварийным закрытием программы.