В конфигурации 1С:ERP Управление предприятием 2.4 (особенно в КОРП-версии) пользователи часто сталкиваются с ситуацией, когда при выборе или смене банковского счета в документе Заявка на расходование денежных средств автоматически изменяется КПП организации в реквизитах плательщика. Это может привести к ошибкам при формировании платежных поручений, если КПП обособленного подразделения подставляется там, где должен быть указан КПП головной организации. Рассмотрим подробно причины этого поведения и способы решения задачи.
Для начала разберем, как система формирует текстовую строку с ИНН и КПП, которую мы видим на форме документа. В типовом решении за это отвечает серверная процедура УстановитьНадписьРеквизитыПлательщика. Проанализируем её код:
&НаСервере
Процедура УстановитьНадписьРеквизитыПлательщика()
Если ЗначениеЗаполнено(Объект.Организация) Тогда
НадписьРеквизитыПлательщика = ДенежныеСредстваСервер.НадписьРеквизитыПлательщика(
Объект.ИННПлательщика,
Объект.КПППлательщика,
Объект.ТекстПлательщика,
ЮрФизЛицо,
Объект.ХозяйственнаяОперация
);
Иначе
НадписьРеквизитыПлательщика = "";
КонецЕсли;
КонецПроцедуры
Проблема заключается в том, что значения Объект.КПППлательщика и Объект.ИННПлательщика не являются статичными. В версии КОРП реализован сложный механизм определения налоговых реквизитов, зависящий от связки «Организация + Подразделение». При изменении банковского счета срабатывает цепочка событий, которая обновляет эти данные.
Разберем по шагам, почему КПП меняется именно при выборе счета:
Банковские счета для каждой записи может быть указано конкретное Подразделение. Если это поле заполнено, система считает, что данный счет принадлежит конкретному филиалу или обособленному подразделению.Регистрации в налоговых органах. Если у подразделения, привязанного к счету, есть своя регистрация, система подставит КПП этого подразделения.История регистраций в налоговом учете (или его вторичные таблицы). Если в нем для выбранного подразделения зафиксирована отдельная запись, отличная от головной организации, КПП будет изменен автоматически.Прежде чем приступать к написанию кода, проанализируем настройки в пользовательском интерфейсе. Часто проблему можно решить без программирования:
Банковские счета и найдем счет, при выборе которого меняется КПП.Регистрации в налоговых органах. Убедимся, что для данного подразделения не задан специфический КПП, который не должен попадать в платежные документы.Если специфика учета требует, чтобы подразделение в счете было указано, но КПП в заявке всегда оставался «головным», нам придется вмешаться в логику работы формы. Рассмотрим пример кода, который можно внедрить через расширение в процедуру УстановитьНадписьРеквизитыПлательщика:
&НаСервере
Процедура ИмяПрефикса_УстановитьНадписьРеквизитыПлательщика(Объект, НадписьРеквизитыПлательщика, ЮрФизЛицо)
// Если нам нужно принудительно использовать КПП организации, а не подразделения
НужныйКПП = Объект.Организация.КПП;
Если ЗначениеЗаполнено(Объект.Организация) Тогда
НадписьРеквизитыПлательщика = ДенежныеСредстваСервер.НадписьРеквизитыПлательщика(
Объект.ИННПлательщика,
НужныйКПП, // Используем КПП организации вместо Объект.КПППлательщика
Объект.ТекстПлательщика,
ЮрФизЛицо,
Объект.ХозяйственнаяОперация
);
КонецЕсли;
КонецПроцедуры
Однако помните, что просто изменить надпись на форме недостаточно — реальное значение КПП хранится в реквизитах объекта, которые потом уходят в документ Списание безналичных денежных средств и далее в выгрузку в банк.
Рассмотрим ситуацию, когда стандартный механизм перезаписывает КПП, и нам нужно это заблокировать. Можно добавить на форму вспомогательный реквизит, который будет хранить «эталонный» КПП, или добавить условие в обработчик изменения счета.
Выясним, как работает функция формирования строки в общем модуле ДенежныеСредстваСервер. Проанализируем её параметры:
Функция НадписьРеквизитыПлательщика(ИНН, КПП, ТекстКорреспондента, ЮрФизЛицо, ХозяйственнаяОперация) Экспорт
ШаблонНадписи = НСтр("ru = 'ИНН %1%2, %3'");
СтрокаИНН = ?(ПустаяСтрока(ИНН), "", СокрЛП(ИНН));
// Система проверяет, нужно ли указывать КПП (например, для платежей в бюджет)
ТребуетсяУказаниеКПП = (ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.ПеречислениеВБюджет);
// Логика формирования строки КПП
СтрокаКПП = ", " + НСтр("ru = 'КПП'");
Если Не ЗначениеЗаполнено(КПП) Тогда
// ... (логика заполнения нулями или пустотой)
Иначе
СтрокаКПП = СтрокаКПП + " " + КПП;
КонецЕсли;
Возврат СтрШаблон(ШаблонНадписи, СтрокаИНН, СтрокаКПП, СокрЛП(ТекстКорреспондента));
КонецФункции
Чтобы КПП не менялся при выборе счета, рекомендуется использовать расширение для перехвата события БанковскийСчетОрганизацииПриИзменении. В этом обработчике после выполнения типового кода нужно принудительно устанавливать значение реквизита РегистрацияВНалоговомОргане (или напрямую КПППлательщика), соответствующее вашим требованиям.
Подведем итоги нашего исследования:
ДенежныеСредстваСервер, так как это повлияет на все документы системы (ТОРГ-12, счета-фактуры и т.д.). Правильнее корректировать поведение конкретной формы Заявка на расходование денежных средств.РеквизитыПлательщика. Все изменения, внесенные программно, должны корректно отражаться и в этой вспомогательной форме.Таким образом, для решения проблемы необходимо либо привести данные в соответствие с логикой 1С (убрать подразделение из карточки счета), либо точечно переопределить заполнение реквизита КПППлательщика в коде формы документа при событии изменения счета.