Содержание
amoCRM и 1С — самая частая пара систем которые нужно интегрировать в российском бизнесе. Менеджеры работают в amoCRM, бухгалтерия в 1С — и данные между ними передаются вручную. Это часы потерянного времени и постоянные ошибки в номенклатуре и реквизитах.
В этой статье покажем как правильно выстроить интеграцию — от архитектуры до рабочего кода.
1. Зачем интегрировать amoCRM с 1С
Без интеграции между системами возникают типичные проблемы:
- Менеджер закрывает сделку в amoCRM — бухгалтер вручную создаёт счёт в 1С
- Данные о клиенте вводятся дважды — в CRM и в 1С — с ошибками в ИНН, адресах
- Статус оплаты в 1С не отображается в amoCRM — менеджер не знает оплатил ли клиент
- Остатки на складе из 1С недоступны менеджерам в CRM
После интеграции всё это происходит автоматически: сделка закрыта → счёт создан → статус оплаты синхронизирован → менеджер видит всё в одном месте.
2. Архитектура интеграции
Интеграция amoCRM ↔ 1С может быть двусторонней или односторонней. Чаще всего нужны оба направления:
3. Способы интеграции
| Способ | Сложность | Стоимость | Гибкость |
|---|---|---|---|
| Python-скрипт | Средняя | Разработка | Максимальная |
| n8n / Make | Низкая | От $20/мес | Средняя |
| Готовые коннекторы | Низкая | От 2 000 ₽/мес | Минимальная |
| 1С-обработка | Высокая | Разработка 1С | Высокая |
Мы рекомендуем Python-скрипт для большинства задач — максимальная гибкость, нет ежемесячных платежей, полный контроль над логикой.
4. Работа с amoCRM API
amoCRM предоставляет REST API. Для авторизации используется OAuth 2.0. Сначала получаем токен:
# pip install requests import requests import json AMO_DOMAIN = 'yourdomain.amocrm.ru' CLIENT_ID = 'ваш_client_id' CLIENT_SECRET = 'ваш_client_secret' REDIRECT_URI = 'https://yoursite.ru/callback' class AmoCRM: def __init__(self, domain, access_token): self.domain = domain self.headers = { 'Authorization': f'Bearer {access_token}', 'Content-Type': 'application/json' } self.base_url = f'https://{domain}/api/v4' def get_leads(self, status_id=None, limit=250): """Получить сделки""" params = {'limit': limit} if status_id: params['filter[status]'] = status_id resp = requests.get( f'{self.base_url}/leads', headers=self.headers, params=params ) return resp.json().get('_embedded', {}).get('leads', []) def update_lead(self, lead_id, data): """Обновить поля сделки""" resp = requests.patch( f'{self.base_url}/leads/{lead_id}', headers=self.headers, json=data ) return resp.json() def get_contact(self, contact_id): """Получить контакт""" resp = requests.get( f'{self.base_url}/contacts/{contact_id}', headers=self.headers ) return resp.json()
5. Работа с 1С REST API
В 1С:Предприятие 8.3+ есть встроенный HTTP-сервис. Его нужно включить в конфигурации:
class OneCAPI: def __init__(self, base_url, username, password): self.base_url = base_url self.auth = (username, password) def create_invoice(self, lead_data): """Создать счёт в 1С""" payload = { 'КонтрагентИНН': lead_data['inn'], 'СуммаДокумента': lead_data['price'], 'НаименованиеТовара': lead_data['product'], 'КомментарийCRM': f'Сделка #{lead_data["id"]} из amoCRM' } resp = requests.post( f'{self.base_url}/hs/crm/invoice', auth=self.auth, json=payload, timeout=30 ) resp.raise_for_status() return resp.json() def get_payment_status(self, invoice_number): """Проверить статус оплаты счёта""" resp = requests.get( f'{self.base_url}/hs/crm/invoice/{invoice_number}/status', auth=self.auth, timeout=15 ) return resp.json()
6. Скрипт синхронизации
Собираем всё вместе — скрипт который запускается каждые 15 минут и обрабатывает закрытые сделки:
import logging from datetime import datetime logging.basicConfig(level=logging.INFO, format='%(asctime)s %(message)s') # Инициализация клиентов amo = AmoCRM(AMO_DOMAIN, ACCESS_TOKEN) onec = OneCAPI(ONEC_URL, ONEC_USER, ONEC_PASS) # ID статуса "Закрыто и реализовано" в amoCRM CLOSED_STATUS_ID = 142 def sync_closed_leads(): logging.info('Начинаем синхронизацию...') # Получаем закрытые сделки без счёта в 1С leads = amo.get_leads(status_id=CLOSED_STATUS_ID) processed = 0 for lead in leads: # Проверяем не обработана ли уже сделка invoice_field = get_custom_field(lead, 'Номер счёта 1С') if invoice_field: continue # уже синхронизировано try: # Получаем данные контакта contact_id = lead['_embedded']['contacts'][0]['id'] contact = amo.get_contact(contact_id) inn = get_custom_field(contact, 'ИНН') # Создаём счёт в 1С result = onec.create_invoice({ 'id': lead['id'], 'inn': inn, 'price': lead['price'], 'product': lead['name'], }) # Записываем номер счёта обратно в amoCRM amo.update_lead(lead['id'], { 'custom_fields_values': [{ 'field_code': 'INVOICE_NUMBER', 'values': [{'value': result['number']}] }] }) processed += 1 logging.info(f'Сделка #{lead["id"]} → счёт {result["number"]}') except Exception as e: logging.error(f'Ошибка для сделки #{lead["id"]}: {e}') logging.info(f'Готово: обработано {processed} сделок') if __name__ == '__main__': sync_closed_leads()
7. Типичные ошибки
Дублирование контрагентов в 1С
Проблема: скрипт создаёт нового контрагента при каждой сделке даже если он уже есть.
Решение: перед созданием ищите контрагента по ИНН. Если найден — используйте существующего.
Потеря данных при сбое
Проблема: скрипт упал на середине — непонятно какие сделки обработаны.
Решение: записывайте номер счёта 1С в поле amoCRM сразу после создания. При следующем запуске проверяйте это поле.
Конфликт при параллельном запуске
Проблема: два экземпляра скрипта запустились одновременно и создали дубли.
Решение: используйте файловый lock или Redis для предотвращения параллельного запуска.
Нужна интеграция amoCRM с 1С под ключ?
Настраиваем интеграцию за 2–4 недели. Фиксированная цена от 45 000 ₽, гарантия 3 месяца. Оценка бесплатно.
Получить оценку