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