Как установить проверку заполнения адреса и телефона контрагента в 1С:УНФ

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

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

Почему полей нет в конфигураторе?

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

Эта табличная часть содержит ссылки на виды контактной информации (например, «Юридический адрес» или «Мобильный телефон») и строковые представления этих данных. Поэтому обычная установка флажка «Проверка заполнения» в свойствах реквизита здесь не сработает.

Способ 1. Настройка без программирования

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

  1. Откроем раздел Настройки — Общие настройки.
  2. Перейдем по ссылке Контактная информация — Виды контактной информации.
  3. Найдем группу Контрагенты.
  4. Выберем нужный вид (например, «Юридический адрес») и откроем его карточку.
  5. Установим флажок Обязательное заполнение.

После этой настройки система сама будет подсвечивать поле красным пунктиром и выдавать предупреждение при попытке записи пустого значения. Это наиболее правильный и «чистый» способ решения задачи.

Способ 2. Программная проверка в модуле объекта

Если штатной настройки недостаточно (например, требуется сложная логика — проверять заполнение только для определенных типов контрагентов), мы можем использовать программный метод. Разберем наиболее профессиональный подход с использованием обработчика ОбработкаПроверкиЗаполнения в модуле объекта справочника Контрагенты.

Рассмотрим пример кода, который проверяет наличие юридического адреса:


Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
    
    // Обязательно проверяем, не идет ли загрузка данных через обмен
    Если ОбменДанными.Загрузка Тогда
        Возврат;
    КонецЕсли;

    НужныйВид = Справочники.ВидыКонтактнойИнформации.ЮрАдресКонтрагента;
    АдресНайден = Ложь;

    Для Каждого СтрокаКИ Из КонтактнаяИнформация Цикл
        Если СтрокаКИ.Вид = НужныйВид Тогда
            Если Не ПустаяСтрока(СтрокаКИ.Представление) Тогда
                АдресНайден = Истина;
                Прервать;
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;

    Если Не АдресНайден Тогда
        ТекстСообщения = "Для контрагента необходимо заполнить юридический адрес!";
        Поле = "КонтактнаяИнформация[0].Представление"; // Условный путь для подсветки
        
        Сообщение = Новый СообщениеПользователю;
        Сообщение.Текст = ТекстСообщения;
        Сообщение.УстановитьДанные(ЭтотОбъект);
        Сообщение.Сообщить();
        
        Отказ = Истина;
    КонецЕсли;
    
КонецПроцедуры

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

Важность проверки флага «ОбменДанными.Загрузка»

Проанализируем ситуацию, когда данные приходят из другой базы (например, из 1С:Бухгалтерии) через синхронизацию. Если в базе-источнике адрес не был заполнен, а в базе-приемнике мы установили жесткую блокировку на запись без адреса, синхронизация прервется с ошибкой. Чтобы этого избежать, всегда используйте условие Если ОбменДанными.Загрузка Тогда Возврат; КонецЕсли;. Это позволит системе беспрепятственно загружать данные, даже если они не соответствуют вашим новым правилам валидации.

Способ 3. Проверка на форме (интерактивный метод)

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


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

Этот метод хорош тем, что он дает быструю обратную связь пользователю. Однако помните, что проверка в форме не сработает, если контрагент создается программно (например, через внешнюю обработку или мобильное приложение). Поэтому для критически важных данных лучше дублировать проверку в модуле объекта.

Дополнительная проверка формата данных

Просто проверить поле на заполненность — это лишь половина дела. Часто пользователи вводят в поле «Телефон» случайные символы. Чтобы повысить качество данных, мы можем добавить простую проверку на количество цифр. Проанализируем пример функции для очистки номера:


Функция ТолькоЦифры(Знач СтрокаНомера)
    Результат = "";
    Для Индекс = 1 По СтрДлина(СтрокаНомера) Цикл
        Символ = Сред(СтрокаНомера, Индекс, 1);
        Если Найти("0123456789", Символ) > 0 Тогда
            Результат = Результат + Символ;
        КонецЕсли;
    КонецЦикла;
    Возврат Результат;
КонецФункции

Используя такую функцию внутри процедуры ОбработкаПроверкиЗаполнения, вы сможете проверять, что в номере телефона введено как минимум 10 цифр, что значительно снизит количество мусорных данных в вашей информационной системе. Для защиты справочника от дублей по ИНН и КПП можно воспользоваться расширением для жесткого запрета дублей контрагентов.

Итоги

Мы рассмотрели три основных подхода к установке проверки заполнения адреса и телефона в 1С:УНФ. Резюмируем наши действия:

← На главную