Доработка отчета «Валовая прибыль» через расширение в УТ11

Когда многое умеешь, решать задачи просто становится скучно. Хочется сложно.

Когда клиент попросил добавить колонку «Остаток» в отчет «Валовая прибыль», я сначала хотел скачать готовый с инфостарта, но не нашел ничего кроме этого отчета:

А клиента в целом существующий отчет устраивал, но не хватало одной колонки — остатка.

Сначала я захотел сделать внешний отчет, но решил блеснуть талантом, так сказать. И поменять существующий отчет через расширение. Чем и занялся.

Первой проблемой оказалось то, что в конфигурации нет отчета «Валовая прибыль». С помощью отладчика я определил, что это отчет «ВыручкаИСебестоимостьПродаж«.

Схему компоновки можно поменять в событии «ПриСозданииНаСервере«, вот значение переменной «СхемаКомпоновкиДанных«:

Изменять текст запроса будем до вызова основного кода при создании на сервере.

Первая попытка замены вышла удачной:


Но меня смутило, что в тексте запроса я допустил ошибку с запятой, а отчет не ругнулся.

Тогда я обнаружил, что схема компонвки сбрасывается и надо расширять событие «ПередЗагрузкойНастроекВКомпоновщик«:

Вот после этого отчет уже ругнулся:

Я успешно написал рабочий код и оттестировал его:

&Перед("ПередЗагрузкойНастроекВКомпоновщик")
Процедура дор_ПередЗагрузкойНастроекВКомпоновщик(Контекст, КлючСхемы, КлючВарианта, НовыеНастройкиКД, НовыеПользовательскиеНастройкиКД)
	
	//Если отчет уже изменен, не меняем повторно
	Если Найти(СхемаКомпоновкиДанных.НаборыДанных.ВыручкаИСебестоимостьПродаж.Запрос, " //ОСИПОВ ") <> 0 Тогда
		Возврат;
	КонецЕсли;
	
	НазваниеОтчета = "Выручка и себестоимость продаж";
	
	Маркер = "{ЛЕВОЕ СОЕДИНЕНИЕ Документ.РасчетСебестоимостиТоваров.Организации";
	ЗаменитьЗапрос(СхемаКомпоновкиДанных.НаборыДанных.ВыручкаИСебестоимостьПродаж.Запрос,
	Маркер,
	" { ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки({(&ОкончаниеПериода)}) КАК ТоварыНаСкладахОстатки 
	| ПО ТоварыНаСкладахОстатки.Номенклатура = Продажи.АналитикаУчетаНоменклатуры.Номенклатура 
	| //ОСИПОВ 
	| } "
	+ Маркер,
	НазваниеОтчета
	);
	
	Маркер = "Продажи.АналитикаУчетаНоменклатуры.Номенклатура КАК Номенклатура";
	ЗаменитьЗапрос(СхемаКомпоновкиДанных.НаборыДанных.ВыручкаИСебестоимостьПродаж.Запрос,
	Маркер,
	" ТоварыНаСкладахОстатки.ВНаличииОстаток КАК Остаток, "
	+ Маркер,
	НазваниеОтчета
	);
	
	Маркер = "СУММА(Таблица.Количество) КАК Количество";
	ЗаменитьЗапрос(СхемаКомпоновкиДанных.НаборыДанных.ВыручкаИСебестоимостьПродаж.Запрос,
	Маркер,
	" Сумма(Таблица.Остаток) КАК Остаток, "
	+ Маркер,
	НазваниеОтчета
	);
	
	
КонецПроцедуры

В коде, кстати, сделана проверка, чтобы текст не заменялся дважды.

Процедура ЗаменитьЗапрос проверяет, что в тексте запроса есть искомая строка и если нет, выдает пользователю сообщение, чтобы позвал программиста — это значит что после обновления код перестал работать.

Но столкнулся с проблемой — я не мог программно добавить поле Остаток в ресурс, вручную легко:

А вот программно никак. Я погуглил и посмотрел, что это можно сделать на этапе, когда уже загружены настройки компоновки. Но это и так делало бюджет разработки уже невероятно большим, поэтому усилием воли я «наступил на горло» своему любопытству и пошел другим путем.

Я скопировал исходную схему компоновки и изменил вручную в ней текст запроса и добавил нужное поле ресурсов.

Теперь мой код только заменял схему компоновки, ничего лишнего:

&Перед("ПередЗагрузкойНастроекВКомпоновщик")
Процедура дор_ПередЗагрузкойНастроекВКомпоновщик(Контекст, КлючСхемы, КлючВарианта, НовыеНастройкиКД, НовыеПользовательскиеНастройкиКД)
	//Меняем на доработанную схему компоновки
	СхемаКомпоновкиДанных = ПолучитьМакет("дор_ОсновнаяСхемаКомпоновкиДанных");
КонецПроцедуры

В итоге отчет получился, как задумано.

Научил пользователей, как добавлять поле в отчет в их сохраненные варианты.

Жаль, что 1С не позволяет программно сделать с схемой компоновки что угодно. Да, можно выгрузить схему в XML, там ее поменять и загрузить обратно, но это как-то чрезмерно сложно для такой простой задачи. Поэтому опять спасение в «ручной» правке.

ВАЖНО! Чтобы замена корректно работала, посмотрите сведения в конце другой статьи, иначе не будут сохраняться настройки вариантов отчета.

Среда: УТ 11.4.13.46
Объем план: 1.5 час

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

Читайте также:

комментария 4

  1. Klopik:

    А что значит » // ОСИПОВ «? , почему заглавными буквами и черным цветом, а не маленькими и зелеными?

    • это текст, который вряд ли встретится в типовом запросе. Разукрашивает 1С. Большими буквами для «красоты».

  2. Павел:

    это надо же с таким опытом в 1с делать такую глупость — править отчет через расширение, когда можно сделать внешний. потом сам же будешь орать кто такой дурак через расширение отчеты правит

    • А в чем глупость? Нормальный ход. Во внешних отчетах свои недостатки. Хотя не спорю, проще было бы дать им поправленный отчет.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *