При переходе на новые релизы конфигураций 1С (например, при обновлении 1С:ЗУП с версии 3.1.30.249 на 3.1.34.77) разработчики и администраторы часто сталкиваются с ситуацией, когда новые служебные реквизиты заполняются не у всех объектов. Проанализируем ситуацию: после обновления выясняется, что некорректно работает дата запрета редактирования для документа ДоговорРаботыУслуги. Причина кроется в том, что реквизит ДатаЗапрета остался незаполненным в старых документах.
Если заглянуть в модуль менеджера документа, можно найти процедуру обновления, например, ЗаполнитьДатыЗапрета, которая при запуске почему-то обрабатывает ровно 100 документов и останавливается. Разберем по шагам, почему так происходит и как правильно решить эту задачу.
Описанная ситуация не является ошибкой. Это стандартное поведение механизма «Отложенного обновления», встроенного в Библиотеку стандартных подсистем (БСП). В современных конфигурациях 1С обновление исторических данных (например, заполнение новых реквизитов в тысячах старых документов) выполняется в фоновом режиме.
Размер в 100 документов — это специально регламентированная порция данных. Рассмотрим подробнее, зачем это нужно:
ЗаполнитьДатыЗапрета), фиксирует транзакцию и переходит к следующей порции. И так в цикле, пока не будут обработаны все документы.Писать собственную обработку для принудительной перезаписи всех документов, как правило, не нужно. Более того, грубое вмешательство может привести к коллизиям с типовым механизмом обновления. Посмотрим на правильный алгоритм действий.
1. Проверка статуса отложенного обновления
В большинстве случаев достаточно просто дождаться, пока фоновое задание отработает все порции. Если процесс затянулся или вы хотите проконтролировать его статус, выполните следующие шаги:
2. Что делать, если обновление зависло?
Если вы видите, что документы не обновляются автоматически и прогресс остановился, проанализируем возможные причины блокировки:
3. Альтернативный вариант (для крайних случаев)
Если типовой обработчик безнадежно «завис» из-за критических ошибок в исторических данных, которые невозможно оперативно выверить, программисты могут прибегнуть к программному заполнению нового реквизита. Чтобы избежать выполнения проверок при записи, которые могут выдавать ошибки, используется свойство ОбменДанными.Загрузка. Рассмотрим пример:
ДокументОбъект = СсылкаНаДокумент.ПолучитьОбъект();
ДокументОбъект.ДатаЗапрета = СсылкаНаДокумент.Дата; // Или ваша логика заполнения
ДокументОбъект.ОбменДанными.Загрузка = Истина;
ДокументОбъект.Записать(РежимЗаписиДокумента.Запись);
Критически важно: Если вы решили заполнить данные собственной обработкой, после её завершения обязательно нужно отметить зависший типовой обработчик в системе как «выполненный». Иначе не завершенное отложенное обновление может заблокировать возможность установки будущих релизов конфигурации.