При работе с конфигурацией 1С:Управление нашей фирмой (УНФ) разработчики часто сталкиваются с тем, что привычные поля «Адрес» или «Телефон» отсутствуют в дереве реквизитов справочника Контрагенты в конфигураторе. Это связано с тем, что в современных конфигурациях на базе БСП (Библиотеки стандартных подсистем) контактная информация хранится и отображается динамически. В этой статье мы подробно разберем, как реализовать проверку обязательного заполнения этих полей, используя как штатные средства, так и программный код.
Проанализируем ситуацию: когда мы открываем форму контрагента в режиме «1С:Предприятие», мы видим поля для ввода адреса и телефона. Однако в конфигураторе на форме их нет. Это происходит потому, что платформа использует механизм динамического построения контактной информации. Данные хранятся не в отдельных реквизитах справочника, а в специальной табличной части, которая обычно называется КонтактнаяИнформация.
Эта табличная часть содержит ссылки на виды контактной информации (например, «Юридический адрес» или «Мобильный телефон») и строковые представления этих данных. Поэтому обычная установка флажка «Проверка заполнения» в свойствах реквизита здесь не сработает.
Прежде чем приступать к написанию кода, рассмотрим штатный механизм, предусмотренный разработчиками 1С. В последних версиях УНФ установить обязательность заполнения можно через интерфейс пользователя:
После этой настройки система сама будет подсвечивать поле красным пунктиром и выдавать предупреждение при попытке записи пустого значения. Это наиболее правильный и «чистый» способ решения задачи.
Если штатной настройки недостаточно (например, требуется сложная логика — проверять заполнение только для определенных типов контрагентов), мы можем использовать программный метод. Разберем наиболее профессиональный подход с использованием обработчика ОбработкаПроверкиЗаполнения в модуле объекта справочника Контрагенты.
Рассмотрим пример кода, который проверяет наличие юридического адреса:
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
// Обязательно проверяем, не идет ли загрузка данных через обмен
Если ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;
НужныйВид = Справочники.ВидыКонтактнойИнформации.ЮрАдресКонтрагента;
АдресНайден = Ложь;
Для Каждого СтрокаКИ Из КонтактнаяИнформация Цикл
Если СтрокаКИ.Вид = НужныйВид Тогда
Если Не ПустаяСтрока(СтрокаКИ.Представление) Тогда
АдресНайден = Истина;
Прервать;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Если Не АдресНайден Тогда
ТекстСообщения = "Для контрагента необходимо заполнить юридический адрес!";
Поле = "КонтактнаяИнформация[0].Представление"; // Условный путь для подсветки
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = ТекстСообщения;
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
В этом примере мы используем цикл по табличной части КонтактнаяИнформация. Важно обращаться к колонкам по их именам (Вид, Представление), а не по индексам, так как порядок колонок может измениться после обновления конфигурации.
Проанализируем ситуацию, когда данные приходят из другой базы (например, из 1С:Бухгалтерии) через синхронизацию. Если в базе-источнике адрес не был заполнен, а в базе-приемнике мы установили жесткую блокировку на запись без адреса, синхронизация прервется с ошибкой. Чтобы этого избежать, всегда используйте условие Если ОбменДанными.Загрузка Тогда Возврат; КонецЕсли;. Это позволит системе беспрепятственно загружать данные, даже если они не соответствуют вашим новым правилам валидации.
Иногда требуется выводить предупреждение пользователю еще до того, как объект начнет записываться в базу данных. В этом случае мы можем использовать событие формы ПередЗаписьюНаСервере или ПередЗаписью. Посмотрим на пример реализации логики непосредственно в форме документа или справочника:
&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
// Выгружаем контактную информацию в таблицу значений для удобства поиска
ТаблицаКИ = ТекущийОбъект.КонтактнаяИнформация.Выгрузить();
ВидТелефон = Справочники.ВидыКонтактнойИнформации.ТелефонКонтрагента;
СтрокаТелефон = ТаблицаКИ.Найти(ВидТелефон, "Вид");
Если СтрокаТелефон = Неопределено Или ПустаяСтрока(СтрокаТелефон.Представление) Тогда
Сообщить("Пожалуйста, укажите контактный телефон контрагента!");
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
Этот метод хорош тем, что он дает быструю обратную связь пользователю. Однако помните, что проверка в форме не сработает, если контрагент создается программно (например, через внешнюю обработку или мобильное приложение). Поэтому для критически важных данных лучше дублировать проверку в модуле объекта.
Просто проверить поле на заполненность — это лишь половина дела. Часто пользователи вводят в поле «Телефон» случайные символы. Чтобы повысить качество данных, мы можем добавить простую проверку на количество цифр. Проанализируем пример функции для очистки номера:
Функция ТолькоЦифры(Знач СтрокаНомера)
Результат = "";
Для Индекс = 1 По СтрДлина(СтрокаНомера) Цикл
Символ = Сред(СтрокаНомера, Индекс, 1);
Если Найти("0123456789", Символ) > 0 Тогда
Результат = Результат + Символ;
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
Используя такую функцию внутри процедуры ОбработкаПроверкиЗаполнения, вы сможете проверять, что в номере телефона введено как минимум 10 цифр, что значительно снизит количество мусорных данных в вашей информационной системе. Для защиты справочника от дублей по ИНН и КПП можно воспользоваться расширением для жесткого запрета дублей контрагентов.
Мы рассмотрели три основных подхода к установке проверки заполнения адреса и телефона в 1С:УНФ. Резюмируем наши действия: