При разработке в среде 1С:Предприятие с использованием Библиотеки стандартных подсистем (БСП) программисты часто сталкиваются с необходимостью автоматического получения данных о банках по их реквизитам, таким как БИК и Корреспондентский счет. Однако попытка вызвать стандартный метод может привести к ошибке: «Обращение к процедуре объекта как к функции». В этой статье мы подробно разберем, почему возникает эта ошибка, как правильно передавать параметры и какие современные альтернативы существуют в последних версиях БСП.
Первоначальная ошибка, с которой сталкивается разработчик, заключается в фундаментальном отличии Процедуры от Функции в языке 1С. Рассмотрим типичный ошибочный код:
// ОШИБОЧНЫЙ КОД
ИмяБанка = РаботаСБанками.ПолучитьДанныеКлассификатора(БИК, КоррСчет);
Проанализируем ситуацию: платформа выдает ошибку, потому что ПолучитьДанныеКлассификатора определена в общем модуле РаботаСБанками именно как Процедура. В языке 1С процедура не возвращает никакого значения через оператор Возврат. Следовательно, её нельзя использовать в правой части оператора присваивания. Система ожидает, что результат будет передан не «наружу» в переменную, а записан в один из параметров, переданных «по ссылке».
Для того чтобы получить данные о банке (ссылку на элемент справочника «Классификатор банков»), необходимо использовать третий параметр. Рассмотрим, как это сделать правильно по шагам:
Правильный программный код будет выглядеть следующим образом:
ПеременнаяРезультат = Неопределено;
БИК = "044525225";
КоррСчет = "30101810400000000225";
// Вызываем процедуру, результат будет помещен в ПеременнаяРезультат
РаботаСБанками.ПолучитьДанныеКлассификатора(БИК, КоррСчет, ПеременнаяРезультат);
Если ЗначениеЗаполнено(ПеременнаяРезультат) Тогда
// Если банк найден, в переменной будет СправочникСсылка.КлассификаторБанков
НаименованиеБанка = ПеременнаяРезультат.Наименование;
Иначе
Сообщить("Банк с такими реквизитами не найден в классификаторе");
КонецЕсли;
Важно понимать, что в качестве третьего параметра можно передавать не только локальную переменную, но и реквизиты объектов или форм напрямую:
РаботаСБанками.ПолучитьДанныеКлассификатора(Объект.БИК, Объект.КоррСчет, Объект.Банк);
Часто даже при правильном синтаксисе вызова процедура не находит банк. Проанализируем причину: данные, скопированные из электронных писем или документов, могут содержать скрытые символы, в частности неразрывные пробелы (Символы.НПП). Для платформы 1С строка "0445 25225" с неразрывным пробелом не равна строке "044525225".
Рекомендуется перед поиском всегда выполнять «очистку» входных данных. Выясним, как это сделать наиболее эффективно:
// Очистка БИК от неразрывных пробелов и обычных пробелов
ЧистыйБИК = СтрЗаменить(ВходнойБИК, Символы.НПП, "");
ЧистыйБИК = СтрЗаменить(ЧистыйБИК, " ", "");
// Еще более надежный способ через БСП (если доступен модуль ОбщегоНазначенияКлиентСервер)
ЧистыйБИК = ОбщегоНазначенияКлиентСервер.ТолькоЦифрыВСтроке(ВходнойБИК);
Использование функции ТолькоЦифрыВСтроке гарантирует, что в поиск уйдут только значащие цифровые символы, что исключает ошибки сопоставления ссылок.
Начиная с версий БСП 3.1 и выше, процедура ПолучитьДанныеКлассификатора считается устаревшей. Разработчикам рекомендуется переходить на использование функции СведенияБИК. Это гораздо удобнее, так как она работает именно как функция и возвращает структурированный результат.
Посмотрим на пример использования современного подхода:
ДанныеБанка = РаботаСБанками.СведенияБИК(НужныйБИК);
Если ДанныеБанка <> Неопределено Тогда
// Функция возвращает структуру
СсылкаНаБанк = ДанныеБанка.Ссылка;
Название = ДанныеБанка.Наименование;
Город = ДанныеБанка.Город;
// Можно сразу заполнить реквизиты на форме
Объект.НаименованиеБанка = Название;
КонецЕсли;
Преимущества использования функции СведенияБИК:
Имя = Функция(...)).Подводя итог, при работе с классификатором банков в 1С следует придерживаться следующих правил:
ПолучитьДанныеКлассификатора, помните, что это процедура. Результат всегда возвращается в третий параметр.СтрЗаменить или методы БСП для очистки строк.ЗначениеЗаполнено или ПустаяСсылка, прежде чем обращаться к свойствам (например, к наименованию), чтобы избежать ошибки «Объект не найден».РаботаСБанками.СведенияБИК, так как она более функциональна и удобна в написании кода.Соблюдение этих простых правил позволит вам писать стабильный код, устойчивый к ошибкам ввода данных пользователями и изменениям в версиях библиотеки БСП.