Как реализовать выбор телефона и E-mail контрагента в табличной части документа?

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

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

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

Архитектура хранения контактной информации

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

  1. Тип: Значение перечисления ТипыКонтактнойИнформации (например, Телефон, АдресЭлектроннойПочты).
  2. Вид: Ссылка на справочник ВидыКонтактнойИнформации. Это позволяет разделять контакты на «Личный мобильный», «Рабочий e-mail» и так далее.
  3. Представление: Строковое значение контакта, которое мы и хотим видеть в нашем документе.

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

Подготовка табличной части документа

Для начала разберем подготовительный этап в конфигураторе. Нам необходимо добавить в нужную табличную часть документа (например, «Запасы» или «Услуги») две колонки:

Важный нюанс: Чтобы пользователь мог выбирать данные из выпадающего списка, для соответствующих элементов формы (полей ввода в колонках) необходимо установить свойство «Режим выбора из списка» (ChoiceListMode) в значение Истина.

Реализация программного выбора через СписокЗначений

Теперь рассмотрим наиболее гибкий способ реализации — формирование списка выбора в момент обращения пользователя к полю. Мы будем использовать событие НачалоВыбора для элемента формы. Проанализируем алгоритм действий:

  1. Отменяем стандартную обработку события.
  2. Получаем текущего контрагента из строки документа.
  3. Запрашиваем его контактную информацию нужного типа.
  4. Формируем список значений и выводим его пользователю.

Рассмотрим пример кода, который можно разместить в модуле формы документа:


&НаКлиенте
Процедура ТЧ_ТелефонНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь;
    ТекущаяСтрока = Элементы.ТЧ.ТекущиеДанные;
    
    Если ТекущаяСтрока = Неопределено Или Не ЗначениеЗаполнено(ТекущаяСтрока.Контрагент) Тогда
        Возврат;
    КонецЕсли;
    
    СписокКонтактов = ПолучитьСписокКонтактовНаСервере(ТекущаяСтрока.Контрагент, ПредопределенноеЗначение("Перечисление.ТипыКонтактнойИнформации.Телефон"));
    
    Если СписокКонтактов.Количество() > 0 Тогда
        ВыбранныйЭлемент = ВыбратьИзСписка(СписокКонтактов, Элемент);
        Если ВыбранныйЭлемент <> Неопределено Тогда
            ТекущаяСтрока.Телефон = ВыбранныйЭлемент.Значение;
        КонецЕсли;
    КонецЕсли;
    
КонецПроцедуры

На стороне сервера нам необходимо эффективно извлечь данные. Выясним, как это сделать с помощью встроенных функций БСП:


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

Использование стандартных форм БСП для выбора

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

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

Автоматизация при выборе контрагента

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


&НаКлиенте
Процедура ТЧ_КонтрагентПриИзменении(Элемент)
    
    ТекущаяСтрока = Элементы.ТЧ.ТекущиеДанные;
    Если ТекущаяСтрока <> Неопределено Тогда
        ЗаполнитьКонтактныеДанныеПоУмолчанию(ТекущаяСтрока);
    КонецЕсли;
    
КонецПроцедуры

В серверной процедуре ЗаполнитьКонтактныеДанныеПоУмолчанию мы можем вызвать запрос, который проверит количество записей КИ. Если запись одна — сразу подставляем её в ТекущаяСтрока.Телефон и ТекущаяСтрока.Email. Это значительно ускоряет работу оператора.

Связь с контактными лицами

Выясним еще один важный нюанс УНФ. Часто телефон принадлежит не абстрактному «Контрагенту» (юрлицу), а его конкретному сотруднику — Контактному лицу. В идеале, при формировании списка выбора, мы должны собирать данные из двух источников:

  1. Табличная часть самого контрагента.
  2. Табличные части всех контактных лиц, связанных с этим контрагентом.

Для этого в серверной функции ПолучитьСписокКонтактовНаСервере стоит добавить запрос к справочнику КонтактныеЛица, где владельцем является наш контрагент. Это позволит пользователю выбрать, например, телефон директора или менеджера по закупкам прямо в строке документа.

Технические нюансы и типы данных

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

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

← На главную