Как программно заполнить номера телефонов в контактной информации справочника Партнеры

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

При разработке в среде 1С часто возникает задача автоматизации ввода данных. Одной из типичных операций является программное заполнение или обновление контактной информации (КИ) объектов, например, справочника Партнеры. Рассмотрим ситуацию, когда у нас уже заполнено текстовое Представление номера телефона, но нам необходимо программно дозаполнить служебные поля, такие как НомерТелефона и НомерТелефонаБезКодов.

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

Анализ типичных ошибок при работе с табличными частями

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


Процедура ПартнерПередЗаписьюПроверитьДополнитьКИПередЗаписью(Объект, Отказ) Экспорт 
    Таблица = Объект.КонтактнаяИнформация.Добавить(); 
    Таблица.Колонки.Добавить("НомерТелефона"); // Ошибка!
    Для каждого Строка Из Таблица Цикл 
        Строка.НомерТелефона = Объект.КонтактнаяИнформация.Представление; 
    КонецЦикла; 
КонецПроцедуры

В данном примере допущено несколько критических ошибок:

  1. Метод Добавить(): Этот метод возвращает конкретную строку табличной части (СтрокаТабличнойЧасти), а не всю таблицу. Попытка вызвать у строки метод Колонки.Добавить() приведет к ошибке выполнения, так как у строки нет коллекции колонок.
  2. Обращение к коллекции: Нельзя обращаться к полю через Объект.КонтактнаяИнформация.Представление, так как КонтактнаяИнформация — это таблица, и системе непонятно, из какой именно строки нужно взять представление.
  3. Бесконечное добавление: Если использовать Добавить() в подписке ПередЗаписью без проверок, при каждом сохранении объекта в таблицу будет добавляться новая пустая строка.

Способ 1: Простой перебор строк (быстрое решение)

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

Проанализируем исправленный код:


Процедура ПартнерПередЗаписьюПроверитьДополнитьКИПередЗаписью(Объект, Отказ) Экспорт 
    // Перебираем все существующие записи в табличной части КИ
    Для каждого ТекСтрока Из Объект.КонтактнаяИнформация Цикл
        
        // Важно: обрабатываем только строки с типом "Телефон"
        Если ТекСтрока.Тип = Перечисления.ТипыКонтактнойИнформации.Телефон Тогда
            
            // Если номер телефона не заполнен, берем его из представления
            Если ПустаяСтрока(ТекСтрока.НомерТелефона) Тогда
                ТекСтрока.НомерТелефона = ТекСтрока.Представление;
            КонецЕсли;
            
            // Заполняем поле без кодов (индексация для поиска)
            ТекСтрока.НомерТелефонаБезКодов = ТекСтрока.Представление;
            
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Важный момент: При таком подходе НомерТелефонаБезКодов будет содержать лишние символы (скобки, тире). Для корректной работы поиска в 1С это поле желательно очищать от всех символов, кроме цифр.

Способ 2: Использование механизмов БСП (профессиональный подход)

В современных конфигурациях (ERP, УТ 11, КА 2) работа с контактной информацией жестко регламентирована. Простого копирования строки в поле НомерТелефона может быть недостаточно, так как основная информация хранится в скрытом поле ЗначенияПолей в формате XML или JSON.

Рассмотрим, как правильно разобрать строку представления на составляющие с помощью программного интерфейса БСП. Для этого используем общий модуль УправлениеКонтактнойИнформацией.


// Пример использования функций БСП для нормализации номера
Для каждого ТекСтрока Из Объект.КонтактнаяИнформация Цикл
    Если ТекСтрока.Тип = Перечисления.ТипыКонтактнойИнформации.Телефон 
        И Не ПустаяСтрока(ТекСтрока.Представление) Тогда
        
        // Получаем структуру с детальными сведениями телефона из строки
        СтруктураТелефона = УправлениеКонтактнойИнформацией.ДетальныеСведенияТелефона(ТекСтрока.Представление);
        
        // Теперь у нас есть доступ к КодСтраны, КодГорода, Номер, Добавочный
        // Можем заполнить НомерТелефона нормализованными данными
        ТекСтрока.НомерТелефона = УправлениеКонтактнойИнформацией.СформироватьНомерТелефона(СтруктураТелефона);
        
        // Для поля "БезКодов" оставим только цифры
        ТекСтрока.НомерТелефонаБезКодов = УправлениеКонтактнойИнформацией.ТолькоЦифры(ТекСтрока.Представление);
        
        // Обновляем ЗначенияПолей, чтобы данные корректно отображались в форме
        ТекСтрока.ЗначенияПолей = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияВXML(ТекСтрока.Представление, СтруктураТелефона, ТекСтрока.Тип);
        
    КонецЕсли;
КонецЦикла;

Почему важно заполнять поле ЗначенияПолей?

Выясним причину, по которой данные могут "пропадать" после программного изменения. В управляемых формах 1С поля КИ часто собираются динамически. Если вы изменили только НомерТелефона, но оставили старое значение в ЗначенияПолей, то при открытии карточки партнера система прочитает XML-данные из ЗначенияПолей и перезапишет вашу правку. Всегда синхронизируйте эти данные.

Рекомендации по реализации в Подписке на событие

Разберем несколько советов по оптимизации кода в подписке ПередЗаписью:

Используя предложенные методы, мы обеспечим корректное и целостное хранение данных контактной информации в системе, что позволит избежать проблем при обмене данными и поиске контрагентов по номеру телефона. Для настройки регулярной синхронизации подготовленных сведений между базами можно использовать автоматический обмен данными между конфигурациями 1С по расписанию с использованием XML-правил.

← На главную