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

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

В практике разработчика 1С часто встречается ситуация, когда после массового изменения реквизитов документов (например, перенумерации) данные в форме списка перестают соответствовать реальности. В самом документе номер изменен, в печатной форме он верный, но в общем списке или журнале документов пользователь видит старые значения. Особенно часто это проявляется в крупных конфигурациях, таких как 1С:ERP Управление предприятием 2, 1С:Комплексная автоматизация 2 или 1С:Управление торговлей 11.

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

Анализ механизма «Реестр документов»

Разберем первопричину проблемы. В современных типовых решениях формы списков документов строятся не напрямую на таблицах самих документов, а на основе вспомогательного регистра сведений РеестрДокументов. Это сделано для оптимизации производительности: поиск, сортировка и фильтрация в огромных массивах данных работают значительно быстрее, когда данные индексированы в одной плоской таблице регистра.

Рассмотрим, как это работает «под капотом»:

  1. При записи документа через интерфейс (вручную) срабатывают Подписки на события (например, РегистрацияДокументовВРеестрах).
  2. Эти подписки вызывают процедуры, которые считывают данные из документа и записывают их в регистр РеестрДокументов и ДанныеПервичныхДокументов.
  3. Динамический список в форме настроен на выборку данных именно из этих регистров.

Проанализируем ситуацию автора темы: он использовал программный код для изменения номеров, устанавливая свойство ОбменДанными.Загрузка = Истина. Это критический момент. При включении этого флага платформа 1С отключает выполнение всех обработчиков событий и подписок на уровне конфигурации. В итоге:

Способы решения проблемы

Для исправления ситуации нам необходимо заставить систему обновить записи в служебных регистрах. Рассмотрим несколько вариантов решения задачи, от простых к более сложным.

Вариант 1. Использование штатных методов актуализации реестра

Если документов немного, можно воспользоваться методом ИнициализироватьИЗаписатьДанныеДокумента из менеджера регистра сведений. Это наиболее «правильный» способ с точки зрения архитектуры типовых решений. Посмотрим на пример кода:


// МассивСсылок - это массив ссылок на документы, у которых изменился номер
Для Каждого СсылкаНаДок Из МассивСсылок Цикл
    РегистрыСведений.РеестрДокументов.ИнициализироватьИЗаписатьДанныеДокумента(СсылкаНаДок, Новый Структура, Ложь);
КонецЦикла;

Разберем, что происходит в этом фрагменте. Мы вызываем метод менеджера регистра, который самостоятельно анализирует объект документа и создает (или обновляет) запись в Реестре документов. Параметр Ложь в конце указывает на то, что запись не является удалением.

Вариант 2. Групповое обновление данных

В случаях, когда обработке подвергаются тысячи или десятки тысяч документов, поштучная запись может быть медленной. В современных редакциях ERP и КА предусмотрены методы для массового обновления. Выясним, как ускорить этот процесс:


// Используем метод для актуализации массива документов за один вызов
МассивСсылок = Новый Массив;
// ... (заполнение массива ссылками на измененные документы)
РегистрыСведений.РеестрДокументов.АктуализироватьДанныеДокументов(МассивСсылок);

Этот метод оптимизирован для работы с коллекциями и позволяет минимизировать количество обращений к базе данных, что существенно экономит время при масштабных операциях перенумерации.

Вариант 3. Перезапись объектов без флага «Загрузка»

Если вы только планируете обработку, рассмотрим вариант отказа от ОбменДанными.Загрузка = Истина. Если бизнес-логика документа (проверки, проведения) позволяет, лучше записывать объект в обычном режиме. Однако, это может быть чревато лишними движениями по регистрам учета. Если же вы уже совершили ошибку и реестры «рассинхронизировались», можно просто «передернуть» документы программно:


Для Каждого СсылкаНаДок Из СписокДокументов Цикл
    Объект = СсылкаНаДок.ПолучитьОбъект();
    // Мы не меняем данные, просто вызываем запись для срабатывания подписок
    Объект.Записать(РежимЗаписиДокумента.Запись); 
КонецЦикла;

Важно: При таком подходе система выполнит все проверки в модуле объекта и все подписки на события. Это гарантирует обновление Реестра документов, но потребует больше ресурсов сервера.

Анализ дополнительных регистров

Стоит отметить, что помимо основного Реестра документов, существуют и другие «скрытые» таблицы. Например, регистр ДанныеПервичныхДокументов. Если данные в нем останутся старыми, это может привести к тому, что в журнале операций номера будут верными, а при формировании регламентированной отчетности или в печатных формах «по умолчанию» (которые берут номер из регистра) вы снова увидите некорректные данные.

Проанализируем ситуацию с поиском ссылок. Если вы воспользуетесь стандартной функцией поиска ссылок на объект, вы увидите, что документ упоминается в следующих местах:

  1. Регистр сведений Реестр документов (основная таблица для списков).
  2. Регистр сведений Данные первичных документов (используется для регламентированного учета).
  3. Регистр сведений Задания к расчету себестоимости (может создаваться при записи документа).

Следовательно, простое изменение реквизита «Номер» в самом объекте — это лишь половина дела. Обязательно проверяйте состояние этих регистров после выполнения ваших обработок.

Использование стандартных обработок для исправления

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

Эта обработка проанализирует расхождения между данными в документах и записями в реестре и автоматически исправит их.

Резюме для разработчика

Подведем итог нашему исследованию. Для того чтобы данные в форме списка всегда были актуальными, придерживайтесь следующих правил:

  1. При использовании ОбменДанными.Загрузка = Истина помните, что вы берете на себя ответственность за целостность всех связанных данных, включая служебные реестры.
  2. После программного изменения номеров, дат или организаций в документах, всегда вызывайте метод РегистрыСведений.РеестрДокументов.ИнициализироватьИЗаписатьДанныеДокумента.
  3. Если вы заметили, что в консоли запросов номер один, а в списке — другой, первым делом проверяйте содержимое регистра РеестрДокументов, а не чистите кэш платформы, так как в 99% случаев проблема именно в рассинхронизации таблиц БД.
  4. Не забывайте про обновление нумерации объектов через ОбновитьНумерациюОбъектов() после массовой перенумерации, чтобы система не выдавала ошибку «Номер не уникален» при создании новых документов пользователями.

Используя эти методы, вы обеспечите корректную и быструю работу пользователей с интерфейсом системы 1С.

← На главную