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