При работе в программе 1С:Бухгалтерия предприятия 3.0 пользователи часто сталкиваются с необходимостью построения сложных аналитических отчетов. Стандартный инструмент Универсальный отчет позволяет быстро выводить данные из документов, справочников или регистров. Однако его базовых возможностей не всегда достаточно, когда требуется соединить информацию из нескольких связанных таблиц.
В этой статье мы подробно разберем практический кейс: как в Универсальном отчете по регистру сведений СведенияТаможенныхДекларацийЭкспорт получить ссылку на подчиненный документ Счет-фактура выданный, а также настроить вывод его номера в красивом «печатном» формате — без внутренних префиксов базы данных и лидирующих нулей (например, преобразовать «00БП-0002811» в «2811»).
Для начала проанализируем структуру хранения данных в системе. Регистр сведений СведенияТаможенныхДекларацийЭкспорт содержит сведения о таможенных декларациях и ссылается на документ отгрузки через измерение ДокументОтгрузки (обычно это документ Реализация (акты, накладные, УПД)).
Документ Счет-фактура выданный не связан напрямую с регистром таможенных деклараций. Однако он всегда содержит ссылку на документ отгрузки в качестве своего документа-основания. Схематично эту цепочку связи можно представить следующим образом:
[Регистр сведений] -> [Документ отгрузки (Реализация)] <- [Документ-основание] <- [Счет-фактура выданный]
Наша задача — настроить систему компоновки данных (СКД) Универсального отчета таким образом, чтобы она автоматически находила соответствующий счет-фактуру по документу отгрузки и выводила его очищенный номер.
Для реализации сложной логики соединения таблиц стандартных настроек Универсального отчета в режиме «1С:Предприятие» будет недостаточно. Нам потребуется временно перейти в режим редактирования схемы компоновки данных (СКД). Выполнить эту операцию можно только в толстом клиенте.
Рассмотрим пошагово, как получить доступ к редактированию схемы:
Универсальный отчет (раздел «Отчеты» — «Стандартные отчеты» — «Универсальный отчет»).После открытия конструктора мы можем напрямую изменять SQL-подобный запрос, который используется для формирования отчета.
Существует два принципиальных подхода к получению связанных данных в СКД. Первый — использование программных функций в вычисляемых полях, второй — явное связывание таблиц в запросе.
Важное архитектурное замечание: некоторые разработчики пытаются решить задачу программным вызовом функций вида УчетНДСПереопределяемый.НайтиПодчиненныйСчетФактуруВыданныйНаРеализацию(ДокументОтгрузки) прямо в вычисляемых полях. Делать так крайне не рекомендуется! Если в вашем отчете будет 10 000 строк, система выполнит 10 000 отдельных точечных запросов к базе данных (классическая проблема производительности N+1). Это приведет к колоссальным задержкам и зависанию системы.
Правильный и производительный способ — использовать ЛЕВОЕ СОЕДИНЕНИЕ в самом запросе схемы компоновки данных. Перейдем на вкладку «Наборы данных» и скорректируем текст запроса, добавив соединение с табличной частью документов-оснований счетов-фактур:
ВЫБРАТЬ
ТаможенныйРегистр.Период КАК Период,
ТаможенныйРегистр.Регистратор КАК Регистратор,
ТаможенныйРегистр.ДокументОтгрузки КАК ДокументОтгрузки,
// Получаем ссылку на подчиненный счет-фактуру
ЕСТЬNULL(СчетФактураДокумент.Ссылка, ЗНАЧЕНИЕ(Документ.СчетФактураВыданный.ПустаяСсылка)) КАК СчетФактура,
// Получаем исходный номер счета-фактуры для последующей обработки
ЕСТЬNULL(СчетФактураДокумент.Номер, "") КАК НомерСФ
ИЗ
РегистрСведений.СведенияТаможенныхДекларацийЭкспорт КАК ТаможенныйРегистр
// Соединяем по табличной части документов-оснований счетов-фактур
ЛЕВОЕ СОЕДИНЕНИЕ Документ.СчетФактураВыданный.ДокументыОснования КАК СФОснования
ПО ТаможенныйРегистр.ДокументОтгрузки = СФОснования.ДокументОснования
И НЕ СФОснования.Ссылка.ПометкаУдаления
// Получаем реквизиты самого документа Счет-фактура выданный
ЛЕВОЕ СОЕДИНЕНИЕ Документ.СчетФактураВыданный КАК СчетФактураДокумент
ПО СФОснования.Ссылка = СчетФактураДокумент.Ссылка
И НЕ СчетФактураДокумент.ПометкаУдаления
При таком подходе СУБД объединит все данные за один сетевой пакет, что обеспечит мгновенное формирование отчета даже на больших массивах информации.
По умолчанию номера документов в 1С хранятся в полном формате, содержащем код информационной базы, префикс организации и череду лидирующих нулей (например, «00БП-0002811»). Бухгалтерам для работы и предоставления отчетности в налоговые органы требуется чистый номер — «2811».
Для решения этой задачи мы задействуем стандартные механизмы Библиотеки стандартных подсистем (БСП), интегрированной в 1С:Бухгалтерию 3.0.
Важное обновление БСП: в старых версиях конфигураций использовалась функция ПрефиксацияОбъектовКлиентСервер.ПолучитьНомерНаПечать(). В современных версиях 1С:Бухгалтерии 3.0 эта функция была переименована. Актуальный метод называется ПрефиксацияОбъектовКлиентСервер.НомерНаПечать(). При попытке использовать старое имя функции на новой конфигурации система выдаст критическую ошибку выполнения.
Мы можем применить эту функцию двумя способами в зависимости от того, как мы хотим выводить результат.
Это самый лаконичный способ, при котором само поле СчетФактура в отчете останется полноценной ссылкой (по ней можно будет кликнуть и перейти в документ), но отображаться для пользователя оно будет в виде красивого номера.
Выполним следующие действия в конструкторе СКД:
СчетФактура (или добавленное нами строковое поле НомерСФ).ПрефиксацияОбъектовКлиентСервер.НомерНаПечать(НомерСФ, Истина, Ложь)
Первый параметр функции принимает исходный номер документа, второй параметр Истина указывает системе на необходимость удаления лидирующих нулей, а третий параметр отвечает за удаление префикса организации.
Если вам требуется вывести очищенный номер в виде отдельной текстовой колонки, выполните следующие действия:
НомерСФПечатьПрефиксацияОбъектовКлиентСервер.НомерНаПечать(НомерСФ, Истина, Ложь)Номер СФ (печать)НомерСФПечать в список выбранных полей отчета.В процессе работы у вас может возникнуть соблазн настроить вызов функций общего модуля не в конфигураторе СКД, а напрямую в режиме «1С:Предприятие» через механизм Пользовательских полей в настройках отчета.
Проанализируем, почему этот вариант не сработает. Платформа 1С жестко разграничивает безопасность выполнения кода:
Поэтому обращение к функциям общего модуля ПрефиксацияОбъектовКлиентСервер жизнеспособно только внутри разработческих вычисляемых полей или выражений представления набора данных.
Хотя редактирование схемы Универсального отчета «на лету» через толстый клиент полностью решает текущую задачу, этот подход имеет один существенный недостаток. Все изменения схемы сохраняются в кэше настроек конкретного пользователя.
При очистке кэша, обновлении версии конфигурации или случайном сбросе настроек пользователем измененная схема СКД будет безвозвратно удалена. Другие пользователи базы данных также не увидят эти изменения по умолчанию.
Для долгосрочной и стабильной работы мы рекомендуем перенести созданную схему во внешний отчет:
.erf.Дополнительные отчеты и обработки (раздел «Администрирование» — «Печатные формы, отчеты и обработки»).Таким образом, отчет станет доступен абсолютно всем пользователям системы под любым клиентом (включая тонкий клиент и веб-клиент), настройки не пропадут при обновлениях программы, а ваши бухгалтеры получат удобный и быстроработающий инструмент для ежедневной аналитики.