При разработке сложных отчетов на платформе 1С:Предприятие 8.3 разработчики часто сталкиваются с ситуацией, когда стандартного функционала системы компоновки данных (СКД) недостаточно. Чтобы упростить программное создание СКД, можно использовать специальные обертки. В таких случаях вывод отчета реализуется программно. Однако даже если табличный документ успешно заполнен данными, поверх него может продолжать отображаться системная надпись: «Отчет не сформирован. Нажмите сформировать». Это происходит потому, что управляемая форма не получает автоматического сигнала о завершении процесса компоновки. Рассмотрим подробнее, почему возникает эта проблема и какими способами ее можно решить.
Начиная с версии платформы 8.3.10, поведение элемента формы Поле табличного документа, связанного с основным реквизитом отчета, изменилось. Платформа берет на себя управление «состоянием» отчета. Если используется стандартная кнопка «Сформировать», система сама переключает флаги визуального отображения. Проанализируем ситуацию: когда мы пишем собственный код вывода через ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент, мы работаем напрямую с данными, но визуальный слой формы «не видит» этого процесса и считает, что отчет все еще находится в исходном состоянии.
Самый гибкий способ — это принудительное отключение отображения состояния непосредственно в коде процедуры формирования отчета. Написание каркаса кода для таких процедур можно ускорить с помощью ИИ-помощника в консоли кода. Для этого нам необходимо обратиться к свойствам элемента формы, который отображает результат (обычно это Результат или ТабличныйДокумент). Разберем по шагам, какие свойства за это отвечают.
В конце вашей процедуры вывода данных добавьте следующие строки кода:
// Отключаем видимость блока состояния
Элементы.Результат.ОтображениеСостояния.Видимость = Ложь;
// Устанавливаем режим отображения в значение "Не использовать"
Элементы.Результат.ОтображениеСостояния.ДополнительныйРежимОтображения = ДополнительныйРежимОтображения.НеИспользовать;
Рассмотрим, что именно делают эти строки. Свойство Видимость полностью скрывает контейнер с системным сообщением. Свойство ДополнительныйРежимОтображения позволяет системе понять, что ей не нужно пытаться накладывать дополнительные текстовые блоки поверх таблицы. Это решение считается универсальным и работает в большинстве конфигураций на управляемых формах.
Если вы хотите избежать написания лишнего кода и вам нужно, чтобы надпись не появлялась никогда (даже при открытии формы), можно воспользоваться настройками в Конфигураторе. Посмотрим на алгоритм действий:
Поле табличного документа (результат отчета).AutoStateDisplayMode).Этот метод хорош тем, что он отключает механизм на уровне определения интерфейса, и вам не придется следить за актуальностью программного кода при изменении логики формирования отчета.
Иногда надпись появляется из-за того, что процедура формирования прерывается или объект отчета инициализирован не полностью. Проанализируем правильный цикл программного вывода СКД с использованием внешних наборов данных, который минимизирует конфликты с платформой:
// 1. Инициализация и подготовка данных
ВнешниеНаборыДанных = Новый Структура;
ВнешниеНаборыДанных.Вставить("МоиДанные", ТаблицаСРезультатами);
ЭтотОбъектОтчет = РеквизитФормыВЗначение("Отчет");
СхемаКомпоновки = ЭтотОбъектОтчет.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
Настройки = ЭтотОбъектОтчет.КомпоновщикНастроек.ПолучитьНастройки();
// 2. Компоновка макета
ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновки, Настройки, ДанныеРасшифровки);
// 3. Инициализация процессора и вывод
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных, ДанныеРасшифровки);
Результат.Очистить();
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(Результат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
// 4. Обязательное скрытие состояния после вывода
Элементы.Результат.ОтображениеСостояния.Видимость = Ложь;
Выясним причину, по которой решение может не сработать в версии 8.3.14 и выше. В некоторых релизах платформы был замечен баг: программное изменение ОтображениеСостояния.Видимость в процедуре ПриСозданииНаСервере игнорировалось. Если вы столкнулись с такой ситуацией, попробуйте перенести код в процедуру ПриОткрытии на клиенте или используйте Решение 2 (через свойства в конфигураторе), так как оно более приоритетно для платформы.
Также стоит учитывать влияние БСП (Библиотеки стандартных подсистем). В типовых конфигурациях (таких как ERP 2.5, УТ 11 или БП 3.0) за формирование отчетов часто отвечает механизм СкомпоноватьРезультат. Если вы переопределяете этот метод в модуле объекта, убедитесь, что вы не оставили процедуру ПриКомпоновкеРезультата пустой. Если она присутствует в модуле, но не содержит кода вывода, платформа будет считать, что отчет «пустой» и принудительно выведет заставку.
Подведем итог: для стабильного результата рекомендуется комбинировать программное скрытие видимости блока состояния с установкой режима НеИспользовать. Это гарантирует, что пользователь увидит сформированные данные без лишних системных уведомлений.