Работа со справочниками в 1С:Предприятие — одна из самых частых задач, с которыми сталкиваются разработчики, администраторы и даже опытные пользователи. Нужно ли экспортировать все контрагентов для отчёта, массово обновить номенклатуру или просто проверить целостность данных — умение правильно выбрать все элементы справочника экономит часы рутинной работы. Однако даже здесь есть подводные камни: от ограничений платформы до нюансов производительности при работе с большими объёмами данных.
В этой статье мы разберём 5 основных способов выборки всех элементов справочника — от визуальных инструментов для новичков до программного кода для профессионалов. Вы узнаете, какой метод подходит для вашей задачи, как избежать типичных ошибок (например, зависания системы при выборке миллиона записей через «Все действия») и как оптимизировать процесс для ускорения в 2–3 раза. Особое внимание уделим различиям между 1С:Предприятие 8.3 и более ранними версиями, а также нюансам работы с иерархическими справочниками.
1. Визуальный способ: «Все действия» в пользовательском режиме
Самый простой метод, доступный даже тем, кто никогда не писал код. Подходит для разовых задач, когда нужно быстро получить список элементов без программирования. Однако у него есть жёсткие ограничения: например, в 1С:Бухгалтерии 3.0 через этот интерфейс нельзя выбрать более 10 000 записей за один раз.
Чтобы воспользоваться методом:
- 📂 Откройте нужный справочник (например,
Справочники → Номенклатура). - 🔍 Нажмите кнопку
Все действия(илиЕщёв зависимости от конфигурации). - 📋 Выберите пункт
Пометить всеилиВыбрать все(в некоторых версиях —Выгрузить список). - 💾 Сохраните данные в
Excel,TXTили другой формат черезФайл → Сохранить как.
⚠️ Внимание: При выборке большого количества элементов (свыше 5 000) система может «подвисать» или выдавать ошибку Недостаточно памяти. В этом случае переходите к следующим методам.
2. Консоль запросов: универсальный инструмент для администраторов
Консоль запросов (Ctrl+Shift+Q в 1С:Предприятие 8.3) — это «швейцарский нож» для работы с данными. Она позволяет писать SQL-подобные запросы прямо в интерфейсе программы, не прибегая к внешним инструментам. Главное преимущество — возможность фильтрации, сортировки и группировки данных на лету.
Пример запроса для выборки всех элементов справочника Контрагенты:
ВЫБРАТЬ
Контрагенты.Ссылка КАК Ссылка,
Контрагенты.Наименование КАК Наименование,
Контрагенты.ИНН КАК ИНН
ИЗ
Справочник.Контрагенты КАК Контрагенты
Чтобы сохранить результат:
- 📊 Выполните запрос (кнопка
ВыполнитьилиF5). - 📄 Нажмите
Файл → Сохранить каки выберите формат (Excel,CSV,JSON). - ⚡ Для ускорения работы с большими справочниками добавьте индексируемые поля в условие
ГДЕ.
Если запрос выполняется слишком долго, разбейте его на части с помощью условия ГДЕ Наименование МЕЖДУ "А" И "М" и ГДЕ Наименование МЕЖДУ "Н" И "Я".
⚠️ Внимание: В некоторых конфигурациях (например, 1С:УТ 11) консоль запросов может быть отключена по умолчанию. Чтобы её включить, потребуются права администратора и доступ к Конфигуратору.
3. Программный код: выборка через встроенный язык 1С
Для автоматизации или интеграции с другими системами без программного кода не обойтись. Встроенный язык 1С предоставляет несколько способов выборки данных, каждый из которых имеет свои плюсы и минусы. Рассмотрим два самых распространённых подхода.
3.1. Метод Выбрать() для объекта справочника
Простой и интуитивно понятный способ, но не оптимальный для больших объёмов данных (может тормозить при выборке свыше 10 000 записей). Пример кода:
Справочник = Справочники.Номенклатура;
Выборка = Справочник.Выбрать();
Пока Выборка.Следующий() Цикл
Сообщить(Выборка.Наименование);
КонецЦикла;
3.2. Запрос с использованием объекта Запрос
Более гибкий и производительный метод. Позволяет фильтровать данные прямо в запросе, что ускоряет работу с большими справочниками. Пример:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка,
| Номенклатура.Артикул КАК Артикул
|ИЗ
| Справочник.Номенклатура КАК Номенклатура";
Результат = Запрос.Выполнить();
ВыборкаРезультата = Результат.Выбрать();
Пока ВыборкаРезультата.Следующий() Цикл
// Обработка данных
КонецЦикла;
Проверьте права доступа в конфигураторе
Создайте резервную копию базы
Ограничьте выборку по дате или статусу (если возможно)
Тестируйте код на копии базы, а не на рабочей версии-->
⚠️ Внимание: При работе с иерархическими справочниками (например, Группы номенклатуры) не забывайте про рекурсивный обход подчиненных элементов. В противном случае вы получите только верхний уровень иерархии.
4. Внешние обработки: готовые решения для массовых операций
Если вам регулярно приходится выгружать данные из справочников, имеет смысл использовать внешние обработки. Это готовые файлы с расширением .epf или .erf, которые можно скачать с сайтов вроде Infostart или 1С-Сообщество. Они часто включают дополнительные функции, такие как:
- 📈 Пакетная обработка данных (массовое изменение реквизитов).
- 🔄 Экспорт/импорт в
Excel,XML,JSON. - 🔍 Продвинутые фильтры (по дате, статусу, пользователю).
- 📊 Визуализация данных (диаграммы, сводные таблицы).
Примеры популярных обработок:
| Название обработки | Назначение | Поддерживаемые конфигурации |
|---|---|---|
| Выгрузка справочников в Excel | Массовая выгрузка с сохранением иерархии | 1С:Бухгалтерия, 1С:УТ, 1С:ERP |
| Универсальный обмен данными | Экспорт/импорт между базами | Любые конфигурации на 8.3 |
| Пакетное редактирование справочников | Массовое изменение реквизитов | 1С:ЗУП, 1С:КА, 1С:УНФ |
⚠️ Внимание: Перед использованием внешних обработок всегда проверяйте их на тестовой базе. Некоторые решения могут конфликтовать с обновлениями конфигурации или содержать уязвимости (особенно если скачаны с непроверенных источников).
5. Прямой доступ к базе данных: SQL-запросы для опытных пользователей
Для администраторов, имеющих доступ к серверу 1С, самым быстрым способом выборки всех элементов справочника станет прямой SQL-запрос к базе данных. Этот метод обходит ограничения встроенного языка и позволяет работать с данными на уровне СУБД (например, Microsoft SQL Server или PostgreSQL).
Пример запроса для выборки всех контрагентов из базы 1С на SQL Server:
SELECT
T1._IDRRef AS Ссылка,
T1._Description AS Наименование,
T1._Fld12345 AS ИНН -- Уточните реальное имя поля в вашей базе!
FROM
_Reference82 AS T1 -- 82 — внутренний ID справочника "Контрагенты"
WHERE
T1._Marked = 0x00 -- Только не помеченные на удаление
Преимущества метода:
- ⚡ Максимальная скорость (в 5–10 раз быстрее, чем встроенные инструменты 1С).
- 🔧 Возможность использовать
JOIN,GROUP BYи другие SQL-конструкции. - 📤 Экспорт данных в любые внешние системы (например, для аналитики в Power BI).
Как узнать внутренний ID справочника?
В конфигураторе откройте справочник, нажмите F11 (Свойства) и найдите поле Идентификатор или UID. В SQL-запросах он часто используется как часть имени таблицы (например, _Reference{UID}).
⚠️ Внимание: Прямая работа с базой данных нарушает лицензионное соглашение 1С, если вы не являетесь сертифицированным партнёром. Кроме того, некорректные запросы могут повредить данные. Используйте этот метод только в крайних случаях и после создания резервной копии.
6. Особенности работы с иерархическими справочниками
Иерархические справочники (например, Номенклатура с группами и подгруппами) требуют особого подхода. Если просто использовать метод Выбрать(), вы получите только элементы верхнего уровня. Чтобы выбрать все элементы, включая вложенные, используйте:
6.1. Рекурсивный обход в коде 1С
Процедура ОбойтиИерархию(Группа)
Выборка = Группа.Выбрать();
Пока Выборка.Следующий() Цикл
Если Выборка.ЭтотГруппа Тогда
ОбойтиИерархию(Выборка.Ссылка); // Рекурсия для подгрупп
Иначе
// Обработка элемента справочника
Сообщить(Выборка.Наименование);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
// Запуск с корневой группы
ОбойтиИерархию(Справочники.Номенклатура.НайтиПоНаименованию("Товары"));
6.2. Запрос с использованием ИЕРАРХИЯ
В языке запросов 1С есть специальный оператор ИЕРАРХИЯ, который упрощает работу с древовидными структурами:
ВЫБРАТЬ
Номенклатура.Ссылка КАК Ссылка,
Номенклатура.Наименование КАК Наименование
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
Номенклатура.Ссылка В ИЕРАРХИИ(&Группа)
Для иерархических справочников всегда проверяйте глубину вложенности. Если групп слишком много (более 10 уровней), рекурсивный обход может привести к переполнению стека.
Сравнение методов: какой выбрать?
Выбор способа зависит от вашей задачи, объёма данных и уровня доступа к системе. Ниже — сравнительная таблица:
| Метод | Скорость | Сложность | Ограничения | Когда использовать |
|---|---|---|---|---|
| Визуальный («Все действия») | ⭐ | ⭐ | Лимит 5 000–10 000 записей | Разовые задачи, небольшие справочники |
| Консоль запросов | ⭐⭐⭐ | ⭐⭐ | Требует знания языка запросов | Регулярные выборки, фильтрация данных |
| Программный код (1С) | ⭐⭐⭐ | ⭐⭐⭐ | Ограничения по памяти при больших объёмах | Автоматизация, интеграции |
| Внешние обработки | ⭐⭐⭐⭐ | ⭐ | Зависимость от стороннего ПО | Массовые операции, сложные отчёты |
| SQL-запросы | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | Риск нарушения лицензии, требует доступа к СУБД | Критические задачи по производительности |
⚠️ Внимание: В 1С:Предприятие 8.3.20+ появились новые ограничения на массовые операции с данными в клиент-серверном режиме. Если ваша база работает на сервере, тестируйте код в Толстом клиенте или Веб-клиенте — результаты могут отличаться.
FAQ: Частые вопросы по выборке элементов справочника
Можно ли выбрать элементы справочника по дате создания?
Да, но поле ДатаСоздания не всегда доступно напрямую. В запросе используйте служебное поле _ДатаСоздания (для SQL) или реквизит ДатаВремяСоздания (если он добавлен в конфигурацию). Пример:
ВЫБРАТЬ
Контрагенты.Ссылка,
Контрагенты.Наименование
ИЗ
Справочник.Контрагенты КАК Контрагенты
ГДЕ
Контрагенты.ДатаВремяСоздания > &НачальнаяДата
Как выбрать только помеченные на удаление элементы?
В языке запросов используйте условие ПометкаУдаления = ИСТИНА. В коде 1С — метод ВыбратьПомеченные():
Выборка = Справочники.Номенклатура.ВыбратьПомеченные();
Пока Выборка.Следующий() Цикл
Сообщить(Выборка.Наименование + " (помечен на удаление)");
КонецЦикла;
Почему при выборке не отображаются все поля справочника?
Возможные причины:
- 🔹 Поле не добавлено в запрос (укажите его явно в разделе
ВЫБРАТЬ). - 🔹 У пользователя нет прав на чтение этого реквизита.
- 🔹 Поле является динамическим (например, рассчитывается на лету).
Проверьте структуру справочника в конфигураторе (F11 → закладка Данные).
Как ускорить выборку из справочника с 100 000+ записей?
Рекомендации:
- 🚀 Используйте пакетную выборку (по 1 000–5 000 записей за раз).
- 🔍 Добавьте
ИНДЕКСЫна часто используемые поля (в конфигураторе). - 📊 Отключите ненужные реквизиты в выборке (берите только те поля, которые нужны).
- 🔄 Для иерархических справочников используйте
ЛЕВОЕ СОЕДИНЕНИЕвместо рекурсии.
Можно ли выбрать элементы справочника из другой базы 1С?
Да, для этого используйте:
- 🔄 Универсальный обмен данными (форматы
XML,JSON). - 🔌 COM-соединение (для локальных баз).
- 🌐 HTTP-сервисы (для облачных решений).
Пример кода для COM-соединения:
ВнешняяБаза = Новый COMОбъект("V83.ComConnector");
Соединение = ВнешняяБаза.Connect("File=C:\Bases\ExternalBase");
Справочник = Соединение.Справочники.Контрагенты;