Как при создании печатной формы реализовать ввод дополнительных данных пользователем?

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

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

Метод 1. Использование простых диалогов ввода

Если нам необходимо получить от пользователя одно или несколько простых значений (например, одну строку текста), мы можем воспользоваться стандартными функциями платформы 1С. Разберем ситуацию, когда перед формированием печатной формы нужно запросить адрес электронной почты.

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


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

        // Создаем структуру параметров для передачи на сервер
        ПараметрыПечати = Новый Структура;
        ПараметрыПечати.Вставить("Почта", АдресЭлПочты);

        // Формируем табличный документ на сервере
        ТабДок = СформироватьПечатнуюФорму(ПараметрыПечати);
        ТабДок.Показать("Печатная форма с адресом");
    КонецЕсли;
КонецПроцедуры

Стоит отметить, что в современном управляемом интерфейсе (Такси) рекомендуется использовать асинхронный метод ПоказатьВводЗначения, чтобы не блокировать работу интерфейса. Это соответствует стандартам разработки для веб-клиента и мобильных приложений.

Метод 2. Создание вспомогательной формы параметров (Подход БСП)

Если задача стоит шире — например, пользователю нужно заполнить целых 6 строк с адресами населенных пунктов — использование шести последовательных окон ВвестиСтроку будет крайне неудобным. В этом случае правильным решением будет создание отдельной формы в составе внешней обработки.

Разберем алгоритм работы этого механизма:

  1. Создание формы: В составе внешней обработки создаем новую форму, называем ее, например, ФормаПараметровПечати.
  2. Размещение реквизитов: На форме размещаем таблицу значений или массив строковых реквизитов (Адрес1, Адрес2 и т.д.).
  3. Логика вызова: При нажатии кнопки "Печать" в основной форме или из подсистемы печати, мы сначала открываем нашу форму параметров.
  4. Передача данных: После того как пользователь заполнит все адреса и нажмет кнопку "Продолжить", мы закрываем форму, возвращая структуру заполненных данных в вызывающую процедуру.

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

Метод 3. Интерактивное редактирование в готовом табличном документе

Рассмотрим ситуацию, когда нам не нужно создавать промежуточные формы. Мы можем сформировать печатную форму, вывести в ней пустые строки (поля), и позволить пользователю вписать туда данные прямо перед отправкой на принтер. Это часто бывает удобнее всего для пользователя, так как он сразу видит контекст документа.

Посмотрим на программную настройку такого поведения:


// При формировании табличного документа на сервере
ТабДок.ТолькоПросмотр = Ложь; // Позволяем редактирование
ТабДок.Защита = Истина;       // Включаем защиту всего листа

// Выбираем конкретную область (ячейку), которую можно редактировать
ОбластьДляВвода = Макет.ПолучитьОбласть("СтрокаАдреса");
ОбластьДляВвода.Параметры.Адрес = ""; // Пустое значение для ввода
// Снимаем защиту только с этой области
ОбластьДляВвода.ТекущаяОбласть.Защита = Ложь;

ТабДок.Вывести(ОбластьДляВвода);

С помощью свойства Защита мы гарантируем, что пользователь не сможет случайно изменить шапку документа, суммы или артикулы товаров, но при этом сможет свободно впечатывать адреса в отведенные для этого ячейки. Это профессиональный подход, который минимизирует количество лишних кликов.

Метод 4. Работа с макетом и параметрами на сервере

Выясним, как технически происходит заполнение макета на стороне сервера, когда данные от пользователя уже получены. Допустим, мы получили структуру ПараметрыПечати, содержащую список адресов.

Проанализируем пример функции формирования документа:


&НаСервере
Функция СформироватьПечатнуюФорму(Параметры)
    ТабДок = Новый ТабличныйДокумент;
    Макет = РеквизитФормыВЗначение("Объект").ПолучитьМакет("МакетПечати");

    // Выводим шапку
    ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
    ТабДок.Вывести(ОбластьШапка);

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

    // Выводим подвал
    ОбластьПодвал = Макет.ПолучитьОбласть("Подвал");
    ТабДок.Вывести(ОбластьПодвал);

    Возврат ТабДок;
КонецФункции

Важный момент: использование метода Вывести() в цикле позволяет нам гибко подстраиваться под количество введенных данных. Если пользователь заполнил 2 адреса — выведутся 2 строки, если 6 — выведутся 6. Это гораздо эффективнее, чем рисовать в макете фиксированные 6 строк.

Рекомендации по сохранению данных

Часто пользователи жалуются, что им приходится вводить одни и те же адреса при каждой печати. Чтобы сделать инструмент по-настоящему удобным, проанализируем возможности сохранения данных:

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

← На главную