Доработка отчета «Валовая прибыль» через расширение в УТ11
Когда многое умеешь, решать задачи просто становится скучно. Хочется сложно.
Когда клиент попросил добавить колонку «Остаток» в отчет «Валовая прибыль», я сначала хотел скачать готовый с инфостарта, но не нашел ничего кроме этого отчета:
А клиента в целом существующий отчет устраивал, но не хватало одной колонки — остатка.
Сначала я захотел сделать внешний отчет, но решил блеснуть талантом, так сказать. И поменять существующий отчет через расширение. Чем и занялся.
Первой проблемой оказалось то, что в конфигурации нет отчета «Валовая прибыль». С помощью отладчика я определил, что это отчет «ВыручкаИСебестоимостьПродаж«.
Схему компоновки можно поменять в событии «ПриСозданииНаСервере«, вот значение переменной «СхемаКомпоновкиДанных«:
Изменять текст запроса будем до вызова основного кода при создании на сервере.
Первая попытка замены вышла удачной:
Но меня смутило, что в тексте запроса я допустил ошибку с запятой, а отчет не ругнулся.
Тогда я обнаружил, что схема компонвки сбрасывается и надо расширять событие «ПередЗагрузкойНастроекВКомпоновщик«:
Вот после этого отчет уже ругнулся:
Я успешно написал рабочий код и оттестировал его:
&Перед("ПередЗагрузкойНастроекВКомпоновщик") Процедура дор_ПередЗагрузкойНастроекВКомпоновщик(Контекст, КлючСхемы, КлючВарианта, НовыеНастройкиКД, НовыеПользовательскиеНастройкиКД) //Если отчет уже изменен, не меняем повторно Если Найти(СхемаКомпоновкиДанных.НаборыДанных.ВыручкаИСебестоимостьПродаж.Запрос, " //ОСИПОВ ") <> 0 Тогда Возврат; КонецЕсли; НазваниеОтчета = "Выручка и себестоимость продаж"; Маркер = "{ЛЕВОЕ СОЕДИНЕНИЕ Документ.РасчетСебестоимостиТоваров.Организации"; ЗаменитьЗапрос(СхемаКомпоновкиДанных.НаборыДанных.ВыручкаИСебестоимостьПродаж.Запрос, Маркер, " { ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки({(&ОкончаниеПериода)}) КАК ТоварыНаСкладахОстатки | ПО ТоварыНаСкладахОстатки.Номенклатура = Продажи.АналитикаУчетаНоменклатуры.Номенклатура | //ОСИПОВ | } " + Маркер, НазваниеОтчета ); Маркер = "Продажи.АналитикаУчетаНоменклатуры.Номенклатура КАК Номенклатура"; ЗаменитьЗапрос(СхемаКомпоновкиДанных.НаборыДанных.ВыручкаИСебестоимостьПродаж.Запрос, Маркер, " ТоварыНаСкладахОстатки.ВНаличииОстаток КАК Остаток, " + Маркер, НазваниеОтчета ); Маркер = "СУММА(Таблица.Количество) КАК Количество"; ЗаменитьЗапрос(СхемаКомпоновкиДанных.НаборыДанных.ВыручкаИСебестоимостьПродаж.Запрос, Маркер, " Сумма(Таблица.Остаток) КАК Остаток, " + Маркер, НазваниеОтчета ); КонецПроцедуры
В коде, кстати, сделана проверка, чтобы текст не заменялся дважды.
Процедура ЗаменитьЗапрос проверяет, что в тексте запроса есть искомая строка и если нет, выдает пользователю сообщение, чтобы позвал программиста — это значит что после обновления код перестал работать.
Но столкнулся с проблемой — я не мог программно добавить поле Остаток в ресурс, вручную легко:
А вот программно никак. Я погуглил и посмотрел, что это можно сделать на этапе, когда уже загружены настройки компоновки. Но это и так делало бюджет разработки уже невероятно большим, поэтому усилием воли я «наступил на горло» своему любопытству и пошел другим путем.
Я скопировал исходную схему компоновки и изменил вручную в ней текст запроса и добавил нужное поле ресурсов.
Теперь мой код только заменял схему компоновки, ничего лишнего:
&Перед("ПередЗагрузкойНастроекВКомпоновщик") Процедура дор_ПередЗагрузкойНастроекВКомпоновщик(Контекст, КлючСхемы, КлючВарианта, НовыеНастройкиКД, НовыеПользовательскиеНастройкиКД) //Меняем на доработанную схему компоновки СхемаКомпоновкиДанных = ПолучитьМакет("дор_ОсновнаяСхемаКомпоновкиДанных"); КонецПроцедуры
В итоге отчет получился, как задумано.
Научил пользователей, как добавлять поле в отчет в их сохраненные варианты.
Жаль, что 1С не позволяет программно сделать с схемой компоновки что угодно. Да, можно выгрузить схему в XML, там ее поменять и загрузить обратно, но это как-то чрезмерно сложно для такой простой задачи. Поэтому опять спасение в «ручной» правке.
ВАЖНО! Чтобы замена корректно работала, посмотрите сведения в конце другой статьи, иначе не будут сохраняться настройки вариантов отчета.
Среда: УТ 11.4.13.46
Объем план: 1.5 час
А что значит » // ОСИПОВ «? , почему заглавными буквами и черным цветом, а не маленькими и зелеными?
это текст, который вряд ли встретится в типовом запросе. Разукрашивает 1С. Большими буквами для «красоты».
это надо же с таким опытом в 1с делать такую глупость — править отчет через расширение, когда можно сделать внешний. потом сам же будешь орать кто такой дурак через расширение отчеты правит
А в чем глупость? Нормальный ход. Во внешних отчетах свои недостатки. Хотя не спорю, проще было бы дать им поправленный отчет.