Частые проблемы и устранение неполадок

Конкретные шаги для самых частых проблем. Базовые случаи (CSRF, login throttle, кэш CSS, диакритика, SMTP) описаны на странице Поддержка; здесь — специфичные для TSync Intelligence.

Быстрая диагностика — первые 3 проверки

Прежде чем открывать логи или писать в поддержку:

  1. Cron работает? Setup → Settings → Cron Job — поле «Last cron run» должно быть в пределах 5 минут. Если нет — половина проблем (письма в очереди, истечение договоров, повторы) идёт отсюда.
  2. Версия PHP подходит? Минимум PHP 8.1, рекомендуется 8.2 / 8.3. См. Setup → Settings → System / Server Info.
  3. Каталоги доступны на запись? application/cache, uploads/, application/logs должны быть writable для пользователя веб-сервера.

«Ошибка сети» на панели, которая не загружается

Боковая панель, выдвижная карточка или список с надписью «Ошибка сети» почти никогда не связаны с сетью. Соединение до сервера дошло; сервер во время ответа наткнулся на ошибку и вернул пустой ответ, поэтому странице нечего было показать и она вывела самое общее сообщение, какое у неё есть.

Теперь такие случаи называют себя сами. Вместо пустого ответа вы получаете короткий код:

Server error (REQ-4f2ab90c11)

Что делать: скопируйте код и приложите его к обращению. В тот же момент он записывается в application/logs/ — в строку, описывающую, что именно отказало, так что разбирающийся пойдёт сразу к причине, а не будет пытаться её воспроизвести.

Строка пишется и на боевой установке. Там обычное журналирование выключено (log_threshold = 0), и до v9.6.0 это проглатывало в том числе эту строку — вы получали код в браузере и ни одной строки нигде, то есть худшее из двух. Запрос, который умер, теперь фиксируется независимо от настройки подробности: одна строка, в том же ежедневном файле, под тем же кодом. Если каталог логов недоступен для записи, ничего не пишется и ничего не падает — значит, на хостинге с каталогом только для чтения будет код без строки, и первым делом проверьте права на папку.

Чем это не является: это не ваш интернет, и повтор действия обычно не помогает. Если код один и тот же каждый раз — сбой детерминированный, и это хорошая новость: значит, его можно найти.


e-Factura ANAF — частые ошибки

«Token expired» / «401 Unauthorized» при загрузке

OAuth-токен ANAF имеет ограниченный срок (60 дней access, 365 дней refresh). В Setup → Settings → RO ANAF:

  1. Проверьте поле Token expires.
  2. Нажмите Refresh token — используется refresh token.
  3. Если refresh token тоже истёк (год): авторизуйтесь заново (Connect to ANAF).

«Invalid CIF» при генерации XML

ANAF в XML требует CIF без префикса «RO», но при загрузке принимает с префиксом. Проверьте:

  • Поле клиента VAT Number — без пробелов и тире.
  • Для физлиц: включите Is individual на клиенте; XML будет использовать CNP вместо CIF.

«Status: in processing» висит неделями

Обычно ANAF отвечает за 1–3 часа. Если статус «in processing» висит дольше суток:

  1. Проверьте статус напрямую в SPV (Spațiul Privat Virtual) — иногда callback не доходит до TSync.
  2. Принудительно: RO ANAF → Pending uploads → Check status.

Полный список кодов ошибок ANAF: см. Ошибки e-Factura.


Cron не работает / работает неправильно

Симптомы: письма в очереди не уходят, договоры не переходят в Expired, повторы не создаются, счётчики Summary устаревшие.

Проверка

  1. Setup → Settings → Cron Job — «Last cron run». Пусто или больше часа назад = cron не работает.
  2. На сервере: crontab -l или cat /etc/cron.d/* — ищите строку:
    * * * * * /usr/bin/php /path/to/tsync/cron.php
  3. Если её нет — следуйте Настройка cron.

Cron запускается, но ничего не делает

  • Проверьте пользователя cron — должен иметь право чтения application/config/app-config.php.
  • Запустите вручную: php /path/to/tsync/cron.php. Ошибки видны сразу.
  • Смотрите application/logs/log-YYYY-MM-DD.php — любая ошибка cron уходит туда.

Страница админки без сайдбара / сломанный layout

Симптом: открываете страницу админки (или модуля custom), а левый сайдбар пропал, контент во всю ширину.

Причина: view использует устаревший шаблон $this->load->view('admin/includes/header') + ... footer. Правильно в TSync Intelligence — init_head() / init_tail() (они подгружают шаблон с сайдбаром).

Решение

В контроллере, рендерящем view, поменять:

// НЕПРАВИЛЬНО
$this->load->view('admin/includes/header');
$this->load->view('mymodule/myview', $data);
$this->load->view('admin/includes/footer');

// ПРАВИЛЬНО $data['title'] = _l('module_name_lang_key'); init_head($data); $this->load->view('mymodule/myview', $data); init_tail();

После правки — hard refresh (Ctrl+Shift+R), сайдбар возвращается.


PDF — нет шрифтов, диакритика, сломанный layout

«Could not include font» при генерации

Шрифт TCPDF не найден. В TSync есть автоматический fallback в App_pdf: если шрифт из PDF Settings → Font не загружается, система переходит на helvetica и логирует warning.

  • Проверьте Setup → Settings → PDF → PDF Font — выберите известный шрифт (helvetica, dejavusans).
  • Для расширенной латинской диакритики (ș, ț, ă, î) — используйте dejavusans или freesans.

«Maximum execution time exceeded» при больших PDF

Длинные PDF (договоры > 30 страниц, каталоги с фото) могут превышать max_execution_time:

  1. Поднимите в php.ini: max_execution_time = 300.
  2. Или в .htaccess: php_value max_execution_time 300.
  3. Перед PDF сжимайте крупные изображения (max 1200px ширина, 80% JPEG).

Сломанный layout PDF (текст налезает)

Обычно сложные HTML-таблицы с colspan/rowspan, которые TCPDF плохо рендерит. Упростите таблицу или добавьте display: block на проблемные ячейки.


Тема письма приходит искажённой, а текст письма — нормальный

Уведомление, чья тема читается как «Contract urmează să expire», тогда как тело того же письма правильно показывает ă, ș и ț, — это конкретный и хорошо понятный дефект, и сам этот разрыв является подсказкой. Тема и тело берутся из одной строки шаблона через одно соединение, поэтому будь дело в данных или в соединении, сломалось бы и то и другое.

Байты всегда были UTF-8; неверной была наклеенная на них метка. Тело спасает собственный <meta charset>, которому почтовый клиент подчиняется; у заголовка темы такой страховки нет, поэтому сохранённое значение вроде ISO-8859-1 велит почтовому клиенту получателя читать один символ как два.

Что делать: обновиться. Миграция 955 исправляет сохранённое значение при замене файлов (уже правильные utf-8 / utf8 / utf8mb4 она не трогает и сохраняет прежнее значение), а отправляющий код больше не зависит от правильности этой опции. Ваши почтовые шаблоны не затрагиваются — тело, которое из той же строки рендерится верно, и есть доказательство, что сохранённый текст никогда не был проблемой.

Как проверить после: страница Здоровье сообщает о почтовой кодировке, отличной от UTF-8, как о предупреждении. Отправьте уведомление себе и прочитайте именно строку темы, а не только текст.


«File too large» / неудачная загрузка

TSync уважает два лимита PHP:

  • upload_max_filesize
  • post_max_size

Установите оба в одно значение (например, 50M) в php.ini или .htaccess:

php_value upload_max_filesize 50M
php_value post_max_size 52M

Перезапустите веб-сервер. Для файлов > 100MB используйте External attachment (ссылка Drive/S3) вместо локальной загрузки.


«Недостаточно прав» на договорах / проектах / счетах

Типичные сообщения: «Your current permissions does not allow…», отсутствующие кнопки, «не вижу» сущностей.

Диагностика

  1. Setup → Roles — определите роль затронутого сотрудника.
  2. На нужной сущности (Contracts/Projects/Invoices…) проверьте флаги:
    • view (own) — только сущности, где он создатель/назначенный.
    • view (global) — все сущности.
    • create / edit / delete — отдельно.
  3. После сохранения роли сделайте logout + login сотруднику, чтобы сессия перезагрузилась.

Модуль активен, но не появляется в меню

После Setup → Modules → Activate меню не меняется.

  • Hard refresh (Ctrl+Shift+R) — меню частично кешируется в браузере.
  • Проверьте application/logs/log-YYYY-MM-DD.php — активация могла упасть с ошибкой (опечатка в install.php, отсутствует hook).
  • Проверьте права роли — модуль может быть активен, но у вас нет view.

Обновление выкачено, но новых функций нет

Вы залили новый код, но забыли про обновление БД. Setup → Settings → Update покажет «Update applied successfully», но без явного запуска из админки миграции схемы не выполнятся.

Принудительный апгрейд БД

  1. Войдите как админ.
  2. Перейдите по адресу admin/upgrade (URL).
  3. Система определит текущую версию БД и применит все недостающие миграции.

Конкретный пример: если после обновления подзадачи не появляются в модальном окне задачи — миграция 342 (колонка parent_task_id в tbltasks) не выполнилась. Запустите апгрейд выше.


Бэкап и восстановление

Автоматический бэкап БД

Внутренний модуль Backup делает ежедневный дамп при настройке:

  • Setup → Settings → Backup — включите, выберите час, retention (например, 14 дней).
  • Бэкапы складываются в backups/ (создаётся автоматически).
  • Cron TSync должен работать (см. выше).

Ручное восстановление

  1. Скопируйте uploads/ из бэкапа поверх текущего каталога.
  2. Импортируйте SQL-дамп: mysql -u user -p database < backup.sql.
  3. Очистите application/cache/*.php.
  4. Проверьте application/config/app-config.php — ключ шифрования должен совпадать с системой-источником (иначе сохранённые пароли и API-токены не расшифруются). См. ключ шифрования.

Чтение логов

TSync пишет в application/logs/log-YYYY-MM-DD.php. Формат CodeIgniter — один файл в день, несколько уровней (ERROR, INFO, DEBUG).

Временное включение DEBUG

В application/config/config.php:

$config['log_threshold'] = 4; // 1=error, 2=debug, 3=info, 4=all

После диагностики верните 1 (только ERROR), чтобы не забивать диск.

Быстрый фильтр

grep -i "ERROR\|EXCEPTION" application/logs/log-2026-05-05.php | tail -50

Прикрепление изображения к складской позиции отвечает пустой ошибкой

Загрузка картинки для складской позиции — Склад → Артикулы → (позиция) → изображение — возвращала HTTP 500 с пустым телом: белый экран, ни сообщения, ни чего-либо, о чём можно сообщить, кроме «не работает». Исправлено в v11.2.3.

Если у вас более старая сборка, тот же дефект затрагивал загрузку изображения артикула и логотипа на экране настроек склада, генерацию номера партии и имя файла подписи. Всё это была одна и та же скрытая ошибка, ждавшая запроса, в котором ничто другое не загрузило заранее определённый помощник.

Что делать: обновитесь до v11.2.3 или новее. Обходного пути нет и настраивать нечего — а если вы видите пустой 500 на любом «глубоком» маршруте действия (не страница, а кнопка, которая отправляет данные), это форма именно этого класса дефектов: пришлите адрес страницы и время, и строка журнала назовёт отсутствующую функцию.


См. также