Создание и последующая поддержка распределенной информационной базы (РИБ) в крупных конфигурациях, таких как «1С:Управление торговлей 11», «1С:Комплексная автоматизация» или «1С:ERP», часто сопряжены с серьезными техническими трудностями. На этапе генерации начального образа СУБД может аварийно завершать работу из-за переполнения памяти, а при эксплуатации в подчиненных узлах могут возникать ошибки блокировки транзакций при удалении устаревших данных.
В этой статье мы подробно рассмотрим, как правильно настроить серверную инфраструктуру MS SQL Server и кластер 1С:Предприятие для создания тяжелых образов РИБ, а также разберем по шагам причины и методы устранения ошибки «Не удалось записать: "Задания к распределению расчетов с клиентами"!» при удалении партнеров или контрагентов.
При работе с базами данных объемом в сотни гигабайт стандартный механизм создания начального образа РИБ через интерактивный интерфейс 1С часто завершается аварийно. Основные причины этого — стремительный рост системной базы данных tempdb, нехватка оперативной памяти на сервере и жесткие лимиты рабочих процессов 1С (rphost). Чтобы обойти эти ограничения, выполним предварительную настройку серверной части.
Шаг 1. Настройка параметров баз данных в СУБД Microsoft SQL Server
Для предотвращения постоянного и неконтролируемого расширения файлов во время тяжелых транзакций выставим фиксированные параметры для системных баз данных:
model (которая служит шаблоном для создания новых временных таблиц) зададим свойства файлов:
tempdb (включая журналы):
MaxDegreeOfParallelism (MAXDOP) в свойствах сервера СУБД. Рекомендуется выставлять его равным от 1 до 4 в зависимости от количества ядер процессора, чтобы исключить взаимные блокировки при генерации тяжелых выборок.Шаг 2. Настройка параметров кластера 1С:Предприятие 8.3
Если сервер 1С работает в 32-разрядном режиме, создание образа гарантированно прервется из-за ограничения адресного пространства процесса rphost в 4 ГБ. Нам обязательно потребуется 64-разрядная версия платформы.
Дополнительно необходимо настроить политики перезапуска процессов в консоли администрирования кластера 1С:
1C:Enterprise 8.3 Server Agent.Шаг 3. Инициализация и запуск процесса генерации
Перед запуском стандартного механизма выполним предварительную подготовку конфигурации и СУБД:
/C ЗапуститьОбновлениеИнформационнойБазы для актуализации всех служебных данных.
DBCC FREEPROCCACHE;
tempdb до исходных размеров, используя команду сжатия файлов:
DBCC SHRINKFILE (tempdev, 10);
DBCC SHRINKFILE (templog, 10);
После успешного развертывания подчиненного узла РИБ пользователи могут столкнуться со специфической ошибкой при попытке удалить помеченные на удаление объекты (партнеров или контрагентов). Система выдает системное сообщение об ошибке записи в регистр сведений.
Выясним причину этой неполадки. При удалении элемента справочника система производит проверку ссылочной целостности и пытается пересчитать или скорректировать связанные движения по документам. В этот момент срабатывают подписки на события взаиморасчетов, которые пытаются добавить запись в независимый регистр сведений ЗаданияКРаспределениюРасчетовСКлиентами (или аналогичный регистр для поставщиков). Запись блокируется базой данных по нескольким причинам:
Организация или ОбъектРасчетов), из-за чего система пытается записать в базу строку с пустыми ключевыми измерениями, что запрещено структурой метаданных.Рассмотрим пошагово способы решения этой проблемы.
Самый простой шаг, помогающий в большинстве стандартных случаев:
Поскольку регистры сведений, отвечающие за распределение взаиморасчетов, являются независимыми, их очистка не приведет к потере исторических данных учета. Системные задания будут автоматически пересозданы СУБД при последующем проведении документов или при выполнении процедуры закрытия месяца.
Для очистки мешающих регистров напишем и запустим в подчиненном узле внешнюю обработку со следующим кодом:
// Очистка регистра заданий по расчетам с клиентами
НаборКлиенты = РегистрыСведений.ЗаданияКРаспределениюРасчетовСКлиентами.СоздатьНаборЗаписей();
НаборКлиенты.Записать(Истина);
// Очистка регистра заданий по расчетам с поставщиками
НаборПоставщики = РегистрыСведений.ЗаданияКРаспределениюРасчетовСПоставщиками.СоздатьНаборЗаписей();
НаборПоставщики.Записать(Истина);
Сообщить("Регистры заданий к распределению успешно очищены!");
После выполнения данного кода запустим стандартную обработку удаления помеченных объектов повторно.
Если ошибка возникает из-за генерации строк с незаполненной организацией при удалении дублей или очистке ссылок, мы можем разработать небольшое расширение конфигурации. В расширении перехватим процедуру записи набора в модуле менеджера или модуле набора записей регистра.
Добавим в расширение процедуру перед записью набора:
&Вместо("ПередЗаписью")
Процедура Расш_ПередЗаписью(Отказ, Замещение)
// Проверим каждую строку набора на заполнение ключевых реквизитов
Индекс = ЭтотОбъект.Количество() - 1;
Пока Индекс >= 0 Цикл
СтрокаЗаписи = ЭтотОбъект[Индекс];
Если Не ЗначениеЗаполнено(СтрокаЗаписи.Организация) Тогда
// Удаляем некорректную запись, которая вызывает ошибку СУБД
ЭтотОбъект.Удалить(СтрокаЗаписи);
КонецЕсли;
Индекс = Индекс - 1;
КонецЦикла;
КонецПроцедуры
Такой подход гарантирует, что некорректные пустые строки будут отсекаться «на лету» перед отправкой SQL-запроса на запись в СУБД.
В актуальных версиях решений на платформе 1С:Предприятие 8.3 (УТ 11.5, КА 2.5, ERP 2.5) разработчики полностью переработали архитектуру и добавили режим «Онлайн-взаиморасчеты». При его включении система производит все расчеты непосредственно в транзакции проведения документов оперативно, не накапливая очереди в оффлайн-регистрах заданий.
Чтобы навсегда избавиться от подобных ошибок, выполним следующие действия: