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