Не знаю, почему разработчики пошли таким путем, но в основной конфигурации (КА2) функция ПолучитьБанковскийСчетОрганизацииПоУмолчанию работает так - если счет один, то он и будет возвращен. А если больше одного, - ничего.
Так как это насквозь неправильно с точки зрения пользователей, в справочник БанковскиеСчетаОрганизаций был добавлен дополнительный реквизит - "счет по умолчанию", с типом Булево.
Как сделано:
1. В расширение добавлен заимствованный из основной конфигурации справочник - БанковскиеСчетаОрганизаций
2. В заимствованный справочник добавлен реквизит (булево) - СчетПоУмолчанию.
3. В расширение добавлена процедура ПриСозданииНаСервере общего модуля СобытияФорм (эта процедура вызывается из модулей форм (как элемента, так и списка), куда и добавлен код, создающий элементы на формах. Элементы добавляются на две формы - объекта и списка.
Конечно некрасиво оборачивать код в Попытка/Исключение/КонецПопытки, но учитывая разнообразие всевозможных дописок/доделок/расширений, самым простым путем было сделать именно так (без лишнего нагромождения костылей-проверок).
&После("ПриСозданииНаСервере")
Процедура БСО_ПриСозданииНаСервере(Форма, Отказ, СтандартнаяОбработка, ДополнительныеПараметры)
Попытка
//новый элемент на форму объекта
Если ТипЗнч(Форма.Объект.Ссылка) = Тип("СправочникСсылка.БанковскиеСчетаОрганизаций") Тогда
БазовыйЭлемент = Форма.Элементы.Найти("Наименование");
НовыйЭлемент = Форма.Элементы.Добавить("БСО_СчетПоУмолчанию", Тип("ПолеФормы"), БазовыйЭлемент.Родитель);
НовыйЭлемент.Вид = ВидПоляФормы.ПолеФлажка;
НовыйЭлемент.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Право;
НовыйЭлемент.Заголовок = "Счет по умолчанию";
НовыйЭлемент.ШрифтЗаголовка = Новый Шрифт(ШрифтыСтиля.ОбычныйШрифтТекста, , , Истина, , , ,);
НовыйЭлемент.ПутьКДанным = "Объект.БСО_СчетПоУмолчанию";
НовыйЭлемент.Доступность = Форма.Объект.ТипСчета = Перечисления.ТипыБанковскихСчетов.Расчетный;
КонецЕсли;
Исключение
КонецПопытки;
Попытка
//новый элемент на форму списка
Если Форма.ИмяФормы = "Справочник.БанковскиеСчетаОрганизаций.Форма.ФормаСписка" Тогда
Если ОбщегоНазначенияКлиентСервер.ЕстьРеквизитИлиСвойствоОбъекта(Форма, "Список") Тогда
Если Форма.Список.ПроизвольныйЗапрос Тогда
ТекстЗапроса = Форма.Список.ТекстЗапроса;
ТекстЗапроса = СтрЗаменить(ТекстЗапроса,
"БанковскиеСчета.НомерСчета",
"БанковскиеСчета.БСО_СчетПоУмолчанию КАК БСО_СчетПоУмолчанию, БанковскиеСчета.НомерСчета");
Форма.Список.ТекстЗапроса = ТекстЗапроса;
КонецЕсли;
ЭлементСписок = Форма.Элементы.Найти("Список");
НовыйЭлемент = Форма.Элементы.Добавить("БСО_СчетПоУмолчанию", Тип("ПолеФормы"), ЭлементСписок);
НовыйЭлемент.Вид = ВидПоляФормы.ПолеКартинки;
НовыйЭлемент.КартинкаЗначений = БиблиотекаКартинок.ОформлениеФлажок;
НовыйЭлемент.ТолькоПросмотр = Истина;
НовыйЭлемент.ПутьКДанным = "Список.БСО_СчетПоУмолчанию";
КонецЕсли;
КонецЕсли;
Исключение
КонецПопытки;
КонецПроцедуры
4. В модуль справочника, в процедуре ПередЗаписью, добавлен код проверки значения нового реквизита, чтобы не получилось больше одного счета по умолчанию (с учетом валюты):
&После("ПередЗаписью")
Процедура БСО_ПередЗаписью(Отказ)
//счет по умолчанию должен быть один!
Если БСО_СчетПоУмолчанию Тогда
Если ЭтотОбъект.ТипСчета <> Перечисления.ТипыБанковскихСчетов.Расчетный Тогда
БСО_СчетПоУмолчанию = Ложь;
Возврат;
КонецЕсли;
Выборка = Справочники.БанковскиеСчетаОрганизаций.Выбрать(, Владелец, Новый Структура("БСО_СчетПоУмолчанию", Истина));
Пока Выборка.Следующий() Цикл
Если Выборка.Ссылка <> Ссылка
И Выборка.БСО_СчетПоУмолчанию
И Выборка.ВалютаДенежныхСредств = ЭтотОбъект.ВалютаДенежныхСредств
Тогда
СчетОбъект = Выборка.ПолучитьОбъект();
СчетОбъект.БСО_СчетПоУмолчанию = Ложь;
СчетОбъект.Записать();
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
5. В штатную функцию ПолучитьБанковскийСчетОрганизацииПоУмолчанию внесены изменения, добавляющие применение нашего реквизита при выборке:
ПолучитьБанковскийСчетОрганизацииПоУмолчанию
&Вместо("ПолучитьБанковскийСчетОрганизацииПоУмолчанию")
Функция БСО_ПолучитьБанковскийСчетОрганизацииПоУмолчанию(Организация, Валюта, НаправлениеДеятельности)
Запрос = Новый Запрос("
|ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1
| БанковскиеСчетаОрганизаций.Ссылка КАК БанковскийСчетОрганизации
|ИЗ
| Справочник.БанковскиеСчетаОрганизаций КАК БанковскиеСчетаОрганизаций
|ГДЕ
| НЕ БанковскиеСчетаОрганизаций.ПометкаУдаления
| И БанковскиеСчетаОрганизаций.БСО_СчетПоУмолчанию
| И НЕ БанковскиеСчетаОрганизаций.Закрыт
| И (БанковскиеСчетаОрганизаций.Владелец = &Организация
| ИЛИ &Организация = Неопределено)
| И (БанковскиеСчетаОрганизаций.ВалютаДенежныхСредств = &Валюта
| ИЛИ &Валюта = Неопределено)
| И (БанковскиеСчетаОрганизаций.НаправлениеДеятельности = &НаправлениеДеятельности
| ИЛИ &НаправлениеДеятельности = НЕОПРЕДЕЛЕНО);
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1
| БанковскиеСчетаОрганизаций.Ссылка КАК БанковскийСчетОрганизации
|ИЗ
| Справочник.БанковскиеСчетаОрганизаций КАК БанковскиеСчетаОрганизаций
|ГДЕ
| НЕ БанковскиеСчетаОрганизаций.ПометкаУдаления
| И БанковскиеСчетаОрганизаций.БСО_СчетПоУмолчанию
| И НЕ БанковскиеСчетаОрганизаций.Закрыт
| И (БанковскиеСчетаОрганизаций.Владелец = &Организация
| ИЛИ &Организация = Неопределено)
| И (БанковскиеСчетаОрганизаций.ВалютаДенежныхСредств = &Валюта
| ИЛИ &Валюта = Неопределено)
|");
Запрос.УстановитьПараметр("Организация", ?(ЗначениеЗаполнено(Организация), Организация, Неопределено));
Запрос.УстановитьПараметр("Валюта", ?(ЗначениеЗаполнено(Валюта), Валюта, Неопределено));
Запрос.УстановитьПараметр("НаправлениеДеятельности", ?(ЗначениеЗаполнено(НаправлениеДеятельности), НаправлениеДеятельности, Неопределено));
Результат = Запрос.ВыполнитьПакет();
ВыборкаПоНаправлению = Результат[0].Выбрать();
ВыборкаБезНаправления = Результат[1].Выбрать();
Если ВыборкаПоНаправлению.Следующий() Тогда
БанковскийСчетОрганизации = ВыборкаПоНаправлению.БанковскийСчетОрганизации;
ИначеЕсли ВыборкаБезНаправления.Следующий() Тогда
БанковскийСчетОрганизации = ВыборкаБезНаправления.БанковскийСчетОрганизации;
Иначе
ПродолжитьВызов(Организация, Валюта, НаправлениеДеятельности);
КонецЕсли;
Возврат БанковскийСчетОрганизации;
КонецФункции
По аналогии, практически то же самое было сделано и в справочнике "Банковские счета контрагентов".
Таким образом, даже если где-то и пойдет что-то не так, то штатный функционал отработает так, как и было задумано разработчиками.
Все изменения, описанные выше, никоим образом не меняют поведение системы в случае конфликта расширения и других доработок.
Использовалось на конфигурации Комплексная автоматизация 2.4.10.75 и 2.4.11.63.