Хороший отчет, который не просто что-то показывает пользователю, но и позволяет сразу что-то с этим сделать – может стать его ключевым рабочим инструментом.
Кликнул в ячейку, сказал “Выровнять” – и 1С сама:
1. нашла или создала документ перемещения
2. добавила в него эту номенклатуру в количестве, достаточном для распределения пропорционально темпам списания
3. обновила отчет с новыми цифрами “как будет”..
Наглядно, удобно, как должно быть…
Это красивая история для любого разработчика/внедренца, когда вся компания с удовольствием пользуется твоей разработкой. Особенно, если ты сам работаешь внутри компании :)
Один из механизмов для этого – расшифровки, на которые мы устанавливаем свои дополнительные действия:
- Клиенты видят их в типовых конфигурациях и привыкли к ним, часто пишут прямо в требованиях “по аналогии с УТ повесить на ячейку отчета следующие действия…”
- Платформа позволяет реализовывать любую логику и делать то, чего в типовых просто нет.
В общем, сейчас поговорим об инструментах, которые позволяют создать уникальные и в то же время удобные доработки в отчеты, которые резко повышают их ценность:
- Добавлять в отчеты расшифровки «как в типовых конфигурациях»
- Реализовывать нетиповые расшифровки, которые будут более полезными для клиентов.
Поехали, там красивое :)
И всего 45 минут, как в школе…
Видео № 1. Что такое расшифровка отчетов на СКД и какие объекты встроенного языка для этого используются
Ключевые моменты видео:
0:32 — стандартная расшифровка отчетов на СКД
1:26 — варианты расшифровки отчетов
3:01 — в каких случаях может потребоваться программная расшифровка отчета
3:26 — обязательное условие для работы расшифровки
3:49 — реквизиты формы отчета, необходимые для работы расшифровки
4:51 — событие ОбработкаРасшифровки
5:46 — изучение объектов, необходимых для программной работы с расшифровкой при помощи отладчика
9:09 — схема взаимосвязи объектов, необходимых для программной работы с расшифровкой
Видео № 2. Как обработать щелчок правой кнопки мыши в отчете на СКД
Ключевые моменты видео:
0:21 — как переопределить действия при нажатии правой кнопки мыши на ячейке отчета
0:35 — событие ОбработкаДополнительнойРасшифровки
1:04 — программный код для обработки дополнительной расшифровки
Видео № 3. Как реализовать расшифровку показателя в отчете при помощи другого отчета
Ключевые моменты видео:
0:25 — программный код для расшифровки отчета при помощи другого отчета
0:54 — программное открытие формы отчета с отбором
1:07 — параметры формы, предоставленные расширением формы клиентского приложения для отчета
Видео № 4. Почему может не работать расшифровка при программной компоновке отчета в процедуре ПриКомпоновкеРезультата
Ключевые моменты видео:
0:26 — демонстрация отчета, в котором не работает расшифровка
0:50 — изучение процедуры ПриКомпоновкеРезультата
1:04 — в каких случаях может потребоваться самостоятельная компоновка отчета
1:23 — использование параметра ДанныеРасшифровки
Видео № 5. Как программно сформировать собственное меню для расшифровки показателей отчета
Ключевые моменты видео:
0:12 — демонстрация использования меню
0:49 — создание объекта ОбработкаРасшифровкиКомпоновкиДанных
1:57 — описание процедуры, которая будет вызвана при выборе пользователем действия в меню
2:31 — описание действий, которые будут добавлены в формируемое меню
4:01 — обработка действия, выбранного пользователем в меню
Видео № 6. Как программно сформировать вложенные подменю для расшифровки показателей отчета
Ключевые моменты видео:
0:13 — демонстрация использования подменю при расшифровке отчета
0:36 — программный код для формирования подменю
0:58 — формирование структуры меню, содержащего подменю
Видео № 7. Как программно обработать действие Отфильтровать при работе с расшифровкой
Ключевые моменты видео:
0:10 — детализация отчета по остаткам товаров до складов
0:40 — анализ программного кода
1:58 — программная модификация настроек компоновки, используемых для расшифровки отчета
2:28 — передача параметра Расшифровка в открываемую форму отчета
Видео № 8. Как реализовать расшифровку в форме самого отчета без открытия отдельных окон
Ключевые моменты видео:
0:21 — демонстрация расшифровки отчета в форме этого же отчета
1:27 — обработка выбранного пользователем действия расшифровки
2:21 — обработка настроек компоновки, переданных в качестве параметра при расшифровке
2:52 — компоновка отчета с новыми настройками
Видео № 9. Как программно сформировать разные меню для разных полей отчета
Ключевые моменты видео:
0:15 — демонстрация отчета с разными меню расшифровки для разных полей
0:50 — настройка макетов в схеме компоновки
1:52 — программное формирование различных меню расшифровки для разных полей отчета
2:23 — получение структуры, содержащей поля расшифровки
3:56 — обработка выбранного пользователем действия расшифровки
Скачайте архив со всеми отчетами, показанными в видео, и Вам не придется вручную набирать весь программный код. Можно просто открыть готовый отчет в своей базе, изучить его, отладить:
Видео № 10. Как в расширении для УТ 11.4 реализовать расшифровку ведомости по товарам на складах при помощи прайс-листа
В видео покажем, как выполнить расшифровку отчета при помощи другого отчета в конфигурации 1С:Управление торговлей версии 11.4. За счет того, что она базируется на БСП, а не написана с нуля, есть нюансы. Чтобы конфигурация осталась типовой и могла обновляться автоматически, доработка выполнена при помощи расширения для УТ 11.4.13.136.
Урок будет полезен тем, кто работает с типовыми решениями 1С. В ERP 2 и КА 2 задача будет решаться так же, как в УТ 11. Также код, представленный в видео, можно использовать как образец для конфигураций, в которых внедрена БСП третьей редакции. Естественно, отчеты или процедуры в них будут называться по-другому, но принцип доработки останется тот же.
Приятного просмотра!
Ключевые моменты видео:
0:15 — расшифровка ведомости расчетов с клиентами при помощи карточки расчетов в УТ 11
1:25 — работа с общей формой ФормаОтчета, поиск процедуры, выполняющей обработку расшифровки
2:14 — анализ программного кода для расшифровки различных отчетов в УТ
2:53 — образец кода, описывающего параметры расшифровки
4:06 — расширение, при помощи которого выполнена доработка
4:25 — использование аннотации ИзменениеИКонтроль
5:28 — проверка работоспособности расширения в пользовательском режиме
Чтобы быстрее разобраться, как выполнить расшифровку в УТ 11, КА 2 и ERP 2, скачайте расширение из видеоурока:
Не пропустите новый курс (по специальной цене для первого потока)!
Коллеги, запускаем новый курс по EDT и Git, первый курс в серии курсов по DevOps.
Если Вы тимлид / руководитель отдела разработки / работаете в команде из 5+ человек над одним проектом / планируете перейти в ведущие франчайзи не простым разработчиком – рекомендуем внимательно его посмотреть:
Спасибо! Очень хорошая подача материала.
Можете подсказать путь решения задачи. УТ11. Форма списка номенклатуры. На форму через расширение выведено количество в резерве “Резерв”. Как сделать (при двойном клике на “Резерве”) программное открытие типового отчета “Остатки и доступность товаров” так, чтобы он открывался сразу с расшифровкой по Заказу на отгрузку? Может есть уроки на эту тему?
Добрый день!
В типовой УТ из формы списка номенклатуры можно открыть отчет “Остатки и доступность товаров”. Предлагаю подсмотреть, как это реализовано. Создать собственный вариант отчета с нужными полями и группировками, открывать его при нажатии на нужном поле.
Ниже ряд полезных методов.
В модуле менеджера справочника Номенклатура:
КомандаОтчет = Отчеты.ОстаткиИДоступностьТоваров.ДобавитьКомандуОтчета(КомандыОтчетов);//СтрокаТаблицыЗначений
Если КомандаОтчет <> Неопределено Тогда
КомандаОтчет.Важность = "Важное";
КомандаОтчет.РежимЗаписи = "";
КонецЕсли;
...
КонецПроцедуры
В модуле менеджера отчета ОстаткиИДоступностьТоваров:
Если ПравоДоступа("Просмотр", Метаданные.Отчеты.ОстаткиИДоступностьТоваров)
И НЕ ОбщегоНазначенияУТКлиентСервер.АвторизованВнешнийПользователь() Тогда
КомандаОтчет = КомандыОтчетов.Добавить();
КомандаОтчет.Менеджер = Метаданные.Отчеты.ОстаткиИДоступностьТоваров.ПолноеИмя();
КомандаОтчет.Представление = НСтр("ru = 'Остатки и доступность'");
КомандаОтчет.Важность = "Обычное";
КомандаОтчет.МножественныйВыбор = Ложь;
КомандаОтчет.ДополнительныеПараметры.Вставить("ИмяКоманды", "ОстаткиИДоступность");
КомандаОтчет.КлючВарианта = "ПоНоменклатуреКонтекст";
Возврат КомандаОтчет;
КонецЕсли;
Возврат Неопределено;
КонецФункции
ФормаСпискаДокументов документа ЗаказКлиента:
Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
Если Поле.Имя = "СписокПроцентОтгрузки" Или Поле.Имя = "СписокСостояние" Тогда
ТекущиеДанные = Элементы.Список.ТекущиеДанные;
Если Не ТекущиеДанные = Неопределено Тогда
СтандартнаяОбработка = Ложь;
СписокДокументов = Новый СписокЗначений;
СписокДокументов.Добавить(ТекущиеДанные.Ссылка);
ОткрытьФорму("Отчет.СостояниеВыполненияДокументов.Форма.ФормаОтчета",
Новый Структура("ВходящиеДокументы", СписокДокументов),
ЭтаФорма,
Ложь);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Спасибо большое. Попробую
Идея с вариантом помогла. Добавил свои варианты отчета в расширении с группировкой по Заказу на отгрузку и Заказу на поступление.
В модуле формы списка номенклатуры добавил обработчик
&НаКлиенте
Процедура Андрей_СписокРасширенныйПоискНоменклатураВыборПосле(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
Если Поле.Имя = “Резерв” Или Поле.Имя = “Ожидается” Тогда
ТекущиеДанные = Элементы.СписокРасширенныйПоискНоменклатура.ТекущиеДанные;
Если Не ТекущиеДанные = Неопределено Тогда
СтандартнаяОбработка = Ложь;
УсловияОтбора = Новый Структура;
УсловияОтбора.Вставить(“Номенклатура”, Элементы.СписокРасширенныйПоискНоменклатура.ТекущаяСтрока);
УсловияОтбора.Вставить(“Склад”, Склад);
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить(“Отбор”, УсловияОтбора);
ПараметрыФормы.Вставить(“СформироватьПриОткрытии”, Истина);
ПараметрыФормы.Вставить(“КлючВарианта”, ?(Поле.Имя = “Резерв”, “Андрей_Резервы”, “Андрей_Ожидается”));
ОткрытьФорму(“Отчет.ОстаткиИДоступностьТоваров.Форма”, ПараметрыФормы,ЭтаФорма, Истина);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Василий, подскажите, пожалуйста, актуальный курс по доработке типового решения УТ11.
Ещё раз благодарю за помощь!
Отлично, что разобрались!
>>Василий, подскажите, пожалуйста, актуальный курс по доработке типового решения УТ11
К сожалению, сейчас у нас на сайте нет актуального курса по этой теме.
Шикарный урок! Спасибо
Очень полезен был этот урок. Понял некоторые сложные вещи. Осталось непонятным простое – что надо написать, чтобы обработка расшифровки просто включала ввод текста в ячейку. То есть как в экселе – щелкнул на поле “Комментарий” и ввел умную мысль.
Добрый день!
Рад, что материал оказался полезным.
Чтобы можно было редактировать значение в ячейке табличного документа, нужно включить для ячейки свойство СодержитЗначение:
И реализовать обработчик события ПриИзмененииСодержимогоОбласти.
А есть ли возможность получить индекс, который попадает в параметр Расшифровка не обращаясь к процедуре РезультатОбработкаРасшифровки?
Например, мне надо получить значения строки и колонки для ячейки в процедуре ПриИзменении….
Нет такой возможности.
А как реализовать расшифровку для разных ресурсов? К примеру есть отчет в котором группировка – вид номенклатуры, а разные ресурсы – это количество различной номенклатуры уже сгруппированной по каким то условиям. И нужно по нажатию на расшифровку ресурса открывать другой отчет (единый для всех ресурсов) но в качестве отбора использовать именно номенклатуру по которой этот ресурс рассчитался?
Добрый день!
Прикрепил пример подобной расшифровки для демо-конфигурации Управляемое приложение – ОстаткиТоваровНаСкладах_СобственноеМенюРасшифровки.zip
Основная идея – создать отдельные макеты компоновки для каждого поля, содержащего количества.
В расшифровке для поля КоличествоПриход будет поле КоличествоПриход, а в расшифровке для поля КоличествоРасход будет поле КоличествоРасход. По этому имени и будем определять, какое меню следует показать:
Пример программного кода:
Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ПоляРасшифровки = ПолучитьЗначениеРасшифровки(Расшифровка);
ОбработкаРасшифровки = Новый ОбработкаРасшифровкиКомпоновкиДанных(ДанныеРасшифровки, Новый ИсточникДоступныхНастроекКомпоновкиДанных(Отчет));
ОписаниеОповещения = Новый ОписаниеОповещения("ПоказатьВыборДействияЗавершение", ЭтаФорма);
ДоступныеДействия = Новый Массив;
ДоступныеДействия.Добавить(ДействиеОбработкиРасшифровкиКомпоновкиДанных.ОткрытьЗначение);
ДополнительныеПунктыМеню = Новый СписокЗначений;
Если ПоляРасшифровки.Свойство("КоличествоПриход") Тогда
ДополнительныеПунктыМеню.Добавить("Открыть расшифровку Прихода");
ИначеЕсли ПоляРасшифровки.Свойство("КоличествоРасход") Тогда
ДополнительныеПунктыМеню.Добавить("Открыть расшифровку Расхода");
КонецЕсли;
ОбработкаРасшифровки.ПоказатьВыборДействия(ОписаниеОповещения, Расшифровка, ДоступныеДействия, ДополнительныеПунктыМеню);
КонецПроцедуры
&НаСервере
Функция ПолучитьЗначениеРасшифровки(Расшифровка)
Структура = Новый Структура;
ДанныеРасшифровкиКомпоновки = ПолучитьИзВременногоХранилища(ДанныеРасшифровки);
ПоляРасшифровки = ДанныеРасшифровкиКомпоновки.Элементы.Получить(Расшифровка).ПолучитьПоля();
Для каждого ПолеРасшифровки Из ПоляРасшифровки Цикл
Структура.Вставить(ПолеРасшифровки.Поле, ПолеРасшифровки.Значение);
КонецЦикла;
Возврат Структура;
КонецФункции
&НаКлиенте
Процедура ПоказатьВыборДействияЗавершение(ВыполненноеДействие, ПараметрВыполненногоДействия, ДополнительныеПараметры) Экспорт
Если ВыполненноеДействие = ДействиеОбработкиРасшифровкиКомпоновкиДанных.ОткрытьЗначение Тогда
ПоказатьЗначение(Неопределено, ПараметрВыполненногоДействия);
ИначеЕсли ВыполненноеДействие = "Открыть расшифровку Прихода" Тогда
ПоказатьПредупреждение(, "Это приход!");
ИначеЕсли ВыполненноеДействие = "Открыть расшифровку Расхода" Тогда
ПоказатьПредупреждение(, "Это расход!");
КонецЕсли;
КонецПроцедуры
Василий Ханевич, приветствую.
Так как до значений группировок то адекватно добраться?
Который из ресурсов расшифровывать можем определить и без макета.
Пробую рекурсивно через ПолучитьРодителей(), но там такая каша возвращается.
Добрый день!
Я бы именно через ПолучитьРодителей пробовал сделать. В курсе по СКД было практическое задание 20.1 на эту тему, там как раз через рекурсию и было реализовано, попробуйте код из обработки посмотреть.
Добрый день! Весьма информативные видео, спасибо!
Подскажите пожалуйста, используя последнее видео дорабатываю расшифровку отчета “ОстаткиИДоступность” отчетом “СебестоимостьТоваров”. И столкнулась с такой проблемой:
1. Мне необходимо, что бы при расшифровке в отчете по себестоимости период был “пустым”, т.е. за весь период, но в отчете “Остатки и доступность” такого параметра нет, поэтому при расшифровке устанавливается период “по – умолчанию”, т.е. текущий месяц. Если менять настройки в процедуре “ПриКомпановкеРезультата” (в пользовательских настройках), то это же применяется ко всему варианту, а мне нужно, что бы только при расшифровке.
2. Так же у варианта отчета по себестоимости в структуре заданы группировки, но у одной из них “Использование” – ложь, а мне необходимо изменить на “Истина”.
Таким образом, при изменении параметра “Период” и настройки структуры в процедуре “ПриКомпоновкеРезультата” становится невозможным пользователю изменить эти настройки Можно ли как-то задавая параметры отчета решить эти 2 проблемы?
Добрый день!
В типовой УТ в общем модуле ОтчетыУТКлиентПереопределяемый есть процедура ОбработкаРасшифровки с примером, который может быть Вам полезен:
СтандартнаяОбработка = Ложь;
СтруктураРасшифровки = ОтчетыУТВызовСервераПереопределяемый.СформироватьДанныеРасшифровки(Расшифровка, ЭтаФорма.ОтчетДанныеРасшифровки);
Если ЗначениеЗаполнено(СтруктураРасшифровки.Номенклатура) Тогда
ОткрытьОтчетСертификатыНоменклатуры(ЭтаФорма.Отчет, СтруктураРасшифровки);
КонецЕсли;
В указанной процедуре выполняется программная работа с пользовательскими настройками, устанавливаются значения параметров, отборы. Затем сформированные настройки передаются в открываемую форму отчета.
Попробуйте такой же подход реализовать для решения Вашей задачи.
Доброго времени!
Сделал, чтобы расшифровка открывала этот же отчет из которого она вызывается, но в качестве параметра указал другой вариант отчета (другой вариант схемы компановки данных – не основной). И возникла проблема, после использования расшифровки следующее открытие формы отчета приводит к тому, что вариант отчета там становится уже не Основной, а тот, что используется в расшифровке.
Вопрос: можно ли сделать так, чтобы при открытии формы пользователем вариант отчета автоматически становился Основным, чтобы пользователь не выбирал его вручную? Выбирать другой вариант отчета пользователю нет смысла, так как он создавался исключительно для использования расшифровки.
Ну или может быть есть какой-то другой вариант решения задачи? Например, сделать так, чтобы НеОсновной формы вообще не было в списке выбора, а использовалась она только программно (через Расшифровку).
Добрый день!
Могу порекомендовать подход, использующийся в типовых конфигурациях. Пользователь работает не с самими отчетами, а с панелями отчетов, в которых размещены варианты отчетов (в УТ раздел Продажи – Отчеты по продажам). Т.е. пользователь открывает не просто отчет, а конкретный сохраненный вариант отчета.
При этом в типовых конфигурациях варианты, использующиеся только для расшифровки, не отображаются в панели отчетов.
Например, в Вашем случае можно в командном интерфейсе разместить не просто отчет, а команду, в которой реализовано открытие всегда основного варианта отчета. Тогда не будет открываться вариант только для расшифровки.
Или можно внедрить в свою конфигурацию подсистему БСП Варианты отчетов, чтобы поведение системы соответствовало другим типовым конфигурациям.
Спасибо за такие хорошие видео)
Однако при изменении обработки дополнительной расшифровки в меню по клику правой кнопки мыши пропадают кнопки “Копировать”, “Выделить все”, “Искать везде” и “Свойства”. Не могли бы вы подсказать, как их вернуть?
Добрый день!
Не придумал, как это можно сделать.
Классные видео! Василий, вы молодец!
А можно ли несколько доработать структуру отчета, открываемую при расшифровке? Например, при расшифровке остатка товара открыть расшифровку отчета, в которой будет структура Склад –
Добрый день!
Спасибо!
Да. Для этого можно подготовить вариант отчета с нужной структурой. И при открытии формы отчета указать, какой именно вариант отчета требуется:
ПараметрыФормы.Вставить("СформироватьПриОткрытии", Истина);
ПараметрыФормы.Вставить("КлючВарианта", "ВариантДляРасшифровкиПоСкладам");
ПараметрыФормы.Вставить("Отбор", Новый Структура("Товар", Товар));
ОткрытьФорму("Отчет.ОтчетДляРасшифровки.Форма", ПараметрыФормы);