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