Итак, релиз УТ 11.0.9.14, необходимо в документе Чек ККМ автоматически показать окно выбора номенклатуры для подарков, если «сработала» скидка такого типа. Для этого необходимо выполнить следующие действия:
1) Создаем общий модуль my_СкидкиНаценки, в свойствах устанавливаем Клиент, Сервер. Текст модуля:
&НаКлиенте
Процедура my_ОткрытьПодборПодарков(СегментПодарков, ФормаВладелец) Экспорт
//вызываем форму подбора номенклатуры с отбором по сегменту, в котором находятся подарки
Для каждого Строка Из СегментПодарков Цикл
Форма = ПолучитьФорму("Справочник.Номенклатура.Форма.ФормаВыбора", , ФормаВладелец);
Форма.СегментНоменклатуры = Строка.Значение;
ОбщегоНазначенияКлиентСервер.УстановитьПараметрДинамическогоСписка(Форма.Список, "СегментНоменклатуры", Строка.Значение, ЗначениеЗаполнено(Форма.СегментНоменклатуры));
Форма.Открыть();
КонецЦикла;
КонецПроцедуры
&НаСервере
Функция my_ОбработкаСкидокТипаПодарок(ТаблицаСкидок) Экспорт
//формируем структуру, в которой запоминаем сегменты номенклатуры, из которых будут выбираться подарки
СписокСегментовПодарков = Новый Структура;
Для каждого Строка Из ТаблицаСкидок Цикл
Если Строка.СкидкаНаценка.СпособПредоставления = Перечисления.СпособыПредоставленияСкидокНаценок.Подарок Тогда
СписокСегментовПодарков.Вставить("Сегмент", Строка.СкидкаНаценка.СегментПодарков);
КонецЕсли;
КонецЦикла;
Возврат СписокСегментовПодарков;
КонецФункции
2) В модуле формы ФормаДокументаМастер документа ЧекККМ добавляем следующий код:
//my begin
&НаКлиенте
Перем my_флПодаркиДобавлены; //Истина - подраки уже добавлены в табличную часть документа ЧекККМ
//my end
&НаКлиенте
Процедура ПриОткрытии(Отказ)
….
//my begin
//необходимо добавить подарки, в табличную часть документа, если сработает скидка с типом "Подарок"
my_флПодаркиДобавлены = Ложь;
//my end
КонецПроцедуры
&НаКлиенте
Процедура Расчет(Команда)
….
Если (ИспользоватьАвтоматическиеСкидкиВПродажах
И ПараметрыПримененияСкидок.НазначеныСкидки)
ИЛИ (Не КонтрольНаСкладеОтключен) Тогда
Результат = ВыполнитьЧастьРасчетаНаСервере(ВозвращенноеЗначениеУправляемыеСкидки);
Если Не Результат.РасчетВыполненУспешно Тогда
Возврат;
КонецЕсли;
//my begin
//если подарки еще не добавлены в ТЧ и заполнена структура со списком сегментов, из которых необходимо выбирать подарки, то
//открываем форму подбора номенклатуры с отбором по сегменту, из которого будут выбираться подарки
Если (НЕ my_флПодаркиДобавлены) И (Результат.СтруктураСообщений.СписокСегментовПодарков.Количество() > 0) Тогда
my_СкидкиНаценки.my_ОткрытьПодборПодарков(Результат.СтруктураСообщений.СписокСегментовПодарков, ЭтаФорма);
КонецЕсли;
//my end
Если Результат.СтруктураСообщений <> Неопределено И Результат.СтруктураСообщений.Сообщения.Количество() > 0 И Результат.СтруктураСообщений.АвтоматическиОткрывать Тогда
ОткрытьФорму("ОбщаяФорма.СообщенияСкидокНаценок", Результат.СтруктураСообщений, ЭтаФорма, УникальныйИдентификатор);
КонецЕсли;
КонецЕсли;
…
КонецПроцедуры
&НаСервере
Функция РассчитатьСкидкиНаценкиНаСервере(СтруктураПараметры)
….
//my begin
//после штатного расчета скидок, проверяем применяется ли к данному документу скидка с типом "Подарок", если применяется, то
//формируем структуру, в которой запоминаем сегменту из которых будут выбираться подарки
СписокСегментовПодарков = my_СкидкиНаценки.my_ОбработкаСкидокТипаПодарок(ПримененныеСкидки.ТаблицаСкидкиНаценки);
Если СписокСегментовПодарков.Количество() > 0 Тогда
СтруктураСообщений.Вставить("СписокСегментовПодарков", СписокСегментовПодарков);
КонецЕсли;
//my end
Возврат СтруктураСообщений;
КонецФункции
//my begin
&НаКлиенте
Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)
//обрабатываем результаты подбора из формы подбора номенклатуры для текущего сегмента подарков
Если ИсточникВыбора.ИмяФормы = "Справочник.Номенклатура.Форма.ФормаВыбора" Тогда
my_ДобавитьТоварВТЧ(ВыбранноеЗначение);
ВернутьсяКПодборуТоваров(Команды.Найти("ВернутьсяКПодборуТоваров"));
ТоварыНоменклатураПриИзменении(Элементы.ТоварыНоменклатура);
//подарки добавлены в ТЧ. Необходимо, чтобы при повторном нажатии на кнопку Расчет, опять не открывалась форма для подбор подарка
my_флПодаркиДобавлены = Истина;
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура my_ДобавитьТоварВТЧ(Товар)
//добавляем выбранный подарок в ТЧ документа
ТекущаяСтрока = Объект.Товары.Добавить();
ТекущаяСтрока.Номенклатура = Товар;
ТекущаяСтрока.Количество = 1;
Элементы.Товары.ТекущаяСтрока = ТекущаяСтрока.ПолучитьИдентификатор();
КонецПроцедуры //my_ДобавитьТоварВТЧ
//my end
В итоге получаем в документе ЧекККМ, если в документе применяется скидка с типом «Подарок», при нажатии кнопки Расчет, появляется окно выбора номенклатуры из сегмента подарков. После выбора подарка, указываем его количество и повторно нажимаем кнопку Расчет, чтобы сработал штатный алгоритм разброса стоимости подарка на остальные строки чека.
P.S. Платформу 8.2 только недавно начал осваивать, поэтому просьба сильно не пинать, если кому то код придется не по душе ))