Разработка и редактирование печатных форм ценников и этикеток — одна из самых частых задач, с которой сталкиваются программисты и администраторы систем на платформе 1С:Предприятие 8. Очень часто от пользователей или клиентов поступает вполне логичное требование: выводить цену товара строго с копейками, даже если копейки нулевые (например, 1600.00 РУБ. вместо дефолтных 1600 РУБ.). Однако при попытке настроить макет ценника стандартными средствами разработчики сталкиваются с тем, что платформа упорно отбрасывает дробную часть, если она равна нулю.
В этой статье мы подробно разберем, почему возникает такое поведение платформы, проанализируем различия в заполнении ячеек табличного документа и рассмотрим несколько эффективных способов решения этой проблемы — от простых интерактивных настроек макета до программной доработки кода печати.
Рассмотрим стандартный механизм работы ячеек табличного документа 1С. В свойствах ячейки макета за ее наполнение отвечает свойство Заполнение, которое может принимать три значения: Текст, Параметр и Шаблон.
Когда разработчик хочет вывести в одной ячейке и саму цену, и валюту (например, написать [Цена] руб.), он устанавливает тип заполнения Шаблон. В этом режиме платформа выполняет следующие действия:
Цена).1600).Главная проблема заключается в том, что при неявном преобразовании числа в строку платформа 1С всегда отбрасывает незначащие нули в дробной части. Настроить формат вывода отдельного параметра внутри шаблона с помощью свойств самой ячейки интерактивно невозможно. Свойство ячейки Формат применяется только к конечному результату. А поскольку результатом сборки шаблона является обычная текстовая строка (а не число), то числовой конструктор формата к ней просто не применяется.
Давайте подробно рассмотрим, как обойти это ограничение платформы.
Это самый простой, чистый и рекомендуемый способ, не требующий написания программного кода. Суть метода заключается в отказе от использования текстовых шаблонов внутри одной ячейки в пользу строгого использования параметров.
Выполним настройку по шагам:
Цена.2. Это принудительно заставит платформу выводить два знака после запятой (копейки)... В форматной строке это запишется как ЧРД='.'. Это позволит игнорировать региональные настройки Windows на компьютерах пользователей.ЧЦ=15; ЧДЦ=2; ЧРД='.' (где ЧЦ — общее число знаков, а ЧДЦ — число знаков дробной части).Но как же быть с выводом валюты («руб.»), если мы убрали ее из ячейки? Для этого применим проверенную практику, которая используется в большинстве типовых конфигураций 1С (например, в «Управлении торговлей 11»):
Цена с настроенным форматом, как мы описали выше. Выровняйте текст в этой ячейке по правому краю.руб. или используйте параметр валюты. Выровняйте его по левому краю.Если макет ценника формируется динамически или его структура не позволяет разбить цену на две ячейки (например, жестко заданы размеры областей), мы можем подготовить форматированную строку программно в коде обработки печати.
Разберем ситуацию, когда данные подготавливаются в модуле обработки печати (например, в обработке ПечатьЭтикетокИЦенников). Вместо передачи числового значения в параметр макета, мы передадим туда уже готовую строковую переменную, собранную по нашим правилам.
Проанализируем пример кода:
// Предположим, у нас есть выборка данных товаров ВыборкаСтрок
ЦенаЧислом = ВыборкаСтрок.Цена;
// Преобразуем число в строку с жестким форматом: 2 знака дробной части, разделитель - точка
ЦенаСтрокой = Формат(ЦенаЧислом, "ЧЦ=15; ЧДЦ=2; ЧРД='.'");
// Прибавляем к полученной строке обозначение валюты
ИтоговыйТекстЦены = ЦенаСтрокой + " руб.";
// Заполняем параметр в области макета
ОбластьМакета.Параметры.Цена = ИтоговыйТекстЦены;
При таком подходе в свойствах ячейки макета должно быть установлено заполнение Параметр (имя параметра — Цена). Платформа получит уже готовую текстовую строку "1600.00 руб." и выведет ее «как есть», ничего не усекая и не округляя.
В современных типовых конфигурациях 1С печать ценников реализована через сложные механизмы компоновки данных (СКД). Чтобы не снимать конфигурацию с поддержки и не мешать последующим обновлениям, правильнее всего внедрить доработку через расширение конфигурации.
Вся логика заполнения параметров ценников обычно находится в модуле менеджера обработки ПечатьЭтикетокИЦенников. Мы можем перехватить заполнение параметров непосредственно в момент формирования областей табличного документа.
Рассмотрим пример кода для расширения (метод «После» или «Вместо» для процедуры формирования печатных форм):
&Вместо("ПодготовитьДанныеДляПечати")
Функция ИмяРасширения_ПодготовитьДанныеДляПечати(ПараметрыПечати)
// Вызываем оригинальный алгоритм заполнения данных
РезультатЗаполнения = ПродолжитьВызов(ПараметрыПечати);
// Производим постобработку сформированного табличного документа
ТабДок = РезультатЗаполнения.ТабличныйДокумент;
Для Строка = 1 По ТабДок.ВысотаТаблицы Цикл
Для Колонка = 1 По ТабДок.ШиринаТаблицы Цикл
Ячейка = ТабДок.Область(Строка, Колонка);
// Если в ячейке находится текст шаблона, содержащий валюту, но без копеек
Если Найти(Ячейка.Текст, " руб.") > 0 Тогда
// Извлекаем числовое значение, форматируем его и записываем обратно
ТекущийТекст = Ячейка.Текст;
ЧисловойТекст = СтрЗаменить(ТекущийТекст, " руб.", "");
// Пробуем преобразовать очищенный текст в число
Попытка
ЧислоЦены = Число(ЧисловойТекст);
НовыйТекст = Формат(ЧислоЦены, "ЧЦ=15; ЧДЦ=2; ЧРД='.'") + " руб.";
Ячейка.Текст = НовыйТекст;
Исключение
// Если в ячейке был сложный текст, оставляем без изменений
КонецПопытки;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Возврат РезультатЗаполнения;
КонецФункции
Этот способ гарантирует, что даже если пользователи создадут собственный макет с типом заполнения «Шаблон», система автоматически переформатирует вывод цен перед отправкой документа на принтер.
Мы проанализировали проблему исчезновения нулевых копеек в ценниках 1С и изучили три надежных способа ее решения. Для большинства задач идеальным выбором будет Решение 1 (использование типа ячейки «Параметр» совместно с настройкой форматной строки в палитре свойств 1С). Оно не требует изменения кода и легко поддерживается силами обычных администраторов или опытных пользователей. Если же дизайн ценника накладывает жесткие рамки на структуру ячеек, программное форматирование через код обработки или расширение решит эту задачу быстро и надежно.