Довідник є списком можливих значень того чи іншого реквізиту. Довідники використовуються в тих випадках, коли необхідно виключити неоднозначний введення інформації. Наприклад, для того, щоб покупець, продавець, комірник, директор розуміли, про який товар йде мова, кожен повинен називати його однаково. І в цьому випадку необхідний довідник. Зазвичай в торговому підприємстві він має вигляд прайс-листа, а якщо такий довідник зберігається в комп'ютері, то в нього заносять всю можливу номенклатуру товарів, з якими працює торгова фірма.
Система 1С: Підприємство дозволяє вести практично необмежену кількість необхідних довідників. Кожен довідник являє собою список однорідних об'єктів: співробітників, організацій, товарів і т. Д. Кожен такий об'єкт називається елементом довідника.
З точки зору користувача, слід мати на увазі, що в Конфігураторі створюється не сам довідник, як список значень, а розробляється заготівля довідника, його шаблон. У процесі конфігурації описується структура інформації, яка буде зберігатися в довіднику, розробляється екранне і, якщо необхідно, друковане подання довідника, задаються різні особливості його «поведінки».
В якості обов'язкових реквізитів кожен довідник має Код і Найменування. Код елемента довідника може бути як числовим, так і текстовим. Система 1С: Підприємство надає широкі можливості по роботі з кодами елементів довідника: автоматичне присвоєння кодів, автоматичний контроль унікальності коду і інші.
Крім коду й найменування, в довідниках системи 1С: Підприємство може зберігатися будь-яка додаткова інформація про елемент довідника. Для зберігання такої інформації в довіднику може бути створений список реквізитів. Використовуючи механізм реквізитів довідника, легко організувати, наприклад, картотеку співробітників. Наприклад, довідник Співробітники майже напевно буде мати атрибути Посада. Оклад і інші. Фірма 1С передбачила програмістів і ввела в усі довідники два вже заданих атрибута: Код і Найменування. Дійсно, практично будь-який об'єкт з реального життя містить ці атрибути. Наприклад, для співробітників кодом виступає табельний номер, а найменуванням - прізвище, ім'я, по батькові (ПІБ).
Для кожного атрибута довідника потрібно вказати його тип даних, наприклад, "число", "рядок", "дата" (у версії 8.0 є ще тип Булево - Істина або Брехня). Це базові типи, але можна вказати і складні типи даних. Наприклад атрибут Посада має тип даних Посади. В цьому випадку, значення цього атрибута будуть вибиратися з довідника Посади. Так реалізується найпростіша зв'язок між довідниками, коли значення атрибутів одного довідника вибираються з іншого довідника.
Процедура відкриття ()
. СправочнікСпісок.Отбор.Карточка.Установіть (Рік, 1980);
. // питання читачам: як заборонити користувачеві змінювати умови відбору?
КонецПроцедури
Статичний фільтр (тільки версія 7.7)
В 1С 7.7 можна встановити відбір по періодичному реквізиту або за кількома реквізитами одночасно (складний фільтр). У цьому випадку виходом з ситуації може бути метод ІспользоватьСпісокЕлементов. Цьому методу потрібно передати список елементів, які повинні бути показані. Попередньо цей список потрібно сформувати.
СпісокЕлементов = СоздатьОб'ект ( "СпісокЗначеній");
СпрСотр = СоздатьОб'ект ( "Справочник.Сотрудники");
СпрСотр.ІспользоватьДату (РабочаяДата ());
СпрСотр.ВибратьЕлементи ();
Поки СпрСотр.ПолучітьЕлемент () = 1 Цикл
. Якщо (СпрСотр.Родітель = группаРаботающіе) І (СпрСотр.Должность = длжПлотнік) Тоді
. СпісокЕлементов.ДобавітьЗначеніе (СпрСотр.ТекущійЕлемент ());
. КонецЕсли;
КонецЦікла;
СпрСотр = СоздатьОб'ект ( "Справочник.Сотрудники");
Режим = 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С часто називається "батько".
Програмне створення групи
СпрСотр.НоваяГруппа ();
СпрСотр.Наіменованіе = "Працюючі";
СпрСотр.Запісать ();
СпрСотр.НоваяГруппа ();
СпрСотр.Наіменованіе = "Звільнені";
СпрСотр.Запісать ();
Увага! У Конфігураторі можна задати для реквізиту то, що він дійсний тільки для елемента, тільки для групи або для обох. Наприклад, поле ДатаПріема не має сенсу для групи Працюючі. Тому не варто звертатися до реквізитів елементів, якщо ви працюєте з групою і навпаки.
Установка поточної групи
СпрСотр = СоздатьОб'ект ( "Справочник.Сотрудники");
СпрСотр.ІспользоватьРодітеля (грпРаботающіе); // тепер ми всередині групи Працюючі
СпрСотр.ВибратьЕлементи (); // відкрити вибірку елементів групи Працюючі
СпрСотр = СоздатьОб'ект ( "Справочник.Сотрудники");
СпрСотр.ІспользоватьРодітеля (грпРаботающіе);
СпрСотр.Новий (); // створення нового елемента в групі Працюючі
Інформація про поточний елемент
Якщо довідник багаторівневий, то буде корисним застосування таких методів і атрибутів, які дозволяють отримати інформацію про поточний елемент довідника:
Повертає рядок, що містить повне найменування обраного елемента довідника з усіма вищими рівнями, розділеними символом "/".
Можливість вибору групи в реквізиті діалогу
Часто буває зручно для реквізитів на формі, мають тип Довідник, відключити можливість вибору групи. Тоді в цьому полі може бути обраний лише елемент і не може бути обрана група. Загалом, простіше один раз спробувати, ніж кілька разів пояснювати.
Форма.ВибрСотруднік.ВиборГруппи (0); // відключити можливість вибору групи
Довідник-власник. це також довідник-господар.
Довідник-власник і підлеглий довідник також називаються пов'язаними довідниками.
У термінах реляційних баз даних довідник-власник - це батьківська таблиця, підпорядкованого довідника - це дочірня таблиця.
Призначення підлеглих довідників
Будь-довідник може використовуватися як сам по собі, так і бути підлеглим будь-якому іншому довіднику. Наприклад, довідник договорів може використовуватися окремо, а може бути пов'язаний з довідником організацій.
Щоб підпорядкувати довідник будь-якого з довідників, вже існуючих в системі, в поле «Чи підлеглий» слід вибрати найменування цього довідника. Такий довідник в системі 1С: Підприємство називається власником.
На відміну від багаторівневого довідника, в якому всі елементи мають однакову структуру, використання механізму підлеглих довідників дозволяє зв'язати елементи різної структури. У цьому випадку кожен елемент підпорядкованого довідника буде пов'язаний з одним з елементів довідника-власника.
Зовні робота з підлеглим довідником в системі 1С: Підприємство буде виглядати наступним чином.
Якщо для підлеглого довідника встановлено режим показу у вигляді ієрархічного списку, то перед використанням довідника спочатку повинен бути обраний елемент довідника-власника. При показі на екрані підлеглий довідник буде містити в своєму заголовку найменування елемента-власника, а список елементів підлеглого довідника буде містити тільки елементи, які відносять до елементу-власнику. При зміні елемента-власника інформація у вікні підлеглого довідника буде відповідним чином оновлена.
Якщо відкрити підлеглий довідник, не вибравши елемент-власник, то у вікні підлеглого довідника не буде доступний широкому жодного елемента, а в заголовку вікна буде видано повідомлення «Не заданий елемент-власник».
При роботі з системою 1С: Преднріятіе для підлеглого довідника може бути відключений показ у вигляді ієрархічного списку. В цьому випадку у вікні підлеглого довідника будуть відображатися всі елементи цього довідника, тобто елементи, залатані різним власникам, будуть показуватися упереміш. Проте, будь-який елемент підпорядкованого довідника «знає» свого власника: якщо для довідника включений режим «Редагувати в діалозі» (див. Нижче п. «Створення форм довідника»), найменування елемента-власника буде видаватися в заголовку вікна редагування елементу довідника.
Установка поточного власника
СпрДоговори = СоздатьОб'ект ( "Справочнік.Договори");
СпрДоговори.ІспользоватьВладельца (ВибрКонтрагент);
СпрДоговори.ВибратьЕлементи (); // відкриваємо вибірку за договорами обраного контрагента
<.>
Інформація про поточний елемент
Якщо довідник підлеглий, то буде корисним застосування таких методів і атрибутів, які дозволяють отримати інформацію про поточний елемент довідника: