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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

fixin

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

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

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

  1. Klopik:

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

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

  2. Павел:

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

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

Добавить комментарий для fixin Отменить ответ

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