Как сделать расшифровку в табличном документе 1С и провалиться из отчёта до документа
Содержание
Расшифровка в табличном документе 1С делается двойным щелчком по ячейке отчёта: программа открывает отчёт уровнем ниже или сам документ. Пользователю больше ничего не нужно. Разработчику — записать значение в свойство ячейки Расшифровка или передать ДанныеРасшифровкиСхемыКомпоновкиДанных, если отчёт собран на СКД.
Способов три, и выбор простой. Бухгалтер пользуется готовой расшифровкой типовых отчётов. Программист в отчёте на макете заполняет параметр расшифровки. В отчёте на компоновке данных расшифровку даёт сама платформа, а свой обработчик пишут, только когда стандартного меню мало.
Как устроена расшифровка в отчётах 1С
Каждая ячейка табличного документа хранит не только текст, но и скрытое значение — расшифровку. Это может быть ссылка на документ, контрагента, счёт или служебный идентификатор компоновки. Когда вы щёлкаете по ячейке дважды, платформа смотрит на это значение и решает, что открыть.
| Способ | Кто использует | Что происходит по двойному щелчку |
|---|---|---|
| Ссылка в ячейке | любой отчёт на макете | открывается форма объекта: документ, элемент справочника |
| Расшифровка СКД | отчёты на компоновке данных | меню действий: расшифровать по полю, отфильтровать, упорядочить, открыть значение |
| Свой обработчик | доработанные отчёты | то, что написал программист: другой отчёт, список с отбором, своя форма |
Признак того, что расшифровка есть: указатель мыши над такой ячейкой меняет вид. Если в ячейке ничего не записано, двойной щелчок просто выделит её.
Что даёт меню расшифровки в отчётах на СКД
В отчётах на компоновке данных (универсальный отчёт, большинство отчётов БП 3.0, ЗУП 3.1, УТ 11) двойной щелчок открывает меню:
- 🔍 Расшифровать — построить новый отчёт по выбранному полю, например разложить сумму по номенклатуре или по документам;
- 🧹 Отфильтровать — оставить в отчёте только строки с этим значением;
- ↕️ Упорядочить — отсортировать по полю;
- 📂 Открыть — показать карточку значения, если это ссылка.
Новый отчёт открывается в отдельном окне с теми же отборами и периодом, что и исходный. Исходный при этом не меняется — можно вернуться к нему и расшифровать другую ячейку.
Расшифровка ОСВ, анализа счёта и карточки счёта
Самый частый путь бухгалтера — от сальдо к документу. В 1С:Бухгалтерии 3.0 все нужные отчёты лежат в разделе Отчеты → Стандартные отчеты.
- Сформируйте
Оборотно-сальдовую ведомостьза нужный период и по нужной организации. - Дважды щёлкните по сумме в строке счёта. 1С предложит выбрать, каким отчётом раскрыть сумму: оборотно-сальдовой ведомостью по счёту, анализом счёта или карточкой счёта. Набор вариантов зависит от колонки.
- Выберите ОСВ по счёту, если нужно увидеть суммы в разрезе субконто — контрагентов, договоров, номенклатуры.
- Выберите Анализ счёта, если вопрос в корреспонденции: с какими счетами сложились обороты.
- В ОСВ по счёту дважды щёлкните по строке контрагента — откроется карточка счёта с отбором по нему.
- В карточке счёта двойной щелчок по строке открывает документ-регистратор, который сделал проводку.
Ищете ошибку в сальдо 60 или 62 счёта? Идите цепочкой ОСВ → ОСВ по счёту → карточка счёта → документ. Четыре щелчка — и вы в документе с неверной проводкой, без ручного перебора журнала.
Чем отличаются отчёты при расшифровке
| Отчёт | Что показывает | Когда открывать |
|---|---|---|
| ОСВ по счёту | сальдо и обороты по субконто | найти контрагента или договор с «лишней» суммой |
| Анализ счёта | обороты в корреспонденции со счетами | понять, откуда пришла сумма |
| Обороты счёта | обороты по периодам: дням, месяцам | найти месяц, где появилось расхождение |
| Карточка счёта | каждая проводка построчно | выйти на конкретный документ |
Расшифровка сохраняет период и отбор по организации. Если в исходной ОСВ стоял отбор по подразделению, проверьте, перенёсся ли он: в настройках нового отчёта он виден сразу.
Детализация из динамических списков и форм документов
В динамическом списке (журнал документов , список справочника) аналог расшифровки — двойной щелчок по строке. Он открывает форму объекта. Отсюда до движений один шаг.
- 📑 В форме документа БП 3.0 кнопка Дт/Кт показывает проводки и движения по регистрам.
- 🔗 Команда «Структура подчиненности» в меню «Ещё» показывает связанные документы: заказ, реализацию, оплату, счёт-фактуру.
- 📊 Из карточки контрагента и номенклатуры в панели навигации открываются отчёты по этому объекту.
Для разработчика у таблицы динамического списка есть событие Выбор. В нём можно отменить стандартное открытие формы и показать что-то другое — например, отчёт по выбранной строке. Принцип тот же, что у табличного документа: параметр СтандартнаяОбработка = Ложь и свой код.
Расшифровка табличного документа в управляемых формах и тонком клиенте
В управляемом приложении табличный документ показывается в поле формы, а событие ОбработкаРасшифровки выполняется на клиенте. Отсюда три следствия.
- Ссылки работают без кода. Если в ячейке ссылка, платформа сама откроет форму объекта — и в тонком, и в веб-клиенте.
- Данные компоновки на клиент не передаются. Объект
ДанныеРасшифровкиСхемыКомпоновкиДанныхживёт на сервере. Его кладут во временное хранилище, а в реквизите формы держат строку-адрес. - Любой разбор расшифровки — серверный вызов. Клиентский обработчик получает только идентификатор и передаёт его на сервер.
Ещё есть событие ОбработкаДополнительнойРасшифровки. Оно срабатывает, когда пользователь выбирает расшифровку через контекстное меню, а не двойным щелчком. Его используют, если нужно два разных действия на одной ячейке.
Если поле табличного документа открыто на редактирование (свойство Редактирование равно Истина), двойной щелчок переводит ячейку в режим правки текста. Для отчётов это свойство оставляют выключенным.
Как сделать расшифровку в табличном документе программно
Ниже три рабочих приёма — от простого к сложному. Имена отчёта, макета и реквизитов замените на свои.
Способ 1. Параметр расшифровки в макете
Самый чистый вариант для отчёта на макете. В конфигураторе откройте макет, выделите ячейки строки, откройте их свойства и в поле «Параметр расшифровки» впишите имя, например Документ. При выводе ячейки получат значение этого параметра.
&НаСервере
Процедура СформироватьНаСервере()
Результат.Очистить();
Макет = Отчеты.МойОтчет.ПолучитьМакет("Макет");
ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| Док.Ссылка КАК Документ,
| Док.Дата КАК Дата,
| Док.Номер КАК Номер,
| Док.СуммаДокумента КАК Сумма
|ИЗ
| Документ.РеализацияТоваровУслуг КАК Док
|ГДЕ
| Док.Дата МЕЖДУ &Начало И &Конец";
Запрос.УстановитьПараметр("Начало", НачалоПериода);
Запрос.УстановитьПараметр("Конец", КонецДня(КонецПериода));
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
ОбластьСтрока.Параметры.Заполнить(Выборка);
Результат.Вывести(ОбластьСтрока);
КонецЦикла;
КонецПроцедуры
Заполнить берёт значения по совпадающим именам, поэтому параметр Документ получит ссылку из колонки Документ. Двойной щелчок по любой ячейке строки откроет реализацию — обработчик писать не нужно.
Способ 2. Свой обработчик ОбработкаРасшифровки
Нужен, когда по щелчку надо открыть не карточку, а что-то другое. Пример: в ячейке ссылка на контрагента, а по щелчку открывается список реализаций с отбором по нему.
&НаКлиенте
Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)
Если ТипЗнч(Расшифровка) = Тип("СправочникСсылка.Контрагенты") Тогда
СтандартнаяОбработка = Ложь;
Отбор = Новый Структура("Контрагент", Расшифровка);
ОткрытьФорму("Документ.РеализацияТоваровУслуг.ФормаСписка",
Новый Структура("Отбор", Отбор));
КонецЕсли;
КонецПроцедуры
Значения других типов уходят в стандартную обработку, и платформа откроет их сама.
Способ 3. Расшифровка в отчёте на СКД с собственным выводом
Если отчёт выводится кодом через компоновщик, расшифровку надо явно попросить: передать объект ДанныеРасшифровкиСхемыКомпоновкиДанных в компоновщик макета и в процессор.
&НаСервере
Процедура СформироватьНаСервере()
Схема = Отчеты.МойОтчет.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
Настройки = Отчет.КомпоновщикНастроек.ПолучитьНастройки();
ДанныеРасшифровки = Новый ДанныеРасшифровкиСхемыКомпоновкиДанных;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, Настройки, ДанныеРасшифровки);
Процессор = Новый ПроцессорКомпоновкиДанных;
Процессор.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки, Истина);
Результат.Очистить();
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(Результат);
ПроцессорВывода.Вывести(Процессор);
АдресРасшифровки = ПоместитьВоВременноеХранилище(ДанныеРасшифровки, УникальныйИдентификатор);
КонецПроцедуры
АдресРасшифровки — строковый реквизит формы. Теперь в ячейках лежат идентификаторы, а по ним на сервере достаются значения полей:
&НаКлиенте
Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)
Значение = ЗначениеПоляРасшифровки(АдресРасшифровки, Расшифровка, "Контрагент");
Если ЗначениеЗаполнено(Значение) Тогда
СтандартнаяОбработка = Ложь;
ПоказатьЗначение(, Значение);
КонецЕсли;
КонецПроцедуры
&НаСервереБезКонтекста
Функция ЗначениеПоляРасшифровки(Адрес, Идентификатор, ИмяПоля)
ДанныеРасшифровки = ПолучитьИзВременногоХранилища(Адрес);
Элемент = ДанныеРасшифровки.Элементы[Идентификатор];
Если ТипЗнч(Элемент) <> Тип("ЭлементРасшифровкиКомпоновкиДанныхПоля") Тогда
Возврат Неопределено;
КонецЕсли;
Для Каждого ПолеРасшифровки Из Элемент.ПолучитьПоля() Цикл
Если ПолеРасшифровки.Поле = ИмяПоля Тогда
Возврат ПолеРасшифровки.Значение;
КонецЕсли;
КонецЦикла;
Возврат Неопределено;
КонецФункции
Если нужного поля в самой ячейке нет (например, щёлкнули по итогу ресурса), оно лежит у родительской группировки. Пройдите вверх через Элемент.ПолучитьРодителей() и проверьте поля там.
Чтобы построить «отчёт по ячейке» как в типовом меню, используйте объект ОбработкаРасшифровкиКомпоновкиДанных. Его метод Расшифровать по идентификатору и полю возвращает новые настройки компоновки, которые остаётся передать в форму отчёта.
Почему не работает расшифровка: ошибки и решения
Как ускорить работу с расшифровкой
На больших отчётах данные расшифровки занимают заметную память: на каждую ячейку с ресурсом создаётся элемент. Несколько приёмов держат отчёт быстрым.
- ⚡ Не включайте расшифровку там, где она не нужна. Печатные формы и выгрузки формируйте без
ДанныеРасшифровки— просто не передавайте этот параметр. - 🧭 Разбирайте на сервере без контекста. Передавайте адрес и идентификатор параметрами, как в примере выше. Контекстный серверный вызов гоняет туда-обратно всю форму.
- 🔑 Храните в ячейке ссылку, а не структуру. Ссылка открывается без обработчика и весит мало.
- 📉 Сужайте исходный отчёт. Расшифровка ОСВ за год по всем организациям строится дольше, чем за месяц по одной. Отбор задайте до двойного щелчка.
Пользователю тоже есть что ускорить. Не формируйте карточку счёта за год с нуля — откройте ОСВ по счёту, найдите контрагента и расшифруйте только его строку.
Другие способы детализировать данные
Расшифровка — не единственный путь к деталям. Иногда удобнее другое.
| Инструмент | Когда подходит |
|---|---|
| Группировки строк (значки «+» и «−» слева) | раскрыть итог по группе прямо в отчёте, без нового окна |
| Настройки отчёта: группировки и отборы | нужна постоянная детализация, а не разовая |
| Анализ субконто | срез по контрагенту или номенклатуре сразу по всем счетам |
| Кнопка Дт/Кт в документе | обратный путь: от документа к проводкам |
| Сохранение варианта отчёта | одна и та же расшифровка нужна каждый месяц |
Если вы раз за разом расшифровываете ОСВ до одних и тех же субконто, настройте группировки в самом отчёте и сохраните вариант. Расшифровка хороша для разового поиска, вариант отчёта — для регулярной работы.
Частые вопросы
Можно ли расшифровать сумму в отчёте, открытом из файла .mxl?
Почему расшифровка в моём отчёте открывает только карточку, а меню нет?
Работает ли расшифровка в веб-клиенте?
Можно ли в одной ячейке дать два действия?
ОбработкаРасшифровки, а выбор из контекстного меню — в ОбработкаДополнительнойРасшифровки.