При обновлении конфигурации 1С:Управление торговлей до релиза 11.4.11.88 многие разработчики столкнулись с тем, что код, используемый в интеграциях (в частности, в модуле UDS Game), перестал работать. Это связано с тем, что фирма «1С» изменила сигнатуру и логику работы серверной процедуры СкидкиНаценкиСервер.НазначитьРучнуюСкидку. Давайте разберем по шагам, как привести ваш код в соответствие с актуальными требованиями платформы.
Основная проблема заключается в том, что старые вызовы процедуры СкидкиНаценкиСервер.НазначитьРучнуюСкидку, которые принимали набор простых параметров, более не актуальны. Теперь разработчик обязан передавать структуру ПараметрыСкидки, которая содержит метаданные о контексте вызова, список выделенных строк и адрес данных во временном хранилище.
Если вы попытаетесь использовать старый метод вызова, система выдаст ошибку о несоответствии количества фактических параметров. Если вы попытаетесь передать пустую или некорректную структуру, вы столкнетесь с ошибкой доступа к объекту АдресВоВременномХранилище.
Для того чтобы процедура сработала корректно, необходимо на сервере формировать структуру параметров. Рассмотрим, как это должно выглядеть в вашем расширении:
&НаСервере
Процедура НазначитьРучнуюСкидку(СуммаСкидкиНаценки, Знач ВыделенныеСтроки, АдресВоВременномХранилище)
ПараметрыСкидки = Новый Структура;
ПараметрыСкидки.Вставить("ИспользуютсяАвтоматическиеСкидки", Истина);
ПараметрыСкидки.Вставить("ВыделенныеСтроки", ВыделенныеСтроки);
ПараметрыСкидки.Вставить("АдресВоВременномХранилище", АдресВоВременномХранилище);
Если СуммаСкидкиНаценки <> 0 Тогда
СкидкиНаценкиСервер.НазначитьРучнуюСкидку(Объект, "Товары", СуммаСкидкиНаценки, ПараметрыСкидки);
КонецЕсли;
КонецПроцедуры
Ключевая ошибка при миграции — попытка передать адрес хранилища из контекста, который мог быть переинициализирован. Чтобы избежать ошибки «Значение не является значением объектного типа», используйте типовую функцию АдресДанныхДляРасчетаРучныхСкидокВоВременномХранилище(Истина). Это гарантирует, что сервер получит актуальную ссылку на данные табличной части текущего чека.
// В коде клиентской части, перед вызовом серверной процедуры:
АдресВоВременномХранилище = АдресДанныхДляРасчетаРучныхСкидокВоВременномХранилище(Истина);
НазначитьРучнуюСкидку(Сумма, Элементы.Товары.ВыделенныеСтроки, АдресВоВременномХранилище);
Если ваша задача — применить скидку не только к выделенной строке, но и ко всей табличной части документа, вам необходимо программно заполнить коллекцию ВыделенныеСтроки элемента управления таблицей. Рассмотрим, как это сделать программно:
// Очищаем текущее выделение, если это требуется логикой
Элементы.Товары.ВыделенныеСтроки.Очистить();
// Добавляем все строки из объекта Товары
Для Каждого Строка ИЗ Объект.Товары Цикл
Элементы.Товары.ВыделенныеСтроки.Добавить(Строка.ПолучитьИдентификатор());
КонецЦикла;
НазначитьРучнуюСкидку не забудьте вызвать методы пересчета, например, ПересчитатьДокументНаКлиенте(), чтобы изменения суммы отобразились в интерфейсе РМК корректно.ПолучитьИдентификатор()), а не ссылки на строки, так как метод НазначитьРучнуюСкидку ожидает именно идентификаторы строк табличной части.Выполнив данные действия, вы приведете работу вашего расширения в соответствие с архитектурой современных релизов 1С:УТ 11.4. Использование структуры ПараметрыСкидки является обязательным требованием, а программное заполнение ВыделенныеСтроки позволит корректно управлять скидками для любого количества позиций номенклатуры.