При переносе данных, разработке отчетов или интеграции различных конфигураций на платформе «1С:Предприятие» программисты часто сталкиваются с задачей определения основного банковского счета контрагента или организации. Логика подсказывает искать этот признак (например, флажок или булево свойство) внутри подчиненного справочника БанковскиеСчета. Однако в типовых решениях «1С:Бухгалтерия предприятия» (как в редакции 2.0 на платформе 8.2, так и в редакции 3.0 на платформе 8.3) разработчики применили иную архитектурную схему.
В этой статье мы подробно разберем, как устроена связь между контрагентом и его основным расчетным счетом, как получить эти данные программно и какие нюансы следует учитывать при переносе данных между различными конфигурациями.
Давайте проанализируем структуру метаданных. В «1С:Бухгалтерии» связь между владельцем (контрагентом, организацией, физическим лицом) и его банковскими счетами реализована через подчинение справочников. Справочник БанковскиеСчета является подчиненным по отношению к справочникам Контрагенты и Организации.
Чтобы не перегружать подчиненный справочник лишними признаками и исключить ситуацию, когда у одного контрагента случайно окажется выбрано несколько «основных» счетов, разработчики 1С пошли по классическому пути СУБД: связь «один-ко-многим» замыкается обратной ссылкой «один-к-одному» на стороне владельца.
Таким образом, признак «Основной» хранится непосредственно в карточке владельца в виде реквизита со ссылочным типом данных:
ОсновнойБанковскийСчет в справочнике Контрагенты (тип ссылки: СправочникСсылка.БанковскиеСчета).ОсновнойБанковскийСчет в справочнике Организации (тип ссылки: СправочникСсылка.БанковскиеСчета).ОсновнойБанковскийСчет в справочнике ФизическиеЛица (тип ссылки: СправочникСсылка.БанковскиеСчета).Когда пользователь в интерфейсе программы нажимает кнопку «Использовать как основной» в списке банковских счетов, система не модифицирует сам элемент счета. Вместо этого она берет ссылку на выбранный банковский счет и записывает ее в реквизит ОсновнойБанковскийСчет соответствующего контрагента или организации.
Рассмотрим, как работать с этим реквизитом на практике с помощью встроенного языка 1С. Ниже приведена пара простых примеров для разработчиков.
Пример 1. Получение основного счета контрагента в коде:
// Получаем ссылку на контрагента (например, из реквизита документа)
СсылкаНаКонтрагента = Справочники.Контрагенты.НайтиПоРеквизиту("ИНН", "7701010101");
Если ЗначениеЗаполнено(СсылкаНаКонтрагента) Тогда
// Прямое обращение к реквизиту владельца
ОсновнойСчет = СсылкаНаКонтрагента.ОсновнойБанковскийСчет;
Если ЗначениеЗаполнено(ОсновнойСчет) Тогда
Сообщить("Основной счет контрагента: " + ОсновнойСчет.НомерСчета + " в банке " + ОсновнойСчет.Банк);
Иначе
Сообщить("У контрагента не выбран основной банковский счет.");
КонецЕсли;
КонецЕсли;
Пример 2. Программная установка банковского счета в качестве основного:
// Предположим, у нас есть ссылка на созданный банковский счет
НовыйСчетСсылка = Справочники.БанковскиеСчета.НайтиПоРеквизиту("НомерСчета", "40702810XXXXXXXXXXXX");
Если ЗначениеЗаполнено(НовыйСчетСсылка) Тогда
// Получаем владельца счета (это может быть Контрагент или Организация)
ВладелецСчета = НовыйСчетСсылка.Владелец;
// Блокируем и открываем объект владельца для изменения
ОбъектВладельца = ВладелецСчета.ПолучитьОбъект();
ОбъектВладельца.ОсновнойБанковскийСчет = НовыйСчетСсылка;
Попытка
ОбъектВладельца.Записать();
Сообщить("Счет успешно установлен в качестве основного.");
Исключение
Сообщить("Не удалось перезаписать владельца: " + ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
Если вы настраиваете правила обмена в программе «1С:Конвертация данных» для переноса информации из старой базы 1С:Бухгалтерия 2.0 (на платформе 8.2) в новую 1С:Бухгалтерия 3.0 (на платформе 8.3), то перенос основного счета не вызовет трудностей. Структура этих реквизитов в обеих редакциях идентична.
Однако при переносе следует соблюдать правильный порядок создания объектов, чтобы избежать записи пустых ссылок:
БанковскиеСчета с заполненным реквизитом Владелец.ОсновнойБанковскийСчет в справочнике Контрагенты.ОсновнойБанковскийСчет настроена корректная ссылка на правило конвертации объектов (ПКО) справочника банковских счетов.Проанализируем важный момент, который часто путает специалистов, работающих с разными решениями на платформе 1С. Описанная выше логика с реквизитом ОсновнойБанковскийСчет жестко зашита в «1С:Бухгалтерии».
Если же вы осуществляете интеграцию с конфигурациями торговой линейки, такими как «Управление торговлей 11» (УТ), «Комплексная автоматизация 2» (КА) или «ERP Управление предприятием», то там физически нет реквизита «ОсновнойБанковскийСчет» в карточке контрагента.
В этих системах используется другой механизм БСП — статистика автозаполнения документов. Система анализирует последние документы продаж или закупок по конкретному партнеру и автоматически подставляет тот счет, который использовался чаще всего за последнее время. При переносе данных из «1С:Бухгалтерии» в «Управление торговлей» напрямую перенести признак основного счета стандартными средствами не получится, так как в целевой базе его просто негде хранить без кастомизации и внедрения расширений.