Как динамически сформировать текст подписи в печатной форме 1С в зависимости от ответственного

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

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

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

Метод 1. Использование дополнительных свойств объектов

Разберем ситуацию, когда нам нужно хранить специфический текст для каждого пользователя, который не предусмотрен стандартными полями (например, «Текст для подписи»). В конфигурации «Управление торговлей 10.3» (и других на базе обычных форм) реализован механизм «Свойства и категории».

Рассмотрим пошагово, как это реализовать:

  1. В режиме «Предприятие» перейдем в справочник «Пользователи» и через кнопку «Перейти» откроем «Свойства объектов».
  2. Создадим новое свойство с наименованием «ТекстПодписиПечатнойФормы» для типа «СправочникСсылка.Пользователи».
  3. Заполним этот текст для нужных сотрудников.

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


// Функция для получения значения свойства ответственного
Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	ЗначенияСвойствОбъектов.Значение КАК ЗначениеТекста
    |ИЗ
    |	РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
    |ГДЕ
    |	ЗначенияСвойствОбъектов.Объект = &Ответственный
    |	И ЗначенияСвойствОбъектов.Свойство.Наименование = ""ТекстПодписиПечатнойФормы""";

Запрос.УстановитьПараметр("Ответственный", СсылкаНаОбъект.Ответственный);
Выборка = Запрос.Выполнить().Выбрать();

Если Выборка.Следующий() Тогда
    Область.Параметры.Ответственный = Выборка.ЗначениеТекста;
КонецЕсли;

Преимущество этого метода: администратор базы может сам менять текст подписи, не прибегая к услугам программиста.

Метод 2. Сбор данных из карточки физического лица и организации

Зачастую вся необходимая информация (должность, телефон, e-mail) уже есть в базе, но распределена по разным справочникам и регистрам. Проанализируем, как собрать эти данные воедино. В 1С «Пользователь» — это учетная запись, а «Физическое лицо» — это человек с его персональными данными.

Посмотрим на пример формирования строки подписи через запрос к контактной информации:


// Получаем физлицо, привязанное к пользователю
ФизЛицо = СсылкаНаОбъект.Ответственный.ФизЛицо;

// Запрос к контактной информации для получения телефона
ЗапросКИ = Новый Запрос;
ЗапросКИ.Текст = 
    "ВЫБРАТЬ
    |	КонтактнаяИнформация.Представление КАК Телефон
    |ИЗ
    |	РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
    |ГДЕ
    |	КонтактнаяИнформация.Объект = &ФизЛицо
    |	И КонтактнаяИнформация.Вид = &ВидТелефона";

ЗапросКИ.УстановитьПараметр("ФизЛицо", ФизЛицо);
ЗапросКИ.УстановитьПараметр("ВидТелефона", Справочники.ВидыКонтактнойИнформации.ТелефонФизЛица);
// ... выполнение запроса ...

Аналогичным образом можно получить данные организации из документа. Сайт и адрес организации хранятся в том же регистре КонтактнаяИнформация, но в привязке к объекту Справочники.Организации.

Метод 3. Правильное формирование итоговой строки через массив

Выясним причину, по которой обычное сложение строк через + работает плохо. Если у одного сотрудника заполнен телефон, а у другого — нет, при обычном сложении у вас могут появиться лишние запятые или пустые пробелы (например, "Иванов И.И., , , сайт.рф").

Рассмотрим более изящный способ сборки строки с использованием массива:


СписокДанных = Новый Массив;

// Добавляем только заполненные значения
Если ЗначениеЗаполнено(ФИООтветственного) Тогда
    СписокДанных.Добавить(ФИООтветственного);
КонецЕсли;

Если ЗначениеЗаполнено(Должность) Тогда
    СписокДанных.Добавить(Должность);
КонецЕсли;

Если ЗначениеЗаполнено(Телефон) Тогда
    СписокДанных.Добавить(Телефон);
КонецЕсли;

// Объединяем элементы массива в одну строку через запятую и пробел
ТекстПодписи = "";
Для Каждого Элемент Из СписокДанных Цикл
    ТекстПодписи = ТекстПодписи + ?(ПустаяСтрока(ТекстПодписи), "", ", ") + Элемент;
КонецЦикла;

Область.Параметры.Ответственный = ТекстПодписи;

В типовых конфигурациях (например, УТ 10.3) часто есть общая функция ОбщегоНазначения.СформироватьСписокРазделителем(Массив, ", "), которую мы рекомендуем использовать вместо написания собственного цикла.

Метод 4. Работа с шаблонами макета

Вместо того чтобы полностью формировать всю строку в программном коде, мы можем использовать возможности самого макета. Посмотрим, как это сделать:

  1. Откроем макет печатной формы.
  2. В нужной ячейке установим свойство «Заполнение» в значение Шаблон.
  3. В тексте ячейки напишем: [Должность] [ФИО], тел: [Телефон], сайт: [Сайт].

Теперь в коде нам достаточно просто заполнить параметры этой области:


Область.Параметры.Должность = ВыбраннаяДолжность;
Область.Параметры.ФИО       = ФИОСотрудника;
Область.Параметры.Телефон   = КонтактныйТелефон;
Область.Параметры.Сайт      = СайтОрганизации;

Этот подход удобен тем, что вы можете визуально оформить подпись в макете: выделить [ФИО] жирным шрифтом или изменить размер текста для сайта, не меняя при этом программный код.

Рекомендация по внешним печатным формам

Если вы модифицируете печатную форму в УТ 10.3, настоятельно рекомендуем выносить ее во внешнюю печатную форму (ВПФ). Это позволит вам тестировать различные варианты формирования подписи и обновлять логику без необходимости монопольного доступа к базе и обновления конфигурации. К тому же, это сохранит вашу базу на поддержке, что упростит будущие обновления.

Подведем итог: использование условий Если...Тогда оправдано только для очень простых и разовых задач. Для стабильной системы лучше использовать свойства объектов или сбор данных из регистров контактной информации с последующим объединением через массив. Это обеспечит гибкость настройки и чистоту вашего программного кода.

← На главную