В
предыдущей статье рассказывалось как построить отчет по заказам со строками и проводками. Теперь в этот отчет выведем изображение продукта из его карточки.
Создаем дочернюю модель от Заказы, строки, проводки (TrainerITSalesOrders) и называем ее TrainerITSalesOrdersImage
В модели добавляем поля:
Идем в к.Сопоставить модель с источником данных
Добавляем Записи таблицы = SalesTable - это будут сами заказы на продажу
Добавляем записи таблицы = SalesLine - эта таблица будет использоваться для создания вычисляемого поля в SalesTable. Без добавления SalesLine как Записи таблицы в корень нельзя будет использовать переменную SalesLine в формуле вычиляемого поля. Это как объявление переменной в коде.
Здесь мы не будем пользоваться релейшеном для вытаскивания строк заказа, а явно создадим вычисляемое поле @SalesLine. Это позволит нам быстрее добираться до полей, релейшенов и методов SalesLine. К тому же я столкнулась с тем, что при использовании релейшенов получается такой уровень вложенности, что метод вытаскивания изображения для продукта не работает! Минус здесь только один - в формуле вычисляемого поля для фильтрации записей по входному параметру пользователя нам придется использовать функцию WHERE вместо FILTER. При использовании FILTER будет ошибка …
Создаем вычисляемое поле для строк заказа на продажу:
Называем поле $SalesLine
Формула для поля:
X++:
FILTER(SalesLine, SalesLine.SalesId=@.SalesId)
Получили такую картинку:
Нам потребуется от строки перейти к номенклатуре, чтобы получить из нее изображение. Поэтому добавим таблицу InventTable в корень модели.
Мы будем пользоваться статическим методом таблицы find, поэтому нам нет смысла вытаскивать записи из БД, достаточно типа Таблица.
Получили картинку:
Теперь добавляем вычисляемое поле в строки заказа:
Имя поля: $InventTable
Формула:
X++:
InventTable.'find()'(@.ItemId)
Это выч.поле будет возвращать нам номенклатуру строки.
Для следующего выч.поля нам потребуется метод класс ImageReference. Поскольку сам объект класса нам не нужен, добавляем просто Класс ImageReference
Теперь создаем выч.поле на строках заказа:
Имя поля $ImageReference
Формула
X++:
ImageReference.constructForPackedData(@.'$InventTable'.'productImageThumbnail()')
Получили картинку:
К выч.полю $InventTable добавим выч.поле $Documents, которое будет возвращать записи из таблицы вложений в продукту (изображение продукта хранится как вложение)
Имя поля $Documents
Формула
X++:
@.'<Relations'.'<Documents'
Получим картинку:
Связываем поля источников данных с полями модели:
Для поля ImageName пишем формулу:
X++:
IF(@.'$ImageReference'.parmImageType="Base64",
@.'$ImageReference'.parmImageData,"")
Она возвратит путь к картинке, если картинка есть
Для поля IsItemImagePresent пишем формулу:
X++:
IF(IsEmpty(@.'$InventTable'.'<Relations'.'<Documents'),FALSE,TRUE)
Она возвратит Истину, если есть вложение.
Для поля ItemImageAsContainer пишем формуду
X++:
@.'$InventTable'.'$Documents'.'getFileContentAsContainer()'
Она возвратит саму картинку.
Маппинг модели завершили. Сохраняем, закрываем. Модель переводим в статус Завершено.
Настраиваем формат.
Для формата необходимо подготовить шаблон.
Возьмем шаблон от предыдущей задачи Заказы, строки, проводки и изменим его.
Вставили под строкой заказа еще одну строчку, расширили ее, объединили первые две ячейки, вставили в них картинку с компьютера. Размер картинки уменьшили до размера ячейки. Сделали диапазон строки, назвали его ProductImage. Встали на картинку, пишем в правой верхней ячейке название ItemImage и нажимаем Enter. Диапазон SalesHeader расширяем на одну строчку вниз.
Обновим шаблон в формате TrainerITSalesOrdersImage
Встаем на диапазон ProductImage, на в.Сопоставление справа нажимаем кнопку с карандашиком и пишем формулу
X++:
@.IsItemImagePresent=TRUE
Такая настройка будет скрывать диапазон, если картинка отсутствует
Для ячейки ItemImage нажимаем Изменить формулу и пишем
X++:
IF(@.IsItemImagePresent, @.ItemImageAsContainer, Base64StringToContainer(""))
Получили картинку:
Проверка позволяет избежать ошибки привязки к формату, если картинки в продукте нет.
Формат сохраняем, завершаем.
В шаблон вместо картинки желательно поместить пустое изображение - чтобы оно не занимало места.