При отладке сложных запросов в консоли часто возникает необходимость передать в параметр не весь объект (ссылку на документ), а лишь значение одного из его полей. Например, если запрос анализирует остатки по конкретному сотруднику, указанному в «Авансовом отчете», или фильтрует данные по организации из документа. Вместо того чтобы вручную искать нужное физическое лицо в справочнике, мы можем заставить консоль саму «достать» это значение из документа.
В этой статье мы разберем несколько эффективных способов решения этой задачи: от использования встроенных возможностей консоли до изменения структуры самого запроса.
Большинство современных консолей запросов (как для управляемых, так и для обычных форм) поддерживают специальный вид параметра — Выражение. Этот механизм позволяет написать произвольный фрагмент кода на языке 1С, результат которого и будет подставлен в запрос в качестве значения параметра.
Проанализируем ситуацию: нам нужно передать в параметр &Сотрудник значение реквизита ФизЛицо из конкретного документа. Для этого выполним следующие шаги:
&Сотрудник).Рассмотрим пример кода, который можно использовать в поле выражения:
// Поиск документа по номеру и дате с последующим обращением к реквизиту
Документы.АвансовыйОтчет.НайтиПоНомеру("000000001", ТекущаяДатаСеанса()).ФизЛицо
Если у нас уже есть другой параметр, содержащий ссылку на документ (например, &ТекущийДокумент), мы можем обращаться к нему напрямую через коллекцию параметров консоли (зависит от конкретной реализации консоли):
// Обращение к реквизиту через ранее определенный параметр-ссылку
Параметры.ТекущийДокумент.Организация
Если используемая вами консоль не поддерживает выражения или вы хотите, чтобы логика извлечения данных была «зашита» в сам запрос, можно воспользоваться механизмом вложенных запросов. Рассмотрим этот метод на примере получения остатков по счету 71 («Расчеты с подотчетными лицами»).
Вместо того чтобы передавать &Сотрудник напрямую, мы передаем в запрос ссылку на &ТекущийДокумент и извлекаем из него ФизЛицо прямо в условии ГДЕ виртуальной таблицы.
Проанализируем пример такого запроса:
ВЫБРАТЬ
ХозрасчетныйОстатки.Счет КАК Счет,
ХозрасчетныйОстатки.СуммаОстатокДт КАК СуммаОстатокДт,
ХозрасчетныйОстатки.СуммаОстатокКт КАК СуммаОстатокКт
ИЗ
РегистрБухгалтерии.Хозрасчетный.Остатки(
&ДатаИтогов,
Счет В ИЕРАРХИИ (&Счет71),
,
Организация = &Организация
И Субконто1 В
(ВЫБРАТЬ
АвансовыйОтчет.ФизЛицо
ИЗ
Документ.АвансовыйОтчет КАК АвансовыйОтчет
ГДЕ
АвансовыйОтчет.Ссылка = &ТекущийДокумент)) КАК ХозрасчетныйОстатки
В данном случае платформа самостоятельно выполнит выборку нужного поля из базы данных по переданной ссылке, что избавляет нас от необходимости предварительной подготовки параметров.
Часто в запросах требуется установить параметр, который является предопределенным элементом (например, основная валюта или специфический счет). В поле «Выражение» консоли мы можем использовать функцию ПредопределенноеЗначение. Это гарантирует точность данных без ручного выбора из списка.
Пример использования для получения ссылки на валюту:
ПредопределенноеЗначение("Справочник.Валюты.Руб")
Также важно помнить о типизации. Если нам нужно передать пустую ссылку определенного типа, чтобы проверить работу условий ГДЕ, мы используем следующий синтаксис:
Справочники.ФизическиеЛица.ПустаяСсылка()
Рассмотрим более сложные сценарии, которые часто встречаются в практике программиста 1С при работе с консолью запросов:
Документы.АвансовыйОтчет.НайтиПоНомеру("001").МоментВремени().ОбщийМодульУчета.ПолучитьАктуальныйГрафик(ОбъектСсылка).ВЫРАЗИТЬ или явное преобразование типов в коде 1С, если консоль это позволяет.Выясним, какой подход лучше выбрать в зависимости от ситуации:
1. Если вы отлаживаете готовый запрос из программного кода — лучше использовать Способ 1 (Выражение). Это позволит вам имитировать поведение программы, не меняя текст самого запроса.
2. Если вы проектируете новый запрос и хотите сделать его максимально универсальным (например, для использования в отчете СКД) — Способ 2 (Вложенный запрос) будет более предпочтительным, так как он переносит логику получения параметров на сторону СУБД.
3. Для быстрой проверки гипотез и работы с системными данными всегда используйте предопределенные значения в выражениях, чтобы исключить человеческий фактор при выборе элементов вручную.
Использование выражений в консоли запросов — это мощный инструмент, который значительно сокращает время на подготовку тестовых данных и позволяет сосредоточиться на логике самого запроса, а не на заполнении бесконечных списков параметров.