Создание шаблонов печатных форм

Шаблоны печатных форм представляют собой файлы в формате Microsoft Excel.

Для создания нового шаблона мы рекомендуем взять за основу один из существующих и изменить его: добавить или убрать поля, прикрепить логотип, изменить внешний вид таблиц или поменять шрифт. Всё это возможно путем простого редактирования файлов Еxcel, которые хранятся в МоемСкладе.

Чтобы скачать шаблон перейдите в нужный вам список документов, нажмите меню Печать и выберите пункт Настроить.

Справа появится окно Настройка шаблонов. Там представлено два раздела Отчет и Документ. К Документу относятся все печатные формы, выводимые из самого документа; к Отчету - шаблоны, печатающиеся из списка документов одного типа, а так же Остатки, Обороты, Прибыльность и другие отчеты.

После редактирования или создания новой печатной формы, добавьте её к существующим шаблонам в соответствующем разделе Печать - Настроить.

Печать из Документа

Реквизиты получателя и отправителя.

В качестве примера используется Заказ Покупателя.

Общим правилом оформление любой формулы реквизитов компании является структура 

${o.targetAgentRequisite.legalTitle}

Основные параметры: 

  • targetAgentRequisite или sourceAgentRequisite- указатель на источник данных, это либо карточка контрагента (кто создает документ source), либо информация из закладки юр. лица (кто получатель документа target).
  • legalTitle - сама переменная, которую требуется вывести на печать.

Готовые примеры: 

${o.targetAgentRequisite} краткое наименование 
${o.targetAgentRequisite.legalTitle} полное наименование 
${o.targetAgentRequisite.INN} ИНН 
${o.targetAgentRequisite.KPP} КПП 
${o.targetAgentRequisite.OKPO} ОКПО 
${o.targetAgentRequisite.legalAddress} юридический адрес 
${o.targetAgentRequisite.actualAddress} фактический адрес 
${o.targetAgentRequisite.agent.contact.phones} телефон 
${o.targetAgentRequisite.account.bankName} наименование банка
${o.targetAgentRequisite.account.bankLocation} местонахождение банка 
${o.targetAgentRequisite.account.BIC} БИК банка 
${o.targetAgentRequisite.account.accountNumber} расчетный счет 
${o.targetAgentRequisite.account.correspondentAccount} корреспондентский счет 
${o.targetAgentRequisite.discount} скидка контрагента
${o.targetAgentRequisite.autoDiscount} автоматическая скидка контрагента

Во всех формулах используется target - это формулы получателя документа, измените на source, если требуется напечатать реквизит отправителя документа.

Общие формулы документа

Общие

${o.name} Наименование
${formatter.getExcelDate(o.moment)} Дата
${o.project.name} Проект
${o.contract.name} Договор
${formatter.getExcelDate(o.contract.moment)} Дата договора
${formatter.printIf(o.applicable, "Да")} Проведение
${o.state.name} Статус
${o.description} Комментарий
${formatter.getExcelDate(o.deliveryPlannedMoment)} План. дата отгрузки/приёмки
${formatter.getExcelDate(o.paymentPlannedMoment)}

План. дата оплаты

Сотрудник 

${o.employee.name} Фамилия ИО
${o.employee.lastName} Фамилия
${o.employee.firstName} Имя
${o.employee.middleName} Отчество
${o.employee.phone} Телефон
${o.employee.email} E-mail
${o.employee.description} Описание

Суммы

${o.sum.sum / 100} Сумма 
${o.sum.sumInCurrency / 100} Сумма в валюте документа
${formatter.printAmount(formatter.getCurrency(o), o.sum.sumInCurrency)} Сумма прописью
${formatter.calcVat(o.getPositions())} Сумма НДС
${formatter.printAmount(formatter.getCurrency(o), formatter.calcVat(o.getPositions())*100)} Сумма НДС прописью
${formatter.calcTotalAmount(formatter.getServices(o)) / 100} Сумма услуг
${formatter.calcTotalAmount(formatter.getGoods(o)) / 100} Сумма товаров
${formatter.calcTotalQuantity(o)} Количество позиций
${formatter.getGoods(o).size()} Количество порядковых записей товаров
${formatter.printNumber(formatter.getGoods(o).size())} Количество порядковых записей товаров прописью
${formatter.getServices(o).size()} Количество порядковых записей услуг
${formatter.printNumber(formatter.getServices(o).size())} Количество порядковых записей услуг прописью
${o.getPositions().size()} Всего наименований
${formatter.printNumber(o.getPositions().size())} Всего наименований прописью
${formatter.countServices(o)} Количество услуг
${formatter.calcTotalGoodsQuantity(o)}  Количество товаров
${formatter.operationWeight(o)} Суммарный вес
${formatter.operationVolume(o)} Суммарный объем

Для документа розницы

${formatter.printIfElse(o.tail.nonCash,"Картой","Наличными")} Способ оплаты
${o.retailStore.name} Наименование точки продаж
${o.retailStore.address} Адрес точки продаж

Склад

${o.sourceStore.name} Наименование
${o.sourceStore.code} Код
${o.sourceStore.contact.address} Адрес
${o.sourceStore.description} Комментарий

Разное

${o.currency.name} Валюта документа
${o.customerOrder.name} Связанный заказ
${formatter.getCurrentUser().name} Текущий пользователь
${o.getPayments().iterator().next().incomingNumber} Номер связанного платежа
${o.getPayments().iterator().next().incomingDate} Дата связанного платежа
${formatter.printIfElse(o.vatIncluded, "с НДС  ", "без НДС")}  Сумма включает НДС
${o.currency.rate} Курс

Позиций документа

Формула

Значение
${position.good.name} краткое наименование товара
${position.good.code} код товара
${position.good.productCode} артикул товара
${position.good.description} описание товара
${position.good.uom.name} единица измерения
${position.good.uom.code} код единицы измерения
${position.basePrice.sum} цена с НДС без скидки, в копейках
${position.discount} скидка, в процентах
${position.price.sum} цена с НДС с учетом скидки, в копейках
${position.quantity} количество единиц товара
${position.vat} НДС, в процентах
${position.good.salePrice} цена продажи из карточки товара
${position.good.buyPrice} цена закупки из карточки товара
${position.consignment.name} наименование серии
${position.consignment.description} описание серии
${position.goodPack.uom.name} название упаковки (может быть пустым)
${position.goodPack.quantity} упаковка (может быть пустым)
${position.good.supplier.name} поставщик
${position.good.minimumBalance} неснижаемый остаток

Создание цикла. Перебор по позициям

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

<jx:forEach items="${o.positions}" var="position">
</jx:forEach>
по всем позициям документа
<jx:forEach items="${formatter.getGoods(o)}" var="position">
</jx:forEach>
только по Товарам
<jx:forEach items="${formatter.getServices(o)}" var="position">
</jx:forEach>

только по Услугам

 

Еще есть вопросы? Отправить запрос

Комментарии

  • Avatar
    Fadeevviktor

    Да уж... Сложновато.

  • Avatar
    It

    Не хватает развернутой документации по API formatter. Например, как вывести последние 50 символов названия товара?

  • Avatar
    Fadeevviktor

    А какую формулу надо добавить в накладной, чтобы получилось " Договор № 001 от 01.01.2015 г."? У каждого клиента свой номер договора и дата своя.

  • Avatar
    alexeylg

    Мне нужно что-бы в документе отгрузки указывался артикул товара. Я использовал готовый шаблон rashod.xls, добавил новый столбец и прописал в него ${position.good.productCode}. В распечатанном документе появился созданный мной столбец, но артикул товара не указывается, пустое поле. Что я делаю не так?

  • Avatar
    Виталий Макеев

    Не хватает развернутой документации по API formatter.

    Краткая шпаргалка по печатным формам МойСклад по этой ссылке https://www.mindmeister.com/ru/177059169/_

    Там есть раздел с перечислением часто используемых методов formatter'а.

    Например, как вывести последние 50 символов названия товара?

    Учитывая что выражения формул в фигурных скобках печатных форм МойСклад есть по сути выражения языка Java, то можно пользоваться Java-методами объектов.

    К примеру формула для последних 50-ти символов названия товара:

    ${good.name.length() >= 50 ? good.name.substring(good.name.length() - 50) : good.name}
    

    По этой ссылке описание всех методов объекта строки в Java:
    https://docs.oracle.com/javase/6/docs/api/java/lang/String.html

    Некторые формулы в действии:

    Если o.name равно значению "NA-ord-16991", то

    o.name.charAt(2)-
    o.name.concat(' some')NA-ord-16991 some
    o.name.contains('NA')true
    o.name.replaceFirst('\d', '0')NA-ord-06991
    o.name.replaceAll('\d', '0')NA-ord-00000
    o.name.replace('NA', 'FOO')FOO-ord-16991
    o.name.split('-')[0]NA
    o.name.toLowerCase()na-ord-16991
    o.name.toUpperCase()NA-ORD-16991
    o.name.trim()NA-ord-16991
    o.name.toCharArray()[0]N

  • Avatar
    Роман

    Подскажите, пожалуйста, как добавить логотип в товарный чек ?

  • Avatar
    Максим

    Неужели до сих пор не существует WYSIWYG редакторов для быстрой генерации нужных нам шаблонов, без всяких этих адских замудростей с формулами?

  • Avatar
    Ivan Pervyi

    Набор символов, а не инструкция. Чтобы создать шаблон СТАНДАРТНОЙ этикетки 30х20 (которую весь мир использует, а не только я) нужно выучить весь exel и стать дипломированным программистом. Неужели сложно создать стандартные шаблоны стандартных размеров, их не так много, может штук десять. А уж если кого не устроит (допустим полей дополнительных вывести), то переделать то что есть гораздо легче, чем учить весь exel. Ждать 10 рабочих дней когда Ваша служба техподдержки займется не приоритетным созданием шаблона не у всех хватит терпения, например у меня оно уже заканчивается.

  • Avatar
    Max Av

    а как сделать, чтобы выводились целые числа без дроби? К примеру я круглую цену умножил на 0.975 Мне нужно чтобы цена со скидкой была без дроби.

  • Avatar
    Виталий Макеев

    а как сделать, чтобы выводились целые числа без дроби? К примеру я круглую цену умножил на 0.975 Мне нужно чтобы цена со скидкой была без дроби.

    ${formatter.round(105/10)} → 10

  • Avatar
    Анна

    нужно добавить краткое наименование товара в ценник, подскажите пожалуйста какая должна быть формула.

  • Avatar
    Виталий Макеев

    нужно добавить краткое наименование товара в ценник

    А что есть "краткое наименование"?

  • Avatar
    Вадим

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

  • Avatar
    Виталий Макеев

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

    Пробуйте так - ${formatter.findAttribute(o, "Сотрудник").employeeValue.name}

  • Avatar
    Вадим

    Спасибо, сработало.

  • Avatar
    Kartsan

    Подскажите, как в отчете остатков, где все выводится в виде ${row.uomName}
    подключить информацию из справочника товаров ? Например, поставщик, которого можно указать в справочнике.
    ${position.good.supplier.name} не работает

  • Avatar
    Kartsan

    С поставщиком я разобрался - ${formatter.loadGood(row.goodRef.id).supplier.name}
    А вот как вывести дополнительное поле? В другом отчете я вывожу так:
    ${formatter.findAttribute(position.good, "Кратность поставки").longValue}

  • Avatar
    Виталий Макеев

    А вот как вывести дополнительное поле?

    Аналогично. Для formatter.findAttribute нужно сначала подгрузить товар через тот же formatter.loadGood.

  • Avatar
    Kartsan

    Спасибо, мне из техподдержки подсказали:
    ${formatter.findAttribute(formatter.loadGood(row.goodRef.id), "Кратность поставки").longValue}
    Все работает, но, конечно, эта формула не для начинающих.

  • Avatar
    Belobrodski
    Подскажите как вставить дополнительное поле с печатный документ?
  • Avatar
    Харитонова Юлия

    Скажите, как называется поле, какой у него тип и в каком шаблоне вы хотите его видеть.

  • Avatar
    Belobrodski
    Поле называется "Распечатан" тип: "флажок" в документе "Приходный ордер" П.с. интересует и для поля дата и текст
  • Avatar
    Харитонова Юлия

    ${formatter.printIfElse(formatter.findAttribute(o, "Распечатан").booleanValue, "Да", "Нет")}

    Про дату и текст не поняла, нужна формула для поля того же поля, только другого типа?

    Текст - ${formatter.findAttribute(o, "Распечатан").value}

    Дата - ${formatter.findAttribute(o, "Распечатан").timeValue}

  • Avatar
    Belobrodski
    Спасибо. А еще нужно для пользовательского поля в котором указываются данные из пользовательского справочника, он называется "Утверждения"
  • Avatar
    Igor Filippov

    Подскажите пожалуйста как создать поле состоящее из части поля Телефон (${o.sourceAgentRequisite.agent.contact.phones}), чтобы выводились символы с 4 по 8.
    К примеру: Телефон=89261234567, Нужно чтобы вывелось=1234.
    Или даже более сложный вариант, чтобы нужное поле формировалось из двух частей: Первая: Месяц создания заказа в цифровом формате (янв=1, фев=2 и т.д.), а вторая часть, из вышеописанной части телефона.
    Пример: февральский заказ от контрагента с телефоном 89261234567, нужно вывести в поле "21234" (где "2"-номер месяца, а "1234" - часть телефона). Спасибо.

  • Avatar
    Администратор

    Может кто подскажет как добавлять фото в накладную или счет, чтобы смаштабировалось корректно?

  • Avatar
    Ffskozlov

    В карточки клиента я создал поле "Адрес доставки", в шаблоне документов Заказы покупателей я вставил ${formatter.findAttribute(o, "Адрес доставки").valueString} и у меня не работает. Подскажите где ошибка? Пробовал и так ${formatter.findAttribute(o.sourceAgentRequisite, "Адрес доставки").valueString}

  • Avatar
    Виталий Макеев

    ${formatter.findAttribute(o.sourceAgent, "Адрес доставки").valueString}

  • Avatar
    Ffskozlov

    Спасибо за ответ. Еще такой вопрос:
    Во вкладке "заказы покупателей" я добавил поле "Дата составления договора" и в шаблон распечатки поставил код: ${formatter.format("%1$td.%1$tm.%1$tY", formatter.getExcelDate(formatter.findAttribute(o, "Дата составления договора").timeValue))} г. тут все работает нормально.
    Но мне нужно сделать, что бы во вкладке "Отгрузка" в шаблоне распечатки бралась дата из документа заказы покупателей. Где изменить код, чтобы работало и там?

  • Avatar
    Виталий Макеев

    Пример того как вывести имя заказа из отгрузки:
    - если отгрузка из счета - ${o.invoicesOut.customerOrder.name}
    - если отгрузка из заказа - ${o.customerOrder.name}