Как вывести процент автоматической или ручной скидки в печатную форму 1С и исправить ошибки макета

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

При оформлении продаж в торговых конфигурациях 1С (таких как «Управление торговлей», «ERP Управление предприятием» или «Комплексная автоматизация») компании активно используют системы лояльности. Автоматические и ручные скидки рассчитываются в документах и напрямую влияют на конечную стоимость товаров. Однако при выводе документов на печать (например, расходной накладной или счета на оплату) пользователи часто сталкиваются с тем, что колонки с процентами скидок остаются пустыми или вовсе отсутствуют в печатной форме.

В этой статье мы подробно разберем, как вывести процент автоматической и ручной скидки на печать, как правильно доработать запрос и макет печатной формы, а также выясним, почему при редактировании макета может «сломаться» сетка и пропасть колонка Сумма.

Шаг 1. Проверка стандартных настроек системы

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

Выполним следующие действия в интерфейсе программы:

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

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

Шаг 2. Добавление полей скидок в запрос печатной формы

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

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

Проанализируем пример составления такого математического расчета в запросе. Нам необходимо вычислить процент скидки от первоначальной стоимости товара (до скидки). Первоначальная стоимость складывается из текущей суммы строки и сумм предоставленных скидок.

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


ВЫБОР
    КОГДА ТЧТовары.Сумма + ТЧТовары.СуммаАвтоматическойСкидки + ТЧТовары.СуммаРучнойСкидки = 0
        ТОГДА 0
    ИНАЧЕ ВЫРАЗИТЬ((ТЧТовары.СуммаАвтоматическойСкидки / (ТЧТовары.Сумма + ТЧТовары.СуммаАвтоматическойСкидки + ТЧТовары.СуммаРучнойСкидки)) * 100 КАК ЧИСЛО(15, 2))
КОНЕЦ КАК ПроцентАвтоматическойСкидки,

ВЫБОР
    КОГДА ТЧТовары.Сумма + ТЧТовары.СуммаАвтоматическойСкидки + ТЧТовары.СуммаРучнойСкидки = 0
        ТОГДА 0
    ИНАЧЕ ВЫРАЗИТЬ((ТЧТовары.СуммаРучнойСкидки / (ТЧТовары.Сумма + ТЧТовары.СуммаАвтоматическойСкидки + ТЧТовары.СуммаРучнойСкидки)) * 100 КАК ЧИСЛО(15, 2))
КОНЕЦ КАК ПроцентРучнойСкидки

Важный нюанс при работе с пакетами запросов: Запросы в модулях печати 1С практически никогда не бывают простыми однострочными выборками. Как правило, они состоят из пакета запросов с использованием временных таблиц (например, ВТ_ТоварыДокумента). Если мы добавим поля расчетов только в самый последний (финальный) запрос пакета, система выдаст ошибку, так как этих полей нет в предшествующих временных таблицах.

Разберем по шагам, как правильно «протащить» новое поле через пакет запросов:

  1. Найдем первый запрос в пакете, который обращается к табличной части Документ.РеализацияТоваровУслуг.Товары.
  2. Добавим в список выбора этого запроса наши поля ПроцентАвтоматическойСкидки и ПроцентРучнойСкидки (или рассчитаем их там).
  3. Поместим эти поля во временную таблицу (например, укажем их в секции ПОМЕСТИТЬ ВТ_Товары).
  4. Во всех последующих запросах пакета, которые читают данные из этой временной таблицы, также обязательно указываем эти поля в списке выбора, передавая их до самого финального запроса, из которого формируется выборка для вывода в макет.

Шаг 3. Работа с макетом и решение проблемы сдвига колонок

После того как поля добавлены в запрос и успешно возвращаются в выборке данных в коде модуля, нам необходимо отобразить их в визуальной сетке макета. На этом этапе разработчики часто совершают ошибку, из-за которой «ломается» структура документа и пропадает колонка Сумма.

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

Чтобы избежать этой проблемы и правильно добавить колонку скидки, выполним следующие шаги:

  1. Откроем макет печатной формы в конфигураторе.
  2. Выделим колонку целиком по ее буквенному или числовому индексу на самой верхней панели координат (например, кликнем по колонке G). Нам нужно выбрать область, в которую мы хотим вставить скидку (например, перед колонкой Сумма).
  3. Нажмем правую кнопку мыши и в контекстном меню выберем команду Раздвинуть (или выберем в главном меню Таблица -> Изменить -> Раздвинуть). Это действие добавит новую пустую колонку по всей высоте макета, сохранив выравнивание всех остальных элементов.
  4. В области ШапкаТаблицы в новой ячейке напишем текст заголовка: "Скидка %".
  5. В области Строка в созданной ячейке откроем свойства (клавиша F4). В поле Заполнение переключим значение со Текст на Параметр. В поле Параметр впишем точное имя поля из нашего запроса: ПроцентАвтоматическойСкидки или ПроцентРучнойСкидки (помните, что регистр букв имеет значение!).
  6. В областях макета, где новая колонка не должна отображаться (например, в заголовке документа «Счет на оплату №...» или в подвале в личных подписях), выделим разделившиеся ячейки и объединим их обратно с помощью команды Объединить (или клавиш Alt + Shift + M).

После проведения этих манипуляций сетка табличного документа останется ровной, а колонка Сумма вернется на свое законное место.

Шаг 4. Использование внешних печатных форм (ВПФ)

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

Создание внешней печатной формы позволяет полностью изолировать код доработки. Рассмотрим структуру программного кода модуля объекта внешней печатной формы, которая подключается через справочник «Дополнительные отчеты и обработки»:


Функция СведенияОВнешнейОбработке() Экспорт

    ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработкеРегистрации();
    
    МассивНазначений = Новый Массив;
    МассивНазначений.Добавить("Документ.РеализацияТоваровУслуг"); // Указываем тип документа
    
    ПараметрыРегистрации.Вставить("Вид", ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиПечатнаяФорма());
    ПараметрыРегистрации.Вставить("Назначение", МассивНазначений);
    ПараметрыРегистрации.Вставить("Наименование", "Реализация товаров со скидками (внешняя)");
    ПараметрыРегистрации.Вставить("Версия", "1.0");
    ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь);
    
    Команды = ПараметрыРегистрации.Команды;
    НоваяКоманда = Команды.Добавить();
    НоваяКоманда.Представление = "Реализация товаров со скидками";
    НоваяКоманда.Идентификатор = "РеализацияСоСкидками";
    НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода();
    НоваяКоманда.ПоказыватьОповещение = Истина;
    НоваяКоманда.Модификатор = "ПечатьMXL";
    
    Возврат ПараметрыРегистрации;

КонецФункции

Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт

    ПараметрыПечати = Новый Структура;
    
    ТабличныйДокумент = СформироватьПечатнуюФорму(МассивОбъектов, ОбъектыПечати, ПараметрыПечати);
    
    ПечатнаяФорма = ДополнительныеОтчетыИОбработки.СведенияОПечатнойФорме(КоллекцияПечатныхФорм, "РеализацияСоСкидками");
    Если ПечатнаяФорма <> Неопределено Тогда
        ПечатнаяФорма.ТабличныйДокумент = ТабличныйДокумент;
    КонецЕсли;

КонецПроцедуры

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

← На главную