Программная оплата бонусными баллами в 1С: УТ 11

29.12.25

Задачи пользователя - Адаптация типовых решений

В данной статье приведён пример кода для реализации программного заполнения бонусных баллов к списанию в заказе клиента.

Часто возникает ситуация, когда нужно создавать заказ программно. В типовых конфигурациях предусмотрено много механизмов, чтобы заполнить все поля заказа нужными данными по аналогии тому, как это происходит при создании заказа из интерфейса. Однако, если компания использует программы лояльности с начислением и списанием бонусных баллов, разработчики 1С: УТ (11.5.17.234) почему-то забыли сделать механизм для программного заполнения бонусных баллов к списанию в строках товаров.

Эту несправедливость однажды пришлось исправлять мне в моей работе и сейчас я помогу исправить её вам, чтобы не пришлось лишний раз искать всё это в типовом коде.

На самом деле все механизмы по заполнению полей списания бонусных баллов уже прописаны в УТ, но они выполняются только на форме ОплатаБонуснымиБаллами. Всё, что нам нужно, это перенести и адаптировать уже существующий механизм из формы в общие модули, чтобы заполнение происходило при вызове одной команды.

Технически нужный нам функционал в данной форме разбит на 2 блока: в ПриСозданииНаСервере происходит инициализация данных и получение общей суммы оплаты. При закрытии формы происходит заполнение табличной заказа по этим данным в процедуре АдресВоВременномХранилище.

Некоторые вспомогательные данные при этом хранятся во временном хранилище между этими двумя событиями. При программном создании нам этого не нужно.

Чтобы сделать процедуру для программного заполнения строк ТЧ Товары СуммаБонусныхБалловКСписанию и СуммаБонусныхБалловКСписаниюВВалюте нам нужно объединить эти два механизма, убрав лишнее. Итоговая процедура будет такой:

Процедура ПрименитьОплатуБонуснымиБаллами(ЗаказОбъект, ДанныеКартыЛояльности)
	
	ВыборкаБонуснаяПрограммаЛояльности = БонусныеБаллыСервер.БонуснаяПрограммаКартыЛояльности(ДанныеКартыЛояльности.Ссылка);
	БонуснаяПрограммаЛояльности = ВыборкаБонуснаяПрограммаЛояльности.БонуснаяПрограммаЛояльности;
	Партнер                     = ЗаказОбъект.Партнер;
	
	ВалютаДокумента         = ЗаказОбъект.Валюта;
	ВалютаБонуснойПрограммы = ВыборкаБонуснаяПрограммаЛояльности.Валюта;
	
	СтруктураКурсовВалютыДокумента         = РаботаСКурсамиВалютУТ.ПолучитьКурсВалюты(ВалютаДокумента,         ТекущаяДатаСеанса());
	СтруктураКурсовВалютыБонуснойПрограммы = РаботаСКурсамиВалютУТ.ПолучитьКурсВалюты(ВалютаБонуснойПрограммы, ТекущаяДатаСеанса());
	КурсКонвертацииБонусовВВалюту          = ВыборкаБонуснаяПрограммаЛояльности.КурсКонвертацииБонусовВВалюту;
	
	// Расчет максимальной суммы оплаты бонусами
	ТабличнаяЧастьТовары = ЗаказОбъект.Товары.Выгрузить(); // ТабличнаяЧасть, ТаблицаЗначений
	ТабличнаяЧастьТовары.Колонки.Добавить("МаксимальнаяСуммаОплаты", ОбщегоНазначенияУТ.ОписаниеТипаДенежногоПоля());
	ТабличнаяЧастьТовары.Колонки.Добавить("МаксимальнаяСуммаОплатыВБаллах", ОбщегоНазначенияУТ.ОписаниеТипаДенежногоПоля());
	
	Запрос = Новый Запрос("ВЫБРАТЬ
	|	Товары.НомерСтроки КАК НомерСтроки,
	|	Товары.КлючСвязи КАК КлючСвязи,
	|	ВЫРАЗИТЬ(Товары.Номенклатура КАК Справочник.Номенклатура) КАК Номенклатура,
	|	Товары.Характеристика КАК Характеристика,
	|	Товары.КоличествоУпаковок КАК КоличествоУпаковок,
	|	Товары.Цена КАК ЦенаЗаУпаковку,
	|	Товары.ПроцентАвтоматическойСкидки КАК ПроцентАвтоматическойСкидки,
	|	Товары.СуммаАвтоматическойСкидки КАК СуммаАвтоматическойСкидки
	|ПОМЕСТИТЬ ВременнаяТаблицаТовары
	|ИЗ
	|	&Товары КАК Товары
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	Товары.НомерСтроки КАК НомерСтроки,
	|	Товары.КлючСвязи КАК КлючСвязи,
	|	Товары.Номенклатура КАК Номенклатура,
	|	Товары.Характеристика КАК Характеристика,
	|	Товары.КоличествоУпаковок КАК КоличествоУпаковок,
	|	ЕСТЬNULL(ЕСТЬNULL(ТабличнаяЧастьЦеновыеГруппы.МаксимальныйПроцентОплатыБонусами,
	|		БонусныеПрограммыЛояльности.МаксимальныйПроцентОплатыБонусами), 0) КАК МаксимальныйПроцентОплатыБонусами,
	|	Товары.КоличествоУпаковок * Товары.ЦенаЗаУпаковку КАК Сумма,
	|	Товары.ПроцентАвтоматическойСкидки КАК ПроцентАвтоматическойСкидки,
	|	Товары.СуммаАвтоматическойСкидки КАК СуммаАвтоматическойСкидки,
	|	ВЫБОР
	|		КОГДА БонусныеПрограммыЛояльности.СегментНоменклатуры <> ЗНАЧЕНИЕ(Справочник.СегментыНоменклатуры.ПустаяСсылка)
	|			ТОГДА ВЫБОР
	|				КОГДА НоменклатураСегмента.Сегмент = БонусныеПрограммыЛояльности.СегментНоменклатуры
	|					ТОГДА ИСТИНА
	|				ИНАЧЕ ЛОЖЬ
	|			КОНЕЦ
	|		ИНАЧЕ ИСТИНА
	|	КОНЕЦ КАК ВходитВДоступныйСегмент,
	|	БонусныеПрограммыЛояльности.БезУчетаПредоставленныхСкидок
	|ИЗ
	|	ВременнаяТаблицаТовары КАК Товары
	|		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.БонусныеПрограммыЛояльности.ЦеновыеГруппы КАК ТабличнаяЧастьЦеновыеГруппы
	|		ПО (ТабличнаяЧастьЦеновыеГруппы.Ссылка = &БонуснаяПрограммаЛояльности)
	|		И (ТабличнаяЧастьЦеновыеГруппы.ЦеноваяГруппа = Товары.Номенклатура.ЦеноваяГруппа)
	|		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.БонусныеПрограммыЛояльности КАК БонусныеПрограммыЛояльности
	|		ПО (БонусныеПрограммыЛояльности.Ссылка = &БонуснаяПрограммаЛояльности)
	|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.НоменклатураСегмента КАК НоменклатураСегмента
	|		ПО Товары.Номенклатура = НоменклатураСегмента.Номенклатура
	|		И Товары.Характеристика = НоменклатураСегмента.Характеристика
	|		И НоменклатураСегмента.Сегмент = БонусныеПрограммыЛояльности.СегментНоменклатуры");
	
	Запрос.УстановитьПараметр("Товары", ТабличнаяЧастьТовары);
	Запрос.УстановитьПараметр("БонуснаяПрограммаЛояльности", БонуснаяПрограммаЛояльности);
	Выборка = Запрос.Выполнить().Выбрать();
	
	Пока Выборка.Следующий() Цикл
		
		Если Не Выборка.МаксимальныйПроцентОплатыБонусами > 0 Тогда
			Продолжить;
		КонецЕсли;
		
		Если Не Выборка.ВходитВДоступныйСегмент Тогда
			Продолжить;
		КонецЕсли;
		
		Если Не Выборка.БезУчетаПредоставленныхСкидок 
			И Выборка.ПроцентАвтоматическойСкидки > Выборка.МаксимальныйПроцентОплатыБонусами Тогда
			Продолжить;
		КонецЕсли;
		
		СтрокаТЧ = ТабличнаяЧастьТовары.Найти(Выборка.НомерСтроки, "НомерСтроки");
		
		Если Выборка.БезУчетаПредоставленныхСкидок Тогда
			СтрокаТЧ.МаксимальнаяСуммаОплаты = (Выборка.МаксимальныйПроцентОплатыБонусами / 100) * (Выборка.Сумма-Выборка.СуммаАвтоматическойСкидки);
		Иначе
			СтрокаТЧ.МаксимальнаяСуммаОплаты = ((Выборка.МаксимальныйПроцентОплатыБонусами - Выборка.ПроцентАвтоматическойСкидки) / 100) * Выборка.Сумма;
		КонецЕсли;
		
		СтрокаТЧ.МаксимальнаяСуммаОплатыВБаллах = РаботаСКурсамиВалютУТ.ПересчитатьПоКурсу(
			СтрокаТЧ.МаксимальнаяСуммаОплаты,
			СтруктураКурсовВалютыДокумента,
			СтруктураКурсовВалютыБонуснойПрограммы) / КурсКонвертацииБонусовВВалюту;
		
	КонецЦикла;
		
	ОстаткиБонусныхБаллов = БонусныеБаллыСервер.ОстаткиИДвиженияБонусныхБаллов(БонуснаяПрограммаЛояльности, Партнер);
	НачальныйОстатокВБаллах = ОстаткиБонусныхБаллов[0].Сумма;
	
	НачальныйОстаток = РаботаСКурсамиВалютУТ.ПересчитатьПоКурсу(
		НачальныйОстатокВБаллах * КурсКонвертацииБонусовВВалюту,
		СтруктураКурсовВалютыБонуснойПрограммы,
		СтруктураКурсовВалютыДокумента);
	
	МаксимальнаяСуммаОплаты        = Мин(ТабличнаяЧастьТовары.Итог("МаксимальнаяСуммаОплаты"), НачальныйОстаток);
	МаксимальнаяСуммаОплатыВБаллах = Мин(ТабличнаяЧастьТовары.Итог("МаксимальнаяСуммаОплатыВБаллах"), НачальныйОстатокВБаллах);
	
	СуммаОплаты        = МаксимальнаяСуммаОплаты;
	СуммаОплатыВБаллах = МаксимальнаяСуммаОплатыВБаллах;
	
	//далее из другой функции
	
	СуммаКРаспределению = СуммаОплатыВБаллах;
	СуммаКРаспределениюВВалюте = СуммаОплаты;
	
	МаксимальнаяСуммаОплатыВБаллах = ТабличнаяЧастьТовары.Итог("МаксимальнаяСуммаОплатыВБаллах");
	
	Для каждого СтрокаТЧ Из ТабличнаяЧастьТовары Цикл
		
		Если МаксимальнаяСуммаОплатыВБаллах <= 0 Тогда
			Прервать;
		КонецЕсли;
		
        ТекСуммаБонусныхБалловКСписанию = СтрокаТЧ.МаксимальнаяСуммаОплатыВБаллах * (СуммаКРаспределению / МаксимальнаяСуммаОплатыВБаллах);
		СтрокаТЧ.СуммаБонусныхБалловКСписанию = Мин(ТекСуммаБонусныхБалловКСписанию, СуммаКРаспределению);
		
		ТекСуммаБонусныхБалловКСписаниюВВалюте = РаботаСКурсамиВалютУТ.ПересчитатьПоКурсу(
			СтрокаТЧ.СуммаБонусныхБалловКСписанию * КурсКонвертацииБонусовВВалюту,
			СтруктураКурсовВалютыБонуснойПрограммы,
			СтруктураКурсовВалютыДокумента);
		СтрокаТЧ.СуммаБонусныхБалловКСписаниюВВалюте = Мин(ТекСуммаБонусныхБалловКСписаниюВВалюте, СуммаКРаспределениюВВалюте);
		
		СуммаКРаспределению = СуммаКРаспределению - СтрокаТЧ.СуммаБонусныхБалловКСписанию;
		МаксимальнаяСуммаОплатыВБаллах = МаксимальнаяСуммаОплатыВБаллах - СтрокаТЧ.МаксимальнаяСуммаОплатыВБаллах;

		СуммаКРаспределениюВВалюте = СуммаКРаспределениюВВалюте - СтрокаТЧ.СуммаБонусныхБалловКСписаниюВВалюте;
		
	КонецЦикла;
	
	ЗаказОбъект.Товары.Загрузить(ТабличнаяЧастьТовары);
	
КонецПроцедуры

Вставляете её вызов после всех обработок строк ТЧ и до вызова СкидкиНаценкиЗаполнениеСервер.Рассчитать и всё будет работать.

Вступайте в нашу телеграмм-группу Инфостарт

оплата бонусными баллами заполнение заказа рассчитать скидки списание бонусных баллов оплата бонусами списание бонусов бонусы бонусные баллы программа лояльности

См. также

Разработка Инструментарий разработчика Работа с интерфейсом Адаптация типовых решений Нейросети 1C:Бухгалтерия 1C:ERP 1С:ЗУП 1С:КА 1С:УНФ 1С:УТ 1С:Розница 1С:ДО 1С:ERP Управление предприятием 2 Платные (руб)

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

36600 руб.

28.08.2025    5032    2    2    

5

Адаптация типовых решений 1С:Предприятие 8 1С:Документооборот Россия Платные (руб)

Расширение конфигурации для «1С:Документооборот КОРП», редакция 3.0. позволяет: 1.использовать произвольные табличные части в качестве дополнительных реквизитов к документу; 2 использовать произвольные табличные части в шаблонах в формате docx для автоматического заполнения таблиц.

32330 руб.

29.06.2023    10754    31    15    

39

Печатные формы Адаптация типовых решений Бухгалтер Пользователь 1С:Предприятие 8 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Платные (руб)

Расширение позволяет вывести в табличном документе факсимиле печати и подписей и/или вывести произвольную картинку из прикреплённых файлов организации для 1С УТ 11.5, КА 2.5, ERP 2.5, УНФ 3, Розница 3. Вывод факсимиле возможен в табличные документы УПД, УКД, Счёт-фактура, ТОРГ-12 и другие. Возможно настроить вывод для любых типовых макетов (Акт сверки, М-15, ТТН), для этого потребуется отредактировать макет и разместить на нём картинки с соответствующими именами, при выводе на печать в размещённые картинки будут выводиться факсимиле из прикреплённых рисунков. Редактирование осуществляется через типовой механизм в пользовательском интерфейсе.

5084 руб.

07.02.2023    11441    107    20    

64

Адаптация типовых решений 1С 8.3 1С:Бухгалтерия 3.0 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Беларусь Россия Платные (руб)

Расширение "Дополнительные документы" предназначено для создания дополнительных документов различного назначения, как форм для внесения данных так и печатных форм в расширяемой конфигурации пользовательскими средствами, без работы в конфигураторе и внесения изменений в структуру данных. Тестировалось для "1С:БП", "1С:УНФ","1С:КА"

21859 руб.

29.12.2025    439    1    6    

1

Банковские операции Адаптация типовых решений Бухгалтер Пользователь 1С:Предприятие 8 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Платные (руб)

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

9760 руб.

17.06.2025    2463    6    0    

6

Логистика, склад и ТМЦ Адаптация типовых решений Пользователь 1С:Предприятие 8 1С:Управление нашей фирмой 1.6 1С:Управление нашей фирмой 3.0 Россия Управленческий учет Платные (руб)

Чтобы не допустить путаницы с обещаниями клиентам и для четкого контроля исполнения заказов мы используем резервирование товаров. Расширение для УНФ, чтобы автоматически отменять старые резервы и не мешалть эффективно продавать.

9150 руб.

02.08.2023    7268    24    5    

40
Для отправки сообщения требуется регистрация/авторизация