Справочники в 1С — это объекты конфигурации, предназначенные для хранения данных, имеющих одинаковую структуру и носящие списочный характер. Например, в справочниках может храниться: перечень номенклатуры, контрагентов, сотрудников, банковских счетов и т.д. В статье рассматриваются базовые принципы работы с этим объектом метаданных.
Изменение элементов справочника
Удаление элементов справочника
Выбор элементов справочника запросом
Создание элемента справочника
Создание новых элементов и групп справочника производится с помощью программного объекта СправочникМенеджер.<Имя справочника>. Данный объект доступен только на сервере.
Создание нового элемента или группы справочника состоит из следующих этапов:
- Создание элемента или группы;
- Заполнение владельца (если справочник подчиненный);
- Заполнение родителя (если справочник иерархический);
- Заполнение наименования и реквизитов (если не задана автоматическая нумерация, то и кода);
- Заполнение табличных частей;
- Запись элемента.
Создание новой группы:
НоваяГруппа = Справочники.Контрагенты.СоздатьГруппу(); // Создание группы НоваяГруппа.Наименование = "Покупатели"; // Заполнение наименования НоваяГруппа.Записать(); // Запись группы
Создание нового элемента:
НовыйЭлемент = Справочники.Контрагенты.СоздатьЭлемент(); // Создание элемента НовыйЭлемент.Родитель = Справочники.Контрагенты.НайтиПоНаименованию("Покупатели"); // Заполнение родителя НовыйЭлемент.Наименование = "Ромашка ООО"; // Заполнение наименования НовыйЭлемент.ИНН = "123456789"; // Заполнение реквизита // Добавление новой строки табличной части НоваяСтрока = НовыйЭлемент.КонтактнаяИнформация.Добавить(); НоваяСтрока.Тип = "Адрес"; НоваяСтрока.Представление = "Москва"; НовыйЭлемент.Записать(); // Запись элемента
Поиск элементов справочника
Для поиска элементов справочников в языке программирования 1С предусмотрено несколько методов:
- НайтиПоКоду(<Код>, <ПоискПоПолномуКоду>, <Родитель>, <Владелец>)
- НайтиПоНаименованию(<Наименование>, <ТочноеСоответствие>, <Родитель>, <Владелец>)
- НайтиПоРеквизиту(<ИмяРеквизита>, <ЗначениеРеквизита>, <Родитель>, <Владелец>)
Во всех методах если поиск успешный, то будет возвращена ссылка на найденный элемент.
НайденныйКонтрагент = Справочники.Контрагенты.НайтиПоКоду("123"); // Поиск контрагента с кодом "123" НайденныйДоговор = Справочники.ДоговорыКонтрагентов.НайтиПоКоду("1", , , НайденныйКонтрагент); // Поиск подчиненного найденному контрагенту договора с номером "1" НайденныйКонтрагент = Справочники.Контрагенты.НайтиПоНаименованию("Покупатели"); // Поиск элемента с наименованием "Покупатели" НайденныйКонтрагент1 = Справочники.Контрагенты.НайтиПоНаименованию("Ромашка ООО", , НайденныйКонтрагент); // Поиск элемента с наименованием "Ромашка ООО" в группе "Покупатели" НайденныйКонтрагент = Справочники.Контрагенты.НайтиПоРеквизиту("ИНН", "123456789"); // Поиск контрагента с ИНН "123456789"
Изменение элементов справочника
Для изменения реквизитов справочника необходимо выполнить следующие действия:
- Получить объект элемента справочника (метод ПолучитьОбъект(), возвращает тип СправочникОбъект.<Имя справочника>);
- Присвоить новые значения реквизитам объекта;
- Записать объект элемента справочника.
Программное изменение справочника возможно только на стороне сервера.
Например, на форму обработки выведен реквизит Номенклатура типа СправочникСсылка.Номенклатура. Вот пример кода, изменяющего наименование выбранной пользователем номенклатуры:
НоменклатураОбъект = Номенклатура.ПолучитьОбъект();
НоменклатураОбъект.Наименование = "Новое наименование";
НоменклатураОбъект.Записать();
Удаление элементов справочника
Элементы справочника могут быть помечены на удаление и удалены из базы непосредственно.
Непосредственное удаление – операция необратимая, в то время как пометку на удаление можно отменить. Пометка на удаление хранится в предопределенном реквизите ПометкаУдаления. В пользовательском режиме помеченные на удаление элементы и группы справочника помечаются красным крестиком.
Пометку на удаление можно установить/снять двумя разными способами:
// Способ 1. Использование метода УстановитьПометкуУдаления() НайденныйКонтрагент = Справочники.Контрагенты.НайтиПоКоду("123"); КонтрагентОбъект = НайденныйКонтрагент.ПолучитьОбъект(); КонтрагентОбъект.УстановитьПометкуУдаления(Истина); // Способ 2. Изменение свойства ПометкаУдаления НайденныйКонтрагент = Справочники.Контрагенты.НайтиПоКоду("123"); КонтрагентОбъект = НайденныйКонтрагент.ПолучитьОбъект(); КонтрагентОбъект.ПометкаУдаления = Истина; КонтрагентОбъект.Записать();
Пример непосредственного удаления элемента справочника:
НайденныйКонтрагент = Справочники.Контрагенты.НайтиПоКоду("123"); КонтрагентОбъект = НайденныйКонтрагент.ПолучитьОбъект(); КонтрагентОбъект.Удалить();
Обход элементов справочника
Для обхода элементов справочника в языке программирования 1С предусмотрено два метода:
- Выбрать(<Родитель>, <Владелец>, <Отбор>, <Порядок>)
- ВыбратьИерархически(<Родитель>, <Владелец>, <Отбор>, <Порядок>)
Методы отличаются порядком следования отобранных элементов: при иерархической выборке для каждого элемента сначала выбираются элементы, для которых он является родителем, а затем уже выбираются элементы следующего уровня.
Рассмотрим примеры обхода элементов справочника:
// Обход всех элементов справочника Контрагенты Выборка = Справочники.Контрагенты.Выбрать(); // Получение выборки всех элементов справочника Пока Выборка.Следующий() Цикл //действия с очередным элементом Сообщить(Выборка.Наименование); КонецЦикла; // Обход контрагентов из группы "Покупатели" ГруппаПокупатели = Справочники.Контрагенты.НайтиПоНаименованию("Покупатели"); Выборка = Справочники.Контрагенты.Выбрать(ГруппаПокупатели); Пока Выборка.Следующий() Цикл Сообщить(Выборка.Наименование); КонецЦикла; // Обход договоров контрагента "Ромашка ООО" НайденныйКонтрагент = Справочники.Контрагенты.НайтиПоНаименованию("Ромашка ООО"); Выборка = Справочники.ДоговорыКонтрагентов.Выбрать(, НайденныйКонтрагент); Пока Выборка.Следующий() Цикл Сообщить(Выборка.Наименование); КонецЦикла; // Обход контрагентов с пустым ИНН // Реквизит ИНН должен быть проиндексирован! Отбор = Новый Структура("ИНН", ""); // Структура может содержать только один элемент Выборка = Справочники.Контрагенты.Выбрать(, , Отбор); Пока Выборка.Следующий() Цикл Сообщить(Выборка.Наименование); КонецЦикла;
Выбор элементов справочника запросом
Поиск данных в базе 1С предпочтительнее выполнять при помощи запросов. Запрос позволяет описать практически любые условия для отбора, в отличие от методов Выбрать() и ВыбратьИерархически(), на которые накладываются существенные ограничения. К тому же, в большинстве случаев работа с использованием запросов быстрее, чем работа с использованием программного кода.
Простой пример поиска и вывода товаров со стоимостью больше 1000:
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Товары.Наименование |ИЗ | Справочник.Товары КАК Товары |ГДЕ | Товары.Стоимость > 1000"; Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл Сообщить(Выборка.Наименование); КонецЦикла;
Открытие форм справочника
Для открытия любых форм справочников рекомендуется использовать метод
ОткрытьФорму(<ИмяФормы>, <Параметры>, <Владелец>, <Уникальность>, <Окно>, <НавигационнаяСсылка>, <ОписаниеОповещенияОЗакрытии>, <РежимОткрытияОкна>)
Для открытия формы элемента или группы справочника также возможно использовать более простой метод
ПоказатьЗначение(<ОписаниеОповещенияОЗавершении>, <Значение>)
Кроме методов ОткрытьФорму() и ПоказатьЗначение() есть и другие (ОткрытьФормуМодально, ОткрытьЗначение, ПолучитьФорму), но их использование не рекомендуется, т.к. часть этих методов использует режим модального открытия, часть противоречит свежим рекомендациям фирмы 1С.
Приведем примеры программного открытия форм справочника:
// Открыть форму списка ОткрытьФорму("Справочник.Контрагенты.ФормаСписка"); // Открыть форму элемента // Контрагент – реквизит формы, заполняемый пользователем интерактивно ПоказатьЗначение(, Контрагент); // Еще один способ открытия формы элемента ПараметрыОткрытия = Новый Структура("Ключ", Контрагент); ОткрытьФорму("Справочник.Контрагенты.Форма.ФормаЭлемента", ПараметрыОткрытия); // Открыть форму группы // ГруппаКонтрагентов– реквизит формы, заполняемый пользователем интерактивно ПоказатьЗначение(, ГруппаКонтрагентов); // Еще один способ открытия формы группы ПараметрыОткрытия = Новый Структура("Ключ", ГруппаКонтрагентов); ОткрытьФорму("Справочник.Контрагенты.Форма.ФормаГруппы", ПараметрыОткрытия);
Внимание!
Следует понимать, что интерактивная работа (в том числе открытие форм) в 1С возможна только на стороне клиента. В то же время поиск и изменение данных возможны только на стороне сервера.
Остались вопросы?
Спросите в комментариях к статье.
Смотри также:
Как узнать кто и когда изменял объект 1С
Получение числа прописью
Программная работа с массивом
Осталось понять, как программно поменять содержимое справочника.
Добавил в статью новый раздел «Изменение элементов справочника». Спасибо за обратную связь.