База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › Как получить остаток бонусных баллов из регистра в 1С:УТ 11.5? › Ответ в теме: Как получить остаток бонусных баллов из регистра в 1С:УТ 11.5?
В УТ 11.5 остаток бонусов обычно получают из виртуальной таблицы регистра накопления:
РегистрНакопления.БонусныеБаллы.Остатки
Основные аналитики, как правило:
— Партнер
— БонуснаяПрограммаЛояльности
Ресурс регистра обычно называется Сумма.
## Получение остатка по партнеру и бонусной программе
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
Функция ПолучитьОстатокБонусныхБаллов(Партнер, БонуснаяПрограммаЛояльности, ДатаОстатков = Неопределено) Экспорт Если Не ЗначениеЗаполнено(ДатаОстатков) Тогда ДатаОстатков = ТекущаяДатаСеанса(); КонецЕсли; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Остатки.БонуснаяПрограммаЛояльности КАК БонуснаяПрограммаЛояльности, | Остатки.Партнер КАК Партнер, | Остатки.СуммаОстаток КАК ОстатокБонусныхБаллов |ИЗ | РегистрНакопления.БонусныеБаллы.Остатки( | &ДатаОстатков, | Партнер = &Партнер | И БонуснаяПрограммаЛояльности = &БонуснаяПрограммаЛояльности | ) КАК Остатки"; Запрос.УстановитьПараметр("ДатаОстатков", ДатаОстатков); Запрос.УстановитьПараметр("Партнер", Партнер); Запрос.УстановитьПараметр("БонуснаяПрограммаЛояльности", БонуснаяПрограммаЛояльности); Выборка = Запрос.Выполнить().Выбрать(); Если Выборка.Следующий() Тогда Возврат Выборка.ОстатокБонусныхБаллов; КонецЕсли; Возврат 0; КонецФункции |
Пример вызова:
|
1 2 3 4 5 6 |
ОстатокБонусов = ПолучитьОстатокБонусныхБаллов( Партнер, БонуснаяПрограммаЛояльности ); Сообщить("Остаток бонусов: " + ОстатокБонусов); |
## Получение остатков по всем бонусным программам клиента
Если нужно получить остатки партнера сразу в разрезе всех бонусных программ:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
Функция ПолучитьОстаткиБонусныхБалловПоПартнеру(Партнер, ДатаОстатков = Неопределено) Экспорт Если Не ЗначениеЗаполнено(ДатаОстатков) Тогда ДатаОстатков = ТекущаяДатаСеанса(); КонецЕсли; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Остатки.БонуснаяПрограммаЛояльности КАК БонуснаяПрограммаЛояльности, | Остатки.СуммаОстаток КАК ОстатокБонусныхБаллов |ИЗ | РегистрНакопления.БонусныеБаллы.Остатки( | &ДатаОстатков, | Партнер = &Партнер | ) КАК Остатки |ГДЕ | Остатки.СуммаОстаток > 0"; Запрос.УстановитьПараметр("ДатаОстатков", ДатаОстатков); Запрос.УстановитьПараметр("Партнер", Партнер); Возврат Запрос.Выполнить().Выгрузить(); КонецФункции |
Использование:
|
1 2 3 4 5 6 7 8 9 10 11 |
ТаблицаОстатков = ПолучитьОстаткиБонусныхБалловПоПартнеру(Партнер); Для каждого СтрокаОстатка Из ТаблицаОстатков Цикл Сообщить( СтрокаОстатка.БонуснаяПрограммаЛояльности + ": " + СтрокаОстатка.ОстатокБонусныхБаллов ); КонецЦикла; |
## Вариант без запроса, через типовой серверный метод
В УТ 11.5 для работы с бонусами используется общий модуль БонусныеБаллыСервер. В типовом коде встречается вызов:
|
1 2 3 4 |
ОстаткиБонусныхБаллов = БонусныеБаллыСервер.ОстаткиИДвиженияБонусныхБаллов( БонуснаяПрограммаЛояльности, Партнер ); |
Далее из результата можно получить начальный остаток:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
ОстаткиБонусныхБаллов = БонусныеБаллыСервер.ОстаткиИДвиженияБонусныхБаллов( БонуснаяПрограммаЛояльности, Партнер ); ОстатокБонусов = 0; Если ОстаткиБонусныхБаллов <> Неопределено И ОстаткиБонусныхБаллов.Количество() > 0 Тогда ОстатокБонусов = ОстаткиБонусныхБаллов[0].Сумма; КонецЕсли; |
Этот вариант предпочтительнее, если необходимо повторить типовую логику УТ, поскольку типовой метод может учитывать не только простой остаток регистра, но и движения, особенности списания и расчет доступного остатка.
## Важный момент по структуре регистра
В разных релизах УТ 11.5 состав измерений и точные имена ресурсов могут немного отличаться. Перед использованием запроса проверьте структуру регистра в конфигураторе:
Конфигурация → Регистры накопления → БонусныеБаллы
Проверьте:
— измерение клиента может называться Партнер;
— измерение программы может называться БонуснаяПрограммаЛояльности;
— ресурс может называться Сумма;
— в виртуальной таблице остатка ресурс будет доступен как СуммаОстаток.
Если в вашей базе клиент хранится не в измерении Партнер, а, например, через карту лояльности, сначала нужно получить партнера, связанного с картой:
|
1 |
Партнер = ДанныеКартыЛояльности.Партнер; |
Получать остаток только по партнеру без указания бонусной программы нежелательно, если у клиента может быть несколько программ. В этом случае остатки по разным программам нужно либо выводить отдельными строками, либо явно суммировать их.