1С 8.3 Справочники
Данные > Примеры кода 1С > 1С 8.3 Справочники
Справочники в 1С 8.3 это списки схожих по принадлежности к учету данных. Служат для хранения условно-постоянной информации, поддержки внутрифирменных или общих классификаторов, формирования списков возможных значений субконто, то есть для организации аналитического учета.
Каждый из справочников обладает своими свойствами и функциями, установленными разработчиками. Используются практически во всех объектах учета как разрез учета или справочная информация.
Оглавление:
Работа со Справочниками в 1С 8.3 (&НаСервере):
// Создаём новый элемент справочника Страны с наименованием "Россия"
СтранаРоссия = Справочники.Страны.СоздатьЭлемент();
СтранаРоссия.Наименование = "Россия";
СтранаРоссия.Записать();
// Создаём новую группу справочника "Страны у океана"
ГруппаСтраныУОкеана = Справочники.Страны.СоздатьГруппу();
ГруппаСтраныУОкеана.Наименование = "Страны у океана";
ГруппаСтраныУОкеана.Записать();
// Переносим элемент справочника Россия в другую группу "Страны у океана"
СтранаРоссия.Родитель = ГруппаСтраныУОкеана.Ссылка;
СтранаРоссия.Записать();
// Меняем элемент справочника по ссылке "Испания"
ИспанияСсылка = Справочники.Страны.НайтиПоНаименованию("Испания");
Если Не ИспанияСсылка.Пустая() Тогда
// Изменим и запишем численность жителей в стране
СтранаИспания = ИспанияСсылка.ПолучитьОбъект();
СтранаИспания.ЧисленностьНаселения = 46600000;
СтранаИспания.Записать();
КонецЕсли;
// Получаем и проверяем пустую ссылку типа справочник
ПустаяСсылка = Справочники.Страны.ПустаяСсылка();
Если ПустаяСсылка.Пустая() Тогда
Сообщить("Ссылка действительно пустая.");
КонецЕсли;
// Узнаём принадлежность элемента справочника группе (с учетом уровней иерархии)
БеларусьСсылка = Справочники.Страны.НайтиПоНаименованию("Беларусь");
ГруппаСтраныУОкеанаСсылка = Справочники.Страны.НайтиПоНаименованию("Страны у океана");
// Проверяем принадлежит ли город Беларусь группе "Страны у океана"
Если БеларусьСсылка.ПринадлежитЭлементу(ГруппаСтраныУОкеанаСсылка) Тогда// Булево Истина
Сообщить("Элемент Беларусь находится в группе Страны у океана.");
Иначе//Ложь
Сообщить("Элемент Беларусь не находится в группе Страны у океана.");
КонецЕсли;
// Копируем существующий элемент справочника "Беларусь"
КопияБеларуси = БеларусьСсылка.Скопировать();
КопияБеларуси.Наименование = КопияБеларуси.Наименование + " КОПИЯ";
КопияБеларуси.УстановитьНовыйКод();
КопияБеларуси.Записать();
// Выясняем уровень вложенности элемента справочника
Сообщить(КопияБеларуси.Уровень()); // Возвращает уровень = 1
// Блокируем элемент справочника перед изменениями (от изменения другими пользователями или режимами)
СтранаБеларусь = БеларусьСсылка.ПолучитьОбъект();
Если Не СтранаБеларусь.Заблокирован() Тогда
СтранаБеларусь.Заблокировать();
// Меняем заблокированный элемент "Беларусь"
СтранаБеларусь.ЧисленностьНаселения = 10000000;
СтранаБеларусь.Записать();
// Не забываем разблокировать для других режимов и пользователей
СтранаБеларусь.Разблокировать();
КонецЕсли;
// Заполняем новый элемент справочника на основании
// Примечание: в модуле справочника Страны определена процедура ОбработкаЗаполнения
СтранаКазахстан = Справочники.Страны.СоздатьЭлемент();
СтранаКазахстан.Заполнить(Справочники.Страны.НайтиПоНаименованию("Италия"));
СтранаКазахстан.Наименование = "Казахстан";
СтранаКазахстан.Записать();
// Помечаем на удаление элемент справочника "Казахстан"
СтранаКазахстан.УстановитьПометкуУдаления(Истина,Ложь);// пометка удаления
// Примечание: включая подчиненные (если речь о группе справочника)
СтранаРоссия = Справочники.Страны.СоздатьЭлемент();
СтранаРоссия.Наименование = "Россия";
СтранаРоссия.Записать();
// Создаём новую группу справочника "Страны у океана"
ГруппаСтраныУОкеана = Справочники.Страны.СоздатьГруппу();
ГруппаСтраныУОкеана.Наименование = "Страны у океана";
ГруппаСтраныУОкеана.Записать();
// Переносим элемент справочника Россия в другую группу "Страны у океана"
СтранаРоссия.Родитель = ГруппаСтраныУОкеана.Ссылка;
СтранаРоссия.Записать();
// Меняем элемент справочника по ссылке "Испания"
ИспанияСсылка = Справочники.Страны.НайтиПоНаименованию("Испания");
Если Не ИспанияСсылка.Пустая() Тогда
// Изменим и запишем численность жителей в стране
СтранаИспания = ИспанияСсылка.ПолучитьОбъект();
СтранаИспания.ЧисленностьНаселения = 46600000;
СтранаИспания.Записать();
КонецЕсли;
// Получаем и проверяем пустую ссылку типа справочник
ПустаяСсылка = Справочники.Страны.ПустаяСсылка();
Если ПустаяСсылка.Пустая() Тогда
Сообщить("Ссылка действительно пустая.");
КонецЕсли;
// Узнаём принадлежность элемента справочника группе (с учетом уровней иерархии)
БеларусьСсылка = Справочники.Страны.НайтиПоНаименованию("Беларусь");
ГруппаСтраныУОкеанаСсылка = Справочники.Страны.НайтиПоНаименованию("Страны у океана");
// Проверяем принадлежит ли город Беларусь группе "Страны у океана"
Если БеларусьСсылка.ПринадлежитЭлементу(ГруппаСтраныУОкеанаСсылка) Тогда// Булево Истина
Сообщить("Элемент Беларусь находится в группе Страны у океана.");
Иначе//Ложь
Сообщить("Элемент Беларусь не находится в группе Страны у океана.");
КонецЕсли;
// Копируем существующий элемент справочника "Беларусь"
КопияБеларуси = БеларусьСсылка.Скопировать();
КопияБеларуси.Наименование = КопияБеларуси.Наименование + " КОПИЯ";
КопияБеларуси.УстановитьНовыйКод();
КопияБеларуси.Записать();
// Выясняем уровень вложенности элемента справочника
Сообщить(КопияБеларуси.Уровень()); // Возвращает уровень = 1
// Блокируем элемент справочника перед изменениями (от изменения другими пользователями или режимами)
СтранаБеларусь = БеларусьСсылка.ПолучитьОбъект();
Если Не СтранаБеларусь.Заблокирован() Тогда
СтранаБеларусь.Заблокировать();
// Меняем заблокированный элемент "Беларусь"
СтранаБеларусь.ЧисленностьНаселения = 10000000;
СтранаБеларусь.Записать();
// Не забываем разблокировать для других режимов и пользователей
СтранаБеларусь.Разблокировать();
КонецЕсли;
// Заполняем новый элемент справочника на основании
// Примечание: в модуле справочника Страны определена процедура ОбработкаЗаполнения
СтранаКазахстан = Справочники.Страны.СоздатьЭлемент();
СтранаКазахстан.Заполнить(Справочники.Страны.НайтиПоНаименованию("Италия"));
СтранаКазахстан.Наименование = "Казахстан";
СтранаКазахстан.Записать();
// Помечаем на удаление элемент справочника "Казахстан"
СтранаКазахстан.УстановитьПометкуУдаления(Истина,Ложь);// пометка удаления
// Примечание: включая подчиненные (если речь о группе справочника)
Перебор всех элементов справочника в 1С 8.3 (&НаСервере):
&НаСервере
Процедура ПереборВсехЭлементовСправочникаНаСервере() // Запросом
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Наименование
|ИЗ
| Справочник.Страны КАК Страны
|ГДЕ
| ЭтоГруппа = ЛОЖЬ
|УПОРЯДОЧИТЬ ПО
| Наименование";
РезультатЗапроса = Запрос.Выполнить();
ВыборкаСтран = РезультатЗапроса.Выбрать();
Пока ВыборкаСтран.Следующий() Цикл
Сообщить(ВыборкаСтран.Наименование);
КонецЦикла;
КонецПроцедуры
Процедура ПереборВсехЭлементовСправочникаНаСервере() // Запросом
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Наименование
|ИЗ
| Справочник.Страны КАК Страны
|ГДЕ
| ЭтоГруппа = ЛОЖЬ
|УПОРЯДОЧИТЬ ПО
| Наименование";
РезультатЗапроса = Запрос.Выполнить();
ВыборкаСтран = РезультатЗапроса.Выбрать();
Пока ВыборкаСтран.Следующий() Цикл
Сообщить(ВыборкаСтран.Наименование);
КонецЦикла;
КонецПроцедуры
&НаСервере
Процедура ПереборВсехЭлементовСправочникаЦикломНаСервере() // Перебор циклом
СпрСтраны = Справочники.Страны.Выбрать();
// вместо метода Выбрать() можно использовать метод ВыбратьИерархически() - тогда сначала в выборке будет показан элемент,
// затем все подчиненные ему элементы и только потом следующий элемент
Пока СпрСтраны.Следующий() Цикл
//Если Не СпрСтраны.Ссылка.Пустая() Тогда //=> доп.проверка ссылки на пустоту
//Если СпрСтраны.ЭтоГруппа = Ложь Тогда //=> проверка на элемент
//Если СпрСтраны.ПометкаУдаления = Ложь Тогда //=> проверка, что не помечен
//Если СокрЛП(СпрСтраны.Наименование) = СокрЛП("Беларусь") Тогда //=> проверка на нужное нам наименование
ЭлементСсылка = СпрСтраны.Ссылка;
ЭлементИмя = СпрСтраны.Наименование;
ЭлементОбъект = СпрСтраны.ПолучитьОбъект(); // Если нужно менять реквизиты, то используется объект!
// Пример:
// ЭлементОбъект.Регион = Перечисления.Регион.ВосточнаяЕвропа;
// ЭлементОбъект.Записать();
// Сообщить("Записан регион "+Перечисления.Регион.ВосточнаяЕвропа);
КонецЦикла;
КонецПроцедуры
Процедура ПереборВсехЭлементовСправочникаЦикломНаСервере() // Перебор циклом
СпрСтраны = Справочники.Страны.Выбрать();
// вместо метода Выбрать() можно использовать метод ВыбратьИерархически() - тогда сначала в выборке будет показан элемент,
// затем все подчиненные ему элементы и только потом следующий элемент
Пока СпрСтраны.Следующий() Цикл
//Если Не СпрСтраны.Ссылка.Пустая() Тогда //=> доп.проверка ссылки на пустоту
//Если СпрСтраны.ЭтоГруппа = Ложь Тогда //=> проверка на элемент
//Если СпрСтраны.ПометкаУдаления = Ложь Тогда //=> проверка, что не помечен
//Если СокрЛП(СпрСтраны.Наименование) = СокрЛП("Беларусь") Тогда //=> проверка на нужное нам наименование
ЭлементСсылка = СпрСтраны.Ссылка;
ЭлементИмя = СпрСтраны.Наименование;
ЭлементОбъект = СпрСтраны.ПолучитьОбъект(); // Если нужно менять реквизиты, то используется объект!
// Пример:
// ЭлементОбъект.Регион = Перечисления.Регион.ВосточнаяЕвропа;
// ЭлементОбъект.Записать();
// Сообщить("Записан регион "+Перечисления.Регион.ВосточнаяЕвропа);
КонецЦикла;
КонецПроцедуры
Перебор всех групп справочника в 1С 8.3 (&НаСервере):
&НаСервере
Процедура ПереборВсехГруппСправочникаНаСервере()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Наименование
|ИЗ
| Справочник.Страны КАК Страны
|ГДЕ
| ЭтоГруппа = ИСТИНА
|УПОРЯДОЧИТЬ ПО
| Наименование";
РезультатЗапроса = Запрос.Выполнить();
ВыборкаСтран = РезультатЗапроса.Выбрать();
Пока ВыборкаСтран.Следующий() Цикл
Сообщить(ВыборкаСтран.Наименование);
КонецЦикла;
КонецПроцедуры
Процедура ПереборВсехГруппСправочникаНаСервере()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Наименование
|ИЗ
| Справочник.Страны КАК Страны
|ГДЕ
| ЭтоГруппа = ИСТИНА
|УПОРЯДОЧИТЬ ПО
| Наименование";
РезультатЗапроса = Запрос.Выполнить();
ВыборкаСтран = РезультатЗапроса.Выбрать();
Пока ВыборкаСтран.Следующий() Цикл
Сообщить(ВыборкаСтран.Наименование);
КонецЦикла;
КонецПроцедуры
Перебор всех групп вместе с элементами справочника (иерархически) в 1С 8.3 (&НаСервере):
&НаСервере
Процедура ПереборВсехГруппВместеСЭлементамиСправочника()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Наименование
|ИЗ
| Справочник.Страны КАК Страны
|УПОРЯДОЧИТЬ ПО
| Наименование Иерархия";
РезультатЗапроса = Запрос.Выполнить();
ВыборкаСтран = РезультатЗапроса.Выбрать();
Пока ВыборкаСтран.Следующий() Цикл
Отступ = "";
Для Шаг = 0 По ВыборкаСтран.Уровень() Цикл
Отступ = Отступ + " ";
КонецЦикла;
Сообщить(Отступ + ВыборкаСтран.Наименование);
КонецЦикла;
КонецПроцедуры
Процедура ПереборВсехГруппВместеСЭлементамиСправочника()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Наименование
|ИЗ
| Справочник.Страны КАК Страны
|УПОРЯДОЧИТЬ ПО
| Наименование Иерархия";
РезультатЗапроса = Запрос.Выполнить();
ВыборкаСтран = РезультатЗапроса.Выбрать();
Пока ВыборкаСтран.Следующий() Цикл
Отступ = "";
Для Шаг = 0 По ВыборкаСтран.Уровень() Цикл
Отступ = Отступ + " ";
КонецЦикла;
Сообщить(Отступ + ВыборкаСтран.Наименование);
КонецЦикла;
КонецПроцедуры
Отбор элементов справочника по родителю (перечислим все элементы группы) в 1С 8.3 (&НаСервере):
&НаСервере
Процедура ОтборЭлементовСправочникаПоРодителюНаСервере()
// Найдём группу "Европа" по её имени
СсылкаНаРодителя = Справочники.Страны.НайтиПоНаименованию("Европа");
// Перечислим только те элементы справочника, что входят в группу "Европа"
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Наименование
|ИЗ
| Справочник.Страны КАК Страны
|ГДЕ
| Страны.Родитель = &Родитель";
Запрос.УстановитьПараметр("Родитель", СсылкаНаРодителя);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаСтран = РезультатЗапроса.Выбрать();
Пока ВыборкаСтран.Следующий() Цикл
Сообщить(ВыборкаСтран.Наименование);
КонецЦикла;
КонецПроцедуры
Процедура ОтборЭлементовСправочникаПоРодителюНаСервере()
// Найдём группу "Европа" по её имени
СсылкаНаРодителя = Справочники.Страны.НайтиПоНаименованию("Европа");
// Перечислим только те элементы справочника, что входят в группу "Европа"
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Наименование
|ИЗ
| Справочник.Страны КАК Страны
|ГДЕ
| Страны.Родитель = &Родитель";
Запрос.УстановитьПараметр("Родитель", СсылкаНаРодителя);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаСтран = РезультатЗапроса.Выбрать();
Пока ВыборкаСтран.Следующий() Цикл
Сообщить(ВыборкаСтран.Наименование);
КонецЦикла;
КонецПроцедуры
Отбор элементов справочника по владельцу (перечислим все города контрагента) в 1С 8.3 (&НаСервере):
&НаСервере
Процедура ОтборЭлементовСправочникаПоВладельцуНаСервере()
// Найдём страну по коду 1 (это Беларусь, у неё 35 городов)
СсылкаНаСтрану = Справочники.Страны.НайтиПоКоду("000000001");
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Наименование
|ИЗ
| Справочник.Города КАК Города
|ГДЕ
| Города.Владелец = &Владелец";
Запрос.УстановитьПараметр("Владелец", СсылкаНаСтрану);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаГородов = РезультатЗапроса.Выбрать();
Пока ВыборкаГородов.Следующий() Цикл// будет перечислен каждыый из 35 городов Беларуси
Сообщить(ВыборкаГородов.Наименование);
КонецЦикла;
КонецПроцедуры
Процедура ОтборЭлементовСправочникаПоВладельцуНаСервере()
// Найдём страну по коду 1 (это Беларусь, у неё 35 городов)
СсылкаНаСтрану = Справочники.Страны.НайтиПоКоду("000000001");
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Наименование
|ИЗ
| Справочник.Города КАК Города
|ГДЕ
| Города.Владелец = &Владелец";
Запрос.УстановитьПараметр("Владелец", СсылкаНаСтрану);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаГородов = РезультатЗапроса.Выбрать();
Пока ВыборкаГородов.Следующий() Цикл// будет перечислен каждыый из 35 городов Беларуси
Сообщить(ВыборкаГородов.Наименование);
КонецЦикла;
КонецПроцедуры
Отбор элементов справочника по коду, наименованию, и другим реквизитам в 1С 8.3 (&НаСервере):
&НаСервере
Процедура ОтборЭлементовСправочникаПоРеквизитамНаСервере()
// Отбор элементов справочника Городов у которых реквизит Область = "Минская" и Район = "Столбцовский"
// При отборе можно также использовать Код, Наименование или любой другой реквизит справочника
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Наименование,
| Область,
| Район
|ИЗ
| Справочник.Города КАК Города
|ГДЕ
| Города.ЭтоГруппа = ЛОЖЬ И
| Города.Область = &Область И
| Города.Район = &Район";
Запрос.УстановитьПараметр("Область", Перечисления.Область.Минская);
Запрос.УстановитьПараметр("Район",Справочники.Районы.НайтиПоНаименованию("Столбцовский"));
РезультатЗапроса = Запрос.Выполнить();
ВыборкаГородов = РезультатЗапроса.Выбрать();
Пока ВыборкаГородов.Следующий() Цикл
Сообщить(ВыборкаГородов.Наименование + " (" +ВыборкаГородов.Область + "," +ВыборкаГородов.Район + ")");
КонецЦикла;
КонецПроцедуры
Процедура ОтборЭлементовСправочникаПоРеквизитамНаСервере()
// Отбор элементов справочника Городов у которых реквизит Область = "Минская" и Район = "Столбцовский"
// При отборе можно также использовать Код, Наименование или любой другой реквизит справочника
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Наименование,
| Область,
| Район
|ИЗ
| Справочник.Города КАК Города
|ГДЕ
| Города.ЭтоГруппа = ЛОЖЬ И
| Города.Область = &Область И
| Города.Район = &Район";
Запрос.УстановитьПараметр("Область", Перечисления.Область.Минская);
Запрос.УстановитьПараметр("Район",Справочники.Районы.НайтиПоНаименованию("Столбцовский"));
РезультатЗапроса = Запрос.Выполнить();
ВыборкаГородов = РезультатЗапроса.Выбрать();
Пока ВыборкаГородов.Следующий() Цикл
Сообщить(ВыборкаГородов.Наименование + " (" +ВыборкаГородов.Область + "," +ВыборкаГородов.Район + ")");
КонецЦикла;
КонецПроцедуры
💡 Шаблоны (готовые модели) кода 1С 8.3 с тегом #Справочники:
📰 Актуальные новости с тегом #Справочники:
- В версии 8.3.27 увеличено количество записей в табличных частях. В более ранних версиях можно было хранить до 99 999 записей. В ОбъектМетаданныхТабличнаяЧасть добавлено новое свойство – ДлинаНомераСтроки. Свойство может принимать целочисленное значение в диапазоне от 5 до 9 включительно, что позволяет хранить в табличной части до 999 999 999 записей.
- В версии 8.3.26 в менеджер объектов добавлен метод ВыбратьПоСсылкам.
0
комментарии
____________________
Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник