Как исправить ошибку вызова метода НазначитьРучнуюСкидку в УТ 11.4.11.88 при интеграции UDS Game?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

При обновлении конфигурации 1С:Управление торговлей до релиза 11.4.11.88 многие разработчики столкнулись с тем, что код, используемый в интеграциях (в частности, в модуле UDS Game), перестал работать. Это связано с тем, что фирма «1С» изменила сигнатуру и логику работы серверной процедуры СкидкиНаценкиСервер.НазначитьРучнуюСкидку. Давайте разберем по шагам, как привести ваш код в соответствие с актуальными требованиями платформы.

Разбор причин ошибки

Основная проблема заключается в том, что старые вызовы процедуры СкидкиНаценкиСервер.НазначитьРучнуюСкидку, которые принимали набор простых параметров, более не актуальны. Теперь разработчик обязан передавать структуру ПараметрыСкидки, которая содержит метаданные о контексте вызова, список выделенных строк и адрес данных во временном хранилище.

Если вы попытаетесь использовать старый метод вызова, система выдаст ошибку о несоответствии количества фактических параметров. Если вы попытаетесь передать пустую или некорректную структуру, вы столкнетесь с ошибкой доступа к объекту АдресВоВременномХранилище.

Шаг 1: Правильная передача параметров на сервер

Для того чтобы процедура сработала корректно, необходимо на сервере формировать структуру параметров. Рассмотрим, как это должно выглядеть в вашем расширении:


&НаСервере
Процедура НазначитьРучнуюСкидку(СуммаСкидкиНаценки, Знач ВыделенныеСтроки, АдресВоВременномХранилище)
    ПараметрыСкидки = Новый Структура;
    ПараметрыСкидки.Вставить("ИспользуютсяАвтоматическиеСкидки", Истина);
    ПараметрыСкидки.Вставить("ВыделенныеСтроки", ВыделенныеСтроки);
    ПараметрыСкидки.Вставить("АдресВоВременномХранилище", АдресВоВременномХранилище);

    Если СуммаСкидкиНаценки <> 0 Тогда
        СкидкиНаценкиСервер.НазначитьРучнуюСкидку(Объект, "Товары", СуммаСкидкиНаценки, ПараметрыСкидки);
    КонецЕсли;
КонецПроцедуры

Шаг 2: Получение актуального адреса хранилища

Ключевая ошибка при миграции — попытка передать адрес хранилища из контекста, который мог быть переинициализирован. Чтобы избежать ошибки «Значение не является значением объектного типа», используйте типовую функцию АдресДанныхДляРасчетаРучныхСкидокВоВременномХранилище(Истина). Это гарантирует, что сервер получит актуальную ссылку на данные табличной части текущего чека.


// В коде клиентской части, перед вызовом серверной процедуры:
АдресВоВременномХранилище = АдресДанныхДляРасчетаРучныхСкидокВоВременномХранилище(Истина);
НазначитьРучнуюСкидку(Сумма, Элементы.Товары.ВыделенныеСтроки, АдресВоВременномХранилище);

Шаг 3: Как применить скидку ко всем строкам документа?

Если ваша задача — применить скидку не только к выделенной строке, но и ко всей табличной части документа, вам необходимо программно заполнить коллекцию ВыделенныеСтроки элемента управления таблицей. Рассмотрим, как это сделать программно:


// Очищаем текущее выделение, если это требуется логикой
Элементы.Товары.ВыделенныеСтроки.Очистить();

// Добавляем все строки из объекта Товары
Для Каждого Строка ИЗ Объект.Товары Цикл
    Элементы.Товары.ВыделенныеСтроки.Добавить(Строка.ПолучитьИдентификатор());
КонецЦикла;

Важные рекомендации по отладке

  1. Проверка контекста: Если вы меняете чек или создаете новый, переменные могут терять свое значение. Всегда запрашивайте адрес хранилища непосредственно перед вызовом процедуры назначения скидки.
  2. Обновление формы: После успешного выполнения НазначитьРучнуюСкидку не забудьте вызвать методы пересчета, например, ПересчитатьДокументНаКлиенте(), чтобы изменения суммы отобразились в интерфейсе РМК корректно.
  3. Типизация: Убедитесь, что в процедуру передается именно массив идентификаторов (который возвращает ПолучитьИдентификатор()), а не ссылки на строки, так как метод НазначитьРучнуюСкидку ожидает именно идентификаторы строк табличной части.

Выполнив данные действия, вы приведете работу вашего расширения в соответствие с архитектурой современных релизов 1С:УТ 11.4. Использование структуры ПараметрыСкидки является обязательным требованием, а программное заполнение ВыделенныеСтроки позволит корректно управлять скидками для любого количества позиций номенклатуры.

← На главную