К статье
Практический материал

Разработка и Конфигурация · 11 мин

1С ЗУП: как сделать выборку данных

Как сделать выборку в 1С ЗУП: конструктор запроса, методы Выбрать и Выполнить, обход выборки циклом, выборка из регистров расчёта и кадровых данных.

Выборка в 1С:ЗУП — это набор записей, полученный из базы данных по заданным условиям: сотрудники подразделения, начисления за месяц, записи регистра отсутствий. В зависимости от задачи выборку создают через запрос на встроенном языке, методы объектов или консоль запросов в режиме предприятия. Правильно построенная выборка — основа отчётов, обработок и доработок конфигурации.

Чаще всего в ЗУП выборки строят запросами к таблицам справочников (Сотрудники, ФизическиеЛица, Подразделения), регистров сведений (КадроваяИсторияСотрудников, ТекущиеКадровыеДанныеСотрудников) и регистров расчёта (Начисления, Удержания). Каждый тип таблицы имеет свои особенности: виртуальные таблицы, параметры периодичности, отборы по регистратору.

Ошибки в выборках приводят к типичным проблемам: запрос возвращает пустой результат, дубли строк, либо обработка «зависает» из-за обращения к данным внутри цикла. Ниже разобраны рабочие способы построения выборки с примерами кода, проверкой результата и типичными ограничениями.

Что такое выборка и какие способы её получения существуют

В терминах платформы 1С выборка — это последовательный набор строк результата запроса или отбора записей объекта. Ключевое свойство выборки — однонаправленный обход: данные читаются последовательно через метод Следующий(), вернуться к предыдущей строке нельзя без повторного получения выборки.

Существует три основных способа получить данные:

  • Запрос с методом Выбрать() — универсальный способ для любых таблиц, поддерживает соединения, группировки, виртуальные таблицы. Основной вариант для ЗУП.
  • Метод Выбрать() менеджера объекта — например, Справочники.Сотрудники.Выбрать(). Подходит для простого перебора элементов одного справочника без сложных условий.
  • Выгрузка результата в таблицу значений — метод Выгрузить() вместо Выбрать(). Используется, когда нужен многократный обход, сортировка или поиск по строкам.

Базовая выборка запросом: пошаговый порядок

Стандартная схема состоит из четырёх шагов: создать объект запроса, задать текст, установить параметры, выполнить и обойти результат. Ниже пример выборки сотрудников по подразделению.

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| Сотрудники.Ссылка КАК Сотрудник,

| Сотрудники.Наименование КАК ФИО

|ИЗ

| Справочник.Сотрудники КАК Сотрудники

|ГДЕ

| Сотрудники.Подразделение = &Подразделение

| И НЕ Сотрудники.ВАрхиве";

Запрос.УстановитьПараметр("Подразделение", ПодразделениеСсылка);

РезультатЗапроса = Запрос.Выполнить();

Выборка = РезультатЗапроса.Выбрать();

Пока Выборка.Следующий() Цикл

Сообщить(Выборка.ФИО);

КонецЦикла;

Обратите внимание на детали. Параметры в тексте обозначаются символом & и заполняются методом УстановитьПараметр до выполнения. Псевдонимы полей (КАК Сотрудник, КАК ФИО) определяют имена, по которым поля доступны в выборке. Если псевдоним не задан, обращаться придётся по имени исходного поля.

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

Порядок создания выборки
  1. 1
    Создайте объект: Запрос = Новый Запрос
  2. 2
    Заполните Запрос.Текст с обращением к таблице и условиями ГДЕ
  3. 3
    Установите параметры методом УстановитьПараметр
  4. 4
    Выполните запрос и получите выборку: Запрос.Выполнить().Выбрать()
  5. 5
    Обойдите выборку циклом Пока Выборка.Следующий() Цикл
  6. 6
    Проверьте количество обработанных строк или свойство Пустой

Выборка кадровых данных: виртуальные таблицы ЗУП

Главная особенность ЗУП — кадровые данные хранятся в регистрах сведений с периодичностью, и актуальные значения получают через виртуальные таблицы срезов. Например, чтобы получить подразделения и должности сотрудников на дату, используют срез последних регистра КадроваяИсторияСотрудников.

Запрос.Текст =

"ВЫБРАТЬ

| Кадры.Сотрудник КАК Сотрудник,

| Кадры.Подразделение КАК Подразделение,

| Кадры.Должность КАК Должность

|ИЗ

| РегистрСведений.КадроваяИсторияСотрудников.СрезПоследних(&Период, ) КАК Кадры";

Запрос.УстановитьПараметр("Период", ТекущаяДатаСеанса());

Первый параметр виртуальной таблицы — период среза, второй — условие отбора. Отбор лучше задавать именно в параметрах виртуальной таблицы, а не в секции ГДЕ: платформа сначала ограничит набор записей регистра, и запрос выполнится быстрее.

Для данных о текущих ставках, ФИО, датах рождения в ЗУП существуют служебные регистры с префиксом «Текущие» (например, ТекущиеКадровыеДанныеСотрудников). Они обновляются автоматически и не требуют среза — это упрощает запрос, но состав полей ограничен.

Выборка начислений из регистра расчёта

Данные о фактических начислениях хранятся в регистре расчёта Начисления. Типовая задача — выбрать суммы по сотрудникам за период расчёта. Здесь используется виртуальная таблица ФактическийПериодДействия или обычная таблица регистра с отбором по периоду регистрации.

Запрос.Текст =

"ВЫБРАТЬ

| Начисления.Сотрудник КАК Сотрудник,

| Начисления.ВидРасчета КАК ВидРасчета,

| СУММА(Начисления.Результат) КАК Сумма

|ИЗ

| РегистрРасчета.Начисления КАК Начисления

|ГДЕ

| Начисления.ПериодРегистрации = &Период

|СГРУППИРОВАТЬ ПО

| Начисления.Сотрудник,

| Начисления.ВидРасчета";

Группировка с агрегатной функцией СУММА сворачивает строки по сотруднику и виду расчёта. Если нужны итоги с иерархией (например, сотрудники внутри подразделений), используйте секцию ИТОГИ ПО — тогда выборка обходится с указанием типа обхода: Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам).

Период регистрации начисления — это месяц, в котором оно проведено, а не месяц, за который оно рассчитано. Для отражения в учёте эти периоды иногда различаются (перерасчёты, премии), поэтому при выборке заранее решите, какой из периодов вам нужен.
ПЗ
Практическое замечание

Проверка и отладка запроса в консоли запросов

Прежде чем встраивать запрос в обработку, проверьте его в консоли запросов — внешней обработке, которая выполняет произвольный текст запроса в режиме предприятия и показывает результат таблицей. Это самый быстрый способ убедиться, что выборка возвращает именно те данные.

Порядок отладки: вставьте текст запроса в консоль, заполните параметры тестовыми значениями, выполните и сравните результат с ожиданиями. Если строк нет — поочерёдно убирайте условия ГДЕ, чтобы найти отсекающее условие. Частая причина пустой выборки — несовпадение типов параметра и поля (например, передана строка вместо ссылки).

В конфигураторе текст запроса удобно собирать конструктором запроса: правый клик внутри строки с текстом → «Конструктор запроса». Конструктор показывает реальные имена таблиц и полей вашей конфигурации, что исключает опечатки.

Контрольные точки

Как проверить результат

Количество строк результата
Норма

Совпадает с ожидаемым числом записей в консоли

Тревожный признак

Ноль строк или многократное дублирование

Типы параметров
Норма

Параметр — ссылка нужного типа, как у поля отбора

Тревожный признак

Передана строка или число вместо ссылки

Период среза
Норма

Дата задана явно и попадает в нужный месяц

Тревожный признак

Пустая дата — срез возвращает не те данные

Типичные ошибки и ограничения

Самая распространённая ошибка — выполнение запроса внутри цикла обхода другой выборки. При тысячах сотрудников это порождает тысячи обращений к базе и резко замедляет работу. Правильный подход — один запрос с соединением таблиц, возвращающий все нужные данные сразу.

Другие частые проблемы:

  • Обращение к полю выборки по несуществующему имени — ошибка «Поле объекта не обнаружено». Проверяйте псевдонимы в секции ВЫБРАТЬ.
  • Отбор по строковому наименованию вместо ссылки — медленно и ненадёжно из-за возможных расхождений в написании.
  • Игнорирование пометки удаления и архивности — в выборку попадают уволенные сотрудники и помеченные документы. Добавляйте условия на ПометкаУдаления и служебные признаки.
  • Использование Выгрузить() там, где достаточно одного обхода выборки, — лишний расход памяти на больших объёмах.
Типичные ошибки
01
Запрос внутри цикла — обработка работает в десятки раз медленнее; замените на один запрос с соединением
02
Отбор по наименованию вместо ссылки — дубли и пропуски записей из-за расхождений в строках
03
Пропуск проверки РезультатЗапроса.Пустой — код молча ничего не делает, и причину трудно найти
04
Период среза не задан или задан неверно — кадровые данные берутся не на ту дату

Выборка или таблица значений: что выбрать

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

Для иерархических данных (подразделения с вложенностью, итоги по группировкам) используйте обход по группировкам или выгрузку в дерево значений с параметром ОбходРезультатаЗапроса.ПоГруппировкамСИерархией.

Сравнение вариантов

Выборка (Выбрать)

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

Таблица значений (Выгрузить)

Многократный обход, сортировка, поиск, подсчёт строк. Требует памяти под весь результат — осторожно на больших объёмах.

Метод Выбрать() справочника

Простой перебор элементов без запроса. Не поддерживает соединения и группировки, редко подходит для расчётных данных ЗУП.

Часто задаваемые вопросы

Как узнать, сколько строк вернул запрос?

У самой выборки нет свойства количества. Выгрузите результат в таблицу значений и посмотрите Таблица.Количество(), либо добавьте в запрос итоговый запрос с функцией КОЛИЧЕСТВО. Для простой проверки «есть ли записи» достаточно свойства РезультатЗапроса.Пустой.

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

Чаще всего причина в параметрах: передан неверный тип значения, пустая ссылка или дата вне нужного периода. Проверьте запрос в консоли, поочерёдно убирая условия ГДЕ. Также проверьте отборы в параметрах виртуальной таблицы — они применяются до основного запроса.

Можно ли в выборке обратиться к полю через точку, например Сотрудник.Подразделение?

Можно, но это порождает неявное соединение и замедляет запрос, а в выборке создаёт поле с точкой в имени. Лучше явно выбрать нужное поле в тексте запроса и задать ему короткий псевдоним.

Чем выборка в ЗУП 3.1 отличается от 2.5?

Сам механизм выборок платформы одинаков, отличаются структуры метаданных: имена регистров, полей и виртуальных таблиц. Запрос, написанный под ЗУП 2.5, в 3.1, скорее всего, потребует переписывания обращений к таблицам. Всегда сверяйте имена объектов в конфигураторе вашей версии.

Как выбрать только действующих сотрудников, без уволенных?

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

Итог

Что важно запомнить

Выборка в 1С ЗУП строится запросом: текст с параметрами, Выполнить(), обход через Выбрать() и Следующий(). Кадровые данные берите из срезов последних, начисления — из регистра расчёта. Проверяйте запрос в консоли, не выполняйте запросы внутри цикла и тестируйте обработки на копии базы.