Перейти к содержимому

Что такое справочник в 1с

  • автор:

Справочники

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

Структура справочника

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

Справочники

Помимо кода и наименования, каждый элемент справочника, как правило, содержит некоторую дополнительную информацию, которая подробно описывает этот элемент. Например, для товара это может быть информация об артикуле, упаковке и т. п. Набор такой информации является одинаковым для всех элементов конкретного справочника, и для ее хранения служат реквизиты справочника:

Справочники

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

Справочники

Справочники могут поддерживать иерархическое расположение элементов. Например, в справочнике Номенклатура могут быть созданы группы: Бытовая техника, Обувь, Продукты и т. д., в которых располагаются элементы, относящиеся к этим группам. Кроме того группы справочника могут включать в себя и другие группы, создавая тем самым многоуровневую иерархическую структуру.

Справочники

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

Справочники

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

Справочники

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

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

Справочники

Формы справочника

Для того чтобы пользователь мог просматривать и изменять данные, содержащиеся в справочнике, система поддерживает несколько форм представления справочника. Система может автоматически генерировать все нужные формы справочника. Наряду с этим разработчик имеет возможность создать собственные формы, которые система будет использовать вместо форм по умолчанию:

Справочники

Форма списка

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

Справочники

Форма элемента

Для просмотра и изменения данных отдельных элементов справочника используется форма элемента. Как правило, она представляет данные в удобном для восприятия и редактирования виде:

Справочники

Форма группы

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

Справочники

Форма выбора, форма выбора группы

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

Справочники

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

Макеты

Справочнику могут быть сопоставлены несколько макетов, содержащих данные, необходимые для обеспечения работы справочника:

Справочники

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

Справочники в 1С: предназначение и примеры использования

В этой статье познакомимся с объектом конфигурации «Справочник»: поговорим о предназначении справочников и рассмотрим примеры использования.

Программный продукт «1С:Предприятие» применяется для решения учетных задач и автоматизации бизнес-процессов предприятия. Большое количество предприятий занимается торговой деятельностью, которая заключается в покупке определенных товаров по цене X (цена закупки) и последующей продаже этих товаров по цене Y = X + a (цена продажи), где «a» — какая-то наценка на товар.

image

Но за счет чего предприятие может продавать товары по ценам, которые выше цен закупки? Это возможно благодаря тому, что товары закупаются в большом количестве (оптом), а продаются небольшими порциями (мелкий опт или розница).
Такая организация процесса приводит нас к следующему выводу: информация об одном и том же товаре потребуется как минимум дважды: в первый раз когда мы этот товара покупаем, а во второй раз — когда этот мы этот товар продаем. А поскольку основная цель любого бизнеса — это прибыль, то продавать нужно много раз, то есть информация об одном и том же товаре потребуется при каждой продаже. И поэтому было бы удобно в системе сохранить список всех товаров, чтобы пользователи не печатали на клавиатуре каждый раз при продаже название товара, а выбирали товар из какого-то списка. Причем заранее пользователь не знает какие товары будет закупать организация, поэтому должна быть возможность добавлять в этот список произвольное количество товаров в любой момент времени.

Для создания таких списков и используется объект конфигурации «Справочник». Например, в справочниках можно хранить список сотрудников, список поставщиков и покупателей, список банков и т.д.
image
Каждый элемент справочника характеризуется кодом и наименованием.
image
Система поддерживает режим автоматической нумерации элементов, при котором она самостоятельно может генерировать код для нового элемента справочника. Кроме этого система позволяет осуществлять контроль уникальности кодов справочника, не разрешая создавать элементы с одинаковыми кодами:
imageКроме кода и наименования, каждый элемент справочника, как правило, содержит некоторую дополнительную информацию, которая подробно описывает этот элемент. Например, для товара это может быть информация об артикуле, упаковке и т.п. Набор такой информации является одинаковым для всех элементов конкретного справочника, и для ее хранения служат реквизиты справочника:
image
Кроме этого, каждый элемент справочника может содержать некоторый набор информации, которая одинакова по своей структуре, но различна по количеству, для разных элементов справочника. Например, для каждого сотрудника в справочнике «Сотрудники» это может быть информация о составе семьи, образовании. Для хранения подобных данных служат табличные части справочника:
imageЕсли справочник предполагает хранение большого количества элементов (например, в справочнике «Номенклатура» могут храниться сотни тысяч и миллионы товаров), то возникает необходимость организовать удобную структуру справочника для более удобного поиска нужных элементов.

Для этого существует возможность включить для справочника иерархию:
image
Иерархия позволяет работать с элементами справочника подобно тому, как происходит работа с файлами в проводнике. В операционной системе файлы различных программ хранятся в разных папках:
image
Если бы все файлы хранились в общей «куче», ориентироваться в огромном количестве файлов было бы крайне неудобно.

Если для справочника включена иерархия, то появляется возможность создавать элементы двух видов: «Группа» (аналог папки в проводнике) и «Элемент» (аналог файла в проводнике).

Например, в справочнике «Номенклатура» могут быть созданы группы: «Детские игрушки», «Для дома», «Спортивный инвентарь» и т.д., в которых располагаются элементы, относящиеся к этим группам. Кроме того группы справочника могут включать в себя и другие группы, создавая тем самым многоуровневую иерархическую структуру:
image
В справочниках возможен и другой вид иерархии, при котором элементы справочника будут относиться не к группам, а к другим элементам этого же справочника. Такой вид иерархии может использоваться, например, при создании справочника Задачи, где одна задача может включать в себя несколько других задач.
image
Разные справочники могут находиться в состоянии подчинения, т.е. элементы одного справочника могут быть подчинены элементам или группам другого справочника. Например, справочник «Договоры» может быть подчинен справочнику «Контрагенты». Тогда при оформлении документов для некоторого контрагента можно будет выбрать договор не среди всех имеющихся в программе договоров, а среди договоров только выбранного в документе контрагента:
image
Справочники допускают также создание предопределенных элементов, которые существуют в справочнике всегда, вне зависимости от действий пользователя. Такие элементы справочника создаются разработчиком при разработке прикладного решения и не могут быть удалены или перемещены пользователем.

image

Например, в справочнике контрагенты уже на этапе создания справочника можно определить некоторые группы для удобства работы пользователей: «Покупатели», «Поставщики», «Прочее», а также создать элемент справочника «РозничныйПокупатель», который будет использоваться при продаже товаров в розницу:

Как справочники хранятся в базе данных

image

В простейшем случае справочник представляет собой в базе данных таблицу, с заранее определенными колонками «Код» и «Наименование». Каждый элемент справочника — это строка из этой таблицы. Для того, чтобы для строк в таблице хранить какие-то дополнительные сведения (например, для контрагентов хранить «УНП» и «Дату регистрации») , нужно добавить в таблицу новые колонки. Чтобы добавить новые колонки в таблицу используются как раз Реквизиты:

image

Иерархический справочник также представлен в базе в виде таблицы, где кроме колонок «Код» и «Наименование» есть ещё 2 колонки: «ЭтоГруппа» (да/нет — признак, указывающий на то, групповой это элемент или нет) и «Родитель» (вышестоящий элемент справочника по иерархии):

Таким образом, в данной статье мы познакомились с объектом конфигурации «Справочники», рассмотрели примеры использования и работы с ними, а также разобрали как справочники хранятся в базе данных.

Что такое справочник в 1с

Вступайте в мою группу помощник программиста.
В ней мы обсуждаем программирование в 1С.

Полный синтаксис (нажмите, чтобы раскрыть)

Справочники

Описание:

Для работы с постоянной и условно постоянной информацией с некоторым множеством значений в системе используются объекты типа «Справочник». Обычно справочниками являются списки материалов, товаров, организаций, валют, сотрудников и др.

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

К настраиваемым свойствам относятся, например, длина и тип кода, количество уровней, поддержка уникальности кодов, набор реквизитов справочника. Помимо кода и наименования, механизм работы со справочниками позволяет создавать набор реквизитов для хранения любой дополнительной информации об элементе справочника.

Оглавление (нажмите, чтобы раскрыть)

  • Как обойти все элементы справочника
  • Как обойти все группы справочника
  • Как обойти группы вместе с элементами справочника (иерархически)
  • Как отобрать элементы справочника по родителю (перечислим все элементы группы)
  • Как отобрать элементы справочника по владельцу (перечислим все договоры контрагента)
  • Как отобрать элементы справочника по коду, наименованию, и другим реквизитам
  • Как создать новый элемент справочника
  • Как создать новую группу справочника
  • Как перенести элемент справочника в другую группу
  • Как внести изменения в элемент справочника по ссылке
  • Как получить и проверить пустую ссылку типа справочник
  • Как узнать принадлежность элемента справочника группе с учетом уровней иерархии
  • Как скопировать существующий элемент справочника
  • Как выяснить уровень вложенности элемента справочника
  • Как заблокировать элемент справочника перед изменениями
  • Как заполнить новый элемент справочника на основании
  • Как пометить на удаление элемент справочника
  • Как открыть форму существующего элемента справочника по ссылке
  • Как открыть форму существующей группы справочника по ссылке
  • Как открыть форму выбора элемента справочника и отследить её закрытие
  • Как открыть форму выбора группы справочника и отследить её закрытие
  • Как открыть форму списка справочника и установить отбор по реквизиту
  • Как открыть форму списка справочника с нужным отображением
  • Как открыть форму только что созданного, но ещё не записанного элемента справочника
  • Скачать и выполнить эти примеры на компьютере
/// Как обойти все элементы справочника в 1с 8.3, 8.2 &НаСервере Процедура КакОбойтиЭлементыСправочникаНаСервере() Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Наименование |ИЗ | Справочник.Вкусы КАК Вкусы |ГДЕ | ЭтоГруппа = ЛОЖЬ |УПОРЯДОЧИТЬ ПО | Наименование"; РезультатЗапроса = Запрос.Выполнить(); ВыборкаВкусов = РезультатЗапроса.Выбрать(); Пока ВыборкаВкусов.Следующий() Цикл Сообщить(ВыборкаВкусов.Наименование); КонецЦикла; КонецПроцедуры

Результат обхода элементов справочника

Результат обхода элементов справочника 1с 8

/// Как обойти все группы справочника в 1с 8.3, 8.2 &НаСервере Процедура КакОбойтиГруппыСправочникаНаСервере() Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Наименование |ИЗ | Справочник.Вкусы КАК Вкусы |ГДЕ | ЭтоГруппа = ИСТИНА |УПОРЯДОЧИТЬ ПО | Наименование"; РезультатЗапроса = Запрос.Выполнить(); ВыборкаВкусов = РезультатЗапроса.Выбрать(); Пока ВыборкаВкусов.Следующий() Цикл Сообщить(ВыборкаВкусов.Наименование); КонецЦикла; КонецПроцедуры

Результат обхода групп справочника

Результат обхода групп справочника 1с 8

/// Как обойти группы вместе с элементами /// справочника (иерархически) в 1с 8.3, 8.2 &НаСервере Процедура КакОбойтиГруппыИЭлементыСправочникаНаСервере() Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Наименование |ИЗ | Справочник.Вкусы КАК Вкусы |УПОРЯДОЧИТЬ ПО | Наименование Иерархия"; РезультатЗапроса = Запрос.Выполнить(); ВыборкаВкусов = РезультатЗапроса.Выбрать(); Пока ВыборкаВкусов.Следующий() Цикл Отступ = ""; Для Шаг = 0 По ВыборкаВкусов.Уровень() Цикл Отступ = Отступ + " "; КонецЦикла; Сообщить(Отступ + ВыборкаВкусов.Наименование); КонецЦикла; КонецПроцедуры

Результат обхода групп и элементов (иерархически) справочника

Результат обхода групп и элементов (иерархически) справочника 1с 8

/// Как отобрать элементы справочника по родителю в 1с 8.3, 8.2 /// (перечислим все элементы группы) &НаСервере Процедура КакОтобратьЭлементыСправочникаПоРодителюНаСервере() // для тестов найдём группу "Любимые" по её имени СсылкаНаРодителя = Справочники.Вкусы.НайтиПоНаименованию("Любимые"); // перечислим только те элементы справочника, что // входят в группу "Любимые" Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Наименование |ИЗ | Справочник.Вкусы КАК Вкусы |ГДЕ | Вкусы.Родитель = &Родитель"; Запрос.УстановитьПараметр("Родитель", СсылкаНаРодителя); РезультатЗапроса = Запрос.Выполнить(); ВыборкаВкусов = РезультатЗапроса.Выбрать(); Пока ВыборкаВкусов.Следующий() Цикл Сообщить(ВыборкаВкусов.Наименование); КонецЦикла; КонецПроцедуры

Результат отбора элементов по родителю (группе) справочника

Результат отбора элементов справочника по родителю (группе)

/// Как отобрать элементы справочника по владельцу в 1с 8.3, 8.2 /// (перечислим все договоры контрагента) &НаСервере Процедура КакОтобратьЭлементыСправочникаПоВладельцуНаСервере() // для тестов найдём клиента по коду 1 (это Андрей, у него 2 договора) СсылкаНаКлиента = Справочники.Клиенты.НайтиПоКоду("000000001"); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Наименование |ИЗ | Справочник.Договоры КАК Договоры |ГДЕ | Договоры.Владелец = &Владелец"; Запрос.УстановитьПараметр("Владелец", СсылкаНаКлиента); РезультатЗапроса = Запрос.Выполнить(); ВыборкаДоговоров = РезультатЗапроса.Выбрать(); Пока ВыборкаДоговоров.Следующий() Цикл Сообщить(ВыборкаДоговоров.Наименование); КонецЦикла; КонецПроцедуры

Результат отбора элементов справочника по владельцу

Результат отбора элементов справочника 1с 8 по владельцу

/// Как отобрать элементы справочника по коду, наименованию, /// и другим реквизитам в 1с 8.3, 8.2 &НаСервере Процедура КакОтобратьЭлементыСправочникаПоРеквизитамНаСервере() // сделаем отбор элементов справочника Клиенты // у которых реквизит Пол = Мужской и ЛюбимыйЦвет = Красный // вместо этих реквизитов для отбора можно использовать // Код, Наименование или любой другой реквизит справочника Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Наименование, | Пол, | ЛюбимыйЦвет |ИЗ | Справочник.Клиенты КАК Клиенты |ГДЕ | Клиенты.ЭтоГруппа = ЛОЖЬ И | Клиенты.Пол = &Пол И | Клиенты.ЛюбимыйЦвет = &Цвет"; Запрос.УстановитьПараметр("Пол", Перечисления.Пол.Мужской); Запрос.УстановитьПараметр( "Цвет", Справочники.Цвета.НайтиПоНаименованию("Красный") ); РезультатЗапроса = Запрос.Выполнить(); ВыборкаКлиентов = РезультатЗапроса.Выбрать(); Пока ВыборкаКлиентов.Следующий() Цикл Сообщить( ВыборкаКлиентов.Наименование + " " + ВыборкаКлиентов.Пол + " " + ВыборкаКлиентов.ЛюбимыйЦвет ); КонецЦикла; КонецПроцедуры

Результат отбора элементов справочника по реквизитам

Результат отбора элементов справочника 1с 8 по реквизитам

&НаСервере Процедура СозданиеИИзменениеЭлементовИГруппСправочникаНаСервере() /// Как создать новый элемент справочника в 1с 8.3, 8.2 // создадим новый элемент справочника Города // с именем Владивосток Владивосток = Справочники.Города.СоздатьЭлемент(); Владивосток.Наименование = "Владивосток"; Владивосток.Записать(); /// Как создать новую группу справочника в 1с 8.3, 8.2 // создадим новую группу справочника Города ГородаУМоря = Справочники.Города.СоздатьГруппу(); ГородаУМоря.Наименование = "Города у моря"; ГородаУМоря.Записать(); /// Как перенести элемент справочника в другую группу в 1с 8.3, 8.2 // перенесём созданный Владивосток в группу "Города у моря" Владивосток.Родитель = ГородаУМоря.Ссылка; Владивосток.Записать(); /// Как внести изменения в элемент справочника по ссылке /// в 1с 8.3, 8.2 // найдём город Калькутта КалькуттаСсылка = Справочники.Города.НайтиПоНаименованию("Калькутта"); Если Не КалькуттаСсылка.Пустая() Тогда // изменим и запишем численность жителей в городе Калькутта = КалькуттаСсылка.ПолучитьОбъект(); Калькутта.Численность = 1000000; Калькутта.Записать(); КонецЕсли; /// Как получить и проверить пустую ссылку типа справочник в 1с 8.3, 8.2 ПустаяСсылка = Справочники.Города.ПустаяСсылка(); Если ПустаяСсылка.Пустая() Тогда Сообщить("Ссылка действительно пустая."); КонецЕсли; /// Как узнать принадлежность элемента справочника группе /// с учетом уровней иерархии в 1с 8.3, 8.2 ПермьСсылка = Справочники.Города.НайтиПоНаименованию("Пермь"); РоссияСсылка = Справочники.Города.НайтиПоНаименованию("Россия"); // проверим принадлежит ли город Пермь группе Россия Если ПермьСсылка.ПринадлежитЭлементу(РоссияСсылка) Тогда Сообщить("Элемент Пермь находится в группе Россия."); КонецЕсли; /// Как скопировать существующий элемент справочника в 1с 8.3, 8.2 // скопируем элемент Пермь КопияПерми = ПермьСсылка.Скопировать(); КопияПерми.Наименование = КопияПерми.Наименование + " КОПИЯ"; КопияПерми.УстановитьНовыйКод(); КопияПерми.Записать(); /// Как выяснить уровень вложенности элемента справочника /// в 1с 8.3, 8.2 Сообщить(КопияПерми.Уровень()); // 1 /// Как заблокировать элемент справочника перед изменениями /// в 1с 8.3, 8.2 // выполним блокировку элемента справочника // от изменения другими режимами или пользователями Пермь = ПермьСсылка.ПолучитьОбъект(); Если Не Пермь.Заблокирован() Тогда Пермь.Заблокировать(); // тут идёт какой-то долгий алгоритм // в результате которого мы меняем // заблокированный элемент Пермь.Численность = 5000; Пермь.Записать(); // и только потом освобождаем его // для других режимов и пользователей Пермь.Разблокировать(); КонецЕсли; /// Как заполнить новый элемент справочника на основании /// в 1с 8.3, 8.2 // в модуле справочника Города я определил процедуру // ОбработкаЗаполнения, которая обрабатывает ситуации // когда мы заполняем один элемент на основании // данных другого (см. в базе для скачивания) Хабаровск = Справочники.Города.СоздатьЭлемент(); Хабаровск.Заполнить( Справочники.Города.НайтиПоНаименованию("Рио-де-Жанейро") ); Хабаровск.Наименование = "Хабаровск"; Хабаровск.Записать(); /// Как пометить на удаление элемент справочника в 1с 8.3, 8.2 // пометим на удаление только что созданный Хабаровск Хабаровск.УстановитьПометкуУдаления( Истина, // пометка удаления Ложь // включая подчиненные (если речь о группе справочника) ); // метод Записать вызывать не нужно КонецПроцедуры &НаСервереБезКонтекста Функция ПолучитьКлиентаПоИмени(Имя) Возврат Справочники.Клиенты.НайтиПоНаименованию(Имя); КонецФункции /// Как открыть форму существующего элемента справочника /// по ссылке в 1с 8.3, 8.2 &НаКлиенте Процедура КакОткрытьФормуСуществующегоЭлементаСправочника(Команда) СсылкаНаЭлемент = ПолучитьКлиентаПоИмени("Андрей"); ПараметрыФормы = Новый Структура("Ключ", СсылкаНаЭлемент); ОткрытьФорму( "Справочник.Клиенты.ФормаОбъекта", // имя формы ПараметрыФормы // параметры для формы ); КонецПроцедуры /// Как открыть форму существующей группы справочника /// по ссылке в 1с 8.3, 8.2 &НаКлиенте Процедура КакОткрытьФормуСуществующейГруппыСправочника(Команда) СсылкаНаГруппу = ПолучитьКлиентаПоИмени("Vip"); ПараметрыФормы = Новый Структура("Ключ", СсылкаНаГруппу); ОткрытьФорму( "Справочник.Клиенты.ФормаГруппы", // имя формы ПараметрыФормы // параметры для формы ); КонецПроцедуры /// Как открыть форму выбора элемента справочника и /// отследить её закрытие в 1с 8.3, 8.2 &НаКлиенте Процедура КакОткрытьФормуВыбораЭлементаСправочника(Команда) ОповещениеОЗакрытии = Новый ОписаниеОповещения("ПослеВыбораЭлемента", ЭтотОбъект); ОткрытьФорму( "Справочник.Клиенты.ФормаВыбора". ОповещениеОЗакрытии ); КонецПроцедуры &НаКлиенте Процедура ПослеВыбораЭлемента(Результат, Параметры) Экспорт Если Результат <> Неопределено Тогда Сообщить("Был выбран элемент " + Результат); КонецЕсли; КонецПроцедуры /// Как открыть форму выбора группы справочника и /// отследить её закрытие в 1с 8.3, 8.2 &НаКлиенте Процедура КакОткрытьФормуВыбораГруппыСправочника(Команда) ОповещениеОЗакрытии = Новый ОписаниеОповещения("ПослеВыбораГруппы", ЭтотОбъект); ОткрытьФорму( "Справочник.Клиенты.ФормаВыбораГруппы". ОповещениеОЗакрытии ); КонецПроцедуры &НаКлиенте Процедура ПослеВыбораГруппы(Результат, Параметры) Экспорт Если Результат <> Неопределено Тогда Сообщить("Была выбрана группа " + Результат); КонецЕсли; КонецПроцедуры /// Как открыть форму списка справочника и /// установить отбор по реквизиту в 1с 8.3, 8.2 &НаКлиенте Процедура КакОткрытьФормаСпискаСправочникаСОтбором(Команда) // откроем список клиентов, оставив // только мужчин ПараметрыОтбора = Новый Структура; ПараметрыОтбора.Вставить("Пол", ПолучитьПеречислениеМужской()); ПараметрыФормы = Новый Структура; ПараметрыФормы.Вставить("Отбор", ПараметрыОтбора); ОткрытьФорму( "Справочник.Клиенты.ФормаСписка", ПараметрыФормы ); КонецПроцедуры &НаСервереБезКонтекста Функция ПолучитьПеречислениеМужской() Возврат Перечисления.Пол.Мужской; КонецФункции /// Как открыть форму списка справочника с нужным отображением /// в 1с 8.3, 8.2 &НаКлиенте Процедура КакОткрытьФормуСпискаСправочникаСНужнымОтображением(Команда) // откроем список клиентов с отображением "Список" ФормаСписка = ПолучитьФорму("Справочник.Клиенты.ФормаСписка"); ФормаСписка.Открыть(); ФормаСписка.Элементы.Список.Отображение = ОтображениеТаблицы.Список; КонецПроцедуры /// Как открыть форму только что созданного, но ещё /// не записанного элемента справочника в 1с 8.3, 8.2 &НаКлиенте Процедура КакОткрытьФормуНовогоНеЗаписанногоСправочника(Команда) // получаем форму нового справочника ФормаНовогоСправочника = ПолучитьФорму( "Справочник.Еда.ФормаОбъекта". Истина); // делаем копию её данных (так как напрямую их менять // нельзя) КопияДанныхФормы = ФормаНовогоСправочника.Объект; // заполняем эти данные на сервере ЗаполнитьДанныеФормыНаСервере(КопияДанныхФормы); // копируем заполненные данные в исходную форму КопироватьДанныеФормы(КопияДанныхФормы, ФормаНовогоСправочника.Объект); // показываем форму нового заполненного // элемента справочника пользователю ФормаНовогоСправочника.Открыть(); КонецПроцедуры &НаСервере Процедура ЗаполнитьДанныеФормыНаСервере(ДанныеФормы) // преобразуем данные формы в документ Еда = ДанныеФормыВЗначение(ДанныеФормы, Тип("СправочникОбъект.Еда")); Еда.Наименование = "Груша"; Еда.Калорийность = 500; // преобразуем документа обратно в данные формы ЗначениеВДанныеФормы(Еда, ДанныеФормы); КонецПроцедуры /// Скачать и выполнить эти примеры на компьютере

Справочники в языке 1С 8.3, 8.2 (в примерах)

С уважением, Владимир Милькин (преподаватель школы 1С программистов и разработчик обновлятора).

Что такое справочник в 1с

Учебник

Форум

Назначение справочников

Справочник является списком возможных значений того или иного реквизита. Справочники используются в тех случаях, когда необходимо исключить неоднозначный ввод информации. Например, для того, чтобы покупатель, продавец, кладовщик, директор понимали, о каком товаре идет речь, каждый должен называть его одинаково. И в этом случае необходим справочник. Обычно в торговом предприятии он имеет вид прайс-листа, а если такой справочник хранится в компьютере, то в него заносят всю возможную номенклатуру товаров, с которыми работает торговая фирма.

Система 1С:Предприятие позволяет вести практически неограниченное количество необходимых справочников. Каждый справочник представляет собой список однородных объектов: сотрудников, организаций, товаров и т. д. Каждый такой объект называется элементом справочника.

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

Атрибуты справочников

В качестве обязательных реквизитов каждый справочник имеет Код и Наименование. Код элемента справочника может быть как числовым, так и текстовым. Система 1С:Предприятие предоставляет широкие возможности по работе с кодами элементов справочника: автоматическое присвоение кодов, автоматический контроль уникальности кода и другие.

Помимо кода и наименования, в справочниках системы 1С:Предприятие может храниться любая дополнительная информация об элементе справочника. Для хранения такой информации в справочнике может быть создан список реквизитов. Используя механизм реквизитов справочника, легко организовать, например, картотеку сотрудников. Например, справочник Сотрудники почти наверняка будет иметь атрибуты Должность, Оклад и другие. Фирма 1С предвосхитила программистов и ввела во все справочники два уже заданных атрибута: Код и Наименование. Действительно, практически любой объект из реальной жизни содержит эти атрибуты. Например, для сотрудников кодом выступает табельный номер, а наименованием — фамилия, имя, отчество (ФИО).

Типы данных

Для каждого атрибута справочника нужно указать его тип данных, например, «число«, «строка«, «дата» (в версии 8.0 есть еще тип Булево — Истина или Ложь). Это базовые типы, но можно указать и сложные типы данных. Например атрибут Должность имеет тип данных Должности. В этом случае, значения этого атрибута будут выбираться из справочника Должности. Так реализуется простейшая связь между справочниками, когда значения атрибутов одного справочника выбираются из другого справочника.

Справочник Сотрудники
Справочник Должности
Наименование
Должность
Наименование

Иерархические справочники

Список элементов справочника в системе 1С:Предприятие может быть многоуровневым. В этом случае все строки справочника будут разделяться на 2 вида: «просто» элементы справочника и группы справочника. Группы позволяют переходить на нижележащие уровни многоуровневого справочника. Использование многоуровневых справочников позволяет организовать ввод информации в справочник с нужной степенью детализации. Элементы и группы элементов в многоуровневом справочнике можно переносить из одной группы в другую.

Подчиненные справочники

Между справочниками может быть установлено отношение подчиненности. В терминах реляционных баз данных, между таблицами устанавливается связь «один-ко-многим». В этом случае каждый элемент подчиненного справочника будет связан с одним из элементов справочника-владельца.Иногда можно сказать, что элементы одного справочника принадлежат элементам другого. Например, в системе может быть справочник НалоговыеЛьготы. Тогда его можно сделать подчиненным справочнику Сотрудники. Это означает, что «Сотрудник владеет налоговыми льготами».

Справочник Сотрудники

Справочник НалоговыеЛьготы

  • Иванов Иванов Иванов
  • Петров Петр Петрович
  • Светлов Михаил Петрович
  • Цветков Антон Васильевич

( владелец Петров Петр Петрович)
( владелец Светлов Михаил Петрович)

Табличные части (только версия 8.0)

В версии 8.0 появилась возможность для элемента справочника иметь несколько табличных частей. Эту возможность рекомендуется использовать для отражения информации, связанной с данным элементом, но не имеющей собственной объектной сущности (для которых рекомендуется завести подчиненный справочник). Например, для спр. Товары может быть заведена табличная часть ЕдиницыИзмерения, для справочника Сотрудники могут быть заведены табличные части Образование и СоставСемьи. Работа с табличными частями похожа на работу с подчиненными справочниками за исключением того, что табличные части не могут быть типами, а значит уже будет нельзя создать реквизит типа Образование.

Сравнение справочников с другими объектами

Объект
Сходства
Различия

Основы программирования

Ссылка на справочник
Для работы со справочником из какого-нибудь модуля требуется сначала создать ссылку на этот справочник.

Создание и запись нового элемента

НовЭл = СпрСотр.СоздатьЭлемент();
НовЭл.Наименование = «Иванов Иван Иванович»;
НовЭл.Оклад = 5000;
НовЭл.Записать();

Поиск элемента справочника

//например, в приказе об увольнении
СпрСотр.НайтиЭлемент(Сотрудник);

СпрСотр.НайтиПоКоду(123);
СпрСотр.НайтиПоНаименованию(«Иванов Иван Иванович»);
СпрСотр.НайтиПоРеквизиту(«Оклад», 5000);

//если элемент найден, он становится текущим и его можно прочитать так:

Если СпрСотр.НайтиПоНаименованию(«Иванов Иван Иванович»)=1 Тогда
. НайденныйСотр = СпрСотр.ТекущийЭлемент();
КонецЕсли;

//в версии 8.0 если элемент найден, то он возвращается, иначе возвращается Неопределено

НайденныйСотр = СпрСотр.НайтиПоКоду(123);
НайденныйСотр = СпрСотр.НайтиПоНаименованию(«Иванов Иван Иванович»);
НайденныйСотр СпрСотр.НайтиПоРеквизиту(«Оклад», 5000);

//далее нужно проверить найденное значение

НайденныйСотр = СпрСотр.НайтиПоНаименованию(«Иванов Иван Иванович»);
Если НайденныйСотр = Неопределено Тогда
. //элемент не найден
КонецЕсли;

Удаление элемента справочника

СпрСотр.Удалить(1); //непосредственное удаление

СпрСотр.Удалить(0); //пометка на удаление
СпрСотр.СнятьПометкуУдаления();

//можно проверить, помечен ли элемент на удаление
//функция возвращает 1 — если помечен, 0 — если нет
Пометка = СпрСотр.ПометкаУдаления(); //обратите внимание: это метод

СпрСотр.Удалить(); //непосредственное удаление

СпрСотр.УстановитьПометкуУдаления (Истина); // пометка на удаление
СпрСотр.УстановитьПометкуУдаления (Ложь); //снять пометку на удаление

//можно проверить, помечен ли элемент на удаление
//есть свойство ПометкаУдаления, оно имеет тип Булево — Истина или Ложь
Пометка = СпрСотр.ПометкаУдаления; //обратите внимание: это свойство
Если Пометка = Истина Тогда
. //элемент помечен на удаление
КонецЕсли;

Перебор элементов справочника

СпрСотр.ВыбратьЭлементы();
Пока СпрСотр.ПолучитьЭлемент() = 1 Цикл
. //действия с очередным элементом
. Сообщить(«Сотрудник » + СпрСотр.Наименование);
КонецЦикла;

выборка = Справочники.Сотрудники.Выбрать();
Пока выборка.Следующий() = 1 Цикл
. //действия с очередным элементом
. Сообщить(«Сотрудник » + выборка.Наименование);
КонецЦикла;

Родитель
Перебор элементов внутри группы. Группа в терминах 1С — это «родитель».

СпрСотр.НайтиПоНаименованию(«Работающие»);
Работающие = СпрСотр.ТекущийЭлемент();
СпрСотр.ИспользоватьРодителя(Работающие);
//дальше, например, цикл по сотрудникам (см. выше)
.

СпрСотр = Справочники.Сотрудники;
ГруппаРаботающие = СпрСотр.НайтиПоНаименованию(«Работающие»);
выборка = СпрСотр.Выбрать(ГруппаРаботающие);
Пока выборка.Следующий() = 1 Цикл
. //действия с очередным элементом
. Сообщить(«Сотрудник » + выборка.Наименование);
КонецЦикла;

Владелец
Перебор элементов справочника принадлежащих элементу другого справочника.
Один справочник подчинен другому справочнику, например спр. НалоговыеЛьготы подчинен спр. Сотрудники.

СпрНЛ = СоздатьОбъект(«Справочник.НалоговыеЛьготы»);
СпрНЛ.ИспользоватьВладельца(Сотрудник);
//дальше, например, цикл по льготам этого сотрудника (см. выше)
.

выборка = Справочники.НалоговыеЛьготы.Выбрать( ,Сотрудник);
Пока выборка.Следующий() = 1 Цикл
. //действия с очередным элементом
. Сообщить(«льгота » + выборка.Наименование);
КонецЦикла;

Периодические реквизиты
Чтение и запись периодических реквизитов.
Установка даты выборки периодических реквизитов для всего справочника.

//так мы узнаем, какая была у сотрудника
//категория на определенную дату
Катег = СпрСотр.Категория.Получить(НекаяДата);

//так мы установим сотруднику категорию
//на определенную дату
СпрСотр.Категория.Установить(НекаяДата, НоваяКатегория);

//можно установить дату выборки периодических
//реквизитов для всего справочника
СпрСотр.ИспользоватьДату(НекаяДата);

//тогда ниже уже нельзя использовать Установить и Получить
//доступ к периодическим реквизитам становится
//такой же, как к обычным реквизитам
Катег = СпрСотр.Категория;
СпрСотр.Оклад = 6000;

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

Экранные формы справочников

Форма списка справочника

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

Лучше один раз увидеть, чем сто раз услышать, поэтому ниже для примера приведена форма списка справочника Сотрудники:

Модуль формы списка содержит процедуры и функции, которые действуют в контексте данной формы (в контексте объекта Справочник).

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

Событие
Описание

Вызывается при записи элемента справочника, если элементы вводятся прямо в форме списка, а не в форме элемента. Это используется для справочников с простой структурой, например справочник Должности. В этой процедуре можно проверить вводимые данные на наличие ошибок.

Пример, справочник Должности

Процедура ПриЗаписи()
. Если СокрЛП(Наименование)=»» Тогда
. Предупреждение(«Не указано название должности!»,30);
. СтатусВозврата(0);
. КонецЕсли;
КонецПроцедуры

Процедура ПриЗаписи(Отказ)
. Если СокрЛП(Наименование)=»» Тогда
. Предупреждение(«Не указано название должности!»,30);
. Отказ = Истина;
. КонецЕсли;
КонецПроцедуры

В форме списка справочника элементы могут быть отсортированы в различном порядке: по коду, по наименованию или по любому реквизиту, у которого в Конфигураторе установлен флажок Сортировка. Задать тип сортировки можно программно методом Сортировка (Способ, ФлагРазрешенияИзменения)

Процедура ПриОткрытии()
. Сортировка(«Код»,0); //сортировка по коду, пользователь изменить не может
КонецПроцедуры

Процедура ПриОткрытии()
. СправочникСписок.Порядок.Установить(«Наименование Asc, Карточка Asc»);
. //вопрос читателям: как запретить пользователю изменять порядок сортировки?
КонецПроцедуры

В форме списка справочника элементы могут быть отфильтрованы, т.е. пользователю будут показаны только нужные элементы. Программно установить отбор можно методом УстановитьОтбор (Реквизит, Значение). Для этого у реквизита должен быть установлен флажок «Отбор по реквизиту» в Конфигураторе .

Процедура ПриОткрытии()
. УстановитьОтбор(«Год»,1980);
КонецПроцедуры

Процедура ПриОткрытии()
. СправочникСписок.Отбор.Карточка.Установить(Год,1980);
. //вопрос читателям: как запретить пользователю изменять условия отбора?
КонецПроцедуры

Статический фильтр (только версия 7.7)

В 1С 7.7 нельзя установить отбор по периодическому реквизиту или по нескольким реквизитам одновременно (сложный фильтр). В этом случае выходом из положения может быть метод ИспользоватьСписокЭлементов. Этому методу нужно передать список элементов, которые должны быть показаны. Предварительно этот список нужно сформировать.

СписокЭлементов = создатьОбъект(«СписокЗначений»);
СпрСотр = СоздатьОбъект(«Справочник.Сотрудники»);
СпрСотр.ИспользоватьДату(РабочаяДата());
СпрСотр.ВыбратьЭлементы();
Пока СпрСотр.ПолучитьЭлемент()=1 Цикл
. Если (СпрСотр.Родитель = группаРаботающие) И (СпрСотр.Должность=длжПлотник) Тогда
. СписокЭлементов.ДобавитьЗначение(СпрСотр.ТекущийЭлемент());
. КонецЕсли;
КонецЦикла;

ИспользоватьСписокЭлементов(СписокЭлементов);

Форма элемента и форма группы

Если справочник имеет сложную структуру, тогда его элементы удобнее редактировать в отдельном окне, а не в списке. Ниже приведена форма элемента справочника Сотрудники.

В форме элемента справочника также есть предопределенные процедуры (события):

События
Описание

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

Пример, справочник Сотрудники

Процедура ПриЗаписи
. Если Категория.Выбран()=0 Тогда
. Предупреждение(«Не указана категория сотрудника!»);
. СтатусВозврата(0);
. КонецЕсли;
КонецПроцедуры

Следует заметить, что вверсии 8.0 список событий всех объектов значительно расширен.

Создание и запись элемента

Программное создание элемента справочника

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

СпрСотр = СоздатьОбъект(«Справочник.Сотрудники»);
СпрСотр.ИспользоватьРодителя(грпРаботающие);
СпрСотр.Новый();
СпрСотр.Наименование = «Иванов Иван Иванович»;
СпрСотр.ДатаПриема = ‘01.01.2002’;
СпрСотр.Записать();
//установка периодических реквизитов возможна только после записи элемента
СпрСотр.Категория.Установить (СпрСотр.ДатаПриема, ктгСовместители);
СпрСотр.Должность.Установить (СпрСотр.ДатаПриема, длжПлотник);

а можно сделать красивее:

СпрСотр = СоздатьОбъект(«Справочник.Сотрудники»);
СпрСотр.ИспользоватьРодителя(грпРаботающие);
СпрСотр.ИспользоватьДату(ДатаПриема); //внимание!
СпрСотр.Новый();
СпрСотр.Наименование = «Иванов Иван Иванович»;
СпрСотр.ДатаПриема = ‘01.01.2002’;
//доступ к периодическим реквизитам становится такой же, как к обычным
СпрСотр.Категория = ктгСовместители;
СпрСотр.Должность = длжПлотник;
СпрСотр.Записать();

Нов = Справочники.Сотрудники.СоздатьЭлемент();
Нов.Родитель = грпРаботающие;
Нов.Наименование = «Иванов Иван Иванович»;
Нов.ДатаПриема = ‘01.01.2002’;
Нов.Записать();

//в версии 8.0 нет периодических реквизитов

Программное создание групп

СпрСотр.НоваяГруппа();
СпрСотр.Наименование = «Работающие»;
СпрСотр.Записать();

СпрСотр.НоваяГруппа();
СпрСотр.Наименование = «Уволенные»;
СпрСотр.Записать();

Нов = Справочники.Сотрудники.СоздатьГруппу();
Нов.Наименование = «Работающие»;
Нов.Записать();

Нов = Справочники[«Сотрудники»].СоздатьГруппу();
Нов.Наименование = «Работающие»;
Нов.Записать();

Внимание! В Конфигураторе можно задать для реквизита то, что он действителен только для элемента, только для группы или для обоих. Например, поле ДатаПриема не имеет смысла для группы Работающие. Поэтому не стоит обращаться к реквизитам элементов, если вы работаете с группой и наоборот.

При создании множества элементов справочника для ускорения работы можно заключить цикл в транзакцию. При этом реальное создание всех элементов произойдет только по команде ЗафиксироватьТранзакцию(). На время выполнения транзакции справочник блокируется.

СпрСотр = СоздатьОбъект(«Справочник.Сотрудники»);
НачатьТранзакцию();

Для Ном = 1 По 100 Цикл
. СпрСотр.Новый();
. СпрСотр.Наименование = «Новый » + Строка(Ном);
. СпрСотр.Записать();
КонецЦикла;

ЗафиксироватьТранзакцию();

СпрСотр = Справочники.Сотрудники;
НачатьТранзакцию();

Для Ном = 1 По 100 Цикл
. Нов = СпрСотр.СоздатьЭлемент();
. Нов.Наименование = «Новый » + Строка(Ном);
. Нов.Записать();
КонецЦикла;

ЗафиксироватьТранзакцию();

Перебор элементов

Простой перебор

СпрСотр = СоздатьОбъект(«Справочник.Сотрудники»);
Режим = 0; //выбирать без учета иерархии, 1 — с учетом (по умолч.)
СпрСотр.ВыбратьЭлементы(Режим);
Пока СпрСотр.ПолучитьЭлемент()=1 Цикл
.
КонецЦикла;

Фильтрация (отбор)

СпрСотр = СоздатьОбъект(«Справочник.Сотрудники»);
РежимИерархии = 1; //1- выбирать с учетом иерархии, 0 — без учета
РежимГрупп = 0; //0 — не включать в выборку группы, 1 — включать
ИмяРеквизита = «Год»; //в Конфигураторе у реквизита должен быть установлен флажок Отбор
Значение = 1980;
СпрСотр.ВыбратьЭлементыПоРеквизиту(ИмяРеквизита,Значение,РежимИерархии, РежимГрупп);
Пока СпрСотр.ПолучитьЭлемент()=1 Цикл
.
КонецЦикла;

Фильтрация в цикле

СпрСотр = СоздатьОбъект(«Справочник.Сотрудники»);
СпрСотр.ИспользоватьРодителя(грпРаботающие);
СпрСотр.ИспользоватьДату(РабочаяДата());
СпрСотр.ВыбратьЭлементы();
Пока СпрСотр.ПолучитьЭлемент()=1 Цикл

Если СпрСотр.Должность <> длжПлотник Тогда
. Продолжить; //этого сотрудника пропускаем, перейти в начало цикла
КонецЕсли;

Порядок сортировки

Перед выборкой можно задать порядок сортировки следующими методами:

ПорядокКодов()
ПорядокНаименований()
ПорядокРеквизита(ИмяРекв) //у реквизита должен быть установлен флажок Сортировка в Конфигураторе
ОбратныйПорядок()

Например, ниже открывается выборка сотрудников, отсортированных по номерам по убыванию:

СпрСотр = СоздатьОбъект(«Справочник.Сотрудники»);
СпрСотр.ПорядокКодов();
СпрСотр.ОбратныйПорядок();
СпрСотр.ВыбратьЭлементы();

Запрос к справочнику

Перебор элементов справочника можно организовать через Запрос. Часто это бывает удобнее, если применяется сложное условие отбора или группировка элементов. Подробнее см. Запросы

Поиск элемента

Поиск элемента

СпрСотр = СоздатьОбъект(«Справочник.Сотрудники»);
Если СпрСотр.НайтиЭлемент(ВыбрСотр)=1 Тогда
. //элемент становится текущим
. СпрСотр.Родитель = грпРаботающие;
. СпрСотр.Записать();
КонецЕсли;

Поиск по коду

Если СпрСотр.НайтиПоКоду(1) = 1 Тогда
. ЭлементИлиГруппа = СпрСотр.ТекущийЭлемент();
КонецЕсли;

Поиск по наименованию

Если СпрСотр.НайтиПоНаименованию(«Работающие»)=1 Тогда
. грпРаботающие = СпрСотр.ТекущийЭлемент();
КонецЕсли;

Режим = 1; // 1 — поиск внутри установленного подчинения (родителя) (по умолч.); 0 — поиск во всем справочнике
ФлагПоиска = 0; //1 — найти точное соответствие; 0 — найти наименование по первым символам (по умолч)
СпрСотр.ИспользоватьРодителя(грпРаботающие);
Если СпрСотр.НайтиПоНаименованию(«Ив»,Режим,ФлагПоиска)=1 Тогда
. ПервыйРаботающийИв = СпрСотр.ТекущийЭлемент();
КонецЕсли;

Поиск по реквизиту

ИмяРекв = «Год»; //у реквизита должен быть установлен флажок Сортировка в Конфигураторе
ФлагГлобПоиска = 1; // 1- искать во всем справочнике, 0 — искать в пределах подчинения
Если СпрСотр.НайтиПоРеквизиту(ИмяРекв,1980,ФлагГлобПоиска)=1 Тогда
. НайденныйЭлемент = СпрСотр.ТекущийЭлемент();
КонецЕсли;

Поиск элемента в цикле

СпрСотр = СоздатьОбъект(«Справочник.Сотрудники»);
СпрСотр.ИспользоватьРодителя(грпРаботающие);
СпрСотр.ИспользоватьДату(РабочаяДата());
СпрСотр.ВыбратьЭлементы();
Пока СпрСотр.ПолучитьЭлемент()=1 Цикл

Если СпрСотр.Должность = длжПлотник Тогда
. Прервать; //нашли работающего плотника! выйти из цикла
КонецЕсли;

Запрос к справочнику

Поиск элемента справочника можно организовать через Запрос. Часто это бывает удобнее, если применяется сложное условие отбора. Подробнее см. Запросы

Удаление элементов

Непосредственное удаление

СпрСотр = СоздатьОбъект(«Справочник.Сотрудники»);
СпрСотр.НайтиЭлемент(ВыбрСотрудник);
СпрСотр.Удалить(); //непосредственное удаление

Внимание! Если вы производите непосредственное удаление элемента, то следите, чтобы на него не было ссылок в других объектах. Например, удаляемый сотрудник может использоваться в документе Отпуск. При его удалении ссылочная целостность базы данных будет нарушена. В этом случае рекомендуется пользоваться пометкой на удаление.

Можно программно получить список объектов, содержащих ссылку на удаляемый объект методом НайтиСсылки(объект).

Пометка на удаление

Для контроля ссылочной целостности базы данных удаляемые элементы всего лишь помечаются на удаление. Затем специальной командой меню Операции => «Удаление помеченных объектов» в монопольном режиме система 1С проконтролирует ссылочную целостность и физически удалит элементы из базы данных, если на них нет ссылок в других объектах.

СпрСотр = СоздатьОбъект («Справочник.Сотрудники»);
СпрСотр. НайтиЭлемент (ВыбрСотрудник);
СпрСотр. Удалить (0); //пометка на удаление

//можно проверить, помечен ли элемент на удаление
//функция возвращает 1 — если помечен, 0 — если нет
Пометка = СпрСотр. ПометкаУдаления ();

//можно снять пометку на удаление
СпрСотр. НайтиЭлемент (ВыбрСотрудник);
СпрСотр. СнятьПометкуУдаления ();

При удалении множества элементов справочника для ускорения работы можно заключить цикл в транзакцию. При этом реальное удаление (пометка на удаление) всех элементов произойдет только по команде ЗафиксироватьТранзакцию(). На время транзакции справочник блокируется.

СпрСотр = СоздатьОбъект(«Справочник.Сотрудники»);
НачатьТранзакцию();

СпрСотр.ВыбратьЭлементы();
Пока СпрСотр.ПолучитьЭлемент()=1 Цикл
. СпрСотр.Удалить(0); //пометка на удаление
КонецЦикла;

ЗафиксироватьТранзакцию();

Иерархические справочники

Список элементов справочника в системе 1С:Предприятие может быть многоуровневым. В этом случае все строки справочника будут разделяться на 2 вида: «просто» элементы справочника и группы справочника. Группы позволяют переходить на нижележащие уровни многоуровневого справочника. Возможное количество уровней вложенности справочника задается в Конфигураторе.

Использование многоуровневых справочников позволяет организовать ввод информации в справочник с нужной степенью детализации. Элементы и группы элементов в многоуровневом справочнике можно переносить из одной группы в другую.

Внимание! Иерархический справочник — это также многоуровневый справочник, или справочник с группами.
Группа справочника в 1С часто называется «родитель«.

Программное создание группы

СпрСотр.НоваяГруппа();
СпрСотр.Наименование = «Работающие»;
СпрСотр.Записать();

СпрСотр.НоваяГруппа();
СпрСотр.Наименование = «Уволенные»;
СпрСотр.Записать();

Внимание! В Конфигураторе можно задать для реквизита то, что он действителен только для элемента, только для группы или для обоих. Например, поле ДатаПриема не имеет смысла для группы Работающие. Поэтому не стоит обращаться к реквизитам элементов, если вы работаете с группой и наоборот.

Установка текущей группы

СпрСотр = СоздатьОбъект(«Справочник.Сотрудники»);
СпрСотр.ИспользоватьРодителя(грпРаботающие); //теперь мы внутри группы Работающие
СпрСотр.ВыбратьЭлементы(); //открыть выборку элементов группы Работающие

СпрСотр = СоздатьОбъект(«Справочник.Сотрудники»);
СпрСотр.ИспользоватьРодителя(грпРаботающие);
СпрСотр.Новый(); //создание нового элемента в группе Работающие

Информация о текущем элементе

Если справочник многоуровневый, то будет полезным применение следующих методов и атрибутов, которые позволяют получить информацию о текущем элементе справочника:

Метод / атрибут
Описание

Этот метод возвращает уровень текущего элемента. Например, для сотрудника, который находится в группе Работающие, мы получим число 2.

Пример, вывод иерархического справочника в виде дерева:

СпрСотр = СоздатьОбъект(«Справочник.Сотрудники»);
СпрСотр.ВыбратьЭлементы();
Пока СпрСотр.ПолучитьЭлементы()=1 Цикл

//вывести отступ в соответствии с глубиной вложенности элемента
Для Ном=1 По СпрСотр.Уровень() Цикл
. Сообщить(«. «);
КонецЦикла;
Сообщить(СпрСотр.Наименование);

Пример, вывод сотрудников (группы не выводятся):

СпрСотр = СоздатьОбъект(«Справочник.Сотрудники»);
СпрСотр.ВыбратьЭлементы();
Пока СпрСотр.ПолучитьЭлементы()=1 Цикл

Если СпрСотр.ЭтоГруппа()=1 Тогда
. Продолжить; //группы пропускаем, перейти в начало цикла
КонецЕсли;
Сообщить(СпрСотр.Наименование);

Пример, вывод товаров, принадлежащих к группе Спиртное, независимо от того входят ли они в подгруппы Шампанское, Пиво, Водка, Вино и т.д.:

СпрТовары = СоздатьОбъект(«Справочник.Товары»);
СпрТовары.ВыбратьЭлементы();
Пока СпрТовары.ПолучитьЭлементы()=1 Цикл

Если СпрТовары.ПринадлежитГруппе(грпСпиртное)=1 Тогда
. Сообщить(СпрТовары.Наименование);
КонецЕсли;

Этот атрибут содержит родителя текущего элемента справочника, т.е. группу, в которой находится текущий элемент. Доступен для чтения и записи.

Пример, перенос всех товаров из группы Спиртное в группу Распродажа:

СпрТовары = СоздатьОбъект(«Справочник.Товары»);
СпрТовары.ВыбратьЭлементы();
Пока СпрТовары.ПолучитьЭлементы()=1 Цикл

Если СпрТовары.ПринадлежитГруппе(грпСпиртное)=1 Тогда
. СпрСотр.Родитель = грпРаспродажа;
. СпрСотр.Записать();
КонецЕсли;

А можно сделать красивее и перенести всю группу Спиртное в группу Распродажа, тогда все подгруппы и элементы также перенесутся в группу Распродажа.

СпрТовары = СоздатьОбъект(«Справочник.Товары»);
СпрТовары.НайтиЭлемент(грпСпиртное);
СпрТовары.Родитель = грпРаспродажа;
СпрТовары.Записать();

Возвращает строку, содержащую полный код выбранного элемента справочника со всеми вышестоящими уровнями, разделенными символом «/».

Возвращает строку, содержащую полное наименование выбранного элемента справочника со всеми вышестоящими уровнями, разделенными символом «/».

Возможность выбора группы в реквизите диалога

Часто бывает удобно для реквизитов на форме, имеющих тип Справочник, отключить возможность выбора группы. Тогда в данное поле может быть выбран только элемент и не может быть выбрана группа. В общем, проще один раз попробовать, чем несколько раз объяснять.

Форма.ВыбрСотрудник.ВыборГруппы(0); //отключить возможность выбора группы

Подчиненные справочники

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

Назначение подчиненных справочников

Любой справочник может использоваться как сам по себе, так и быть подчиненным какому-либо другому справочнику. Например, справочник договоров может использоваться отдельно, а может быть связан со справочником организаций.

Чтобы подчинить справочник какому-либо из справочников, уже существующих в системе, в поле «Подчинен» следует выбрать наименование этого справочника. Такой справочник в системе 1С:Предприятие называется владельцем.

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

Внешне работа с подчиненным справочником в системе 1С:Предприятие будет выглядеть следующим образом.

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

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

При работе с системой 1С:Преднриятие для подчиненного справочника может быть отключен показ в виде иерархического списка. В этом случае в окне подчиненного справочника будут отображаться все элементы этого справочника, то есть элементы, починенные разным владельцам, будут показываться вперемешку. Тем не менее, любой элемент подчиненного справочника «знает» своего владельца: если для справочника включен режим «Редактировать в диалоге» (см. ниже п. «Создание форм справочника»), наименование элемента-владельца будет выдаваться в заголовке окна редактирования элемента справочника.

Установка текущего владельца

СпрДоговоры = СоздатьОбъект(«Справочник.Договоры»);
СпрДоговоры.ИспользоватьВладельца(ВыбрКонтрагент);
СпрДоговоры.ВыбратьЭлементы(); //открываем выборку по договорам выбранного контрагента

Информация о текущем элементе

Если справочник подчиненный, то будет полезным применение следующих методов и атрибутов, которые позволяют получить информацию о текущем элементе справочника:

Атрибут
Описание

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

Пример, перенос всех договоров от одного котрагента к другому (справочник Договоры подчинен справочнику Контрагенты):

СпрДоговоры = СоздатьОбъект(«Справочник.Договоры»);
СпрДоговоры.ИспользоватьВладельца(Контрагент1);
СпрДоговоры.ВыбратьЭлементы();
Пока СпрДоговоры.ПолучитьЭлементы()=1 Цикл

СпрДоговоры.Владелец = Контрагент2;
СпрДоговоры.Записать();

Периодические реквизиты

Включение опции «Периодический» позволяет указать для реквизита справочника хранение истории изменений его значения. Такой реквизит в системе 1С:Предприятие называется периодическим и обладает следующим свойством: в отличие от «обычных» (не периодических) реквизитов, система 1С:Предприятие хранит значения такого реквизита по датам их изменения. При обращении к значению такого реквизита на некоторую дату выдается его значение на эту дату, либо, если таковое отсутствует, — на ближайшую предыдущую дату, на которую устанавливалось значение реквизита.

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

К периодическому реквизиту можно обращаться при помощи встроенного языка системы 1С:Предприятие — получать и записывать значение реквизита на указываемую дату. Однако, следует иметь в виду, что при получении значения реквизита на какую-то дату извлекается его значение на указанную или (если значение на указанную дату отсутствует) на ближайшую предыдущую дату, а запись значения периодического реквизита выполняется всегда на указанную дату.

В режиме использования конфигурации для периодического реквизита можно вызвать окно «История». Это окно представляет собой таблицу, состоящую из двух граф: дата изменения значения реквизита справочника и значение на эту дату. Окно «История» позволяет редактировать историю изменений значения реквизита напрямую: вводить новые строки, редактировать или удалять существующие.

Методы периодических реквизитов
//так мы узнаем, какая была у сотрудника категория на определенную дату
Катег = СпрСотр.Категория. Получить (НекаяДата);

//так мы установим сотруднику категорию на определенную дату
СпрСотр.Категория. Установить (НекаяДата, НоваяКатегория);

Внимание! Эти методы можно применять, если ранее не применялся метод ИспользоватьДату

Установка даты выборки периодических реквизитов

//можно установить дату выборки периодических реквизитов для всего справочника
СпрСотр. ИспользоватьДату (НекаяДата);

//тогда ниже уже нельзя использовать методы Установить и Получить
//доступ к периодическим реквизитам становится такой же, как к обычным реквизитам
Катег = СпрСотр.Категория;
СпрСотр.Оклад = 6000;

Объект «Периодический»

Для работы с историей периодического реквизита очень удобно использовать объект «Периодический».

Пример, вывести историю карьеры сотрудника за текущий год:

ИсторияКарьеры = СоздатьОбъект(«Периодический»);
ИсторияКарьеры.ИспользоватьОбъект(«Должность»,ВыбрСотрудник);
ИсторияКарьеры.ВыбратьЗначения(НачГода(РабочаяДата(),КонГода(РабочаяДата()));
Пока ИсторияКарьеры.ПолучитьЗначение()=1 Цикл
. Сообщить(Строка(ИсторияКарьеры.ДатаЗнач) + » » + Строка(ИсторияКарьеры.Значение));
КонецЦикла;

С помощью объекта Периодический можно также редактировать и удалять значения. Полный список методов см. в Синтакс-помощнике.

Проведение документов

При проведении документа часто требуется установить новое значение периодического реквизита на определенную дату. Это называется движение документа. В этом случае следует применять метод УстановитьРеквизитСправочника:

УстановитьРеквизитСправочника(Сотрудник, «Должность», НоваяДолжность, ДатаПеремещения);

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

ВыбратьСтроки();
Пока ПолучитьСтроку()=1 Цикл

ПривязыватьСтроку(НомерСтроки);
УстановитьРеквизитСправочника(Сотрудник, «Должность», НоваяДолжность, ДатаПеремещения);

Подбор из справочника

Функция подбора позволяет выбирать несколько значений из справочника или другого объекта, не закрывая его. Например, есть документ РасходнаяНакладная, в котором пользователь может указать несколько товаров.

Организация подбора

Процедура ОбработкаПодбора(Элемент,КонтФормы)
. НоваяСтрока();
. Товар = Элемент;
КонецПроцедуры

Можно воспользоваться контекстом формы и сразу перейти в нужную группу, например:

Процедура ОбработкаПодбора(Элемент,КонтФормы)
. НоваяСтрока();
. Товар = Элемент;
КонецПроцедуры

Установка и получение значений из подбора

КонтФормыПодбора.УстановитьЗначениеВПодборе(,)

— строка с именем реквизита формы подбора значения;
— значение реквизита.

КонтФормыПодбора.ПолучитьЗначениеИзПодбора()

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

Другие полезные методы

Описание

Возвращает 1 — если элемент справочника выбран, 0 — если не выбран. Часто применяется для проверки на ошибки, чтобы все необходимые данные были указаны.

Чтение структуры справочников

Цикл по справочникам

КолвоСправочниковВКонфигурации = Метаданные.Справочник();
Для Ном=1 to КолвоСправочниковВКонфигурации Цикл

кфгСпр = Метаданные.Справочник(Ном);
Идентификатор = кфгСпр.Идентификатор();
ПолныйИдентификатор = кфгСпр.ПолныйИдентификатор();
Синоним = кфгСпр.Синоним();
Комментарий = кфгСпр.Комментарий();
КоличествоУроней = кфгСпр.КоличествоУроней();
ПодчиненЛи = кфгСпр.Владелец().Выбран();
Владелец = кфгСпр.Владелец();
ИдентификаторВладельца = кфгСпр.Владелец().Идентификатор;
.

т.е. если вызвать метод Метаданные.Справочник() без параметров, то он вернет общее количество справочников в конфигурации. Если передать ему в качестве параметра номер или название справочника, то он вернет справочник как объект конфигурации.

Цикл по реквизитам справочника

КолвоРеквизитов = кфгСпрСотр.Реквизит();
Для Ном=1 to КолвоРеквизитов Цикл

кфгРекв = кфгСпрСотр.Реквизит(Ном);
Идентификатор = кфгРекв.Идентификатор();
ПолныйИдентификатор = кфгРекв.ПолныйИдентификатор();
Синоним = кфгРекв.Синоним();
Комментарий = кфгРекв.Комментарий();
Тип = кфгРекв.Тип(); //»Строка», «Число», «Справочник»
Вид = кфгРекв.Вид(); //напр. «Сотрудники»
Длина = кфгРекв.Длина();
Точность = кфгРекв.Точность();
Периодический = кфгРекв.Периодический();
.

т.е. если вызвать метод Метаданные.Справочник(Х).Реквизит() без параметров, то он вернет общее количество реквизитов справочника Х в конфигурации. Если передать ему в качестве параметра номер или название реквизита, то он вернет реквизит справочника как объект конфигурации.

Обращение к атрибутам по имени

При работе с метаданными часто применяются следующие методы:

Описание

Что можно скачать

Так как работа с метаданными плохо документирована самой фирмой 1С, то рекомендуется скачать следующий файл, который является файлом для Синтакс-помощника. В нем содержится описание работы с некоторыми методами объекта Метаданные.

Распакуйте и поместите als-файл в каталог Program Files\1cv77\BIN и он будет подключен к Синтакс-помощнику.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Luxury Car Rental in Miami | Reserve a Premium Vehicle with RealCar