При программном заполнении документов в 1С:Предприятие разработчики часто сталкиваются с необходимостью подставить определенный банковский счет организации или контрагента. Разберем типичную ситуацию: при попытке найти счет по БИК через метод НайтиПоРеквизиту система выдает ошибку "Неверно указан реквизит". Проанализируем причины такого поведения платформы и вместе выясним, как правильно решить эту задачу.
Посмотрим на классический пример ошибочного кода:
НомерБИК = 042007835;
Объект.БанковскийСчетОрганизации = Справочники.БанковскиеСчета.НайтиПоРеквизиту("БИК", НомерБИК);
В конфигурации "Бухгалтерия предприятия 3.0" (как и в большинстве других типовых конфигураций 1С) у справочника БанковскиеСчета нет реквизита "БИК". То, что мы видим в карточке банковского счета на форме — это реквизит справочника Банки. В самом банковском счете хранится лишь ссылка на элемент справочника Банки, а уже внутри него лежит код БИК. Метод НайтиПоРеквизиту не умеет искать данные "через точку" в связанных таблицах, поэтому платформа логично сообщает, что такого реквизита не существует.
Проанализируем вторую грубую ошибку в приведенном выше фрагменте кода. БИК задан как числовое значение: НомерБИК = 042007835;.
В банковской сфере и в системе 1С БИК всегда является строкой. Если передать его как число, платформа автоматически отбросит ведущий ноль, и значение превратится в 42007835. Найти банк по такому значению будет невозможно, так как код изменился. Правильный вариант записи всегда подразумевает использование кавычек:
НомерБИК = "042007835";
В ходе обсуждения разработчики часто пытаются искать элементы по наименованию или текстовому описанию. Рассмотрим важный технический нюанс платформы: метод НайтиПоРеквизиту системно не поддерживает поиск по строкам неограниченной длины.
Если реквизит имеет тип "Строка" и его длина не ограничена, поиск завершится неудачей или ошибкой. Если перед вами стоит задача поиска по такому полю, обязательно нужно использовать язык запросов 1С.
Справочник БанковскиеСчета является подчиненным. У него всегда есть владелец — элемент справочника Организации или Контрагенты. Если искать банковский счет только по номеру счета, программа может подставить счет с таким же номером, но принадлежащий совершенно другой организации.
Разберем по шагам, как корректно получить нужный банковский счет и присвоить его документу "Реализация товаров и услуг".
Способ 1: Поиск по номеру счета с указанием владельца
Если нам известен конкретный номер расчетного счета организации, мы можем использовать метод НайтиПоРеквизиту, передав в него владельца третьим параметром:
НомерСчета = "40702810400000000123";
ОрганизацияВладелец = Объект.Организация; // ссылка на организацию из документа
Объект.БанковскийСчетОрганизации = Справочники.БанковскиеСчета.НайтиПоРеквизиту("НомерСчета", НомерСчета, ОрганизацияВладелец);
Способ 2: Использование языка запросов (поиск по БИК банка и организации)
Если стоит задача найти счет организации в конкретном банке (зная его БИК), правильно будет использовать запрос. Посмотрим на пример кода:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| БанковскиеСчета.Ссылка КАК Счет
|ИЗ
| Справочник.БанковскиеСчета КАК БанковскиеСчета
|ГДЕ
| БанковскиеСчета.Владелец = &Организация
| И БанковскиеСчета.Банк.Код = &БИК";
Запрос.УстановитьПараметр("Организация", Объект.Организация);
Запрос.УстановитьПараметр("БИК", "042007835"); // Обязательно строка!
РезультатЗапроса = Запрос.Выполнить();
Если Не РезультатЗапроса.Пустой() Тогда
Выборка = РезультатЗапроса.Выбрать();
Выборка.Следующий();
Объект.БанковскийСчетОрганизации = Выборка.Счет;
КонецЕсли;
Строка, чтобы не терять ведущие нули.БанковскиеСчета всегда учитывайте владельца, чтобы не назначить документу чужие реквизиты.Запрос.