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