Разработка и Конфигурация · 11 мин
1С ЗУП: как сделать выборку данных
Как сделать выборку в 1С ЗУП: конструктор запроса, методы Выбрать и Выполнить, обход выборки циклом, выборка из регистров расчёта и кадровых данных.
Выборка в 1С:ЗУП — это набор записей, полученный из базы данных по заданным условиям: сотрудники подразделения, начисления за месяц, записи регистра отсутствий. В зависимости от задачи выборку создают через запрос на встроенном языке, методы объектов или консоль запросов в режиме предприятия. Правильно построенная выборка — основа отчётов, обработок и доработок конфигурации.
Чаще всего в ЗУП выборки строят запросами к таблицам справочников (Сотрудники, ФизическиеЛица, Подразделения), регистров сведений (КадроваяИсторияСотрудников, ТекущиеКадровыеДанныеСотрудников) и регистров расчёта (Начисления, Удержания). Каждый тип таблицы имеет свои особенности: виртуальные таблицы, параметры периодичности, отборы по регистратору.
Ошибки в выборках приводят к типичным проблемам: запрос возвращает пустой результат, дубли строк, либо обработка «зависает» из-за обращения к данным внутри цикла. Ниже разобраны рабочие способы построения выборки с примерами кода, проверкой результата и типичными ограничениями.
Что такое выборка и какие способы её получения существуют
В терминах платформы 1С выборка — это последовательный набор строк результата запроса или отбора записей объекта. Ключевое свойство выборки — однонаправленный обход: данные читаются последовательно через метод Следующий(), вернуться к предыдущей строке нельзя без повторного получения выборки.
Существует три основных способа получить данные:
- Запрос с методом Выбрать() — универсальный способ для любых таблиц, поддерживает соединения, группировки, виртуальные таблицы. Основной вариант для ЗУП.
- Метод Выбрать() менеджера объекта — например,
Справочники.Сотрудники.Выбрать(). Подходит для простого перебора элементов одного справочника без сложных условий. - Выгрузка результата в таблицу значений — метод
Выгрузить()вместоВыбрать(). Используется, когда нужен многократный обход, сортировка или поиск по строкам.
Базовая выборка запросом: пошаговый порядок
Стандартная схема состоит из четырёх шагов: создать объект запроса, задать текст, установить параметры, выполнить и обойти результат. Ниже пример выборки сотрудников по подразделению.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Сотрудники.Ссылка КАК Сотрудник,
| Сотрудники.Наименование КАК ФИО
|ИЗ
| Справочник.Сотрудники КАК Сотрудники
|ГДЕ
| Сотрудники.Подразделение = &Подразделение
| И НЕ Сотрудники.ВАрхиве";
Запрос.УстановитьПараметр("Подразделение", ПодразделениеСсылка);
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
Сообщить(Выборка.ФИО);
КонецЦикла;
Обратите внимание на детали. Параметры в тексте обозначаются символом & и заполняются методом УстановитьПараметр до выполнения. Псевдонимы полей (КАК Сотрудник, КАК ФИО) определяют имена, по которым поля доступны в выборке. Если псевдоним не задан, обращаться придётся по имени исходного поля.
Проверить, вернул ли запрос строки, удобно через РезультатЗапроса.Пустой — это свойство равно Истина, если записей нет. Такая проверка позволяет избежать лишнего цикла и корректно обработать ситуацию «ничего не найдено».
- 1Создайте объект: Запрос = Новый Запрос
- 2Заполните Запрос.Текст с обращением к таблице и условиями ГДЕ
- 3Установите параметры методом УстановитьПараметр
- 4Выполните запрос и получите выборку: Запрос.Выполнить().Выбрать()
- 5Обойдите выборку циклом Пока Выборка.Следующий() Цикл
- 6Проверьте количество обработанных строк или свойство Пустой
Выборка кадровых данных: виртуальные таблицы ЗУП
Главная особенность ЗУП — кадровые данные хранятся в регистрах сведений с периодичностью, и актуальные значения получают через виртуальные таблицы срезов. Например, чтобы получить подразделения и должности сотрудников на дату, используют срез последних регистра КадроваяИсторияСотрудников.
Запрос.Текст =
"ВЫБРАТЬ
| Кадры.Сотрудник КАК Сотрудник,
| Кадры.Подразделение КАК Подразделение,
| Кадры.Должность КАК Должность
|ИЗ
| РегистрСведений.КадроваяИсторияСотрудников.СрезПоследних(&Период, ) КАК Кадры";
Запрос.УстановитьПараметр("Период", ТекущаяДатаСеанса());
Первый параметр виртуальной таблицы — период среза, второй — условие отбора. Отбор лучше задавать именно в параметрах виртуальной таблицы, а не в секции ГДЕ: платформа сначала ограничит набор записей регистра, и запрос выполнится быстрее.
Для данных о текущих ставках, ФИО, датах рождения в ЗУП существуют служебные регистры с префиксом «Текущие» (например, ТекущиеКадровыеДанныеСотрудников). Они обновляются автоматически и не требуют среза — это упрощает запрос, но состав полей ограничен.
Выборка начислений из регистра расчёта
Данные о фактических начислениях хранятся в регистре расчёта Начисления. Типовая задача — выбрать суммы по сотрудникам за период расчёта. Здесь используется виртуальная таблица ФактическийПериодДействия или обычная таблица регистра с отбором по периоду регистрации.
Запрос.Текст =
"ВЫБРАТЬ
| Начисления.Сотрудник КАК Сотрудник,
| Начисления.ВидРасчета КАК ВидРасчета,
| СУММА(Начисления.Результат) КАК Сумма
|ИЗ
| РегистрРасчета.Начисления КАК Начисления
|ГДЕ
| Начисления.ПериодРегистрации = &Период
|СГРУППИРОВАТЬ ПО
| Начисления.Сотрудник,
| Начисления.ВидРасчета";
Группировка с агрегатной функцией СУММА сворачивает строки по сотруднику и виду расчёта. Если нужны итоги с иерархией (например, сотрудники внутри подразделений), используйте секцию ИТОГИ ПО — тогда выборка обходится с указанием типа обхода: Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам).
Период регистрации начисления — это месяц, в котором оно проведено, а не месяц, за который оно рассчитано. Для отражения в учёте эти периоды иногда различаются (перерасчёты, премии), поэтому при выборке заранее решите, какой из периодов вам нужен.
Проверка и отладка запроса в консоли запросов
Прежде чем встраивать запрос в обработку, проверьте его в консоли запросов — внешней обработке, которая выполняет произвольный текст запроса в режиме предприятия и показывает результат таблицей. Это самый быстрый способ убедиться, что выборка возвращает именно те данные.
Порядок отладки: вставьте текст запроса в консоль, заполните параметры тестовыми значениями, выполните и сравните результат с ожиданиями. Если строк нет — поочерёдно убирайте условия ГДЕ, чтобы найти отсекающее условие. Частая причина пустой выборки — несовпадение типов параметра и поля (например, передана строка вместо ссылки).
В конфигураторе текст запроса удобно собирать конструктором запроса: правый клик внутри строки с текстом → «Конструктор запроса». Конструктор показывает реальные имена таблиц и полей вашей конфигурации, что исключает опечатки.
Как проверить результат
Совпадает с ожидаемым числом записей в консоли
Ноль строк или многократное дублирование
Параметр — ссылка нужного типа, как у поля отбора
Передана строка или число вместо ссылки
Дата задана явно и попадает в нужный месяц
Пустая дата — срез возвращает не те данные
Типичные ошибки и ограничения
Самая распространённая ошибка — выполнение запроса внутри цикла обхода другой выборки. При тысячах сотрудников это порождает тысячи обращений к базе и резко замедляет работу. Правильный подход — один запрос с соединением таблиц, возвращающий все нужные данные сразу.
Другие частые проблемы:
- Обращение к полю выборки по несуществующему имени — ошибка «Поле объекта не обнаружено». Проверяйте псевдонимы в секции ВЫБРАТЬ.
- Отбор по строковому наименованию вместо ссылки — медленно и ненадёжно из-за возможных расхождений в написании.
- Игнорирование пометки удаления и архивности — в выборку попадают уволенные сотрудники и помеченные документы. Добавляйте условия на
ПометкаУдаленияи служебные признаки. - Использование
Выгрузить()там, где достаточно одного обхода выборки, — лишний расход памяти на больших объёмах.
Выборка или таблица значений: что выбрать
Если данные обходятся один раз и сразу обрабатываются — достаточно выборки, она экономит память. Если нужен повторный обход, сортировка после получения, поиск строк или передача данных между процедурами — выгружайте результат в таблицу значений методом Выгрузить().
Для иерархических данных (подразделения с вложенностью, итоги по группировкам) используйте обход по группировкам или выгрузку в дерево значений с параметром ОбходРезультатаЗапроса.ПоГруппировкамСИерархией.
Сравнение вариантов
Один последовательный обход, минимальный расход памяти. Нельзя вернуться к пройденным строкам и узнать количество заранее.
Многократный обход, сортировка, поиск, подсчёт строк. Требует памяти под весь результат — осторожно на больших объёмах.
Простой перебор элементов без запроса. Не поддерживает соединения и группировки, редко подходит для расчётных данных ЗУП.
Часто задаваемые вопросы
Как узнать, сколько строк вернул запрос?
У самой выборки нет свойства количества. Выгрузите результат в таблицу значений и посмотрите Таблица.Количество(), либо добавьте в запрос итоговый запрос с функцией КОЛИЧЕСТВО. Для простой проверки «есть ли записи» достаточно свойства РезультатЗапроса.Пустой.
Почему выборка пустая, хотя данные в базе есть?
Чаще всего причина в параметрах: передан неверный тип значения, пустая ссылка или дата вне нужного периода. Проверьте запрос в консоли, поочерёдно убирая условия ГДЕ. Также проверьте отборы в параметрах виртуальной таблицы — они применяются до основного запроса.
Можно ли в выборке обратиться к полю через точку, например Сотрудник.Подразделение?
Можно, но это порождает неявное соединение и замедляет запрос, а в выборке создаёт поле с точкой в имени. Лучше явно выбрать нужное поле в тексте запроса и задать ему короткий псевдоним.
Чем выборка в ЗУП 3.1 отличается от 2.5?
Сам механизм выборок платформы одинаков, отличаются структуры метаданных: имена регистров, полей и виртуальных таблиц. Запрос, написанный под ЗУП 2.5, в 3.1, скорее всего, потребует переписывания обращений к таблицам. Всегда сверяйте имена объектов в конфигураторе вашей версии.
Как выбрать только действующих сотрудников, без уволенных?
Отберите записи кадрового регистра, где вид события не равен увольнению, либо используйте служебный регистр текущих кадровых данных с отбором по признаку текущей занятости. Дополнительно исключите сотрудников в архиве условием на поле ВАрхиве справочника.
Что важно запомнить
Выборка в 1С ЗУП строится запросом: текст с параметрами, Выполнить(), обход через Выбрать() и Следующий(). Кадровые данные берите из срезов последних, начисления — из регистра расчёта. Проверяйте запрос в консоли, не выполняйте запросы внутри цикла и тестируйте обработки на копии базы.