При работе с конфигурацией 1С:Комплексная автоматизация 1.1 (или аналогичной ей УПП 1.3) программисты часто сталкиваются с ситуацией, когда стандартное изменение схемы компоновки данных (СКД) в конфигураторе никак не влияет на внешний вид отчета в режиме "1С:Предприятие". Особенно это характерно для сложных зарплатных отчетов, таких как Расчетные ведомости организаций. В этой статье мы разберем, почему так происходит, и как все-таки добиться изменения состава и порядка колонок.
Разберем ситуацию: вы открыли отчет, зашли в схему компоновки, поменяли выбранные поля или порядок группировок, сохранили, но при формировании видите старую структуру. Более того, даже полное удаление полей из настроек СКД в конфигураторе не дает эффекта. Рассмотрим, почему это происходит. В типовых решениях на обычных формах часто используется механизм Универсального отчета. В таких отчетах настройки зачастую не берутся напрямую из "настроек по умолчанию" СКД. Вместо этого система использует:
УстановитьНачальныеНастройки().Сохраненные настройки.КомпоновщикНастроекКомпоновкиДанных.Проанализируем макеты отчета. Если в списке макетов вы видите объект с типом Двоичные данные (часто с именем "ОсновнаяСхемаКомпоновкиДанных" или "Настройки"), то именно в нем "зашиты" настройки колонок. Система при первом запуске считывает этот макет, десериализует его и применяет к компоновщику.
Перед тем как вносить изменения, нам нужно убедиться, что отчет не формируется чисто программным путем. Посмотрим в модуль объекта отчета. Нас интересует процедура СформироватьОтчет() или события компоновки. Если мы видим вызов общих модулей, таких как ТиповыеОтчеты.СформироватьТиповойОтчет, значит, управление передано стандартному механизму, который игнорирует ручные правки СКД, если они не соответствуют внутренним алгоритмам.
Для проверки того, откуда берутся настройки, мы можем использовать следующий код в модуле для отладки:
МакетНастроек = ПолучитьМакет("ИмяМакетаСДвоичнымиДанными");
НастройкиИзХранилища = МакетНастроек.Получить();
// Теперь в переменной НастройкиИзХранилища находится объект КомпоновщикНастроекКомпоновкиДанных
Если мы выяснили, что настройки жестко зашиты в двоичном макете, нам нужно их обновить. Рассмотрим алгоритм действий программиста:
Рассмотрим пример кода для извлечения и сохранения настроек во внешней обработке:
// Извлечение настроек для редактирования
Процедура ПрочитатьНастройкиИзОтчета()
ОтчетОбъект = Отчеты.РасчетныеВедомостиОрганизаций.Создать();
Макет = ОтчетОбъект.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
Если ТипЗнч(Макет) = Тип("ДвоичныеДанные") Тогда
// Читаем из хранилища, если это сериализованный объект
НастройкиКомпоновщика = Макет.Получить();
// Применяем к компоновщику текущей обработки для визуальной правки
ЭтотОбъект.КомпоновщикНастроек.ЗагрузитьНастройки(НастройкиКомпоновщика.Настройки);
КонецЕсли;
КонецПроцедуры
// Сохранение измененных настроек в файл
Процедура СохранитьНастройкиВФайл()
Хранилище = Новый ХранилищеЗначения(ЭтотОбъект.КомпоновщикНастроек);
Хранилище.Записать("C:\temp\new_settings.bl");
КонецПроцедуры
Просто изменить настройки в компоновщике недостаточно, если данных для новой колонки нет в самом запросе СКД. Поэтому сначала выполним стандартные действия:
1. Откроем Схему компоновки данных в конфигураторе.
2. Перейдем на закладку Наборы данных и добавим нужное поле в текст запроса или как вычисляемое поле.
3. Обязательно проверим закладку Настройки и убедимся, что новое поле доступно для выбора.
Важный нюанс: В отчетах типа "Расчетная ведомость" колонки начислений и удержаний часто формируются динамически (кросс-таблица). Если вы добавляете поле, которое не относится к ресурсам (например, какой-то реквизит сотрудника), убедитесь, что оно включено в группировку колонок или строк в соответствии с логикой отчета.
Даже после того, как вы изменили макет и обновили конфигурацию, 1С может продолжать показывать старый вариант отчета. Это происходит из-за кэширования настроек конкретного пользователя. Выполним следующие действия:
Сохраняемые настройки (или Сохраненные настройки, в зависимости от версии подсистемы).РасчетныеВедомостиОрганизаций для вашего пользователя и удалим их.Как отметил автор темы, критически важно не просто изменить объект настроек, но и применить его. В модуле объекта, в процедуре инициализации, убедитесь, что вызов загрузки настроек выполняется корректно. Проанализируем пример того, как это может выглядеть в коде:
Процедура УстановитьНачальныеНастройки() Экспорт
// Получаем макет с базовыми настройками
НастройкиМакета = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных").Получить();
// Загружаем их в текущий компоновщик отчета
КомпоновщикНастроек.ЗагрузитьНастройки(НастройкиМакета.Настройки);
// Важно: если в коде далее идет переопределение колонок,
// ваши правки могут быть затерты. Проверьте этот момент!
КонецПроцедуры
Если отчет использует построитель или специфические общие модули управления персоналом, проверьте метод ВывестиСоответствиеКолонок(). Иногда список колонок жестко ограничен массивом имен полей. В этом случае добавление поля в СКД не поможет, пока вы не добавите его имя в этот программный массив.
Мы выяснили, что для изменения колонок в типовом отчете КА 1.1 недостаточно просто поправить СКД. Необходимо учитывать "многослойность" настроек. Основные шаги включают работу с двоичными макетами, программную десериализацию КомпоновщикаНастроек, правку сохраненных настроек в справочнике и контроль программного вывода в модуле объекта. Соблюдение этой последовательности позволит вам успешно добавить любую колонку и настроить ее расположение в расчетных ведомостях.