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

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

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

Способ №1: Подмена данных в цикле обхода выборки

Этот метод подходит, если логика подмены значения простая и не требует сложных вычислений. Мы выполняем запрос как обычно, а непосредственно в момент заполнения параметров области макета проверяем, требуется ли замена данных для текущей строки.

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

  1. Выполняем запрос к данным документа.
  2. В цикле Пока Выборка.Следующий() Цикл заполняем параметры области макета стандартным методом Параметры.Заполнить(Выборка).
  3. Добавляем условие, которое проверяет значение текущей записи. Если оно соответствует нашему критерию, принудительно переопределяем параметр области макета.

Пример реализации:


Пока Выборка.Следующий() Цикл
    Счетчик = Счетчик + 1;
    ОбластьМакетаСтрока.Параметры.Сч = Счетчик;
    ОбластьМакетаСтрока.Параметры.Заполнить(Выборка);
    
    // Проверка условия для подмены
    Если СтрДлина(Выборка.Производитель.Наименование) > 50 Тогда
        ОбластьМакетаСтрока.Параметры.Производитель = \"Производитель 1 полное наименование\";
    КонецЕсли;
    
    ТабДокумент.Вывести(ОбластьМакетаСтрока);
КонецЦикла;

Важное примечание: Будьте внимательны при использовании обращения через точку в цикле (например, Выборка.Производитель.Наименование). Это может привести к выполнению лишних обращений к базе данных на каждой итерации цикла, что негативно сказывается на производительности. Для больших объемов данных лучше использовать дополнительные поля в самом запросе.

Способ №2: Использование конструкции ВЫБОР КОГДА в запросе

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

Используя конструкцию ВЫБОР КОГДА ... ТОГДА ... ИНАЧЕ ... КОНЕЦ, мы переносим логику обработки данных на сервер базы данных. Это позволяет избежать лишних манипуляций в коде модуля и оптимизировать процесс получения выборки.

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


ВЫБРАТЬ
    ИнвойсТовары.Номенклатура.Артикул КАК Артикул,
    ВЫБОР
        КОГДА ИнвойсТовары.Номенклатура.Производитель = &Производитель Тогда
            ИнвойсТовары.Номенклатура.Производитель.ПолноеНаименование
        ИНАЧЕ
            ИнвойсТовары.Номенклатура.Производитель.Наименование
    КОНЕЦ КАК Производитель
ИЗ
    Документ.Инвойс.Товары КАК ИнвойсТовары

В коде модуля остается только установить параметр для запроса:


ЗапросТаблица.УстановитьПараметр(\"Производитель\", СсылкаНаНужногоПроизводителя);

Почему второй способ предпочтительнее?

Проанализируем преимущества использования запроса:

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

← На главную