Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
1С_Лекция №2.doc
Скачиваний:
9
Добавлен:
01.03.2025
Размер:
280.06 Кб
Скачать

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

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

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

События

Описание

ПриОткрытии()

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

ПриЗакрытии()

Вызывается при закрытии формы элемента справочника.

ПриЗаписи()

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

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

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

ВводНового()

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

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

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

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

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

7.7

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

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

 

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

7.7

СпрСотр = СоздатьОбъект("Справочник.Сотрудники"); СпрСотр.НоваяГруппа(); СпрСотр.Наименование = "Работающие"; СпрСотр.Записать(); СпрСотр.НоваяГруппа(); СпрСотр.Наименование = "Уволенные"; СпрСотр.Записать();

 

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

Транзакции

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

7.7

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

Для Ном = 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С часто называется "родитель".

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]