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