При разработке отчетов или печатных форм в конфигурации 1С:Зарплата и управление персоналом 3.1 программисты часто сталкиваются с ситуацией, когда запрос к справочнику БанковскиеСчетаКонтрагентов возвращает несколько записей для одного физического лица. Это происходит даже в тех случаях, когда номер расчетного счета совпадает, а различаются только привязанные к ним банки (или их БИК). Давайте разберем, как правильно определить актуальный счет и вытащить корректный БИК, используя механизмы системы.
Проанализируем ситуацию: почему при запросе номера счета и БИК мы можем получить две и более строки на одного сотрудника? Рассмотрим основные технические причины:
БанковскиеСчетаКонтрагентов могут храниться старые или ошибочно введенные записи. Если в запросе не установлено условие ГДЕ НЕ БанковскиеСчетаКонтрагентов.ПометкаУдаления, система выберет все когда-либо созданные счета.Банки) меняется. В базе 1С при этом часто создается новая запись в справочнике счетов, ссылающаяся на новый БИК, при этом старая запись может остаться не помеченной на удаление.Прежде всего, проверим самый простой вариант. При написании запроса к справочнику БанковскиеСчетаКонтрагентов необходимо всегда проверять статус записи. Посмотрим на пример кода запроса, который отсекает лишние данные:
ВЫБРАТЬ
БанковскиеСчета.Ссылка КАК СчетСсылка,
БанковскиеСчета.НомерСчета КАК НомерСчета,
БанковскиеСчета.Банк.Код КАК БИК
ИЗ
Справочник.БанковскиеСчетаКонтрагентов КАК БанковскиеСчета
ГДЕ
БанковскиеСчета.Владелец = &ФизическоеЛицо
И НЕ БанковскиеСчета.ПометкаУдаления
Как показывает практика, в 90% случаев «лишние» записи — это именно помеченные на удаление объекты, которые пользователь не видит в интерфейсе, но которые «видит» запрос.
Если после фильтрации по помеченным на удаление записям всё равно выводится несколько строк, нам нужно выяснить, какой именно счет является основным для выплаты зарплаты на текущий момент. В ЗУП 3.1 эта информация не хранится в самом справочнике счетов. Нам необходимо обратиться к специализированным регистрам. При выделении зарплатного учета из комплексной системы перенос кадровых и расчётных данных ERP 2 — ЗУП 3 обеспечивается автоматическое наполнение этих регистров на основании накопленной истории.
Основным источником данных является регистр сведений МестаВыплатыЗарплатыСотрудников. Рассмотрим подробнее, как работает логика системы:
БанковскиеСчетаКонтрагентов.Проанализируем запрос, который позволяет получить именно тот счет, который выбран в карточке сотрудника в разделе «Выплаты и учет затрат»:
ВЫБРАТЬ
МестаВыплаты.БанковскийСчет КАК АктуальныйСчет,
МестаВыплаты.БанковскийСчет.Банк.Код КАК БИК
ИЗ
РегистрСведений.МестаВыплатыЗарплатыСотрудников.СрезПоследних(&Период, Сотрудник = &Сотрудник) КАК МестаВыплаты
ГДЕ
МестаВыплаты.СпособВыплаты = ЗНАЧЕНИЕ(Перечисление.СпособыВыплатыЗарплаты.ЗачислениеНаКарточку)
Важный момент: если вы используете зарплатный проект, данные могут находиться в регистре ЛицевыеСчетаСотрудниковПоЗарплатнымПроектам. В этом случае актуальным будет счет, у которого в регистре стоит признак того, что он открыт и привязан к действующему проекту.
Как было замечено в обсуждении, реквизит БИК часто выведен на форму элемента справочника БанковскиеСчетаКонтрагентов программно, и его нет в списке реквизитов самого справочника. В типовых конфигурациях 1С БИК — это Код элемента справочника Банки.
Чтобы вытащить его запросом, мы обращаемся к реквизиту через точку: БанковскийСчет.Банк.Код. Выясним причину, по которой БИК может двоиться: если в справочнике Банки создано два элемента с названием «Филиал №34 Банка ВТБ», но с разными кодами, и на каждый из них ссылается свой банковский счет сотрудника, мы получим две разные строки.
Для гарантированного получения актуального БИК рекомендуем придерживаться следующей последовательности действий:
РегистрСведений.МестаВыплатыЗарплатыСотрудников.СрезПоследних.МестаВыплатыЗарплатыПодразделений и МестаВыплатыЗарплатыОрганизаций соответственно).БанковскиеСчетаКонтрагентов, чтобы достать Банк.Код.НЕ БанковскийСчет.ПометкаУдаления лишней не будет.Таким образом, мы уходим от неопределенности «какой счет последний по дате» к четкой бизнес-логике программы: актуальным считается тот счет, который назначен сотруднику ответственным лицом (бухгалтером или расчетчиком) в качестве целевого для перечисления денежных средств.