При разработке в среде 1С часто возникает задача автоматизации ввода данных. Одной из типичных операций является программное заполнение или обновление контактной информации (КИ) объектов, например, справочника Партнеры. Рассмотрим ситуацию, когда у нас уже заполнено текстовое Представление номера телефона, но нам необходимо программно дозаполнить служебные поля, такие как НомерТелефона и НомерТелефонаБезКодов.
В этой статье мы разберем, как правильно реализовать этот механизм, проанализируем ошибки начинающих разработчиков и изучим профессиональные подходы с использованием Библиотеки стандартных подсистем (БСП). Если задачу по автоматизации ввода данных нужно решить без написания программного кода, можно настроить роботизированную автоматизацию действий пользователя в 1С для переноса информации между окнами и заполнения документов.
Рассмотрим фрагмент кода, который часто пытаются использовать новички. Разберем, почему он не будет работать:
Процедура ПартнерПередЗаписьюПроверитьДополнитьКИПередЗаписью(Объект, Отказ) Экспорт
Таблица = Объект.КонтактнаяИнформация.Добавить();
Таблица.Колонки.Добавить("НомерТелефона"); // Ошибка!
Для каждого Строка Из Таблица Цикл
Строка.НомерТелефона = Объект.КонтактнаяИнформация.Представление;
КонецЦикла;
КонецПроцедуры
В данном примере допущено несколько критических ошибок:
СтрокаТабличнойЧасти), а не всю таблицу. Попытка вызвать у строки метод Колонки.Добавить() приведет к ошибке выполнения, так как у строки нет коллекции колонок.Объект.КонтактнаяИнформация.Представление, так как КонтактнаяИнформация — это таблица, и системе непонятно, из какой именно строки нужно взять представление.Добавить() в подписке ПередЗаписью без проверок, при каждом сохранении объекта в таблицу будет добавляться новая пустая строка.Если задача стоит максимально просто — скопировать уже имеющееся текстовое представление в соответствующие поля, мы можем воспользоваться простым циклом Для каждого. Этот метод подойдет для простых конфигураций или в случаях, когда строгая валидация номера не требуется.
Проанализируем исправленный код:
Процедура ПартнерПередЗаписьюПроверитьДополнитьКИПередЗаписью(Объект, Отказ) Экспорт
// Перебираем все существующие записи в табличной части КИ
Для каждого ТекСтрока Из Объект.КонтактнаяИнформация Цикл
// Важно: обрабатываем только строки с типом "Телефон"
Если ТекСтрока.Тип = Перечисления.ТипыКонтактнойИнформации.Телефон Тогда
// Если номер телефона не заполнен, берем его из представления
Если ПустаяСтрока(ТекСтрока.НомерТелефона) Тогда
ТекСтрока.НомерТелефона = ТекСтрока.Представление;
КонецЕсли;
// Заполняем поле без кодов (индексация для поиска)
ТекСтрока.НомерТелефонаБезКодов = ТекСтрока.Представление;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Важный момент: При таком подходе НомерТелефонаБезКодов будет содержать лишние символы (скобки, тире). Для корректной работы поиска в 1С это поле желательно очищать от всех символов, кроме цифр.
В современных конфигурациях (ERP, УТ 11, КА 2) работа с контактной информацией жестко регламентирована. Простого копирования строки в поле НомерТелефона может быть недостаточно, так как основная информация хранится в скрытом поле ЗначенияПолей в формате XML или JSON.
Рассмотрим, как правильно разобрать строку представления на составляющие с помощью программного интерфейса БСП. Для этого используем общий модуль УправлениеКонтактнойИнформацией.
// Пример использования функций БСП для нормализации номера
Для каждого ТекСтрока Из Объект.КонтактнаяИнформация Цикл
Если ТекСтрока.Тип = Перечисления.ТипыКонтактнойИнформации.Телефон
И Не ПустаяСтрока(ТекСтрока.Представление) Тогда
// Получаем структуру с детальными сведениями телефона из строки
СтруктураТелефона = УправлениеКонтактнойИнформацией.ДетальныеСведенияТелефона(ТекСтрока.Представление);
// Теперь у нас есть доступ к КодСтраны, КодГорода, Номер, Добавочный
// Можем заполнить НомерТелефона нормализованными данными
ТекСтрока.НомерТелефона = УправлениеКонтактнойИнформацией.СформироватьНомерТелефона(СтруктураТелефона);
// Для поля "БезКодов" оставим только цифры
ТекСтрока.НомерТелефонаБезКодов = УправлениеКонтактнойИнформацией.ТолькоЦифры(ТекСтрока.Представление);
// Обновляем ЗначенияПолей, чтобы данные корректно отображались в форме
ТекСтрока.ЗначенияПолей = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияВXML(ТекСтрока.Представление, СтруктураТелефона, ТекСтрока.Тип);
КонецЕсли;
КонецЦикла;
Выясним причину, по которой данные могут "пропадать" после программного изменения. В управляемых формах 1С поля КИ часто собираются динамически. Если вы изменили только НомерТелефона, но оставили старое значение в ЗначенияПолей, то при открытии карточки партнера система прочитает XML-данные из ЗначенияПолей и перезапишет вашу правку. Всегда синхронизируйте эти данные.
Разберем несколько советов по оптимизации кода в подписке ПередЗаписью:
Представление. Не стоит выполнять тяжелые операции разбора строки, если данные не редактировались.ТекСтрока.Вид.Попытка...Исключение, так как пользователи могут вводить в представление произвольный текст, не похожий на номер телефона.Используя предложенные методы, мы обеспечим корректное и целостное хранение данных контактной информации в системе, что позволит избежать проблем при обмене данными и поиске контрагентов по номеру телефона. Для настройки регулярной синхронизации подготовленных сведений между базами можно использовать автоматический обмен данными между конфигурациями 1С по расписанию с использованием XML-правил.