Доработка типового отчета в БП 30
1С:Предприятие 8.3 (8.3.10.2561)
Бухгалтерия предприятия, редакция 3.0 (3.0.64.29)
Пример, как можно внести изменения в типовой отчет Бухгалтерии предприятия 30 без снятия конфигурации с поддержки
Задача: Добавить возможность отбора, группировки по Регистратору(Документу) в типовой отчет "Регистры налогового учета"
1. Добавляем расширение в конфигурацию 1с
Меню -Конфигурация - Расширение конфигурации
Добавим расширение
Снимем признак "Безопасный режим в расширение"
2. Добавил форму отчета в расширение
Находим требуемый отчет в конфигурации , щелкам правой кнопкой мышки по форме отчета, выполняем команду "Добавить в расширение"
3. Определяем место инициализации компоновщика и его настроек.
В рамках текущей задачи это процедура "ИзменениеСхемыКомпоновкиДанныхНаСервере" в форме отчета.
Можно понять, если найти в коде использования реквизита формы "СхемаКомпоновкиДанных" и момент инициализации настроек для компоновщика отчета.
В данном реквизите типа "Строка" сохраняется схема компоновки данных. Далее она может изменятся в процессе выполнения программного кода. Используется для источника доступных настроек компоновщика данных.
4. Добавляем процедуру в расширение
Выделяем процедуру в основной форме отчета, щелкаем правой кнопкой мыши и выполняем команду "Добавить в расширение"
Выбираем в какой момент времени она будет вызвана. В нашем случаи после выполнения изначальной до изменений.
Так отображается добавленная процедура в коде формы отчета расширения.
5. Определяем по данным отчета, что нам нужно изменить, что бы можно было наложить отбор по требуемому полю
В данном случаи, нужно изменить "Ограничение использования реквизитов" в схеме компоновки данных
6. Снимаем ограничение использования реквизитов для условия и группировки
В процедуре "ИзменениеСхемыКомпоновкиДанныхНаСервере" добавляем программный код:
&НаСервере
&После("ИзменениеСхемыКомпоновкиДанныхНаСервере")
Процедура Расшир_ИзменениеСхемыКомпоновкиДанныхНаСервере(Знач Схема)
// Определяем необходимость инициализации
ИнициализироватьКомпНастроек=ложь;
Если Схема = Неопределено Тогда
Схема = ПолучитьИзВременногоХранилища(СхемаКомпоновкиДанных);
КонецЕсли;
// Найдем набор данных для изменения
ДанныеПервичныхДокументов=Схема.НаборыДанных.найти("ДанныеПервичныхДокументов");
Если ДанныеПервичныхДокументов<> неопределено тогда
// Найдем в наборе данных поле для изменения
ПолеРегистраторНаборДанных=ДанныеПервичныхДокументов.Поля.найти("Регистратор");
Если ПолеРегистраторНаборДанных <> неопределено тогда
// Меняем значение настройки поля
ПолеРегистраторНаборДанных.ОграничениеИспользованияРеквизитов.Условие =ложь;
ПолеРегистраторНаборДанных.ОграничениеИспользованияРеквизитов.Группировка =ложь;
ИнициализироватьКомпНастроек=истина;
КонецЕсли;
КонецЕсли;
Если ИнициализироватьКомпНастроек тогда
// Обновим значение СКД
СхемаКомпоновкиДанных = ПоместитьВоВременноеХранилище(Схема, СхемаКомпоновкиДанных);
// Инициализируем компоновщик настроек
Отчет.КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных));
КонецЕсли;
КонецПроцедуры
7. Поле "Регистратор" все равно не доступно ?
Проводим отладку и выясняем, что дополнительно при открытии формы настройки отчета отрабатывает ограничение по доступности некоторых полей в процедуре "ПолучитьЗапрещенныеПоля". Для других типовых отчетов не обязательно наличие данной процедуры.
Процедура "ПолучитьЗапрещенныеПоля"
Выдержка из типовой процедуры
&НаКлиенте
Функция ПолучитьЗапрещенныеПоля(Режим = "") Экспорт
СписокПолей = Новый Массив;
//Если список субконто задан
Если Отчет.СписокВидовСубконто.Количество() > 0 Тогда
СписокПолей.Добавить("Субконто1");
СписокПолей.Добавить("Субконто2");
СписокПолей.Добавить("Субконто3");
КонецЕсли;
Для Каждого Субконто Из Отчет.СписокВидовСубконто Цикл
СписокПолей.Удалить(0);
КонецЦикла;
СписокПолей.Добавить("UserFields");
СписокПолей.Добавить("DataParameters");
СписокПолей.Добавить("SystemFields");
СписокПолей.Добавить("Показатели");
СписокПолей.Добавить("Период");
СписокПолей.Добавить("БухТипРесурса");
СписокПолей.Добавить("ДатаОперации");
СписокПолей.Добавить("ДоляЕНВД");
СписокПолей.Добавить("Содержание");
СписокПолей.Добавить("Организация");
СписокПолей.Добавить("ОстатокБУ");
СписокПолей.Добавить("ОстатокНУ");
СписокПолей.Добавить("Регистратор");
.....
Добавляем ее по аналогу в расширение, внесем изменения для исключения поля "Регистратор" из списка ограничений.
&НаКлиенте
&Вместо("ПолучитьЗапрещенныеПоля")
Функция Расшир_ПолучитьЗапрещенныеПоля(Режим)
// Результат - это поле табличного документа, заменяем на свое значение
МассивСписокПолейФикс = ПродолжитьВызов(Режим);
// Сформируем новый фиксированный массив без ограничения на поле "Регистратор"
СписокПолей= новый Массив;
Для Каждого Эл из МассивСписокПолейФикс цикл
Если Эл = "Регистратор" тогда
Продолжить;
КонецЕсли;
СписокПолей.Добавить(Эл);
КонецЦикла;
// Вернем новый фикс. массив
Возврат Новый ФиксированныйМассив(СписокПолей);
КонецФункции
8. Проверяем результат
Поле и реквизиты доступны для группировки
Поле и реквизиты доступны для отбора