Создание и работа с запросами (для начинающих)
Сегодня хочу вам рассказать о том, как начать работать с запросами и научиться (конечно постепенно) – работе с запросами в 1С. Тем, кто знаком с запросами MS
SQL будет конечно намного проще.
Итак, давайте откроем конфигуратор и создадим новую внешнюю обработку.

После чего мы получим окошко с нашей обработкой. Давайте приступим непосредственно к экспериментам по запросам, для этого создадим в нашей обработке – новую форму – а для этого в списке (белое поле) выберите Формы – и нажмите (+) Добавить, соглашайтесь со всеми предложенными параметрами формы по умолчанию, и нажимайте готово.

Итак мы создали с вами пустую форму, с кнопками и. В окне с форме выбираем вкладкуи переходим непосредственно к написанию кода, который будет выполнятся при нажатии кнопки выполнить. Для этого находим процедуру КнопкаВыполнитьНажатие(Кнопка)

и пишем следующий код:
Давайте прокомментируем, что мы здесь написали. Мы выбрали запросом все документы «СчетНаОплатуПокупателю». Хочу сразу заметить, что в зависимости от того, в какой конфигурации вы экспериментируете – посмотрите состав документов вашей конфигурации и вместо указанного мною «СчетНаОплатуПокупателю» подставьте любой объект Документ из списка документов вашей конфигурации, желательно чтобы в информационной базе – документы этого типа были созданы, чтобы не получить пустой результат запроса. Также хочу отметить важный момент – если таких документов будет слишком много – то выполнение запроса может затянутся на некоторое время – из-за того, что мы не ограничиваем запрос условиями и выбираем все поля – о чем нам говорит звездочка (*).
Ключевым словом «Выбрать» мы приказываем нашему запросу выбрать все поля(*) (реквизиты документа) из документа «СчетНаОплатуПокупателю».
Важно:
Хочу заметить также, что при написании языка запроса – обращаться к объектам конфигурации следует в единственном, а не во множественном числе. В данном
случае объект Документы в конфигурации (ветка Документы) – в запросе написан Документ. Также к составу документов – мы добираемся через точку(.) – и название документа.
Результат запроса мы получаем в виде таблицы значений, о чем свидетельствует примененный нами метод(параметр) – Выгрузить, то есть сначала мы выполнили
запрос (Выполнить), а уже затем выгрузили результат выполнения запроса в таблицу значений и таблица значений находится в переменной Результат.
Далее сохраняем нашу обработку в файл, для этого нажимаем Файл->Сохранить как и пишем имя файла, для своей обработки я задал имя «ВнешняяОбработка1Демо», чтобы долго не искать обработку можете сохранить ее на рабочий стол, дальше нам придется ее открывать)).
Теперь давайте изучим немного основы отладки. Для этого сейчас на поле рядом с текстом Результат = … дважды щелкните левой клавишей мыши, чтобы появилась красный кружок, у вас должно получиться нечто следующее:

Итак, мы сейчас с вами установили точку останова на строке с результатом, теперь давайте запустим конфигурацию на отладку, нажав клавишу ( F 5) либо кнопку
на панели инструментов:

Теперь в запущенном нами режиме 1С:Предприятия откроем нашу сохраненную обработку Файл->Открыть и найдите то место, куда вы сохраняли файл обработки, выберите его и нажмите открыть. Жмем в нашей обработки кнопку «Выполнить». Если вы все сделали правильно – вы автоматически перейдете в режим конфигуратора и в месте установки нашей точки останова увидите следующее:

На нашем кружке появилась стрелочка – мы перешли в пошаговое выполнение нашего кода, и далее мы увидим самое интересное. Если вы все правильно сделали – сейчас вы сможете получить результат выполнения запроса.
Для наглядного представления запроса сделаем следующее: В верхнем меню конфигуратора находим меню Отладка и выбираем команду Табло.

Внизу окна конфигуратора откроется пустое окошечко ->Табло. В этом окне есть строки, пустые. Дважды щелкните на пустую подсвеченную строку и напишите слово Результат. У вас должно получиться следующее:

Итак, в указанном нами окне мы должны получить результат выполнения нашего кода, а именно сейчас – переменной «Результат», так как мы сейчас еще не выполнили данную строку кода – мы имеем пустое значение и тип данных переменной – «Неопределено».
Давайте сделаем шаг – для выполнения указанной строки кода. Для этого нажмите клавишу , либо в меню Отладка->Шагнуть через…( F 10).
И что же мы видим в нашем Табло:

Мы видим с вами – значение переменной и тип переменной. Теперь также мы можем просмотреть содержание нашей таблицы значений, для этого подведите курсор мыши к полю результат, нажмите правую клавишу мыши и выберите пункт «Показать значение в отдельном окне»

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

Резюмирую:
Вы научились создавать простейший запрос, а также поучаствовали в отладке своего кода и даже посмотрели результат нашего запроса в конфигураторе.
Три приема отладки запросов в типовых конфигурациях

В современных конфигурациях масса сложных запросов – объемных, с большим количеством временных таблиц и т.д. Текст запросов часто собирается программно из кусочков, часто в разных процедурах.
И вот Вы дорабатываете такой запрос – а он возвращает не тот результат, который ожидается.
Как найти причину? Нужно отладить запрос.
И нужно уметь это делать так, чтобы не терять на это кучу времени.
В серии из трех видеоуроков мы рассмотрим базовые приемы отладки, которые часто используются на практике:
- Разберем базовый подход, как в консоли запросов сформировать и отладить результирующий пакетный запрос, при помощи которого получаются данные.
- Научимся прямо в отладчике просматривать содержимое временных таблиц и результата запроса, чтобы проанализировать отдельные этапы выполнения запроса.
- Также рассмотрим удобный прием – отложенную отладку. С помощью одной команды в отладчике получим в консоли итоговый текст выполняющегося запроса, значения параметров, содержимое временных таблиц. Это упрощает отладку, поскольку не нужно вручную в консоли вводить все указанные данные.
При работе с типовыми конфигурациями – незаменимые навыки как для новичков, так и для профи : )
Отладка запросов 1С
Часто в конфигурациях 1С 8 встречаются очень большие и сложные запросы. Например, запрос автозаполнения документа «Начисление зарплаты» , не смотря на то, что благодаря использованию пакетного запроса с большим числом временных таблиц, он построен логично и прозрачно, разобраться в нем тяжело из за его громоздкости.
Есть два основных метода отладки больших запросов.
Использование консоли запросов
Стандартную консоль запросов можно найти на дисках ИТС(это внешняя обработка), да и на просторах интернета целая куча различных ее модификаций.
Консоль запросов позволяет писать и отлаживать запросы в режиме 1С:Предприятия, не используя Конфигуратор. По ссылке доступна для скачивания одна из версий консоли запросов, скачиваем файл, разархивируем его и открываем через меню 1С:Предприятия «Файл – Открыть»
Для того чтобы разобраться в большом запросе с помощью консоли запросов, разбейте запрос на пакеты. Это позволит сразу отслеживать результат выполнения каждой части запроса. После выполнения запроса перейдите на закладку “Временные таблицы”, выберите нужную вам и нажмите “Отладить”, для виртуальной таблицы создастся отдельный запрос, который вы можете выполнить отдельно от основного.
Выгрузка результатов временных таблиц
Используется функция вида:
Ее можно расположить в модуле вашей обработки, либо в общем модуле 1С 8. Т.о. к ней можно обращаться из любого отлаживаемого запроса, вставив в нужное место модуля следующий код:
- Запрос — отлаживаемый нами запрос;
- втИмя — имя виртуальной таблицы отлаживаемого запроса.
Полученную таблицу значений можно просмотреть в отладке при помощи “Вычислить выражение”.
Как посмотреть результат запроса 1с в отладчике
Часто в конфигурациях 1С 8 встречаются очень большие и сложные запросы. Например, запрос автозаполнения документа «Начисление зарплаты» , не смотря на то, что благодаря использованию пакетного запроса с большим числом временных таблиц, он построен логично и прозрачно, разобраться в нем тяжело из за его громоздкости.
Есть два основных метода отладки больших запросов.
Использование консоли запросов
Стандартную консоль запросов можно найти на дисках ИТС(это внешняя обработка), да и на просторах интернета целая куча различных ее модификаций.
Консоль запросов позволяет писать и отлаживать запросы в режиме 1С:Предприятия, не используя Конфигуратор. По ссылке доступна для скачивания одна из версий консоли запросов, скачиваем файл, разархивируем его и открываем через меню 1С:Предприятия «Файл – Открыть»
Для того чтобы разобраться в большом запросе с помощью консоли запросов, разбейте запрос на пакеты. Это позволит сразу отслеживать результат выполнения каждой части запроса. После выполнения запроса перейдите на закладку “Временные таблицы”, выберите нужную вам и нажмите “Отладить”, для виртуальной таблицы создастся отдельный запрос, который вы можете выполнить отдельно от основного.
Выгрузка результатов временных таблиц
Используется функция вида:
Ее можно расположить в модуле вашей обработки, либо в общем модуле 1С 8. Т.о. к ней можно обращаться из любого отлаживаемого запроса, вставив в нужное место модуля следующий код:
- Запрос — отлаживаемый нами запрос;
- втИмя — имя виртуальной таблицы отлаживаемого запроса.
Полученную таблицу значений можно просмотреть в отладке при помощи “Вычислить выражение”.

Сегодня сделаем на сайте заметку о способах просмотра временных таблиц запросов. Что бы понять каким образом запрос нам собрал итоговый результат, необходимо рассмотреть его внутренности и при наличии временных таблиц понять что же у них там внутри.
Рассмотрим 4 способа получения этой информации.
Данные: в наличии имеется бесполезный запрос с двумя временными таблицами (“Подразделения”, “Пользователи”):
Хоть они и не участвуют в результирующей выборки, но для данного примера это не суть важно.
В результате отладки запроса вам вдруг понадобилось посмотреть, а что же хранится в этих временных таблицах. И тут вы поняли, что посмотреть это нереально, так как вы в этом ничего не понимаете. Стоп. Шутка. Все вы знаете. И так начнем.
Способ 1. Берем консоль запросов для разработчиков под управляемые формы, вставляем наш туда текст запроса и с помощью панели управления таблицами, выводим их в табличный документ:

Для обычных форм так же существуют консоли запросов, в которых можно просматривать временные таблицы. Для примера можете её взять из подсистемы “Инструменты разработчика”.
Способ 2. Используя процедуру многих типовых конфигураций: “ПоказатьВременнуюТаблицу”. Если в вашей конфигурации таковой не имеется, то приведу полное её описание (смело копируйте в свой общий модуль):
В типовых конфигурациях используются массивные запросы до нескольких тысяч строк. Разобраться «с наскока» в таких запросах не получится.
Тексты этих запросов представляют собой пакеты с десятками временных таблиц.
Умение быстро просмотреть содержимое каждой временной таблицы (по сути – каждого отдельного этапа получения данных) существенно упрощает жизнь внедренцам, позволяет понять логику работы запроса, найти допущенную ошибку.
В текущей статье мы рассмотрим несколько приемов, которые помогут Вам анализировать и дорабатывать типовые конфигурации.
Начнем с ответа на популярный вопрос:
Как просмотреть содержимое временной таблицы?
Для примера рассмотрим конфигурацию «Управление торговлей», редакция 11.3.
При закрытии кассовой смены пробитые чеки ККМ архивируются, все данные о продажах переносятся в документ Отчет о розничных продажах.
Проанализируем, какой запрос используется при закрытии кассовой смены.
В общем модуле РозничныеПродажи есть функция ЗаполнитьОтчетОРозничныхПродажах. Именно в ней и содержится текст запроса, который получает данные о чеках ККМ, пробитых за текущую кассовую смену. Приведем фрагмент этой процедуры.
В приведенном программном коде первым делом создается экземпляр менеджера временных таблиц. Именно в нем будут храниться создаваемые временные таблицы.
Далее создается запрос, осуществляется связь запроса с ранее созданным менеджером временных таблиц. Видно, что в тексте запроса несколько раз встречается ключевое слово ПОМЕСТИТЬ. Значит, при выполнении такого запроса происходит создание нескольких временных таблиц.
При отладке этого фрагмента программного кода может возникнуть потребность просмотреть содержимое временных таблиц. Рассмотрим, как это можно сделать.
В последней строке программного кода происходит выполнение пакета запросов. В результате система возвращает массив, куда последовательно помещаются результаты выполнения отдельных запросов пакета:
В пакете первый запрос создает временную таблицу Товары. Результат такого запроса содержит одну колонку Количество и одну строку, куда помещается количество записей в созданной временной таблице:
Выгрузим результат этого запроса в таблицу значений:
Можно увидеть, что в созданной временной таблице находятся три записи, но сами значения, помещенные во временную таблицу, отсутствуют, поскольку в результате запроса с ключевым словом ПОМЕСТИТЬ содержится только количество записей в созданной временной таблице, а не сами записи.
Чтобы просмотреть содержимое временной таблицы, в типовой конфигурации «Управление торговлей», редакция 11.3 была реализована вспомогательная экспортная функция ПоказатьВременнуюТаблицу общего модуля ОбщегоНазначенияУТ.
В качестве параметров нужно передать менеджер временных таблиц (или сам запрос) и имя самой временной таблицы, которую требуется просмотреть. Функция возвращает таблицу значений. Следовательно, в конфигураторе в окне Вычислить выражение можно получить саму временную таблицу:
Функция выглядит следующим образом:
Итак, при помощи подобной функции можно при отладке просмотреть содержимое временной таблицы.
Функция ПоказатьВременнуюТаблицу из общего модуля ОбщегоНазначенияУТ присутствует в конфигурациях «Управление торговлей», редакция 11.3, «Комплексная автоматизация», редакция 2, «ERP Управление предприятием 2».
Если в конфигурации нет аналогичной функции (например, в «1С:Бухгалтерии» или «Управление небольшой фирмой» нет такого общего модуля и такой функции), то ее можно реализовать самостоятельно, например, в общем модуле, а затем использовать при отладке. Самый простой вариант функции будет выглядеть следующим образом:
Свойства менеджера временных таблиц, появившиеся в платформе 8.3.8
В предыдущем разделе для получения содержимого временной таблицы нужно было воспользоваться функцией из конфигурации. Было бы намного удобнее, если бы возможности просмотра временных таблиц были реализованы прямо в платформе. И в платформе 8.3.8 такие возможности были добавлены.
У менеджера временных таблиц есть свойство Таблицы. Это коллекция, которая содержит временные таблицы, хранящиеся в менеджере временных таблиц:
Для каждой временной таблицы можно получить имя (свойство ПолноеИмя) и список колонок (свойство Колонки). Метод ПолучитьДанные() временной таблицы запроса возвращает значение типа РезультатЗапроса. Соответственно, можно вывести содержимое самой временной таблицы:
Также у объекта встроенного языка Запрос появился новый метод ВыполнитьПакетСПромежуточнымиДанными():
Результат работы этого метода аналогичен методу ВыполнитьПакет(), но есть важное отличие.
Когда используется метод ВыполнитьПакет(), то для временной таблицы в результате мы получаем количество записей, которое было помещено во временную таблицу. При использовании метода ВыполнитьПакетСПромежуточнымиДанными() вместо количества записей будет возвращено содержимое этой временной таблицы:
Значит, теперь нет необходимости реализовывать специальные функции в конфигурациях, а можно использовать новые возможности платформы.
Просмотр временных таблиц при проведении документа Расчет себестоимости в УПП 1.3
В конфигурации «Управление производственным предприятием», редакция 1.3 документ Расчет себестоимости – один из самых сложных с точки зрения используемых алгоритмов. И в запросах, которые выполняются при проведении этого документа, используется достаточно большое количество временных таблиц. И зачастую при отладке нужно знать, какие именно данные в этих таблицах размещаются.
Рассмотрим, какие возможности есть в конфигурации УПП.
Рассмотрим для примера, как просмотреть содержимое временной таблицы, которая формируется при проведении документа на шаге Расчет базы распределения косвенных расходов (используется партионный учет):
В конфигураторе устанавливаем точку останова в процедуре ОбработкаПроведения. В пользовательском режиме запускаем проведение документа. Происходит остановка на точке.
Теперь по шагам можно пройти все выполняемые строки программного кода, определить, где именно происходит расчет базы распределения. Это процедура ВыполнениеДействийДокумента в модуле объекта, где последовательно выполняются действия, указанные пользователем в форме документа. Для расчета базы происходит переход к процедуре РассчитатьБазуРаспределения общего модуля ПроцедурыРасчетаБазыРаспределенияЗатрат, в которой встречается следующий фрагмент программного кода:
Сама процедура ПоказатьВременнуюТаблицу() выглядит следующим образом:
Первым делом необходимо включить отладочный режим в структуре шапки документа. Для этого в окне Вычислить выражение (Shift + F9) указать:
Подробнее описание этой функции можно найти в процедуре ПодготовитьСтруктуруШапкиДокумента() модуля объекта. В конце этой процедуры есть комментарий, описывающий включение отладочного режима.
Убедимся, что после вычисления этого выражения в структуре шапки документа свойство приняло нужное значение:
Анализируем программный код процедуры, становится понятно, что при включенном отладочном режиме можно получить содержимое временной таблицы. Это как раз и будет таблица, содержащая данные базы распределения:
Такие возможности для просмотра содержимого временных таблиц предоставляет конфигурация «Управление производственным предприятием».
Передача запроса из отладчика в консоль запросов
Один из самых удобных способов отладки запросов – это использование консоли запросов. В таком случае работать с запросом можно прямо в режиме «1С:Предприятие», сразу проверяя результат запроса на данных информационной базы. Также в большинстве консолей существует возможность просматривать содержимое временных таблиц запроса.
В таком случае отладка запросов может выглядеть следующим образом. Необходимо в конфигураторе получить готовый текст запроса, который требуется отладить. Для этого в простом случае достаточно будет только скопировать текст запроса из модуля в конфигураторе.
Часто в программном коде итоговый текст запроса собирается из отдельных «кусочков» при помощи конкатенации строк. В таком случае можно установить точку останова в коде и при помощи функции отладчика Вычислить выражение (Shift + F9) получить готовый текст запроса, который и будет выполняться. Этот текст запроса можно переносить в консоль запросов, запущенную в пользовательском режиме.
Затем в консоли необходимо установить параметры, которые используются при работе с запросом. И после этого запрос в консоли можно выполнять, просматривать результат запроса, корректировать текст запроса в случае возникновения ошибок, анализировать содержимое временных таблиц и т.д.
Итак, в статье мы рассмотрели основные приемы, которые можно использовать при отладке запросов с временными таблицами.
Применяйте эти приемы на практике, это существенно облегчит задачи по анализу и доработке типовых конфигураций!
Об авторе
Автор статьи – Василий Ханевич
Автор и тренер курсов:
PDF-версия статьи для участников группы ВКонтакте
Если Вы еще не вступили в нее – сделайте это сейчас, и в блоке ниже (на этой странице) появятся ссылки на скачивание материалов.
35 комментариев для “ 4 приема отладки запросов в типовых конфигурациях – на примере УТ 11.3 и УПП 1.3 ”
Добрый день!
Если можно, добавлю свои пять копеек.
Для отладки запросов можно использовать расширения. Годится это, правда, только для конфигураций, совместимых с 8.3.10 и старше, но, если очень нужно, можно сделать копию базы и в копии снять ограничения на совместимость.
Итак, создаем новое расширение, расширяем в него интересующую нас процедуру с прагмой &после, в расширении процедуры имеем доступ к запросу и его менеджеру временных таблиц и можем делать любой анализ (хоть консоль запросов вызывай!).
Например, можно выгрузить все временные таблицы в Excel:
&После(“СоздатьДвижения”)
Процедура Отладка_СоздатьДвижения(МенеджерВременныхТаблиц, Затраты, Протокол)
ВывестиТаблицу(“Вершины”, Затраты.Вершины);
ВывестиТаблицу(“Ребра”, Затраты.Ребра);
ВывестиТаблицу(“Контуры”, Затраты.Контуры);
ВывестиТаблицу(“ЦелевоеСальдо”, Затраты.ЦелевоеСальдо);
Для каждого Таблица из МенеджерВременныхТаблиц.Таблицы Цикл
ВывестиТаблицу(Таблица.ПолноеИмя, Таблица.ПолучитьДанные().Выгрузить());
КонецЦикла;
Процедура ВывестиТаблицу(Имя, Таблица)
ТабДок = новый ТабличныйДокумент;
ТабДок.Область(1,1).Текст = Имя;
Для Инд=0 по Таблица.Колонки.Количество()-1 Цикл
ТабДок.Область(2,Инд+1).Текст = Таблица.Колонки[Инд].Имя;
КонецЦикла;
Для Инд1=0 по Таблица.Количество()-1 Цикл
Для Инд2=0 по Таблица.Колонки.Количество()-1 Цикл
ТабДок.Область(Инд1 + 3, Инд2 + 1).Текст = Строка(Таблица[Инд1][Инд2])
КонецЦикла
КонецЦикла;
ТабДок.Записать(“e:XXXОтладка” + Имя + “.xlsx”, ТипФайлаТабличногоДокумента.XLSX)
С консолью запросов я, пожалуй, погорячился – процедуры с такими запросами исполняются на сервере, сорри…
Добрый день!
Да, вполне можно использовать такой подход.
Вопрос только в удобстве отладки таблиц в Excel.
Спасибо за статью!
Приемы и новшества актуальны, только ведь все понимают, что сопровождать, изменять, дорабатывать такие сложные запросы никому не хочется – я не прихожу в восторг от очередного задания разобраться в запросе – одно уныние от таких запросов: усложнять запросы можно до бесконечности. А выигрыш какой?!
Основная проблема (и потеря времени) происходит тогда, когда надо быстро понять (прочесть) запрос, затем отладить его в консоли запросов с текущими параметрами – понять для чего он был создан, почему именно такие связи между полями таблиц, где тот ключевой показатель, который надо изменить?
Я уверен, что временные виртуальные таблицы нужны, но не уверен, что нагромождать конфигурации большими кусочными запросами – это единственно правильный способ решить ту или иную задачу.
Почему я убежден, что есть другой способ конфигурировать базы, потому что в свое время, разрабатывая конфигурацию, пошел по самому простому пути – для получения определенных данных стал формировать большие запросы. Получение данных с каждым годом замедлялось в разы – терпение лопнуло, когда я сформировал отчет за 8 часов.
В результате я пошел от задачи и придумал механизм хранения промежуточных показателей в таблицах базы данных. Удобство заключалось еще и в том, что я мог в любой момент через пользовательский режим посмотреть регистры с отбором по нужным мне измерениям и провести визуальный анализ на предмет корректного расчета промежуточных сведений.
Спустя год я описал это в статье, почему до сих пор это не стало повсеместным – думаю, потому что способ так решать задачи до сих пор не популярен: проще написать большой и сложный запрос.
Вопрос к обсуждению: почему нельзя изменить сложные запросы УПП на схему хранения промежуточных сведений в самой базе данных?
Добрый день!
Резонный вопрос. Но скорее всего, в УПП уже ничего не поменяется, развивать это решение не будут.
А вот, например, в БП 3 я заметил движение в подобном направлении. В УПП понадобилось разобраться, почему декларация по налогу на имущество заполняется не так, как ожидается. Запросы там были достаточно сложные, выполнялись в цикле по периодам, состояли из отдельных временных таблиц и т.д. Потом смотрю, что в БП 3 есть отдельный регистр сведений РасчетНалогаНаИмущество, куда при закрытии месяца записываются уже подготовленные и структурированные данные. И декларация заполняется по этому регистру. Правда, сама процедура получения данных для записи в регистр достаточно сложная.
Так что хранение промежуточных данных используется. Но для этого могут потребоваться методические изменения в прикладном решении.
К тому же, чтобы подготовить эти промежуточные данные в общем случае может потребоваться также достаточно сложный алгоритм или объемный запрос, разделенный на отдельные кусочки.