Как программно записать контактную информацию в «1С:Управление торговлей», чтобы она корректно отображалась?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

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

Анализируем исходную проблему: почему данные не отображаются?

Мы часто сталкиваемся с ситуацией, когда, казалось бы, правильно заполняем поля адреса (город, улица, дом) через код, но при открытии карточки контрагента эти данные отсутствуют или отображаются некорректно. В сообщении 0 автор описывает именно такую ситуацию, когда поля заполнены, но в форме контрагента они не видны.

Как мы видим из сообщения 4, при прямом заполнении полей в консоли мы получаем примерно следующий результат:


Индекс = 1111
Город= ""
Улица = ""

В то время как при ручном заполнении этих же полей в пользовательском режиме, система сохраняет их в специальном структурированном виде, который автор описывает как:


"<КонтактнаяИнформация xmlns="http://www.v8.1c.ru/ssl/contactinfo" xmlns:xs="http://www.w3.org/2001/XMLSchema" ... "

Это наблюдение критически важно. Оно указывает на то, что система не просто хранит значения полей адреса как отдельные строковые данные, а ожидает их в определенной структуре (ранее XML, а в современных версиях — JSON). Если мы не предоставим данные в таком формате, 1С не сможет их распознать и отобразить.

1С использует специальный механизм для хранения и отображения контактной информации, который включает в себя не только само "представление" (строку адреса), но и детализированные "значения полей" в структурированном виде. Нам необходимо понять, как формировать эту структурированную строку.

Ключевые аспекты хранения контактной информации в 1С

Чтобы успешно записывать контактную информацию, мы должны понимать, как она устроена в типовых конфигурациях 1С, основанных на Библиотеке Стандартных Подсистем (БСП).

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

  1. Тип: Это общее обозначение категории контактных данных, например, "Адрес", "Телефон", "Электронная почта".
  2. Вид: Это ссылка на элемент справочника ВидыКонтактнойИнформации. Он уточняет назначение данных, например, "Юридический адрес контрагента", "Рабочий телефон", "Основной email".
  3. Представление: Строка, которую пользователь видит в полях контактной информации на форме. Это текстовое, читабельное отображение адреса, телефона и т.д.
  4. ЗначенияПолей: Это самая важная часть для нашей задачи. Это структурированная строка (XML или JSON), содержащая детальную информацию о полях адреса (Индекс, Страна, Город, Улица, Дом, Корпус, Квартира и т.д.). Именно сюда система записывает разобранные данные, которые мы видим в специальных полях форм.

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

Правильный подход: используем стандартные функции БСП

Вместо того чтобы пытаться вручную сформировать сложную XML или JSON строку, мы должны использовать специализированные функции Библиотеки Стандартных Подсистем (БСП), разработанные для этой цели. Именно эти функции обеспечивают корректное формирование структуры и ее последующее отображение в интерфейсе.

Центральной функцией для записи контактной информации является УправлениеКонтактнойИнформацией.ЗаписатьКонтактнуюИнформацию(), как справедливо указано в сообщении 7. Рассмотрим ее и связанные с ней методы подробнее.

Функция УправлениеКонтактнойИнформацией.ЗаписатьКонтактнуюИнформацию()

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

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

Сигнатура этой функции обычно выглядит так:


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

Рассмотрим параметры:

Подготовка строки ЗначенияПолей

Для формирования корректной JSON-строки ЗначенияПолей мы будем использовать вспомогательную функцию БСП КонтактнаяИнформацияКлиентСервер.СформироватьJSONКонтактнойИнформации(). Эта функция принимает на вход структуру с полями адреса и возвращает готовую строку для записи.

Важно: Поля структуры должны иметь те же имена, что и поля адреса в системе (например, Индекс, Страна, Город, Улица, Дом, Корпус, Квартира). При их заполнении мы ориентируемся на внутренние названия реквизитов адреса.

Пример формирования структуры адреса и JSON-строки:


// 1. Создаем структуру с детальными полями адреса
// В этой структуре мы перечисляем все необходимые поля адреса.
СтруктураАдреса = Новый Структура;
СтруктураАдреса.Вставить("Индекс", "123456");
СтруктураАдреса.Вставить("Страна", "Россия");
СтруктураАдреса.Вставить("Город", "Москва");
СтруктураАдреса.Вставить("Улица", "Ленина");
СтруктураАдреса.Вставить("Дом", "10");
СтруктураАдреса.Вставить("Корпус", "1");
СтруктураАдреса.Вставить("Квартира", "5");
СтруктураАдреса.Вставить("Представление", "123456, Россия, г. Москва, ул. Ленина, д. 10, корп. 1, кв. 5"); // Можно указать здесь, но лучше сгенерировать отдельно

// Для адресов, особенно в новых конфигурациях, крайне желательно указывать
// идентификаторы ФИАС (ГАР) для города, улицы, дома и т.д., если они известны.
// Поля для таких идентификаторов обычно заканчиваются на "_КИД" или имеют префикс "ФИАС"
// Пример (замените на реальные GUID):
// СтруктураАдреса.Вставить("Город_КИД", "0c5b2444-70a0-4932-980c-b4dc0d3f02b5");
// СтруктураАдреса.Вставить("Улица_КИД", "a62be119-094e-4b72-b7e1-314227cd700d");
// Если идентификаторы не указаны или неверны, система может помечать адрес как
// "введенный вручную" или не давать корректно работать с адресным классификатором.

// 2. Преобразуем эту структуру в JSON-строку для поля "ЗначенияПолей"
ЗначенияПолейКИ = КонтактнаяИнформацияКлиентСервер.СформироватьJSONКонтактнойИнформации(СтруктураАдреса);

Формирование Представления

Если мы заполним только ЗначенияПолей, но оставим пустым Представление, в карточке может быть пусто или данные будут отображаться некорректно. Система часто ожидает, что представление будет сформировано на основе структуры ЗначенияПолей. Для этого мы используем метод УправлениеКонтактнойИнформацией.СформироватьПредставлениеКонтактнойИнформации(). Этот метод автоматически собирает текстовое представление адреса из полей структуры.

Пример:


ПредставлениеКИ = УправлениеКонтактнойИнформацией.СформироватьПредставлениеКонтактнойИнформации(СтруктураАдреса, "Адрес");

Второй параметр ("Адрес") указывает тип контактной информации, что позволяет функции корректно форматировать представление в зависимости от типа данных (адрес, телефон и т.д.).

Пошаговый алгоритм программной записи контактной информации

Теперь, когда мы разобрались с основными компонентами, объединим все в единый, последовательный алгоритм. Этот алгоритм позволит нам корректно записывать контактную информацию в любой объект, поддерживающий стандартный механизм БСП — для работы из внешних систем пригодится расширение API для создания и изменения контрагентов.

  1. Получаем или создаем объект: Первым делом, нам нужна ссылка на объект, для которого мы хотим записать контактную информацию. Это может быть новый или уже существующий элемент справочника Контрагенты, Организации и т.д.
    
    // Предположим, мы работаем с существующим контрагентом
    ОбъектКонтрагент = Справочники.Контрагенты.НайтиПоКоду("000000001"); 
    Если ОбъектКонтрагент = Неопределено Тогда
        Сообщить("Контрагент не найден!");
        Возврат;
    КонецЕсли;
    
    // Для записи контактной информации нам нужен объект, а не ссылка
    КонтрагентОбъект = ОбъектКонтрагент.ПолучитьОбъект(); 
    
  2. Определяем вид и тип КИ: Найдем или создадим ссылку на нужный элемент справочника ВидыКонтактнойИнформации (например, "Юридический адрес контрагента") и определим строковый ТипКИ (например, "Адрес"). ТипКИ должен соответствовать общему виду информации, а ВидКИ — ее конкретному назначению.
    
    // Пример получения Вида КИ
    ВидКИ = Справочники.ВидыКонтактнойИнформации.НайтиПоНаименованию("Юридический адрес контрагента");
    Если ВидКИ = Неопределено Тогда
        Сообщить("Вид контактной информации 'Юридический адрес контрагента' не найден. Создайте его.");
        Возврат;
    КонецЕсли;
    ТипКИ = "Адрес"; // Указываем общий тип
    
  3. Формируем структуру адреса: Создадим структуру с детальными полями адреса, как мы обсуждали ранее. Убедимся, что все необходимые поля заполнены.
    
    СтруктураАдреса = Новый Структура;
    СтруктураАдреса.Вставить("Индекс", "603000");
    СтруктураАдреса.Вставить("Страна", "Россия");
    СтруктураАдреса.Вставить("Город", "Нижний Новгород");
    СтруктураАдреса.Вставить("Улица", "Кремль");
    СтруктураАдреса.Вставить("Дом", "1");
    // СтруктураАдреса.Вставить("Корпус", "");
    // СтруктураАдреса.Вставить("Квартира", "");
    // При необходимости добавляем GUID ФИАС
    // СтруктураАдреса.Вставить("Город_КИД", "...");
    
  4. Генерируем JSON-строку ЗначенияПолей: Используем функцию КонтактнаяИнформацияКлиентСервер.СформироватьJSONКонтактнойИнформации(), чтобы преобразовать нашу структуру в JSON-строку, которая будет храниться в поле ЗначенияПолей.
    
    ЗначенияПолейКИ = КонтактнаяИнформацияКлиентСервер.СформироватьJSONКонтактнойИнформации(СтруктураАдреса);
    
  5. Генерируем Представление: Используем функцию УправлениеКонтактнойИнформацией.СформироватьПредставлениеКонтактнойИнформации() для создания текстового представления адреса. Это обеспечит корректное отображение адреса в форме.
    
    ПредставлениеКИ = УправлениеКонтактнойИнформацией.СформироватьПредставлениеКонтактнойИнформации(СтруктураАдреса, ТипКИ);
    
  6. Вызываем основную функцию записи: Теперь, когда все параметры подготовлены, мы вызываем процедуру УправлениеКонтактнойИнформацией.ЗаписатьКонтактнуюИнформацию().
    
    // Передаем наш объект, JSON-строку, Вид КИ, Тип КИ и Представление
    УправлениеКонтактнойИнформацией.ЗаписатьКонтактнуюИнформацию(КонтрагентОбъект, ЗначенияПолейКИ, ВидКИ, ТипКИ, ПредставлениеКИ);
    
  7. Записываем объект в базу данных: После всех манипуляций с контактной информацией, обязательно сохраните сам объект (КонтрагентОбъект.Записать()), чтобы изменения, внесенные в его табличную часть КонтактнаяИнформация, были окончательно сохранены в базе данных. Без этого шага все наши программные изменения будут потеряны.
    
    КонтрагентОбъект.Записать();
    Сообщить("Контактная информация успешно записана для контрагента " + ОбъектКонтрагент.Наименование);
    

После выполнения этих шагов контактная информация будет корректно записана и отображена в карточке контрагента.

Особенности интеграции с ГАР (ФИАС) и настройка видов КИ

Давайте подробнее рассмотрим некоторые важные нюансы, которые могут повлиять на корректность работы с контактной информацией.

Интеграция с Государственным адресным реестром (ГАР/ФИАС)

Современные конфигурации 1С тесно интегрированы с Государственным адресным реестром (ГАР, ранее известным как ФИАС). Это позволяет не только использовать стандартизированные адреса, но и автоматически проверять их корректность, а также выполнять автозаполнение. При программной записи критически важно, чтобы идентификаторы (GUID) городов, улиц, домов и других адресных объектов (поля, оканчивающиеся на _КИД в структуре, например, Город_КИД, Улица_КИД) соответствовали актуальной базе ФИАС, загруженной в вашу 1С.

Если эти идентификаторы не указаны, неверны или отсутствуют в базе ФИАС вашей конфигурации, при открытии карточки адреса встроенный редактор может:

Поэтому, если у вас есть возможность получить ФИАС-идентификаторы при формировании адреса, настоятельно рекомендуем включать их в структуру адреса.

Настройка "Редактировать только в диалоге" для видов контактной информации

В справочнике ВидыКонтактнойИнформации для каждого вида КИ может быть установлена настройка "Редактировать только в диалоге". Эта опция влияет на то, как система обрабатывает поля Представление и ЗначенияПолей.

Если для конкретного вида КИ эта настройка установлена, попытка прямой записи в поле Представление (например, через прямой доступ к табличной части) без корректного заполнения ЗначенийПолей через БСП-функции может привести к тому, что при открытии формы 1С увидит пустую или неструктурированную информацию в ЗначенияПолей. В этом случае система попытается "исправить" ситуацию, очистив поле Представление и отобразив его пустым, считая, что пользователь должен ввести данные через диалоговое окно.

Это еще раз подчеркивает, почему всегда следует стремиться заполнять ЗначенияПолей через функции БСП, а не пытаться вручную манипулировать строками табличной части. Использование УправлениеКонтактнойИнформацией.ЗаписатьКонтактнуюИнформацию() гарантирует, что система получит данные в ожидаемом формате и обработает их согласно всем настройкам.

Заключение

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

Следуя рассмотренному пошаговому алгоритму, используя функции КонтактнаяИнформацияКлиентСервер.СформироватьJSONКонтактнойИнформации() для создания структурированных данных, УправлениеКонтактнойИнформацией.СформироватьПредставлениеКонтактнойИнформации() для создания отображаемой строки и УправлениеКонтактнойИнформацией.ЗаписатьКонтактнуюИнформацию() для окончательной записи, вы сможете корректно заполнять адреса и другие контактные данные. Это обеспечит их правильное отображение в пользовательском интерфейсе и беспроблемное взаимодействие со всеми системными механизмами.

Не забывайте об интеграции с ФИАС и важности заполнения идентификаторов, а также о влиянии настройки "Редактировать только в диалоге". Применяя эти знания, вы значительно повысите качество и надежность ваших программных решений в 1С.

← На главную