Заметки
Почему crm.deal.productrows.set перезаписывает все товары
crm.deal.productrows.set задаёт весь список товаров сделки. Строки, которых нет в переданном наборе, не сохраняются как «старые». Это поведение метода, а не случайная потеря товаров.
Для добавления одной строки удобнее crm.item.productrow.add. Для изменения строки — метод обновления по её ID.
В legacy-интеграции с set нужно передавать полный итоговый список. Но чтение и последующая запись не являются одной атомарной операцией: между ними менеджер может изменить товары. Название обёртки replaceSafely само по себе эту гонку не устраняет.
Развитие legacy-метода остановлено. Для нового кода ориентируйтесь на универсальные методы товарных строк, сохраняя старый API там, где требуется поддержка существующей версии.
Документация: crm.deal.productrows.set.