При разработке в конфигурациях, построенных на базе Библиотеки стандартных подсистем (БСП), таких как «1С:Управление торговлей 11», программисты часто сталкиваются с задачей программного заполнения контактной информации (адресов, телефонов, email). Типичная ошибка новичка — попытка записать данные напрямую в строковый реквизит ЗначенияПолей. В этой статье мы разберем, почему прямой способ не работает, и как правильно использовать встроенные механизмы системы для корректного отображения данных в карточках партнеров и контрагентов.
Рассмотрим ситуацию: у нас есть объект (например, Партнер), у которого в табличной части КонтактнаяИнформация уже частично заполнены данные. Мы хотим программно добавить или обновить номер телефона. Если мы попытаемся сделать это простым присваиванием строки, как в следующем примере:
Для каждого ТекСтрока из Объект.КонтактнаяИнформация Цикл
Если ТекСтрока.Тип = Перечисления.ТипыКонтактнойИнформации.Телефон Тогда
ТекСтрока.ЗначенияПолей = "НомерТелефона=" + НужныйНомер;
КонецЕсли;
КонецЦикла;
Мы обнаружим, что после записи объекта из карточки исчезнут код страны, код города и добавочный номер. Это происходит потому, что реквизит ЗначенияПолей — это не просто строка, а структурированные данные в формате XML (в старых версиях) или JSON (в новых версиях БСП). Когда мы записываем туда простую строку, система не может распарсить её и «теряет» остальные составляющие номера. Проанализируем правильные способы решения этой задачи.
Этот метод считается наиболее надежным, так как он опирается на внутренние схемы конфигурации. Мы передаем строковое представление телефона, а система сама раскладывает его на составляющие. Разберем по шагам реализацию через модуль УправлениеКонтактнойИнформациейСлужебный:
// Определяем тип и вид контактной информации
ТипКИ = Перечисления.ТипыКонтактнойИнформации.Телефон;
ВидКИ = Справочники.ВидыКонтактнойИнформации.ТелефонПартнера;
Представление = "+7 (999) 000-00-00";
// Формируем объект XDTO на основании строкового представления
ОбъектXDTOКИ = УправлениеКонтактнойИнформациейСлужебный.КонтактнаяИнформацияXDTOПоПредставлению(Представление, ТипКИ);
// Сериализуем XDTO в строку XML/JSON для записи в базу
ЗначенияПолей = УправлениеКонтактнойИнформациейСлужебный.КонтактнаяИнформацияXDTOВXML(ОбъектXDTOКИ);
// Записываем данные в объект
УправлениеКонтактнойИнформацией.ЗаписатьКонтактнуюИнформацию(СсылкаНаПартнера, ЗначенияПолей, ВидКИ, ТипКИ);
Обратите внимание на использование функции ЗаписатьКонтактнуюИнформацию. Это предпочтительный метод, так как он автоматически обновляет и табличную часть объекта, и (если необходимо) связанные регистры сведений, обеспечивая целостность данных.
Если у нас уже есть строка (представление), но ЗначенияПолей пусты, мы можем воспользоваться функцией, которая берет на себя всю «грязную» работу по разбору строки. Выясним, как применить метод ПреобразоватьПредставлениеВЗначенияПолей:
Представление = "8 (900) 123-45-67";
ТипКИ = Перечисления.ТипыКонтактнойИнформации.Телефон;
ВидКИ = Справочники.ВидыКонтактнойИнформации.ТелефонПартнера;
// Получаем готовую структуру данных
Результат = УправлениеКонтактнойИнформацией.ПреобразоватьПредставлениеВЗначенияПолей(Представление, ТипКИ, ВидКИ);
// Результат можно подставить в ТекСтрока.ЗначенияПолей в обработчике ПередЗаписью
Этот способ крайне эффективен, так как он учитывает региональные настройки и правила форматирования, заданные в справочнике ВидыКонтактнойИнформации.
Иногда нам нужно программно задать конкретные части номера (например, отдельно код страны и добавочный). В современных версиях БСП рекомендуется формировать структуру и передавать её в конвертер. Проанализируем пример формирования данных с нуля:
ДанныеКИ = Новый Структура;
ДанныеКИ.Вставить("КодСтраны", "7");
ДанныеКИ.Вставить("КодГорода", "495");
ДанныеКИ.Вставить("НомерТелефона", "1234567");
ДанныеКИ.Вставить("Добавочный", "101");
ДанныеКИ.Вставить("Представление", "+7 (495) 123-45-67 доб. 101");
// Преобразуем структуру в формат хранения базы данных (XML или JSON)
ЗначенияПолей = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияВXML(ДанныеКИ);
Важный нюанс: Если в вашей конфигурации используется JSON, вместо метода КонтактнаяИнформацияВXML следует искать аналогичный метод для JSON в модуле УправлениеКонтактнойИнформацией. Система БСП сама определит формат, если вы используете высокоуровневые функции записи.
При программном заполнении таблицы контактной информации часто забывают про служебный реквизит НомерТелефонаБезКодов. Посмотрим, почему он важен:
Для корректного заполнения этого поля рекомендуется использовать функцию очистки строки от нецифровых символов. Рассмотрим пример кода:
ТекСтрока.НомерТелефонаБезКодов = УправлениеКонтактнойИнформациейСлужебный.ТолькоЦифры(ТекСтрока.Представление);
// Или, если нужно оставить только последние 10 цифр для РФ:
ТекСтрока.НомерТелефонаБезКодов = Прав(УправлениеКонтактнойИнформациейСлужебный.ТолькоЦифры(ТекСтрока.Представление), 10);
Как отмечается в обсуждении, если задача стоит в дозаполнении КИ непосредственно при сохранении карточки пользователем, лучше всего использовать расширение или подписку на событие. Однако, в типовых конфигурациях логика работы с КИ на формах часто вынесена в общие модули. Рассмотрим рекомендацию использовать процедуру ПередЗаписьюНаСервере:
Если вы хотите вмешаться в процесс записи объекта из формы, обратите внимание на вызов УправлениеКонтактнойИнформацией.ПередЗаписьюНаСервере(ЭтаФорма, ТекущийОбъект). Ваш код должен отрабатывать до этого вызова, чтобы стандартные механизмы подхватили ваши изменения и корректно их сериализовали.
Подведем итог: Для правильной работы с контактной информацией в УТ 11 никогда не формируйте строку ЗначенияПолей вручную конкатенацией. Используйте методы УправлениеКонтактнойИнформацией, оперируйте структурами или XDTO, и всегда следите за тем, чтобы Представление и НомерТелефонаБезКодов соответствовали данным в ЗначенияПолей.