При оформлении продаж в торговых конфигурациях 1С (таких как «Управление торговлей», «ERP Управление предприятием» или «Комплексная автоматизация») компании активно используют системы лояльности. Автоматические и ручные скидки рассчитываются в документах и напрямую влияют на конечную стоимость товаров. Однако при выводе документов на печать (например, расходной накладной или счета на оплату) пользователи часто сталкиваются с тем, что колонки с процентами скидок остаются пустыми или вовсе отсутствуют в печатной форме.
В этой статье мы подробно разберем, как вывести процент автоматической и ручной скидки на печать, как правильно доработать запрос и макет печатной формы, а также выясним, почему при редактировании макета может «сломаться» сетка и пропасть колонка Сумма.
Прежде чем приступать к изменению программного кода, проверим штатные возможности конфигурации. Разработчики фирмы 1С уже предусмотрели механизмы вывода скидок в печатные формы, но по умолчанию они могут быть отключены в настройках администрирования.
Выполним следующие действия в интерфейсе программы:
Если после включения этой опции скидки в стандартных формах по-прежнему не выводятся, либо если вы используете сильно измененную (кастомизированную) конфигурацию или индивидуальный макет, нам потребуется внести изменения на уровне запроса и макета.
Рассмотрим техническую сторону проблемы. Главная причина, по которой данные не выводятся в печатную форму, заключается в том, что в результирующем запросе схемы печати отсутствуют поля ПроцентАвтоматическойСкидки и ПроцентРучнойСкидки. Программа просто не выбирает эти данные из базы данных при формировании выборки.
Важно помнить, что в некоторых прикладных решениях 1С проценты скидок не хранятся в физических таблицах базы данных в готовом виде. Вместо этого в табличной части Товары документов продаж хранятся только суммы скидок: СуммаРучнойСкидки и СуммаАвтоматическойСкидки, а также итоговая Сумма строки. В таком случае нам нужно самостоятельно рассчитать процент непосредственно в тексте запроса.
Проанализируем пример составления такого математического расчета в запросе. Нам необходимо вычислить процент скидки от первоначальной стоимости товара (до скидки). Первоначальная стоимость складывается из текущей суммы строки и сумм предоставленных скидок.
Напишем безопасное выражение для запроса, которое исключает ошибку деления на ноль:
ВЫБОР
КОГДА ТЧТовары.Сумма + ТЧТовары.СуммаАвтоматическойСкидки + ТЧТовары.СуммаРучнойСкидки = 0
ТОГДА 0
ИНАЧЕ ВЫРАЗИТЬ((ТЧТовары.СуммаАвтоматическойСкидки / (ТЧТовары.Сумма + ТЧТовары.СуммаАвтоматическойСкидки + ТЧТовары.СуммаРучнойСкидки)) * 100 КАК ЧИСЛО(15, 2))
КОНЕЦ КАК ПроцентАвтоматическойСкидки,
ВЫБОР
КОГДА ТЧТовары.Сумма + ТЧТовары.СуммаАвтоматическойСкидки + ТЧТовары.СуммаРучнойСкидки = 0
ТОГДА 0
ИНАЧЕ ВЫРАЗИТЬ((ТЧТовары.СуммаРучнойСкидки / (ТЧТовары.Сумма + ТЧТовары.СуммаАвтоматическойСкидки + ТЧТовары.СуммаРучнойСкидки)) * 100 КАК ЧИСЛО(15, 2))
КОНЕЦ КАК ПроцентРучнойСкидки
Важный нюанс при работе с пакетами запросов: Запросы в модулях печати 1С практически никогда не бывают простыми однострочными выборками. Как правило, они состоят из пакета запросов с использованием временных таблиц (например, ВТ_ТоварыДокумента). Если мы добавим поля расчетов только в самый последний (финальный) запрос пакета, система выдаст ошибку, так как этих полей нет в предшествующих временных таблицах.
Разберем по шагам, как правильно «протащить» новое поле через пакет запросов:
Документ.РеализацияТоваровУслуг.Товары.ПроцентАвтоматическойСкидки и ПроцентРучнойСкидки (или рассчитаем их там).ПОМЕСТИТЬ ВТ_Товары).После того как поля добавлены в запрос и успешно возвращаются в выборке данных в коде модуля, нам необходимо отобразить их в визуальной сетке макета. На этом этапе разработчики часто совершают ошибку, из-за которой «ломается» структура документа и пропадает колонка Сумма.
Выясним причину этой проблемы. Макет табличного документа 1С (формат MXL) имеет единую неделимую сетку колонок по всей вертикали. Если мы просто добавим новую колонку для скидки в области строки (секция Строка или Детали) путем раздвижения ячеек вручную, то сетка колонок сдвинется вправо. При этом шапка таблицы (секция ШапкаТаблицы) и подвал с итогами (секция ПодвалТаблицы) останутся на старых координатах. В результате колонка Сумма в строках сдвинется на одну позицию вправо, а в шапке и подвале останется на месте. Визуально данные перемешаются, а колонка Сумма в конце таблицы может просто исчезнуть, уйдя за правую границу области печати.
Чтобы избежать этой проблемы и правильно добавить колонку скидки, выполним следующие шаги:
G). Нам нужно выбрать область, в которую мы хотим вставить скидку (например, перед колонкой Сумма).ШапкаТаблицы в новой ячейке напишем текст заголовка: "Скидка %".Строка в созданной ячейке откроем свойства (клавиша F4). В поле Заполнение переключим значение со Текст на Параметр. В поле Параметр впишем точное имя поля из нашего запроса: ПроцентАвтоматическойСкидки или ПроцентРучнойСкидки (помните, что регистр букв имеет значение!).Alt + Shift + M).После проведения этих манипуляций сетка табличного документа останется ровной, а колонка Сумма вернется на свое законное место.
Как справедливо заметили участники обсуждения на форуме, любые изменения в стандартных макетах и запросах конфигурации лучше всего реализовывать через механизм Внешних печатных форм. Если вносить изменения непосредственно в основную конфигурацию, то при первом же автоматическом обновлении программы все ваши доработки макетов будут перезаписаны стандартными объектами поставщика.
Создание внешней печатной формы позволяет полностью изолировать код доработки. Рассмотрим структуру программного кода модуля объекта внешней печатной формы, которая подключается через справочник «Дополнительные отчеты и обработки»:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработкеРегистрации();
МассивНазначений = Новый Массив;
МассивНазначений.Добавить("Документ.РеализацияТоваровУслуг"); // Указываем тип документа
ПараметрыРегистрации.Вставить("Вид", ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиПечатнаяФорма());
ПараметрыРегистрации.Вставить("Назначение", МассивНазначений);
ПараметрыРегистрации.Вставить("Наименование", "Реализация товаров со скидками (внешняя)");
ПараметрыРегистрации.Вставить("Версия", "1.0");
ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь);
Команды = ПараметрыРегистрации.Команды;
НоваяКоманда = Команды.Добавить();
НоваяКоманда.Представление = "Реализация товаров со скидками";
НоваяКоманда.Идентификатор = "РеализацияСоСкидками";
НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода();
НоваяКоманда.ПоказыватьОповещение = Истина;
НоваяКоманда.Модификатор = "ПечатьMXL";
Возврат ПараметрыРегистрации;
КонецФункции
Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
ПараметрыПечати = Новый Структура;
ТабличныйДокумент = СформироватьПечатнуюФорму(МассивОбъектов, ОбъектыПечати, ПараметрыПечати);
ПечатнаяФорма = ДополнительныеОтчетыИОбработки.СведенияОПечатнойФорме(КоллекцияПечатныхФорм, "РеализацияСоСкидками");
Если ПечатнаяФорма <> Неопределено Тогда
ПечатнаяФорма.ТабличныйДокумент = ТабличныйДокумент;
КонецЕсли;
КонецПроцедуры
В функции СформироватьПечатнуюФорму() мы пишем логику получения данных (наш модифицированный запрос с расчетом процентов скидок) и алгоритм заполнения макета, который мы сохранили внутри нашей внешней обработки. Таким образом, основная конфигурация остается полностью типовой и легко обновляется, а пользователи получают необходимую печатную форму с автоматическими и ручными скидками.