Как безопасно обновить приватный виджет в amoCRM / Kommo без потери настроек
Обновление приватного виджета — один из самых рискованных моментов в работе с amoCRM / Kommo. После обновления всегда есть риск сбросить настройки и приходится восстанавливать их вручную. Особенно неприятно, когда настроек много и они сложные. В этой статье я покажу проверенный на практике способ, который позволяет почти полностью исключить потерю данных.

Важные предупреждения:
Способ работает только с приватными виджетами.
Это обходное решение (хак). amoCRM может изменить внутренние механизмы в любой момент.
Всегда делайте бэкапы перед обновлением.
Используйте на свой страх и риск.
1. Предварительно нужно узнать код виджета:
Зайдите в amoМаркет (в Kommo: Settings → Integrations) → раздел «Установленные».
Найдите нужную интеграцию и откройте её.
Перейдите во вкладку «Ключи и доступы».
Скопируйте «Код виджета».

Как узнать код виджета в amoCRM
2. Бэкап архива виджета (widget.zip)
Это самый важный шаг. Если после обновления что-то пойдёт не так, вы сможете быстро откатиться.
Сформируйте и откройте ссылку:
https://ВАШ_СУБДОМЕН.amocrm.ru/upl/КОД_ВИДЖЕТА/widget.zip
Скачается архив текущей версии виджета в аккаунте. Обязательно переименуйте его, например: widget_1.0.0_backup.zip.
3. Бэкап настроек виджета
Откройте консоль браузера (F12 → вкладка Console).
Выполните команду (замените КОД_ВИДЖЕТА):
console.log(JSON.stringify(APP.widgets.list['КОД_ВИДЖЕТА'].params));
Скопируйте результат и сохраните его у себя.
4. Обновление виджета
Загружайте новую версию виджета обычным способом.
5. Восстановление настроек из бэкапа
В случае возникновения проблем при обновлени сразу возвращайте прошлую версию архива, а если пропали настройки, то восстановить их можно двумя способами:
Вручную занести всё в поля и сохранить. Не годится, если настроек много и они сложные.
Выполнить следующий скрипт в консоли браузера, предварительно вставив в него ваш бэкап:
(function restoreWidgetSettings() {
const BACKUP = JSON.parse('ВСТАВЬТЕ_СЮДА_ВАШ_БЭКАП');
// Системные поля
const systemKeys = [
'active', 'id', 'status', 'widget_code', 'path', 'version',
'oauth_client_uuid', 'widget_active', 'images_path', 'cdn_path',
'cdn_images_path', 'support', 'category_code'
];
// Автоматически берём все поля, кроме системных
const settingsKeys = Object.keys(BACKUP).filter(key => !systemKeys.includes(key));
console.log('🔄 Восстанавливаем поля:', settingsKeys);
const body = new URLSearchParams();
body.append('action', 'edit');
body.append('id', String(BACKUP.id));
body.append('code', BACKUP.widget_code);
body.append('widget_active', 'Y');
body.append('is_widget_state_action', '1');
body.append('is_marketplace_request', '1');
settingsKeys.forEach(key => {
const value = BACKUP[key];
if (value === undefined) return;
body.append(
`settings[${key}]`,
typeof value === 'string' ? value : JSON.stringify(value)
);
});
fetch('/ajax/widgets/edit', {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'X-Requested-With': 'XMLHttpRequest',
},
body: body,
})
.then(response => {
if (response.ok) {
console.log('✅ Настройки успешно восстановлены!');
console.log(` Восстановлено полей: ${settingsKeys.length}`);
console.log(' Обновите страницу (F5), чтобы увидеть изменения.');
} else {
console.error('❌ Ошибка при восстановлении. Статус:', response.status);
}
})
.catch(error => {
console.error('❌ Произошла ошибка при выполнении запроса:', error);
});
})();Полезные советы
Делайте бэкап перед каждым обновлением, даже небольшим.
Храните бэкапы версий отдельно.
Если виджет используется на нескольких аккаунтах — делайте бэкап для каждого.
После восстановления обновляйте страницу (F5).
Таким образом вы значительно снижаете риски при обновлении приватных виджетов.
Если у вас есть свои проверенные приёмы — делитесь в комментариях.