Как настроить РИБ без ошибок на СУБД и исправить сбой записи «Задания к распределению расчетов с клиентами»

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

Создание и последующая поддержка распределенной информационной базы (РИБ) в крупных конфигурациях, таких как «1С:Управление торговлей 11», «1С:Комплексная автоматизация» или «1С:ERP», часто сопряжены с серьезными техническими трудностями. На этапе генерации начального образа СУБД может аварийно завершать работу из-за переполнения памяти, а при эксплуатации в подчиненных узлах могут возникать ошибки блокировки транзакций при удалении устаревших данных.

В этой статье мы подробно рассмотрим, как правильно настроить серверную инфраструктуру MS SQL Server и кластер 1С:Предприятие для создания тяжелых образов РИБ, а также разберем по шагам причины и методы устранения ошибки «Не удалось записать: "Задания к распределению расчетов с клиентами"!» при удалении партнеров или контрагентов.

Часть 1. Подготовка MS SQL Server и кластера 1С для успешного создания начального образа РИБ

При работе с базами данных объемом в сотни гигабайт стандартный механизм создания начального образа РИБ через интерактивный интерфейс 1С часто завершается аварийно. Основные причины этого — стремительный рост системной базы данных tempdb, нехватка оперативной памяти на сервере и жесткие лимиты рабочих процессов 1С (rphost). Чтобы обойти эти ограничения, выполним предварительную настройку серверной части.

Шаг 1. Настройка параметров баз данных в СУБД Microsoft SQL Server

Для предотвращения постоянного и неконтролируемого расширения файлов во время тяжелых транзакций выставим фиксированные параметры для системных баз данных:

  1. Откроем MS SQL Server Management Studio (SSMS).
  2. Для базы данных model (которая служит шаблоном для создания новых временных таблиц) зададим свойства файлов:
    • Начальный размер файла базы данных (mdf): 1000 МБ, авторасширение — по 200 МБ, ограничение размера — неограниченно.
    • Файл журнала транзакций (ldf): начальный размер — 100 МБ, авторасширение — по 50 МБ, ограничение размера — 6 ГБ.
  3. Для всех файлов базы данных tempdb (включая журналы):
    • Зададим начальный объем файлов — 200 МБ, шаг роста — по 200 МБ, ограничение размера — неограниченно.
  4. Установим оптимальное значение параметра параллелизма MaxDegreeOfParallelism (MAXDOP) в свойствах сервера СУБД. Рекомендуется выставлять его равным от 1 до 4 в зависимости от количества ядер процессора, чтобы исключить взаимные блокировки при генерации тяжелых выборок.

Шаг 2. Настройка параметров кластера 1С:Предприятие 8.3

Если сервер 1С работает в 32-разрядном режиме, создание образа гарантированно прервется из-за ограничения адресного пространства процесса rphost в 4 ГБ. Нам обязательно потребуется 64-разрядная версия платформы.

Дополнительно необходимо настроить политики перезапуска процессов в консоли администрирования кластера 1С:

  1. Откроем утилиту администрирования кластера 1С.
  2. Перейдем в свойства локального кластера.
  3. Установим флаг «Завершать проблемные процессы». Это позволит серверу вовремя освобождать заблокированную память. После изменения настроек перезапустим службу 1C:Enterprise 8.3 Server Agent.

Шаг 3. Инициализация и запуск процесса генерации

Перед запуском стандартного механизма выполним предварительную подготовку конфигурации и СУБД:

  1. Запустим информационную базу в режиме Конфигуратора и убедимся, что для планов обмена включена поддержка расширений (если они используются). В свойствах самих расширений должна стоять галка «Участвует в РИБ».
  2. Запустим сеанс «Предприятия» с параметром командной строки: /C ЗапуститьОбновлениеИнформационнойБазы для актуализации всех служебных данных.
  3. Очистим кэш процедур на SQL-сервере. Для этого выполним в SSMS команду: DBCC FREEPROCCACHE;
  4. Уменьшим файлы tempdb до исходных размеров, используя команду сжатия файлов:
    
    DBCC SHRINKFILE (tempdev, 10);
    DBCC SHRINKFILE (templog, 10);
    
  5. Освободим достаточно дискового пространства на сервере (для баз средних размеров может потребоваться от 300 ГБ свободного места под временные файлы СУБД в процессе генерации).
  6. Очистим локальный кэш конфигурации 1С на рабочем сервере и запустим стандартную процедуру создания начального образа РИБ.

Часть 2. Исправление ошибки «Не удалось записать: "Задания к распределению расчетов с клиентами"!»

После успешного развертывания подчиненного узла РИБ пользователи могут столкнуться со специфической ошибкой при попытке удалить помеченные на удаление объекты (партнеров или контрагентов). Система выдает системное сообщение об ошибке записи в регистр сведений.

Выясним причину этой неполадки. При удалении элемента справочника система производит проверку ссылочной целостности и пытается пересчитать или скорректировать связанные движения по документам. В этот момент срабатывают подписки на события взаиморасчетов, которые пытаются добавить запись в независимый регистр сведений ЗаданияКРаспределениюРасчетовСКлиентами (или аналогичный регистр для поставщиков). Запись блокируется базой данных по нескольким причинам:

Рассмотрим пошагово способы решения этой проблемы.

Решение 1. Временное отключение даты запрета редактирования

Самый простой шаг, помогающий в большинстве стандартных случаев:

  1. В подчиненной информационной базе перейдем в раздел НСИ и администрирование — Настройка пользователей и прав — Даты запрета изменения.
  2. Временно снимем флаг использования даты запрета изменений или сдвинем дату глубоко в прошлое.
  3. Повторим стандартную процедуру удаления помеченных партнеров и контрагентов.
  4. Вернем настройки даты запрета изменений в исходное состояние.

Решение 2. Программная очистка очередей заданий к распределению

Поскольку регистры сведений, отвечающие за распределение взаиморасчетов, являются независимыми, их очистка не приведет к потере исторических данных учета. Системные задания будут автоматически пересозданы СУБД при последующем проведении документов или при выполнении процедуры закрытия месяца.

Для очистки мешающих регистров напишем и запустим в подчиненном узле внешнюю обработку со следующим кодом:


// Очистка регистра заданий по расчетам с клиентами
НаборКлиенты = РегистрыСведений.ЗаданияКРаспределениюРасчетовСКлиентами.СоздатьНаборЗаписей();
НаборКлиенты.Записать(Истина);

// Очистка регистра заданий по расчетам с поставщиками
НаборПоставщики = РегистрыСведений.ЗаданияКРаспределениюРасчетовСПоставщиками.СоздатьНаборЗаписей();
НаборПоставщики.Записать(Истина);

Сообщить("Регистры заданий к распределению успешно очищены!");

После выполнения данного кода запустим стандартную обработку удаления помеченных объектов повторно.

Решение 3. Обход ошибки записи через расширение конфигурации

Если ошибка возникает из-за генерации строк с незаполненной организацией при удалении дублей или очистке ссылок, мы можем разработать небольшое расширение конфигурации. В расширении перехватим процедуру записи набора в модуле менеджера или модуле набора записей регистра.

Добавим в расширение процедуру перед записью набора:


&Вместо("ПередЗаписью")
Процедура Расш_ПередЗаписью(Отказ, Замещение)
    
    // Проверим каждую строку набора на заполнение ключевых реквизитов
    Индекс = ЭтотОбъект.Количество() - 1;
    Пока Индекс >= 0 Цикл
        СтрокаЗаписи = ЭтотОбъект[Индекс];
        Если Не ЗначениеЗаполнено(СтрокаЗаписи.Организация) Тогда
            // Удаляем некорректную запись, которая вызывает ошибку СУБД
            ЭтотОбъект.Удалить(СтрокаЗаписи);
        КонецЕсли;
        Индекс = Индекс - 1;
    КонецЦикла;
    
КонецПроцедуры

Такой подход гарантирует, что некорректные пустые строки будут отсекаться «на лету» перед отправкой SQL-запроса на запись в СУБД.

Решение 4. Переход на современный режим онлайн-взаиморасчетов

В актуальных версиях решений на платформе 1С:Предприятие 8.3 (УТ 11.5, КА 2.5, ERP 2.5) разработчики полностью переработали архитектуру и добавили режим «Онлайн-взаиморасчеты». При его включении система производит все расчеты непосредственно в транзакции проведения документов оперативно, не накапливая очереди в оффлайн-регистрах заданий.

Чтобы навсегда избавиться от подобных ошибок, выполним следующие действия:

  1. Перейдем в раздел НСИ и администрирование — Казначейство и взаиморасчеты.
  2. В группе параметров «Взаиморасчеты» переключим режим работы на «Онлайн».
  3. Выполним пересчет взаиморасчетов с помощью встроенного помощника перехода. Это позволит исключить использование устаревших регистров заданий и стабилизирует работу подчиненных баз РИБ.
← На главную