При работе с документами «Счет на оплату покупателю» в конфигурации «1С:Бухгалтерия предприятия 8» (редакция 3.0) пользователи могут столкнуться с нетипичным поведением: документ выгружен из внешнего источника (например, из «1С:Торговля и Склад 7.7»), счет расчетов в шапке визуально заполнен, но при попытке сменить договор контрагента реквизит БанковскийСчет мгновенно очищается. В результате провести документ становится невозможно из-за ошибки: «Реквизиты банковского счета не заполнены».
Рассмотрим подробнее причины возникновения этой неполадки, изучим работу внутренних механизмов 1С и разберем по шагам варианты ее устранения.
Проанализируем ситуацию в отладчике. В форме документа Документ.СчетНаОплатуПокупателю при смене договора выгодоприобретателя запускается обработчик события ПриИзмененииДоговора. Внутри этого обработчика конфигурация производит поиск и подстановку основного банковского счета организации.
Поиск банковского счета выполняется алгоритмами типовой конфигурации по следующим условиям:
В документах, перенесенных из внешних систем через правила конвертации данных (КД 2.0 или КД 3.0), часто возникает скрытая проблема: реквизит шапки Организация на форме выглядит заполненным, однако служебный реквизит ОрганизацияПолучатель остается равным значению ЗначениеНеЗаполнено() (пустая ссылка).
Так как процедура поиска счета берет данные из реквизита ОрганизацияПолучатель, код не может сопоставить владельца счета и возвращает пустую ссылку. В результате стандартный механизм очищает поле БанковскийСчет на форме.
Выяснив причину, разберем по шагам, как исправить незаполненные документы без необходимости править их вручную каждый раз.
Вариант А: Использование стандартной обработки «Групповое изменение реквизитов»
Если в базе нет возможности запустить программную обработку, используем штатный механизм платформы 1С:
Счет на оплату покупателю.Проведен равен Ложь.ОрганизацияПолучатель (или Организация) и укажем требуемую организацию.Вариант Б: Программное заполнение реквизита обработкой
Посмотрим на пример кода, который можно выполнить во внешней обработке или через внешнюю обработку произвольного кода для массового проставления организации-получателя:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СчетНаОплату.Ссылка КАК Ссылка,
| СчетНаОплату.Организация КАК Организация
|ИЗ
| Документ.СчетНаОплатуПокупателю КАК СчетНаОплату
|ГДЕ
| СчетНаОплату.Проведен = ЛОЖЬ
| И СчетНаОплату.ОрганизацияПолучатель = ЗНАЧЕНИЕ(Справочник.Организации.ПустаяСсылка)";
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетали = РезультатЗапроса.Выбрать();
Пока ВыборкаДетали.Следующий() Цикл
ОбъектДокумент = ВыборкаДетали.Ссылка.ПолучитьОбъект();
ОбъектДокумент.ОрганизацияПолучатель = ВыборкаДетали.Организация;
// Заполняем основной банковский счет при необходимости
Если НЕ ЗначениеЗаполнено(ОбъектДокумент.БанковскийСчет) Тогда
ОбъектДокумент.БанковскийСчет = ВыборкаДетали.Организация.ОсновнойБанковскийСчет;
КонецЕсли;
ОбъектДокумент.Записать(РежимЗаписиДокумента.Запись);
КонецЦикла;
Если реквизиты организации заполнены корректно, но банковский счет все равно сбрасывается при смене договора, проверим настройку самого справочника банковских счетов и договоров контрагента.
Организации.Чтобы проблема не повторялась при последующих выгрузках из «1С:Торговля и Склад 7.7», необходимо внести исправления в правила конвертации данных:
ОрганизацияПолучатель, сопоставив его с организацией источника.