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

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

При работе с обычными формами в среде «1С:Предприятие 8.3» разработчики часто сталкиваются с загадочным поведением журналов документов. Одной из самых неприятных проблем является внезапное исчезновение данных в «графах» журнала — специальных виртуальных полях, которые собирают информацию из разных видов документов. Проблема проявляется так: вы открываете журнал, и некоторые колонки (особенно ссылочные или булевы) оказываются пустыми, хотя в самих документах реквизиты заполнены. Стоит только зайти в настройки списка или программно скрыть/показать колонку, как данные чудесным образом появляются. Разберем детально, почему это происходит и как это починить раз и навсегда.

Разберем причину: Механизм «ленивой» выборки полей

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

Проанализируем ситуацию: если колонка журнала скрыта или платформа ошибочно определяет её как невидимую в текущем контексте (например, при использовании закладок и программной смене отборов), соответствующее поле исключается из генерируемого SQL-запроса. В версиях платформы 8.3.10–8.3.12 этот механизм оптимизации часто дает сбои, особенно при работе с объектами типа Графа. Графа — это не прямой реквизит таблицы, а виртуальная сущность. Когда вы программно меняете отборы (например, при переключении страниц на форме), платформа иногда «забывает» включить графу в список необходимых полей, и в процедуре ПриПолученииДанных свойство ДанныеСтроки возвращает пустую структуру для этой колонки.

Способ 1. Программная имитация «Настройки списка» (Workaround)

Как заметили пользователи в обсуждении, ручное открытие «Настройки списка» и нажатие кнопки «ОК» мгновенно возвращает данные в колонки. Это происходит потому, что данное действие принудительно пересобирает внутренний запрос и обновляет привязку данных (data binding). Мы можем имитировать этот процесс программно.

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


// В обработчике смены закладок или после установки отбора
Процедура ПриСменеСтраницыПанели(Элемент, ТекущаяСтраница)
    
    // Устанавливаем нужные отборы для журнала
    УстановитьОтборыПоСтатусу(ТекущаяСтраница);
    
    // Применяем "магический" прием для обновления данных в графах
    ИмяКолонкиДляОбновления = "Дата";
    ТекущаяВидимость = ЭлементыФормы.ЖурналДокументовСписок.Колонки[ИмяКолонкиДляОбновления].Видимость;
    
    ЭлементыФормы.ЖурналДокументовСписок.Колонки[ИмяКолонкиДляОбновления].Видимость = Ложь;
    ЭлементыФормы.ЖурналДокументовСписок.Колонки[ИмяКолонкиДляОбновления].Видимость = ТекущаяВидимость;
    
КонецПроцедуры

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

Способ 2. Использование фиктивной сортировки

Выясним еще одну важную деталь: платформа 1С обязана включить поле в SQL-запрос, если по этому полю установлена сортировка. Даже если алгоритмы оптимизации считают колонку невидимой, они не могут исключить её из выборки, если она участвует в упорядочивании данных.

Если данные пропадают в конкретной графе, попробуйте добавить её в список полей сортировки (пусть даже она будет вторым или третьим полем в списке, не влияя на основной порядок документов). Это гарантирует наличие данных в ДанныеСтроки.

  1. Откройте свойства табличного поля ЖурналДокументовСписок.
  2. Перейдите к настройке порядка (сортировки) по умолчанию.
  3. Добавьте проблемную графу в список доступных полей сортировки.

Способ 3. Принудительное считывание через невидимые колонки

Проанализируем ситуацию, когда данные нужны в обработчике ПриПолученииДанных, но их там нет. Чтобы принудительно заставить платформу считывать данные, можно создать в журнале «техническую» колонку:

Важный момент: если вы установите Видимость = Ложь в конфигураторе, оптимизатор снова может исключить поле из выборки. Поэтому колонка должна быть формально видимой, но фактически скрытой от глаз пользователя (нулевая ширина).

Почему стандартные методы не помогают?

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

Рекомендации по версии платформы

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

  1. Проверить поведение на более свежих релизах платформы (например, 8.3.20+), работая в режиме совместимости с 8.2 или 8.3.12.
  2. Если обновление невозможно, используйте Способ 1 с программным переключением видимости колонки. Это наиболее стабильный вариант, который «лечит» симптомы без серьезного вмешательства в архитектуру журнала.
  3. Убедитесь, что в процедуре ПриВыводеСтроки или ПриПолученииДанных вы не устанавливаете пустой текст для ячеек этих колонок случайно, перезаписывая данные из БД.

Используя эти методы, мы можем гарантировать стабильное отображение данных пользователю, избегая раздражающих «пустых клеток» в журнале документов.

← На главную