В процессе разработки в среде 1С:Предприятие, особенно в конфигурациях вроде 1С:УНФ 1.6, часто возникает задача повышения удобства ввода данных. Одной из таких задач является возможность выбора контактных данных (телефона или адреса электронной почты) контрагента непосредственно в строке табличной части документа. Это избавляет пользователя от необходимости вручную копировать данные из карточки контрагента и минимизирует риск ошибок.
В данной статье мы подробно рассмотрим, как реализовать этот функционал, опираясь на механизмы Библиотеки стандартных подсистем (БСП), которые лежат в основе современных конфигураций 1С.
Прежде чем приступать к кодингу, проанализируем, как данные хранятся в системе. В конфигурации УНФ 1.6 (и других на базе БСП) контактная информация (КИ) не является набором простых реквизитов справочника Контрагенты. Она хранится в табличной части этого справочника под названием КонтактнаяИнформация. Каждая строка этой таблицы содержит следующие важные поля:
ТипыКонтактнойИнформации (например, Телефон, АдресЭлектроннойПочты).ВидыКонтактнойИнформации. Это позволяет разделять контакты на «Личный мобильный», «Рабочий e-mail» и так далее.Понимание этой структуры критически важно для написания запросов и программного получения списка доступных контактов.
Для начала разберем подготовительный этап в конфигураторе. Нам необходимо добавить в нужную табличную часть документа (например, «Запасы» или «Услуги») две колонки:
Телефон (Тип: Строка, длина 20–50 символов);Email (Тип: Строка, длина 100 символов).Важный нюанс: Чтобы пользователь мог выбирать данные из выпадающего списка, для соответствующих элементов формы (полей ввода в колонках) необходимо установить свойство «Режим выбора из списка» (ChoiceListMode) в значение Истина.
Теперь рассмотрим наиболее гибкий способ реализации — формирование списка выбора в момент обращения пользователя к полю. Мы будем использовать событие НачалоВыбора для элемента формы. Проанализируем алгоритм действий:
Рассмотрим пример кода, который можно разместить в модуле формы документа:
&НаКлиенте
Процедура ТЧ_ТелефонНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ТекущаяСтрока = Элементы.ТЧ.ТекущиеДанные;
Если ТекущаяСтрока = Неопределено Или Не ЗначениеЗаполнено(ТекущаяСтрока.Контрагент) Тогда
Возврат;
КонецЕсли;
СписокКонтактов = ПолучитьСписокКонтактовНаСервере(ТекущаяСтрока.Контрагент, ПредопределенноеЗначение("Перечисление.ТипыКонтактнойИнформации.Телефон"));
Если СписокКонтактов.Количество() > 0 Тогда
ВыбранныйЭлемент = ВыбратьИзСписка(СписокКонтактов, Элемент);
Если ВыбранныйЭлемент <> Неопределено Тогда
ТекущаяСтрока.Телефон = ВыбранныйЭлемент.Значение;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
На стороне сервера нам необходимо эффективно извлечь данные. Выясним, как это сделать с помощью встроенных функций БСП:
&НаСервереБезКонтекста
Функция ПолучитьСписокКонтактовНаСервере(КонтрагентСсылка, ТипКИ)
Список = Новый СписокЗначений;
// Используем общий модуль БСП для получения данных
ТаблицаКИ = УправлениеКонтактнойИнформацией.ПолучитьКонтактнуюИнформациюОбъекта(КонтрагентСсылка, ТипКИ);
Для Каждого СтрокаКИ Из ТаблицаКИ Цикл
Если Не ПустаяСтрока(СтрокаКИ.Представление) Тогда
Список.Добавить(СтрокаКИ.Представление, СтрокаКИ.Представление);
КонецЕсли;
КонецЦикла;
Возврат Список;
КонецФункции
Если нам нужно не просто выбрать строку, но и, возможно, добавить новый контакт, не заходя в карточку контрагента, мы можем вызвать специализированную форму БСП. Рассмотрим подробнее этот вариант. В БСП существует форма ВыборКонтактнойИнформации.
Проанализируем ситуацию: использование такой формы позволяет пользователю видеть типы контактов (например, «Офис», «Прямой») и даже создавать новые записи, которые автоматически сохранятся в справочнике Контрагенты. Это делает интерфейс профессиональным и законченным.
Хорошим тоном считается автоматическое заполнение полей, если у контрагента всего одна запись телефона или почты. Разберем, как это реализовать в обработчике ПриИзменении колонки Контрагент.
&НаКлиенте
Процедура ТЧ_КонтрагентПриИзменении(Элемент)
ТекущаяСтрока = Элементы.ТЧ.ТекущиеДанные;
Если ТекущаяСтрока <> Неопределено Тогда
ЗаполнитьКонтактныеДанныеПоУмолчанию(ТекущаяСтрока);
КонецЕсли;
КонецПроцедуры
В серверной процедуре ЗаполнитьКонтактныеДанныеПоУмолчанию мы можем вызвать запрос, который проверит количество записей КИ. Если запись одна — сразу подставляем её в ТекущаяСтрока.Телефон и ТекущаяСтрока.Email. Это значительно ускоряет работу оператора.
Выясним еще один важный нюанс УНФ. Часто телефон принадлежит не абстрактному «Контрагенту» (юрлицу), а его конкретному сотруднику — Контактному лицу. В идеале, при формировании списка выбора, мы должны собирать данные из двух источников:
Для этого в серверной функции ПолучитьСписокКонтактовНаСервере стоит добавить запрос к справочнику КонтактныеЛица, где владельцем является наш контрагент. Это позволит пользователю выбрать, например, телефон директора или менеджера по закупкам прямо в строке документа.
Важно помнить, что хранение только текстового представления в документе может быть недостаточно для сложных отчетов. Если ваша задача подразумевает дальнейшую рассылку или интеграцию с телефонией, рекомендуется добавить скрытую колонку ВидТелефона (Тип: СправочникСсылка.ВидыКонтактнойИнформации). Это позволит системе точно знать, является ли номер мобильным для отправки СМС или городским для совершения звонка.
Подведем итог: использование методов УправлениеКонтактнойИнформацией и стандартных событий элементов формы позволяет реализовать удобный и интуитивно понятный механизм выбора контактов. Мы рассмотрели как простой вариант со списком выбора, так и более сложные подходы с автоматизацией и учетом контактных лиц.