Вывод копеек отдельно в макет ценника. Розница 3.0

UPD 2023-06-13: доработал обработку рублей и исправил ошибку в выводе копеек.

Клиент захотел, чтобы в макете копейки выводились отдельно:

К сожалению, с помощью форматирования нельзя выделить дробную часть из числа (недостаток 1С, оставил пожелание).

Поэтому приходится брать в руки код и писать расширение модуля менеджера обработки ПечатьЭтикетокИЦенников:

&Вместо("СформироватьПечатныеФормыЭтикетокИЦенников")
Функция M_СформироватьПечатныеФормыЭтикетокИЦенников(НастройкиПечати, ПечататьЭтикетки, ПечататьЦенники)
	
	КоллекцияПечатныхФорм = ПродолжитьВызов(НастройкиПечати, ПечататьЭтикетки, ПечататьЦенники);
	
	Для Каждого ПечатнаяФорма Из КоллекцияПечатныхФорм Цикл
		ТабличныйДокумент = ПечатнаяФорма.ТабличныйДокумент;
		//Копейки
		Начало = Неопределено;
		Пока истина Цикл
			Область = ТабличныйДокумент.НайтиТекст("#КОП:", Начало);
			Если Область = Неопределено Тогда
				Прервать;
			КонецЕсли;          
			Текст = Область.Текст;
			Текст = СтрЗаменить(Текст, "#КОП:", "");
			Текст = СтрЗаменить(Текст, ",", ".");
			Поз = Найти(Текст, ".");
			Если Поз <> 0 Тогда
				Текст = Сред(Текст, Поз + 1);
			Иначе 
				Текст = "00";
			КонецЕсли;              
			//Добавляем до десятков копеек если после запятой одно число
			Если СтрДлина(Текст) = 1 Тогда
				Текст = Текст + "0";
			КонецЕсли;
			//Попытка
			//Текст = Формат(Число(Текст), "ЧЦ=2; ЧН=00; ЧВН=");
			//Исключение
			//КонецПопытки;
			Область.Текст = Текст;
		КонецЦикла;
		//Рубли
		Начало = Неопределено;
		Пока истина Цикл
			Область = ТабличныйДокумент.НайтиТекст("#РУБ:", Начало);
			Если Область = Неопределено Тогда
				Прервать;
			КонецЕсли;          
			Текст = Область.Текст;
			Текст = СтрЗаменить(Текст, ",", ".");
			Текст = СтрЗаменить(Текст, "#РУБ:", "");
			Поз = Найти(Текст, ".");
			Если Поз <> 0 Тогда
				Текст = Лев(Текст, Поз - 1);
			Иначе 
				Текст = Текст;
			КонецЕсли;
			Попытка
			Текст = Формат(Число(Текст), "ЧН=0");
			Исключение
			КонецПопытки;
			Область.Текст = Текст;
		КонецЦикла;

		//НПП - неразрывные пробелы убираем
		Начало = Неопределено;
		Пока истина Цикл
			Область = ТабличныйДокумент.НайтиТекст("#НПП:", Начало);
			Если Область = Неопределено Тогда
				Прервать;
			КонецЕсли;          
			Текст = Область.Текст;
			Текст = СтрЗаменить(Текст, Символы.НПП, "");
			Текст = СтрЗаменить(Текст, "#НПП:", "");
			Область.Текст = Текст;
		КонецЦикла;

	КонецЦикла;

	
	Возврат КоллекцияПечатныхФорм;
КонецФункции

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

В макете поле выглядит так:

В начале поля добавляю префикс #КОП: подобрал такой префикс, чтобы не встречался в наименованиях товаров.

Для рублей также использую префикс #РУБ: потому что если использовать целочисленный формат, то цена округляется по правилам округления, в форматировании нет возможности получения просто целой части числа.

Также добавил команду-префикс #НПП: которая убирает неразрывные пробелы из ячейки.

Результат я привел в первой картинке этой статьи.

Для УТ 11.4 всё аналогично, только вместо функции — процедура с другим названием и параметрами:

&Вместо("СформироватьПечатныеФормыЭтикетокИЦенниковТоваров")
Процедура дор_СформироватьПечатныеФормыЭтикетокИЦенниковТоваров(ДанныеПечати, ОбъектыПечати, КоллекцияПечатныхФормБСП)
	
	ПродолжитьВызов(ДанныеПечати, ОбъектыПечати, КоллекцияПечатныхФормБСП);

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

Среда: Розница 3.0.3.147, УТ 11.4.13.46

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

Читайте также:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *