При разработке обработок загрузки данных или интеграций в современных конфигурациях 1С, таких как «Управление торговлей 11», «ERP» или «Комплексная автоматизация», программисты часто сталкиваются с проблемой: данные в табличную часть КонтактнаяИнформация вроде бы записаны, но при открытии карточки контрагента поля остаются пустыми. Более того, при интерактивном сохранении карточки программно добавленные данные могут бесследно исчезнуть. Разберем детально, почему так происходит и как правильно реализовать заполнение контактной информации (КИ).
В конфигурациях на базе Библиотеки стандартных подсистем (БСП) механизм работы с контактной информацией значительно сложнее, чем обычное добавление строк в таблицу. Форма объекта (карточка контрагента) при открытии считывает данные не напрямую из всех колонок табличной части, а анализирует специальный реквизит ЗначенияПолей. Если этот реквизит пуст или содержит некорректную структуру (XML или JSON), стандартные механизмы формы не смогут отобразить адрес или телефон, даже если колонки Представление или АдресЭП заполнены верно.
Кроме того, система проверяет соответствие Вида и Типа контактной информации. Если вы пытаетесь записать адрес электронной почты, используя вид, предназначенный для физического адреса, форма проигнорирует такие данные в целях обеспечения целостности.
Рассмотрим пример кода, который позволяет добавить Email контрагенту путем прямого обращения к табличной части. Этот способ требует внимательности при заполнении всех служебных полей.
// Получаем объект контрагента для редактирования
ОбъектКонтрагент = Справочники.Контрагенты.НайтиПоКоду("00001").ПолучитьОбъект();
// Определяем нужный вид контактной информации
// Для УТ 11 это обычно предопределенный элемент EmailКонтрагента
ВидКИ = Справочники.ВидыКонтактнойИнформации.EmailКонтрагента;
// Добавляем новую строку в табличную часть
НоваяСтрокаКИ = ОбъектКонтрагент.КонтактнаяИнформация.Добавить();
НоваяСтрокаКИ.Тип = Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты;
НоваяСтрокаКИ.Вид = ВидКИ;
НоваяСтрокаКИ.Представление = "test@example.com";
НоваяСтрокаКИ.АдресЭП = "test@example.com";
// Важнейший этап: формирование XML-структуры для реквизита ЗначенияПолей.
// Используем служебную функцию БСП для формирования корректного XML по представлению.
НоваяСтрокаКИ.ЗначенияПолей = УправлениеКонтактнойИнформациейСлужебныйВызовСервера.КонтактнаяИнформацияXMLПоПредставлению(
НоваяСтрокаКИ.Представление,
НоваяСтрокаКИ.Вид
);
// Для корректного отображения в списках заполняем ВидДляСписка
НоваяСтрокаКИ.ВидДляСписка = ВидКИ;
// Записываем объект
ОбъектКонтрагент.Записать();
Проанализируем этот код. Мы не просто добавляем строку, но и вызываем функцию КонтактнаяИнформацияXMLПоПредставлению. Именно она упаковывает строковое представление в структурированный XML, который «понимает» форма контрагента. Без этого шага форма решит, что данных нет.
Разберем более современный и надежный метод. В составе БСП есть общий модуль УправлениеКонтактнойИнформацией, который содержит готовые процедуры для записи данных. Использование API позволяет избежать ошибок при обновлении конфигурации, так как формат хранения данных (например, переход с XML на JSON в новых версиях платформы) будет обработан самой подсистемой автоматически.
Посмотрим на пример использования универсальной функции:
// Подготовим данные для записи
СтруктураДанных = Новый Структура;
СтруктураДанных.Вставить("АдресЭП", "info@company.ru");
СтруктураДанных.Вставить("Представление", "info@company.ru");
ВидКИ = Справочники.ВидыКонтактнойИнформации.EmailКонтрагента;
// Вызываем стандартный метод БСП
УправлениеКонтактнойИнформацией.ЗаписатьКонтактнуюИнформацию(
ОбъектКонтрагент,
СтруктураДанных,
ВидКИ,
Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты
);
ОбъектКонтрагент.Записать();
Этот метод предпочтительнее, так как он берет на себя всю «черную работу» по формированию служебных строк и проверке видов КИ.
Выясним, за что отвечают ключевые колонки табличной части, чтобы понимать логику работы системы:
ВидыКонтактнойИнформации. Именно здесь настраивается, является ли email «Личным» или «Рабочим», и для какого справочника он предназначен.В конфигурации «Управление торговлей 11» существует функциональная опция «Независимо вести партнеров и контрагентов». Проанализируем ситуацию: если в настройках программы включено использование партнеров, то основная контактная информация часто хранится и отображается в справочнике Партнеры, а в справочнике Контрагенты она может дублироваться или отсутствовать вовсе.
Если вы программно заполнили КИ у Контрагента, но в интерфейсе открываете карточку через справочник Партнеры (или наоборот), вы не увидите изменений. Всегда проверяйте, к какому именно объекту привязана контактная информация в вашем конкретном случае. Часто требуется дублировать запись КИ и для партнера, и для связанного с ним контрагента.
Рассмотрим основные причины неудач:
Объект.КонтактнаяИнформация.Добавить() обязательно нужно вызвать Объект.Записать(), иначе данные останутся только в оперативной памяти.ЗначенияПолей «склейкой» строк. Используйте только штатные функции БСП, так как структура XML/JSON может меняться от релиза к релизу.Правильное заполнение контактной информации в 1С требует понимания архитектуры БСП. Основной секрет успеха заключается в использовании штатных функций модуля УправлениеКонтактнойИнформацией и обязательном заполнении поля ЗначенияПолей. При соблюдении этих правил ваши данные будут корректно отображаться в интерфейсе и сохраняться при работе пользователей.