Содержание

  1. Зачем интегрировать amoCRM с 1С
  2. Архитектура интеграции
  3. Способы интеграции
  4. Работа с amoCRM API
  5. Работа с 1С REST API
  6. Скрипт синхронизации
  7. Типичные ошибки

amoCRM и 1С — самая частая пара систем которые нужно интегрировать в российском бизнесе. Менеджеры работают в amoCRM, бухгалтерия в 1С — и данные между ними передаются вручную. Это часы потерянного времени и постоянные ошибки в номенклатуре и реквизитах.

В этой статье покажем как правильно выстроить интеграцию — от архитектуры до рабочего кода.

1. Зачем интегрировать amoCRM с 1С

Без интеграции между системами возникают типичные проблемы:

  • Менеджер закрывает сделку в amoCRM — бухгалтер вручную создаёт счёт в 1С
  • Данные о клиенте вводятся дважды — в CRM и в 1С — с ошибками в ИНН, адресах
  • Статус оплаты в 1С не отображается в amoCRM — менеджер не знает оплатил ли клиент
  • Остатки на складе из 1С недоступны менеджерам в CRM

После интеграции всё это происходит автоматически: сделка закрыта → счёт создан → статус оплаты синхронизирован → менеджер видит всё в одном месте.

2. Архитектура интеграции

Интеграция amoCRM ↔ 1С может быть двусторонней или односторонней. Чаще всего нужны оба направления:

amoCRM Закрытая сделка → создать счёт, заказ, контрагента
amoCRM Статус оплаты → обновить поле в сделке amoCRM
amoCRM Остатки товаров → доступны менеджерам в CRM
Совет по архитектуре: не делайте прямую синхронизацию в реальном времени сразу. Начните с одного направления и одного события — например «закрытие сделки → создание счёта». Отработайте, убедитесь что работает стабильно, затем добавляйте следующее.

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 для предотвращения параллельного запуска.

OAuth токен amoCRM истекает через 24 часа. Реализуйте автоматическое обновление токена через refresh_token. Храните токены в файле или базе данных, не в коде.

Нужна интеграция amoCRM с 1С под ключ?

Настраиваем интеграцию за 2–4 недели. Фиксированная цена от 45 000 ₽, гарантия 3 месяца. Оценка бесплатно.

Получить оценку