Методы работы со справочниками


Рассмотрим несколько часто используемых функций для работы со справочниками.

  • НайтиПоКоду.

    Синтаксис:

    НайтиПоКоду(Код[, ПоискПоПолномуКоду][, Родитель][, Владелец])

    Здесь: Код — искомый код; ПоискПоПолномуКоду — режим поиска по полному коду (может принимать значение ИСТИНА или ЛОЖЬ, по умолчанию — ЛОЖЬ); Родитель — родитель, в пределах которого нужно выполнить поиск; Владелец — владелец, в пределах которого нужно выполнить поиск.

    Здесь стоит также рассмотреть, что такое родитель и что такое владелец.
    Под родителем понимается старшая ступень в иерархической структуре. Например, если справочник "Товары" разбит на группы "Товары" и "Услуги", а группа "Товары", в свою очередь, разбита на подгруппы "Молочные продукты", "Соки, воды" и "Хлебо-булочные изделия", то для товара "Плюшка Московская с маком" родителем будет группа "Хлебо-булочные изделия", а для этой группы родителем будет группа "Товары".

    Под владельцем понимается старший справочник из двух взаимосвязанных справочников. Например, у справочника "Товары" есть различные единицы измерения — штука, килограмм, упаковка. Но "Единицы измерения" — это тоже справочник, связанный со справочником "Товары" таким образом, что у одной товарной позиции может быть несколько разных единиц измерения. В этом случае справочник "Товары" является владельцем.
    В случае команды НайтиПоКоду(), если не указывать Родителя или Владельца, поиск будет проводиться по всему справочнику.

    Пример:

    Поиск = Справочники.Автомобили.НайтиПоКоду("000000004");
    Если Поиск.Пустая() = ЛОЖЬ Тогда // Пустая() означает, что
    // элемент не найден
    Сообщить(Поиск.Наименование);
    КонецЕсли;

    Ищем код элемента в пределах справочника "Автомобили", если поиск прошел успешно (ссылка результата не пуста), то выдаем наименование найденного элемента. Для примера из рис. 3.19 это "ГАЗ 330232".

  • НайтиПоНаименованию.

    Синтаксис:

    НайтиПоНаименованию(Наименование[, ТочноеСоответствие][, Родитель][, Владелец])

    Здесь: Наименование — искомое наименование (или его часть, в зависимости от следующего параметра); ТочноеСоответствие означает, полностью ли соответствует искомое значение значению параметра Код. Может принимать значение ИСТИНА или ЛОЖЬ. Если ТочноеСоответствие равно ИСТИНА, то параметр Код должен полностью совпадать с искомым кодом (за исключением пробелов в конце), если же ТочноеСоответствие равно ЛОЖЬ, то поиск ведется по части кода, начиная слева. По умолчанию ТочноеСоответствие = ЛОЖЬ. Родитель — родитель, в пределах которого нужно выполнить поиск; Владелец — владелец, в пределах которого нужно выполнить поиск, аналогично с методом НайтиПоКоду().

    Пример:

    Поиск = Справочники.Автомобили.НайтиПоНаименованию("Opel");
    Если Поиск.Пустая() = ЛОЖЬ Тогда
    Сообщить(Поиск.Наименование);
    КонецЕсли;
    Ищем наименование элемента в пределах справочника "Автомобили" по части наименования. Если поиск прошел успешно (ссылка результата не пуста), то выдаем наименование найденного элемента. Для примера из рис. 3.19 это "Opel Vivaro".

    Поиск = Справочники.Автомобили.НайтиПоНаименованию("Opel", Истина);
    Если Поиск.Пустая() = Ложь Тогда
    Сообщить(Поиск.Наименование);
    КонецЕсли;
    Этот пример отличается от предыдущего всего одним параметром. Мы включили поиск по точному соответствию (ТочноеСоответствие = ИСТИНА), поэтому по примеру из рис. 3.19 мы ничего не найдем.

    Пример:
    Поиск = Справочники.Автомобили.НайтиПоНаименованию("Opel Vivaro", Истина);
    Если Поиск.Пустая() = ЛОЖЬ Тогда
    Сообщить(Поиск.Наименование);
    КонецЕсли;
    А здесь при поиске по точному соответствию мы изменили искомое наименование. Наименование одной из записей справочника "Автомобили" соответствует искомому значению, поэтому для примера с рис. 3.19 будет найден "Opel Vivaro".

  • НайтиПоРеквизиту.

    Синтаксис:

    НайтиПоРеквизиту(ИмяРеквизита, ЗначениеРеквизита[, Родитель][, Владелец])

    Здесь: ИмяРеквизита — имя реквизита, по которому будем искать; ЗначениеРеквизита — искомое значение реквизита; Родитель — родитель, в пределах которого нужно выполнить поиск; Владелец — владелец, в пределах которого нужно выполнить поиск, аналогично с методами НайтиПоКоду() и НайтиПоНаименованию().

    Пример:

    СтрокаПоиска = "на техосмотр";
    Поиск = Справочники.Автомобили.НайтиПоРеквизиту("Примечание", СтрокаПоиска);
    Если Поиск.Пустая() = Ложь Тогда
    Сообщить(Поиск.Наименование+" номер: "+Поиск.ГосНомер);
    КонецЕсли;
    В этом примере мы ищем автомобиль, у которого в поле Примечание ввели пометку "на техосмотр", и выводим название автомобиля и его номерной знак. Для примера с рис. 3.19 результат будет "ГАЗ 330232 номер: м774мм77".

  • ВыбратьИерархически. Формирует иерархическую выборку элементов справочника по заданным условиям. При иерархической выборке для каждого элемента сначала выбираются элементы, для которых он является родителем, а потом — элементы следующего уровня.

    Синтаксис:

    ВыбратьИерархически([Родитель][, Владелец][, Отбор][, Порядок])

    Здесь: Родитель — родитель, по которому осуществляется выборка; Владелец — владелец, по которому осуществляется выборка; Отбор задает поле и значение отбора открываемой выборки; Порядок — реквизит, по которому сортируется выборка, и направление выборки (может принимать значение "Возр" и "Убыв", по умолчанию отбор идет по возрастанию). Например, параметр Порядок может иметь значение "Код Убыв", где Код — реквизит документа, по которому будем сортировать, Убыв — сортировка по убыванию.

    Пример:

    Выборка = Справочники.Контрагенты.ВыбратьИерархически();
    Пока Выборка.Следующий() Цикл
    Сообщить(Выборка.Наименование);
    КонецЦикла;
    Этот программный код перебирает все элементы справочника "Контрагенты" и по каждому элементу сообщает его наименование.

    Результат выполнения может выглядеть следующим образом:

    Покупатели
    Астра
    Гаврилов И.С.
    Иванов С.П.
    Макаричева С.Т.
    Петрова И.А.
    ЧП Сергеев
    Поставщики
    Евромебель
    Завод мягких игрушек
    Мебельный комбинат №7
    ООО Баглей
    Ввод начальных остатков

    Жирным шрифтом выделены группы — Поставщики и Покупатели.

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

    Синтаксис:

    Выбрать([Родитель][, Владелец][, Отбор][, Порядок])

    Здесь: Родитель — родитель, по которому осуществляется выборка; Владелец — владелец, по которому осуществляется выборка; Отбор задает поле и значение отбора открываемой выборки; Порядок — реквизит, по которому сортируется выборка, и направление выборки (может принимать значение "Возр" и "Убыв", по умолчанию отбор идет по возрастанию). Например, параметр Порядок может иметь значение "Код Убыв", где Код — реквизит документа, по которому будем сортировать, Убыв — сортировка по убыванию.

    Пример:

    Выборка = Справочники.Контрагенты.Выбрать();
    Пока Выборка.Следующий() Цикл
    Сообщить(Выборка.Наименование);
    КонецЦикла;
    Этот программный код перебирает все элементы справочника "Контрагенты" и по каждому элементу сообщает его наименование.

    Результат выполнения может выглядеть следующим образом:

    Астра
    Ввод начальных остатков
    Гаврилов И.С.
    Евромебель
    Завод мягких игрушек
    Иванов С.П.
    Макаричева С.Т.
    Мебельный комбинат №7
    ООО Баглей
    Петрова И.А.
    Покупатели
    Поставщики
    ЧП Сергеев

    Жирным шрифтом выделены группы — Поставщики и Покупатели.
    В чем разница между последними двумя примерами? При обычной выборке происходит перебор элементов справочника подряд, вне зависимости от того, группа это или элемент справочника. При иерархической выборке сначала отбирается группа (т. е. родитель для всех элементов в нее входящих), затем входящие в нее элементы, потом следующая группа и входящие в нее элементы и т. д.

  • СоздатьГруппу. Создает новую группу справочника.

    Синтаксис:

    СоздатьГруппу()

    Пример:

    НовыйОбъект = Справочники["Контрагенты"].СоздатьГруппу();
    НовыйОбъект.Наименование = "Комиссионеры";
    НовыйОбъект.Записать();

  • СоздатьЭлемент. Создает новый элемент справочника.

    Синтаксис:

    СоздатьЭлемент()

    Пример:
    НовыйОбъект = Справочники["Склады"].СоздатьЭлемент();
    НовыйОбъект.Наименование = "Склад-холодильник";
    НовыйОбъект.ВидСклада = Перечисления.ВидыСкладов.Оптовый;
    НовыйОбъект.ТипЦенРозничнойТорговли = Справочники.ТипыЦенНоменклатуры.НайтиПоНаименованию(СокрЛП("Оптовая"));
    НовыйОбъект.Записать();
    Данный программный код создает новый элемент справочника складов и заполняет реквизиты Наименование, ВидСклада и ТипЦенРозничнойТорговли, после чего записывает новый элемент.

  • Записать. Записывает элемент в базу данных.

    Синтаксис:

    Записать()

    Пример:

    НовыйОбъект = Справочники["Склады"].СоздатьЭлемент();
    НовыйОбъект.Наименование = "Выносная торговля";
    НовыйОбъект.ВидСклада = Перечисления.ВидыСкладов.Розничный;
    НовыйОбъект.ТипЦенРозничнойТорговли =
    Справочники.ТипыЦенНоменклатуры.НайтиПоНаименованию(
    СокрЛП("Розничная"));
    НовыйОбъект.Записать();

  • УстановитьПометкуУдаления. Помечает на удаление элемент справочника.

    Синтаксис:

    УстановитьПометкуУдаления(ПометкаУдаления[, ВключаяПодчиненные])

    Здесь ПометкаУдаления может принимать значения ИСТИНА или Ложь. При значении ИСТИНА элемент будет помечен на удаление, при значении Ложь — пометка на удаление будет снята с элемента. ВключаяПодчиненные — может принимать значения Истина или Ложь. При значении Истина элемент будет помечен на удаление вместе со всеми подчиненными ему элементами, при значении Ложь — помечен на удаление будет только сам элемент. Значение по умолчанию — Истина.

    Пример:

    Спр = Справочники.Номенклатура.НайтиПоКоду("00000000108").ПолучитьОбъект();
    Спр.УстановитьПометкуУдаления(Истина);
    В этом примере мы ищем элемент справочника с заданным кодом, получаем его командой ПолучитьОбъект() и помечаем на удаление. С данным примером связана еще одна важная команда работы со справочниками — ПолучитьОбъект().

  • ПолучитьОбъект. Получает объект по ссылке, после чего полученный объект можно читать, модифицировать и удалять.

    Синтаксис:

    ПолучитьОбъект()

    Пример:

    Спр = Справочники.Номенклатура.НайтиПоКоду("00000000108").ПолучитьОбъект();
    Спр.УстановитьПометкуУдаления(Ложь);
    Этот пример отменяет результат предыдущего примера — ищет элемент справочника номенклатуры с заданным кодом и снимает с него пометку на удаление.

  • ПустаяСсылка. Получает пустое значение ссылки на справочник заданного типа.

    Синтаксис:

    ПустаяСсылка()

    Пример:

    Спр = Справочники.Контрагенты.ПустаяСсылка();
    Теперь давайте внесем последние коррективы в наш справочник.
    Обратите внимание на то, что при работе с формой справочника "Автомобили", вне зависимости от того, есть кузов у автомобиля или нет, значение номерного знака кузова внести все равно можно. Так проектировать форму можно, но неправильно. Гораздо лучше сделать так, чтобы если уж кузова нет, то и никакой информации по нему пользователь внести не смог.

    Для того чтобы сделать это, откройте форму элемента справочника "Автомобили" (для этого открываем дерево конфигурации, ищем в разделе Справочники справочник "Автомобили", открываем его содержимое знаком "+", выбираем в подразделе Формы ранее созданную нами форму элемента и открываем ее двойным щелчком). Если до этого вы все делали, как описывалось в этой главе ранее, то форма элемента должна выглядеть подобно рис. 3.11.

    Теперь выполняем следующие действия:

    1. Щелкнем правой кнопкой мыши по полю ГосНомерКузова и в контекстном меню выберем пункт Свойства. При этом, как и в рассмотренных ранее примерах, в правой части окна откроется окно свойств объекта.

    2. В окне свойств снимем флажок Доступность.

    3. Щелкнем правой кнопкой мыши по флажку НаличиеКузова ("Есть кузов") и в контекстном меню выбираем пункт Свойства. При этом в правой части окна откроется окно свойств выбранного флажка.

    4. В нижней части окна свойств найдите раздел События, в котором есть опция При изменении (рис. 3.20).

     
    Подобных опций-действий у каждого элемента управления на форме может быть много, все зависит от типа элемента формы: ПриИзменении, ПриВыборе, ПриОткрытии, ПриНажатии и т. д. Пройдитесь мышью по элементам управления на форме, выбирая их и просматривая в свойствах, какие бывают действия. Для каждого из таких действий может быть написана программная процедура, которая выполняется, если такое действие над элементом формы будет произведено. Нажали кнопку — выполнилась процедура, щелкнули по флажку — выполнилась процедура. Если, конечно, мы эту процедуру создадим. Сейчас именно это мы сделаем с процедурой ПриИзменении для флажка. Других событий у этого типа элемента управления нет. Поставили флажок, сбросили флажок — это все подпадает под категорию "При изменении".

    5. Щелкните мышью на значке с изображением увеличительного стекла в правой части строки ПриИзменении.

    6. Мы сразу попадем в модуль формы и увидим автоматически созданную процедуру (рис. 3.21).

     
    7. Модуль формы справочника пока еще пуст, других процедур там нет. Да и вновь созданная процедура также пуста, только лишь автоматически созданные начало и конец процедуры с автоматически же заданным именем и комментарий, который показывает, где мы должны создавать тело процедуры.

    8. Изменим код процедуры так, как показано на рис. 3.22.

     
    9. Строка Если НаличиеКузова = Истина Тогда могла быть написана по-другому, вот так: Если НаличиеКузова Тогда, без явного сравнения со значением Истина. Разбирая чужой программный код, вы неоднократно встретите такой стиль написания. По своему действию он абсолютно идентичен сравнению со значением Истина, показанному в примере на рис. 3.22. Если же значение сравнивается со значением Ложь, то программный код Если НаличиеКузова = Ложь Тогда будет идентичен такому программному коду: Если Не НаличиеКузова Тогда. Попробуйте переписать пример, показанный на рис. 3.22, разными способами.

    10. А что делает строка ГосНомерКузова = ""? Она предназначена для того, чтобы очистить номер кузова, если пользователь ввел номер кузова, потом передумал, но стирать не стал, а просто убрал флажок НаличиеКузова. Если бы мы не прописали эту строку, то в поле ГосНомерКузова осталось бы значение, пусть и недоступное к редактированию.
    11. Сохраните конфигурацию и конфигурацию базы данных, перейдите в режим Предприятия и проверьте, как работает форма справочника "Автомобили" теперь. Поле номера кузова теперь доступно для внесения данных, только при наличии кузова.

    ПРИМЕЧАНИЕ
    Подобным же образом работает метод элемента формы Видимость, только в отличие от метода Доступность, при Видимость = Ложь объект становится не недоступным для редактирования, а попросту не виден пользователю.

    ПРИМЕЧАНИЕ
    Обратите внимание на то, что для того чтобы обратиться к элементу на форме, мы используем не просто имя реквизита, а обращаемся к имени через ЭлементыФормы. Элемент формы может содержать в себе тот или иной реквизит справочника, но сам по себе реквизит справочника не может быть недоступен или невидим. А вот элемент формы, в котором реквизит отображается, — может.

    А КАК ПЕРЕБРАТЬ ЭЛЕМЕНТЫ СПРАВОЧНИКА?

    Выборка = Справочники.Номенклатура.ВыбратьИерархически();
    Пока Выборка.Следующий() Цикл
    Сообщить(Выборка.Наименование);
    КонецЦикла;
    А КАК ПЕРЕБРАТЬ СТРОКИ ТАБЛИЧНОЙ ЧАСТИ СПРАВОЧНИКА?

    ЭлементСправочника = Справочники.Контрагенты.НайтиПоКоду("000000009");
    Для Каждого ТекущаяСтрока Из ЭлементСправочника.ВидыДеятельности Цикл
    Сообщить(ТекущаяСтрока.ВидДеятельности);
    КонецЦикла;
    А КАК ПРОГРАММНО СОЗДАТЬ ЭЛЕМЕНТ СПРАВОЧНИКА?

    НовыйЭлемент = Справочники.Валюты.СоздатьЭлемент();
    НовыйЭлемент.Код = 96;
    НовыйЭлемент.Наименование = "MNT";
    НовыйЭлемент.НаименованиеПолное = "Монгольский тугрик";
    НовыйЭлемент.Записать();
    А КАК ПРОГРАММНО ПОМЕТИТЬ НА УДАЛЕНИЕ ЭЛЕМЕНТ СПРАВОЧНИКА?

    ИскомыйЭлемент = Справочники.Валюты.НайтиПоКоду("96");
    Если ИскомыйЭлемент.Пустая() = Ложь Тогда
    УдаляемыйЭлемент = ИскомыйЭлемент.ПолучитьОбъект();
    УдаляемыйЭлемент.УстановитьПометкуУдаления(Истина);
    КонецЕсли;
    А КАК ПРОГРАММНО ОТКРЫТЬ ФОРМУ СПИСКА СПРАВОЧНИКА?

    ФормаСписка = Справочники.Автомобили.ПолучитьФормуСписка();
    ФормаСписка.Открыть();
  • Похожие новости

    Комментариев 0

    Информация
    Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.