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