Почему не сохраняется юридический адрес при программном создании контрагента в 1С:БГУ 2.0?

Программист 1С v8.3 (Управляемые формы) Бухгалтерский учет Сфера услуг, туризм и социальный сектор
← На главную

При программной загрузке данных в 1С часто возникают неочевидные проблемы, связанные с особенностями архитектуры конкретной конфигурации. В этой статье мы разберем ситуацию, с которой столкнулся разработчик при загрузке контрагентов в "1С:Бухгалтерия государственного учреждения 2.0" (БГУ 2.0). Проблема заключалась в том, что юридический адрес, хотя и записывался в базу данных, не отображался в форме элемента и удалялся при последующем сохранении объекта вручную.

Проанализируем ситуацию по шагам, выясним причину такого поведения системы и рассмотрим правильный способ добавления контактной информации для контрагентов в БГУ 2.0.

Анализ проблемы: особенность архитектуры данных в БГУ 2.0

На первый взгляд, задача кажется тривиальной: нужно создать элемент справочника Контрагенты и заполнить его табличную часть КонтактнаяИнформация. Автор темы так и поступил, используя для этого стандартные функции Библиотеки стандартных подсистем (БСП). Код успешно добавлял строку с юридическим адресом в нужную табличную часть, и ее можно было увидеть через консоль запросов. Однако в пользовательском интерфейсе адрес отсутствовал, а при попытке сохранить контрагента запись с адресом бесследно исчезала.

Ключевая причина такого поведения кроется в структуре хранения данных в БГУ 2.0. Эта конфигурация, как и многие современные решения 1С, использует разделение сущностей для более гибкого учета.

  1. Справочник Контрагенты — это обобщенный справочник. Он служит для объединения всех участников расчетов (поставщиков, покупателей, госорганов) в одном месте. Сам по себе элемент этого справочника хранит только самую общую информацию.
  2. Справочники ЮридическиеЛица и ФизическиеЛица — это подчиненные или, точнее, связанные справочники, которые хранят специфические реквизиты, присущие только юридическим или физическим лицам. К таким реквизитам относятся ИНН, КПП, ОГРН и, что самое важное для нашей задачи, юридический адрес.

Связь между этими справочниками осуществляется через реквизит ОсновнойКонтрагент в справочниках ЮридическиеЛица и ФизическиеЛица, который ссылается на соответствующий элемент справочника Контрагенты.

Когда вы открываете форму контрагента в пользовательском режиме, система не просто читает данные из справочника Контрагенты. Она также обращается к связанному элементу в справочнике ЮридическиеЛица (или ФизическиеЛица) и подтягивает оттуда контактную информацию. При сохранении происходит обратный процесс: данные из формы записываются в соответствующие справочники. Именно поэтому, когда адрес был добавлен напрямую в "неправильный" справочник Контрагенты, форма его не видела, а при записи очищала эту "лишнюю" информацию, так как в правильном источнике (справочнике ЮридическиеЛица) ее не было.

Пример неверного подхода

Рассмотрим код, который использовался изначально. Он логичен, но не учитывает архитектуру БГУ 2.0.

В этом коде вся работа ведется с объектом справочника Контрагенты. Именно ему и пытаются добавить контактную информацию.


// Получаем объект справочника "Контрагенты"
КонтрагентОбъект = Контрагент.ПолучитьОбъект();

Представление = "346780, Ростовская область, г. Батайск, ул. Московская , д. 12";
ВидКИ = Справочники.ВидыКонтактнойИнформации.ЮридическийАдресКонтрагенты;
ТипКИ = ВидКИ.Тип;
    
// Функции БСП для подготовки данных адреса
ОбъектXDTOКИ = УправлениеКонтактнойИнформациейЛокализация.КонтактнаяИнформацияXDTOПоПредставлению(Представление, ТипКИ);
ЗначенияПолей = УправлениеКонтактнойИнформациейЛокализация.КонтактнаяИнформацияXDTOВXML(ОбъектXDTOКИ);

// Ключевая ошибка: контактная информация добавляется к объекту Контрагента
УправлениеКонтактнойИнформацией.ДобавитьКонтактнуюИнформацию(КонтрагентОбъект, ЗначенияПолей, ВидКИ, ТекущаяДата(), Истина);

Функция УправлениеКонтактнойИнформацией.ДобавитьКонтактнуюИнформацию универсальна. Она добавляет информацию тому объекту, который передан в первом параметре. В данном случае это КонтрагентОбъект, что и является ошибкой.

Правильное решение: работаем с нужным справочником

Чтобы адрес корректно сохранился и отображался, необходимо добавлять его не к элементу справочника Контрагенты, а к связанному с ним элементу справочника ЮридическиеЛица. Разберем правильный алгоритм действий.

  1. Создаем или находим элемент справочника Контрагенты. Это наша основная, обобщающая сущность.
  2. Создаем или находим элемент справочника ЮридическиеЛица.
  3. Устанавливаем связь. Заполняем реквизит ОсновнойКонтрагент у элемента ЮридическиеЛица ссылкой на наш элемент Контрагенты.
  4. Добавляем контактную информацию. Вызываем функцию БСП, но в качестве первого параметра передаем уже объект справочника ЮридическиеЛица.
  5. Записываем оба объекта.

Посмотрим на исправленный пример кода. Предположим, что мы создаем контрагента и связанное с ним юридическое лицо с нуля.


// 1. Создаем или находим Контрагента
НовыйКонтрагент = Справочники.Контрагенты.СоздатьЭлемент();
НовыйКонтрагент.Наименование = "ООО Ромашка";
НовыйКонтрагент.Записать();

// 2. Создаем связанное ЮридическоеЛицо
ЮрЛицоОбъект = Справочники.ЮридическиеЛица.СоздатьЭлемент();
ЮрЛицоОбъект.Наименование = "Общество с ограниченной ответственностью ""Ромашка""";
ЮрЛицоОбъект.ИНН = "1234567890";
ЮрЛицоОбъект.КПП = "1234501001";

// 3. Устанавливаем связь
ЮрЛицоОбъект.ОсновнойКонтрагент = НовыйКонтрагент.Ссылка;

// 4. Готовим и добавляем контактную информацию к объекту ЮридическогоЛица
Представление = "346780, Ростовская область, г. Батайск, ул. Московская , д. 12";
ВидКИ = Справочники.ВидыКонтактнойИнформации.ЮридическийАдресКонтрагенты;
ТипКИ = ВидКИ.Тип;
    
ОбъектXDTOКИ = УправлениеКонтактнойИнформациейЛокализация.КонтактнаяИнформацияXDTOПоПредставлению(Представление, ТипКИ);
ЗначенияПолей = УправлениеКонтактнойИнформациейЛокализация.КонтактнаяИнформацияXDTOВXML(ОбъектXDTOКИ);

// Теперь передаем в функцию правильный объект - ЮрЛицоОбъект
УправлениеКонтактнойИнформацией.ДобавитьКонтактнуюИнформацию(ЮрЛицоОбъект, ЗначенияПолей, ВидКИ, ТекущаяДата(), Истина);

// 5. Записываем объект ЮридическогоЛица со всей информацией
ЮрЛицоОбъект.Записать();

Важный момент: Если вы загружаете данные, и контрагент уже может существовать в базе, необходимо сначала найти и получить ссылку на существующий элемент справочника Контрагенты, а затем найти или создать связанный с ним элемент ЮридическиеЛица. Главное — всегда выполнять операцию добавления контактной информации именно для объекта ЮридическиеЛица или ФизическиеЛица.

Как отлаживать подобные проблемы

Если вы столкнулись с похожей ситуацией, когда данные "исчезают" при записи, лучший способ разобраться — это отладка. В данном случае полезным был бы следующий метод:

  1. Программно создайте контрагента с "неправильно" записанным адресом.
  2. Откройте этот элемент в пользовательском режиме.
  3. В конфигураторе поставьте точку останова в модуле объекта справочника Контрагенты, в обработчике события ПередЗаписью или ПриЗаписи.
  4. Нажмите "Записать и закрыть" в форме контрагента.
  5. Когда сработает точка останова, проанализируйте с помощью отладчика, какой код выполняется. Вы увидите, что система, скорее всего, выполняет процедуру синхронизации, которая очищает табличную часть КонтактнаяИнформация, так как не находит соответствующих данных в справочнике ЮридическиеЛица.

Этот подход поможет не только решить текущую проблему, но и глубже понять внутренние механизмы работы конфигурации, что очень ценно для любого разработчика 1С.

← На главную