Как программно заполнить или дополнить контактную информацию в 1С:Управление торговлей 11?

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

При разработке в конфигурациях, построенных на базе Библиотеки стандартных подсистем (БСП), таких как «1С:Управление торговлей 11», программисты часто сталкиваются с задачей программного заполнения контактной информации (адресов, телефонов, email). Типичная ошибка новичка — попытка записать данные напрямую в строковый реквизит ЗначенияПолей. В этой статье мы разберем, почему прямой способ не работает, и как правильно использовать встроенные механизмы системы для корректного отображения данных в карточках партнеров и контрагентов.

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

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


Для каждого ТекСтрока из Объект.КонтактнаяИнформация Цикл
    Если ТекСтрока.Тип = Перечисления.ТипыКонтактнойИнформации.Телефон Тогда
        ТекСтрока.ЗначенияПолей = "НомерТелефона=" + НужныйНомер;
    КонецЕсли;
КонецЦикла;

Мы обнаружим, что после записи объекта из карточки исчезнут код страны, код города и добавочный номер. Это происходит потому, что реквизит ЗначенияПолей — это не просто строка, а структурированные данные в формате XML (в старых версиях) или JSON (в новых версиях БСП). Когда мы записываем туда простую строку, система не может распарсить её и «теряет» остальные составляющие номера. Проанализируем правильные способы решения этой задачи.

Способ 1. Использование объектов XDTO (классический метод БСП)

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


// Определяем тип и вид контактной информации
ТипКИ = Перечисления.ТипыКонтактнойИнформации.Телефон;
ВидКИ = Справочники.ВидыКонтактнойИнформации.ТелефонПартнера;
Представление = "+7 (999) 000-00-00";

// Формируем объект XDTO на основании строкового представления
ОбъектXDTOКИ = УправлениеКонтактнойИнформациейСлужебный.КонтактнаяИнформацияXDTOПоПредставлению(Представление, ТипКИ);

// Сериализуем XDTO в строку XML/JSON для записи в базу
ЗначенияПолей = УправлениеКонтактнойИнформациейСлужебный.КонтактнаяИнформацияXDTOВXML(ОбъектXDTOКИ);

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

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

Способ 2. Преобразование представления через специализированные функции

Если у нас уже есть строка (представление), но ЗначенияПолей пусты, мы можем воспользоваться функцией, которая берет на себя всю «грязную» работу по разбору строки. Выясним, как применить метод ПреобразоватьПредставлениеВЗначенияПолей:


Представление = "8 (900) 123-45-67";
ТипКИ = Перечисления.ТипыКонтактнойИнформации.Телефон;
ВидКИ = Справочники.ВидыКонтактнойИнформации.ТелефонПартнера;

// Получаем готовую структуру данных
Результат = УправлениеКонтактнойИнформацией.ПреобразоватьПредставлениеВЗначенияПолей(Представление, ТипКИ, ВидКИ);

// Результат можно подставить в ТекСтрока.ЗначенияПолей в обработчике ПередЗаписью

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

Способ 3. Ручное формирование структуры (через соответствие или структуру)

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


ДанныеКИ = Новый Структура;
ДанныеКИ.Вставить("КодСтраны", "7");
ДанныеКИ.Вставить("КодГорода", "495");
ДанныеКИ.Вставить("НомерТелефона", "1234567");
ДанныеКИ.Вставить("Добавочный", "101");
ДанныеКИ.Вставить("Представление", "+7 (495) 123-45-67 доб. 101");

// Преобразуем структуру в формат хранения базы данных (XML или JSON)
ЗначенияПолей = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияВXML(ДанныеКИ);

Важный нюанс: Если в вашей конфигурации используется JSON, вместо метода КонтактнаяИнформацияВXML следует искать аналогичный метод для JSON в модуле УправлениеКонтактнойИнформацией. Система БСП сама определит формат, если вы используете высокоуровневые функции записи.

Важность реквизита НомерТелефонаБезКодов

При программном заполнении таблицы контактной информации часто забывают про служебный реквизит НомерТелефонаБезКодов. Посмотрим, почему он важен:

  1. Индексация: По этому полю осуществляется быстрый поиск по номеру телефона в списках.
  2. Формат: Там должны содержаться только цифры без скобок, тире и пробелов.

Для корректного заполнения этого поля рекомендуется использовать функцию очистки строки от нецифровых символов. Рассмотрим пример кода:


ТекСтрока.НомерТелефонаБезКодов = УправлениеКонтактнойИнформациейСлужебный.ТолькоЦифры(ТекСтрока.Представление);
// Или, если нужно оставить только последние 10 цифр для РФ:
ТекСтрока.НомерТелефонаБезКодов = Прав(УправлениеКонтактнойИнформациейСлужебный.ТолькоЦифры(ТекСтрока.Представление), 10);

Где лучше размещать код заполнения?

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

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

Подведем итог: Для правильной работы с контактной информацией в УТ 11 никогда не формируйте строку ЗначенияПолей вручную конкатенацией. Используйте методы УправлениеКонтактнойИнформацией, оперируйте структурами или XDTO, и всегда следите за тем, чтобы Представление и НомерТелефонаБезКодов соответствовали данным в ЗначенияПолей.

← На главную