Выборка 1С – это специальный объект в 1С 8.3, который позволяет перебрать элементы справочников, документов и прочих объектов, имеющих такую возможность.
Для создания выборки справочника следует использовать методы менеджера справочника Выбрать и ВыбратьИерархически (только для справочников с иерархией), а для создания выборки документов – Выбрать.
Например, так:
Выборка = Документы.ПродажаТоваров.Выбрать();
Или, так:
Выборка = Справочники.Контрагенты.Выбрать();
Для простой выборки.
Выборка = Справочники.Регионы.ВыбратьИерархически();
Для иерархической выборки.
Поскольку выборка это объект, предназначенный для перебора элементов, то для выполнения перебора элементов следует делать обход выборки. Обход выборки осуществляется при помощи цикла. Обход выборки осуществляется динамически, это значит, что при создании выборки не все элементы выбираются сразу из базы данных, а получение элементов происходит порциями, частями. Для обхода используется метод выборки Следующий. Этот метод возвращает Истина, когда следующий элемент выбран, и Ложь, когда достигнут конец выборки.
Обойти выборку документов можно так:
Выборка = Документы.ПродажаТоваров.Выбрать(); Пока Выборка.Следующий() Цикл КонецЦикла;
А справочников, соответственно так:
Выборка = Справочники.Контрагенты.Выбрать(); Пока Выборка.Следующий() Цикл КонецЦикла;
В процессе обхода выборки, мы можем обращаться напрямую ко всем реквизитам того объекта, который выбран на текущей итерации.
Выборка = Справочники.Контрагенты.Выбрать(); Пока Выборка.Следующий() Цикл Сообщить("Наименование: " + Выборка.Наименование + ",ИНН: " + Выборка.ИНН + ",КПП: " + Выборка.КПП); КонецЦикла;
В результате, выведется информация обо всех контрагентах.
Поскольку, Контрагенты иерархический справочник, то в выборке присутствуют и группы, и элементы.
Мы не можем получить выборку только элементов или групп, поэтому, чтобы вывелись только элементы, необходимо воспользоваться стандартным реквизитом справочника ЭтоГруппа, этот реквизит имеет значение Истина, когда элемент является группой, и Ложь – когда просто элемент.
Можно код выше исправить следующим образом:
Выборка = Справочники.Контрагенты.Выбрать(); Пока Выборка.Следующий() Цикл Если Выборка.ЭтоГруппа Тогда Продолжить; КонецЕсли; Сообщить("Наименование: " + Выборка.Наименование + ",ИНН: " + Выборка.ИНН + ",КПП: " + Выборка.КПП); КонецЦикла;
Тогда выведутся только элементы.
У метода менеджера справочника Выбрать существует четыре необязательных параметра.
Выбрать(<Родитель>,<Владелец>,<Отбор>,<Порядок>)
Первый параметр позволяют формировать выборку элементов с указанным родителем, а второй с указанным владельцем. Третий параметр имеет тип Структура и позволяет отбирать элементы по определённому условию.
Например, у справочника Контрагенты имеется реквизит ТипКонтрагента, который имеет тип ссылка на перечисление ТипыКонтрагентов.
У этого перечисления два значения Покупатель и Поставщик. Если требуется, чтобы выборка выше выводила только покупателей, то следует создать структуру с единственным ключом, название которого должно совпадать с названием реквизит справочника, а в значение структуры указать нужное значение перечисления.
Отбор = Новый Структура("ТипКонтрагента",Перечисления.ТипыКонтрагентов.Покупатель); Выборка = Справочники.Контрагенты.Выбрать(,,Отбор); Пока Выборка.Следующий() Цикл Сообщить("Наименование: " + Выборка.Наименование + ",ИНН: " + Выборка.ИНН + ",КПП: " + Выборка.КПП); КонецЦикла;
В этом случае будут отобраны только контрагенты-покупатели.
Обратите внимание, что в случае установки отбора нет смысла отсекать группы. Они не попадут в выборку, поскольку этот реквизит у них не заполнен.
Также, имейте в виду, что отбор можно производить только по стандартным реквизитам Наименование, Код, а также по тем реквизитам, у которых в свойстве Индексировать установлено значение Индексировать или Индексировать с доп. Упорядочиванием.
Иерархическая выборка справочников 1С
По мимо обычной выборки справочников при помощи метода менеджера справочника Выбрать, можно производить иерархическую выборку при помощи метода ВыбратьИерархически. Чем отличается простая выборка справочника от иерархической? Разберем простой пример. Выведем в таблицу значений на форме элементы и группы справочника номенклатуры обычной выборкой, а потом иерархической.
Для обычной выборки будет следующий код:
Выборка = Справочники.Номенклатура.Выбрать(); Пока Выборка.Следующий() Цикл НовСтр = ТЗНоменклатура.Добавить(); ЗаполнитьЗначенияСвойств(НовСтр,Выборка); КонецЦикла;
И следующий результат:
Все элементы и группы вывелись как попало, при следующей структуре справочника:
А теперь посмотрим, как будут выведены группы и элементы при иерархической выборке.
Выборка = Справочники.Номенклатура.ВыбратьИерархически(); Пока Выборка.Следующий() Цикл НовСтр = ТЗНоменклатура.Добавить(); ЗаполнитьЗначенияСвойств(НовСтр,Выборка); КонецЦикла;
Получится следующий результат:
Элементы вывелись в иерархическом порядке. Иерархическая выборка перебирает элементы следующем образом: сначала выбирается элемент самого верхнего уровня, потом если это группа, то отбирается элемент, который входит в эту группу и т.д.
А если мы воспользуемся методом выборки справочников УровеньВВыборке, то сможем увидеть порядок вложенности.
Выборка = Справочники.Номенклатура.ВыбратьИерархически(); Пока Выборка.Следующий() Цикл НовСтр = ТЗНоменклатура.Добавить(); ЗаполнитьЗначенияСвойств(НовСтр,Выборка); НовСтр.Уровень = Выборка.УровеньВВыборке() КонецЦикла;
Будет следующий результат:
Где 0 – самый высший уровень (элемент или группа не входят ни в какие группы), 1 – следующий уровень (элемент или группа входят в группу высшего уровня) и т.д.
При иерархической выборке также можно сделать отбор, но будут выбраны только элементы верхнего уровня, поскольку группы отобраны не будут (у них этот реквизит не заполнен), а если группы не отобраны, то и элементы других уровней тоже не будут выбраны, даже если они подходят по условию.
Метод ПолучитьОбъект выборки
Выборка возвращает только ссылку на объект, сам объект мы изменять не можем. Мы можем обратиться к экземпляру объекта отобранной выборкой ссылкой, если воспользуемся методом ПолучитьОбъект().
Например, в этом коде пытаемся всем элементам справочника Номенклатура с видом Товары, обнулить этот вид, присвоив пустую ссылку перечисления.
Выборка = Справочники.Номенклатура.Выбрать(,,Отбор); Пока Выборка.Следующий() Цикл ОбъектСправочник = Выборка.ПолучитьОбъект(); ОбъектСправочник.ВидНоменклатуры = Перечисления.ВидыНоменклатуры.ПустаяСсылка(); Попытка ОбъектСправочник.Записать(); Исключение Сообщить("Не удалось изменить вид"); КонецПопытки; КонецЦикла;
Для записи элемента использовалась попытка.
Читайте также по теме:
Более подробно и основательно начальные вопросы программирования в 1С есть вы можете изучить в
Книга «Программировать в 1С за 11 шагов»
Изучайте программирование в 1С в месте с моей книгой «Программировать в 1С за 11 шагов»
Книга написана понятным и простым языком — для новичка.
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Научитесь понимать архитектуру 1С;
- Станете писать код на языке 1С;
- Освоите основные приемы программирования;
- Закрепите полученные знания при помощи задачника
О том как разрабатывать под управляемым приложением 1С, читайте в книге Книга «Основы разработки в 1С: Такси»
Отличное пособие по разработке в управляемом приложении 1С, как для начинающих разработчиков, так и для опытных программистов.
- Очень доступный и понятный язык изложения
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Поймете идеологию управляемого приложения 1С
- Узнаете, как разрабатывать управляемое приложение;
- Научитесь разрабатывать управляемые формы 1С;
- Сможете работать с основными и нужными элементами управляемых форм
- Программирование под управляемым приложением станет понятным
Промо-код на скидку в 15% — 48PVXHeYu
Эти книги, плюс книга по программированию оперативного учета имеются в едином комплекте: комплект книг по разработке в 1С.
Только для читателей моего блога,
промо-код на скидку в 300 рублей на весь комплект: blog
Если Вам понравился этот урок, был полезен или помог решить какую-нибудь проблему, то Вы можете поддержать мой проект, перечислив любую сумму.
можно оплатить вручную:
Яндекс.Деньги — 410012882996301
Подписывайтесь на мой канал в телеграмме: https://t.me/Programming1CNizamutdinov
И вступайте в мои группы:
Вконтакте: https://vk.com/1c_prosto
Фейсбуке: https://www.facebook.com/groups/922972144448119/
ОК: http://ok.ru/group/52970839015518
Твиттер: https://twitter.com/signum2009