Мы используем Розницу 2.1, почти довольны. Один из её недостатков - работа с дисконтными картами.
Если клиент хочет заменить карту, 1С предлагает документ Замена дисконтной карты. В соответствующий РС делается запись. Старая карта не блокируется. При этом не переносятся накопления. Да, есть механизм поиска предыдущих карт и выведение данных с учётом замен, но почему-то он не везде внедрён..
Я решил доработать систему, и добавил в документ Замена карты движения по накоплениям.
В модуле документа в обработке проведения
// Движения по денежным средствам.
МаркетинговыеАкцииСервер.ОтразитьРегистрацияЗаменыКартПокупателей(ДополнительныеСвойства, Движения, Отказ);
//
БонусныеБаллыСервер.ОтразитьБонусныеБаллы(ДополнительныеСвойства, Движения, Отказ);
ПродажиСервер.ОтразитьПродажиПоДисконтнымКартам(ДополнительныеСвойства, Движения, Отказ);
//
В модуле менеджера доработал запрос
Функция ТекстЗапросаТаблицаРегистрацияЗаменыКартПокупателей()
ТекстЗапроса = "ВЫБРАТЬ
| ЗаменаДисконтныхКартКартыПокупателей.Ссылка КАК Ссылка,
| ЗаменаДисконтныхКарт.Дата КАК Период,
| ЗаменаДисконтныхКартКартыПокупателей.КартаИсточник КАК КартаИсточник,
| ЗаменаДисконтныхКартКартыПокупателей.КартаПриемник КАК КартаПриемник
|ПОМЕСТИТЬ Карты
|ИЗ
| Документ.ЗаменаДисконтныхКарт.КартыПокупателей КАК ЗаменаДисконтныхКартКартыПокупателей
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ЗаменаДисконтныхКарт КАК ЗаменаДисконтныхКарт
| ПО ЗаменаДисконтныхКартКартыПокупателей.Ссылка = ЗаменаДисконтныхКарт.Ссылка
|ГДЕ
| ЗаменаДисконтныхКартКартыПокупателей.Ссылка = &Ссылка
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| БонусныеБаллыОстатки.ДисконтнаяКарта,
| БонусныеБаллыОстатки.БонуснаяПрограммаЛояльности,
| БонусныеБаллыОстатки.НачисленоОстаток * -1 КАК Начислено,
| БонусныеБаллыОстатки.КСписаниюОстаток * -1 КАК КСписанию
|ИЗ
| РегистрНакопления.БонусныеБаллы.Остатки(
| ,
| ДисконтнаяКарта В
| (ВЫБРАТЬ
| Карты.КартаИсточник
| ИЗ
| Карты)) КАК БонусныеБаллыОстатки
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Карты КАК Карты
| ПО БонусныеБаллыОстатки.ДисконтнаяКарта = Карты.КартаИсточник
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| Карты.КартаПриемник,
| БонусныеБаллыОстатки.БонуснаяПрограммаЛояльности,
| БонусныеБаллыОстатки.НачисленоОстаток,
| БонусныеБаллыОстатки.КСписаниюОстаток
|ИЗ
| РегистрНакопления.БонусныеБаллы.Остатки(
| ,
| ДисконтнаяКарта В
| (ВЫБРАТЬ
| Карты.КартаИсточник
| ИЗ
| Карты)) КАК БонусныеБаллыОстатки
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Карты КАК Карты
| ПО БонусныеБаллыОстатки.ДисконтнаяКарта = Карты.КартаИсточник
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ПродажиПоДисконтнымКартамОбороты.ДисконтнаяКарта,
| ПродажиПоДисконтнымКартамОбороты.ВладелецДисконтнойКарты,
| -1 * СУММА(ПродажиПоДисконтнымКартамОбороты.СуммаОборот) КАК Сумма,
| -1 * СУММА(ПродажиПоДисконтнымКартамОбороты.КоличествоОборот) КАК Количество
|ИЗ
| РегистрНакопления.ПродажиПоДисконтнымКартам.Обороты(
| ,
| ,
| Период,
| ДисконтнаяКарта В
| (ВЫБРАТЬ
| Карты.КартаИсточник
| ИЗ
| Карты)) КАК ПродажиПоДисконтнымКартамОбороты
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Карты КАК Карты
| ПО ПродажиПоДисконтнымКартамОбороты.ДисконтнаяКарта = Карты.КартаИсточник
|
|СГРУППИРОВАТЬ ПО
| ПродажиПоДисконтнымКартамОбороты.ДисконтнаяКарта,
| ПродажиПоДисконтнымКартамОбороты.ВладелецДисконтнойКарты
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| Карты.КартаПриемник,
| ПродажиПоДисконтнымКартамОбороты.ВладелецДисконтнойКарты,
| СУММА(ПродажиПоДисконтнымКартамОбороты.СуммаОборот),
| СУММА(ПродажиПоДисконтнымКартамОбороты.КоличествоОборот)
|ИЗ
| РегистрНакопления.ПродажиПоДисконтнымКартам.Обороты(
| ,
| ,
| Период,
| ДисконтнаяКарта В
| (ВЫБРАТЬ
| Карты.КартаИсточник
| ИЗ
| Карты)) КАК ПродажиПоДисконтнымКартамОбороты
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Карты КАК Карты
| ПО ПродажиПоДисконтнымКартамОбороты.ДисконтнаяКарта = Карты.КартаИсточник
|
|СГРУППИРОВАТЬ ПО
| ПродажиПоДисконтнымКартамОбороты.ДисконтнаяКарта,
| ПродажиПоДисконтнымКартамОбороты.ВладелецДисконтнойКарты,
| Карты.КартаПриемник
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ЗаменаДисконтныхКартКартыПокупателей.Ссылка КАК Ссылка,
| ЗаменаДисконтныхКарт.Дата КАК Период,
| ЗаменаДисконтныхКартКартыПокупателей.КартаИсточник КАК КартаИсточник,
| ЗаменаДисконтныхКартКартыПокупателей.КартаПриемник КАК КартаПриемник
|ИЗ
| Документ.ЗаменаДисконтныхКарт.КартыПокупателей КАК ЗаменаДисконтныхКартКартыПокупателей
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ЗаменаДисконтныхКарт КАК ЗаменаДисконтныхКарт
| ПО ЗаменаДисконтныхКартКартыПокупателей.Ссылка = ЗаменаДисконтныхКарт.Ссылка
|ГДЕ
| ЗаменаДисконтныхКартКартыПокупателей.Ссылка = &Ссылка";
Возврат ТекстЗапроса;
КонецФункции
Время выполнения запроса менее секунды.
И также в модуль менеджера в процедуру инициализации
ТаблицыДляДвижений = СтруктураДополнительныеСвойства.ТаблицыДляДвижений;
ТаблицыДляДвижений.Вставить("ТаблицаРегистрацияЗаменыКартПокупателей", МассивРезультатов[3].Выгрузить());
ТаблицыДляДвижений.Вставить("ТаблицаБонусныеБаллы", МассивРезультатов[1].Выгрузить());
ТаблицыДляДвижений.Вставить("ТаблицаПродажиПоДисконтнымКартам", МассивРезультатов[2].Выгрузить());
Теперь все остатки на одной карте, удобно смотреть отчёты и т.д.
Буду рад, если кому-то поможет.