1с получить реквизит справочника номенклатура

Получить реквизит элемента справочника по ссылке

Я
   neetro

28.05.14 — 18:09

Тестовая конфигурация с нуля. Справочник «Номенклатура» содержит реквизит Цена (Число 15,2). Есть документ «Ввод остатков». В табличной части все банально, Номенклатура, Цена, Количество, Сумма. Пытаюсь в табличную часть документа подставить цену из реквизита Цена, не могу добраться до нее. В модуле формы документа использую событие ОбработкаВыбора(). Вот код

&НаКлиенте

Процедура ТоварыНоменклатураОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)

    ТекущиеДанныеТовары = Элементы.Товары.ТекущиеДанные;

    ТекущиеДанныеТовары.Цена = ВыбранноеЗначение.Цена;

КонецПроцедуры

ВыбранноеЗначение.Цена = недопустимый реквизит, хотя ВыбранноеЗначение Тип СправочникСсылк.Номенклатура и значение есть в «Вычислить выражение»

  

Партнерская программа EFSOL Oblako

   х86

1 — 28.05.14 — 18:15

получай цену на сервере

   Жан Пердежон

2 — 28.05.14 — 18:21

чтобы получить цену надо слазить в базу, а базы на клиенте нет

   Господин ПЖ

3 — 28.05.14 — 18:22

клиент про реквизиты реквизитов не в курсе…

   neetro

4 — 28.05.14 — 18:23

(2) не дает создать обработчик на сервере (только без контекста)

Сделал так

&НаКлиенте

Процедура ТоварыНоменклатураОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)

    ТекущиеДанныеТовары = Элементы.Товары.ТекущиеДанные;

    ТекущиеДанныеТовары.Цена = ТоварыНоменклатураОбработкаВыбораНаСервере(ВыбранноеЗначение);

КонецПроцедуры

&НаСервереБезКонтекста

Функция ТоварыНоменклатураОбработкаВыбораНаСервере(ВыбранноеЗначение)

    Возврат ВыбранноеЗначение.Цена;

КонецФункции

Заработало ))

Спасибо!

   neetro

5 — 28.05.14 — 18:23

(3),(4) я уловил уже. Спасибо!

   neetro

6 — 28.05.14 — 18:24

Или есть способ оптимальнеекрасивее? В одну процедуруфункцию?

   Господин ПЖ

7 — 28.05.14 — 18:27

>ВыбранноеЗначение.Цена;

весь объект то читать зачем?

   neetro

8 — 28.05.14 — 18:29

(7) Какой? Цена? Цена это реквизит числовой

   Господин ПЖ

9 — 28.05.14 — 18:30

(8) и ради одной цифры ты еретично читаешь весь объект…

   neetro

10 — 28.05.14 — 18:32

(9) а как мне еще цифру получить как не через ссылку на объект?

   Господин ПЖ

11 — 28.05.14 — 18:33

богоподобным запросом

   Господин ПЖ

12 — 28.05.14 — 18:33

тфу, богоугодным

   neetro

13 — 28.05.14 — 18:34

Запрос для того чтобы прочитать одну цифру оптимальнее?! О_о

   kosts

14 — 28.05.14 — 18:37

(13) Как думаешь, что делает система, когда просишь её получить цену в ВыбранноеЗначение.Цена?

   Ndochp

15 — 28.05.14 — 18:38

(12) А вот правда, чем лучше. Запрос (внутри) создастся и так и так, отбор будет одинаковый, на равенство ссылке.

На клиент уйдет все равно только одна цифра. Дельта получается на объем передачи лишних реквизитов между СУБД и сервером. Там должны быть такие копейки, что меньше ошибки измерения.

   fisher

16 — 28.05.14 — 18:38

(13) В общем случае — да. При обращении через точку идет тот же самый запрос, только на все поля объекта, а не на одно. Зато выполняется кэширование объекта. При повторном обращении через точку к этому же объекту запроса уже не будет.

   neetro

17 — 28.05.14 — 18:38

(14) наверное не В а ИЗ ВыбранноеЗначение.Цена

Хочешь сказать запрос и делает? Только по всему объекту?

   Господин ПЖ

18 — 28.05.14 — 18:39

>Как думаешь, что делает система

она убьет очередного котенка

   AAlexandra

19 — 28.05.14 — 18:40

(0) Посмотри, как в типовых обрабатывается изменение цены/количества/товара в ТЧ документа. Со всякими кэшированиями, чтобы по каждому чиху в базу не лазить, как в (4).

   neetro

20 — 28.05.14 — 18:40

(16) ок, я примерно понял

   fisher

21 — 28.05.14 — 18:40

(15) Далеко не всегда копейки. Объект может быть «тяжелым» — с большими табличными частями и хранилищами значений. А тянуться он будет весь, хотя нужен только один реквизит.

   Господин ПЖ

22 — 28.05.14 — 18:41

>При повторном обращении через точку к этому же объекту запроса уже не будет

скуль тоже данные кэшировать умеет

   neetro

23 — 28.05.14 — 18:42

(19) нету типовой у меня…. Тем более подозреваю там цены вообще по нормальному — регистр сведений

   neetro

24 — 28.05.14 — 18:43

Попробую переделать на запрос. Спасибо всем за направление вектора моих мыслей в правильную сторону ))

   Ndochp

25 — 28.05.14 — 18:43

(16) О, точно. Правильно запросом, потому, что кэширование жрет ресурсов. Главное ведь проверял же недавно. (правда в толстом клиенте, и получение всего объекта. Идет в 5-10 раз быстрее, чем чтение одного поля через точку)

   neetro

26 — 28.05.14 — 18:46

(25) так получается же кеширование жрет ресурсы а кешируется после Запроса?

   Ndochp

27 — 28.05.14 — 18:49

(26) результат запроса в кеш не складывается, просто кладется в память. А получение реквизита ссылки через точку приводит к помещению данных объекта в хитросделанный кеш.

   neetro

28 — 28.05.14 — 18:51

Ок

   AAlexandra

29 — 28.05.14 — 18:52

(23) ну.. типовую найти при желании — не проблема, было бы это желание.

А вопрос в подходе. В типовой данные из ТЧ кэшируются в переменную, при изменении, например, количества, кратность упаковки берется не из объекта через точку, а из таблицы кэшированных значений. И только если там нет — лезем на сервер.

Ну а так — дело ваше, конечно..

   fisher

30 — 28.05.14 — 18:55

Ну, непосредственно по сабжевому моменту (выбор новой номенклатуры из списка), механизм кэширования значений в типовых ничем не поможет. И к этому механизму, если честно, у меня серьезные претензии. Какого хрена весь клиентский кэш постоянно гоняется на сервер??

   fisher

31 — 28.05.14 — 18:56

По сабжу можно хитрее извратиться, через альтернативную форму выбора. Цену получать еще в динамическом списке формы, и возвращать её в документ при выборе вместе с номенклатурой.

   neetro

32 — 28.05.14 — 18:59

Переделал

&НаКлиенте

Процедура ТоварыНоменклатураОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)

    ТекущиеДанныеТовары = Элементы.Товары.ТекущиеДанные;

    ТекущиеДанныеТовары.Цена = ТоварыНоменклатураОбработкаВыбораНаСервере(ВыбранноеЗначение);

КонецПроцедуры

&НаСервереБезКонтекста

Функция ТоварыНоменклатураОбработкаВыбораНаСервере(ВыбранноеЗначение)  

    
    Запрос = Новый Запрос;

    Запрос.Текст =

        «ВЫБРАТЬ

        |    Номенклатура.Цена

        |ИЗ

        |    Справочник.Номенклатура КАК Номенклатура

        |ГДЕ

        |    Номенклатура.Ссылка = &Ссылка»;

    Запрос.УстановитьПараметр(«Ссылка», ВыбранноеЗначение);

    РезультатЗапроса = Запрос.Выполнить();

    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

    ВыборкаДетальныеЗаписи.Следующий();

    
    Возврат ВыборкаДетальныеЗаписи.Цена;

КонецФункции

Так?

   neetro

33 — 28.05.14 — 18:59

(31) я не очень силен в 8ке. Вот разбираюсь

   neetro

34 — 28.05.14 — 19:00

(29) понял. Спасибо!

   neetro

35 — 28.05.14 — 19:04

(29) в типовую я полезу когда буду делать «по правильному» с нормальными ценами (в регистре) и тп. Сейчас простой вопрос, зачем городить огород. Два ответа и все стало понятно.

   neetro

36 — 28.05.14 — 19:04

Запрос то правильно сделал? (работает, но мало ли)

  

neetro

37 — 28.05.14 — 19:18

(31) понял идею, интересно.

Получение дополнительных реквизитов справочника

Автор bony_ann, 08 авг 2018, 12:50

0 Пользователей и 1 гость просматривают эту тему.

В отчёте (отдельными колонками) нужно вывести номенклатуру и её дополнительные реквизиты, введённые пользователем в режиме предприятия.
Не понятно каким образом получить доп реквизиты.
Не судите строго, студентка, только начала работать с 1с. 


Цитата: bony_ann от 08 авг 2018, 12:50
В отчёте (отдельными колонками) нужно вывести номенклатуру и её дополнительные реквизиты, введённые пользователем в режиме предприятия.
Не понятно каким образом получить доп реквизиты.
Не судите строго, студентка, только начала работать с 1с.

Дополнительные реквизиты — это табличная часть справочника Номенклатура?
Сделайте цикл по строкам этой табличной части.


Примерно так можно получить:


Свойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("ИмяРеквизита", Истина);

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| НоменклатураДополнительныеРеквизиты.Значение КАК Реквизит
|ИЗ
| Справочник.Номенклатура.ДополнительныеРеквизиты КАК НоменклатураДополнительныеРеквизиты
|ГДЕ
| НоменклатураДополнительныеРеквизиты.Ссылка = &Номенклатура
| И НоменклатураДополнительныеРеквизиты.Свойство = &Свойство";


Цитата: ДмитрийФ от 08 авг 2018, 13:29
Примерно так можно получить:

Свойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("ИмяРеквизита", Истина);

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| НоменклатураДополнительныеРеквизиты.Значение КАК Реквизит
|ИЗ
| Справочник.Номенклатура.ДополнительныеРеквизиты КАК НоменклатураДополнительныеРеквизиты
|ГДЕ
| НоменклатураДополнительныеРеквизиты.Ссылка = &Номенклатура
| И НоменклатураДополнительныеРеквизиты.Свойство = &Свойство";

Спасибо, но запрос вывел таблицу значений по каждой номенклатуре, а как получить отдельные значения в столбцах?


Надо не таблицу выбирать из Справочник.Номенклатура, а сразу запрос делать к Справочник.Номенклатура.ДополнительныеРеквизиты.
При этом можно сделать разные свойства в разных колонках, если знать заранее все свойства, через ВЫБОР получится.
Но если нужно автоматически, то через СКД в виде таблицы выводить.


Теги:

  • Форум 1С

  • Форум 1С — ПРЕДПРИЯТИЕ 8.0 8.1 8.2 8.3 8.4

  • Конфигурирование, программирование в 1С Предприятие 8

  • Получение дополнительных реквизитов справочника

Похожие темы (5)

Рейтинг@Mail.ru

Rambler's Top100

Поиск

Тема: Получение значения реквизита элемента из справочника в документ

  1. 17.05.2019, 09:54


    #1

    MasterLoma вне форума


    Гость форума


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

    Доброго времени суток! У меня возникли некоторые трудности с получением значения реквизита из справочника в документ. Мне нужно, чтобы когда я в табличной части (документа) в реквизите «Номенклатура» выбирал какую-то номенклатуру, то в реквизит «Цена» табличной части, записывалась её цена из справочника. Для того, чтобы получить значение из справочника, как я понял, нужно создать функцию….А вот как прописать в функции то, что она должна возвращать цену какой-то номенклатуры?
    В справочнике «Номенклатура» у меня хранятся книги. Через предопределённые данные я создал группы (Жанры книг) и в каждом из жанров находятся элементы (книги) с информацией об авторе и тд.


  2. 17.05.2019, 10:38


    #2

    Margofs вне форума


    Пришел за помощью


    По умолчанию Re: Получение значения реквизита элемента из справочника в документ

    Какая конфигурация? на какой платформе?


  3. 17.05.2019, 10:54


    #3

    По умолчанию Re: Получение значения реквизита элемента из справочника в документ

    Цитата Сообщение от MasterLoma
    Посмотреть сообщение

    Доброго времени суток! У меня возникли некоторые трудности с получением значения реквизита из справочника в документ. Мне нужно, чтобы когда я в табличной части (документа) в реквизите «Номенклатура» выбирал какую-то номенклатуру, то в реквизит «Цена» табличной части, записывалась её цена из справочника. Для того, чтобы получить значение из справочника, как я понял, нужно создать функцию….А вот как прописать в функции то, что она должна возвращать цену какой-то номенклатуры?
    В справочнике «Номенклатура» у меня хранятся книги. Через предопределённые данные я создал группы (Жанры книг) и в каждом из жанров находятся элементы (книги) с информацией об авторе и тд.

    Цена — это реквизит справочника «Номенклатура»?
    Тогда можно обращаться без функции: Цена=Номенклатура.Цена;
    Это должно быть прописано в процедуре «ПриВыбореНоменклатуры», которая назначается колонке «Номенклатура»вашей табличной части


  4. 17.05.2019, 11:07


    #4

    Margofs вне форума


    Пришел за помощью


    По умолчанию Re: Получение значения реквизита элемента из справочника в документ

    на клиенте он заполняет табличную часть….. не обратиться он объектно!


  5. 17.05.2019, 11:10


    #5

    Margofs вне форума


    Пришел за помощью


    По умолчанию Re: Получение значения реквизита элемента из справочника в документ

    &НаКлиенте
    **************
    Для каждого стр из Объект.Товары Цикл /// к примеру, либо получать текущую строку табличной части
    Цена =ВернутьЦену(стр.Номенклат� �ра);
    **************************

    &НаСервере
    Функция ВернутьЦену(Товар)
    Если Не ЗНачениеЗаполнено(Товар) Тогда
    Возврат 0;
    КонецЕсли;

    Возврат Товар.Цена;
    КонецФункции


  6. Пользователь сказал cпасибо:


  7. 17.05.2019, 11:20


    #6

    Margofs вне форума


    Пришел за помощью


    По умолчанию Re: Получение значения реквизита элемента из справочника в документ

    Цитата Сообщение от Margofs
    Посмотреть сообщение

    &НаКлиенте
    **************
    Для каждого стр из Объект.Товары Цикл /// к примеру, либо получать текущую строку табличной части
    Цена =ВернутьЦену(стр.Номенклат� �ра);
    **************************

    &НаСервере
    Функция ВернутьЦену(Товар)
    Если Не ЗНачениеЗаполнено(Товар) Тогда
    Возврат 0;
    КонецЕсли;

    Возврат Товар.Цена;
    КонецФункции

    часть


  8. 17.05.2019, 12:23


    #7

    По умолчанию Re: Получение значения реквизита элемента из справочника в документ

    Цитата Сообщение от Margofs
    Посмотреть сообщение

    &НаКлиенте
    **************
    Для каждого стр из Объект.Товары Цикл /// к примеру, либо получать текущую строку табличной части
    Цена =ВернутьЦену(стр.Номенклат� �ра);
    **************************

    &НаСервере
    Функция ВернутьЦену(Товар)
    Если Не ЗНачениеЗаполнено(Товар) Тогда
    Возврат 0;
    КонецЕсли;

    Возврат Товар.Цена;
    КонецФункции

    Можно так:
    &НаКлиенте
    Процедура ТабличнаяЧасть1Номенклату� �аПриИзменении(Элемент)
    ТекущиеДанные = Элементы.ТабличнаяЧасть1.Т� �кущиеДанные;
    УИ=ТекущиеДанные.Номенклат ура.УникальныйИдентификат� �р();
    ТекущиеДанные.Цена=НайтиЦе ну(УИ);
    КонецПроцедуры
    &Насервере
    Функция НайтиЦену(Реквизит)
    ТекН=Справочники.Номенклат ура.ПолучитьСсылку(Реквизи т);
    Возврат ТекН.Цена;

    КонецФункции


  9. Пользователь сказал cпасибо:


  10. 17.05.2019, 14:03


    #8

    MasterLoma вне форума


    Гость форума


    По умолчанию Re: Получение значения реквизита элемента из справочника в документ

    Цитата Сообщение от Margofs
    Посмотреть сообщение

    Какая конфигурация? на какой платформе?

    1С:Предприятие 8.3, учебная версия (8.3.6.2014)


  11. 17.05.2019, 14:04


    #9

    MasterLoma вне форума


    Гость форума


    По умолчанию Re: Получение значения реквизита элемента из справочника в документ

    Цитата Сообщение от Margofs
    Посмотреть сообщение

    &НаКлиенте
    **************
    Для каждого стр из Объект.Товары Цикл /// к примеру, либо получать текущую строку табличной части
    Цена =ВернутьЦену(стр.Номенклат� �ра);
    **************************

    &НаСервере
    Функция ВернутьЦену(Товар)
    Если Не ЗНачениеЗаполнено(Товар) Тогда
    Возврат 0;
    КонецЕсли;

    Возврат Товар.Цена;
    КонецФункции

    Спасибо попозже попробую таким образом сделать.


Похожие темы

  1. Ответов: 16

    Последнее сообщение: 24.03.2017, 10:41

  2. Ответов: 0

    Последнее сообщение: 14.01.2014, 12:53

  3. Ответов: 1

    Последнее сообщение: 24.04.2012, 13:36

  4. Ответов: 0

    Последнее сообщение: 28.01.2012, 12:20

  5. Ответов: 4

    Последнее сообщение: 11.11.2011, 08:35

Социальные закладки

Социальные закладки


Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •  
  • BB коды Вкл.
  • Смайлы Вкл.
  • [IMG] код Вкл.
  • [VIDEO] код Вкл.
  • HTML код Выкл.

Правила форума

  • Как создать элемент (группу) справочника?
  • Как найти элемент справочника?
  • Как удалить элемент справочника?
  • Как перебрать элементы справочника?
  • Как выбрать все элементы из определенной группы?
  • Как перебрать элементы подчиненного справочника с помощью запроса?
  • Как перебрать элементы подчиненного справочника с помощью выборки справочника?
  • Как открыть форму списка (элемента) справочника?
  • Как добавить запись в табличную часть элемента справочника?
  • Как удалить строки из табличной части справочника?
  • Как перебрать строки табличной части справочника?
  • Как создать элемент в нужной группе?
  • Как узнать, есть ли у текущего элемента подчиненные?
  • Как узнать количество подчиненных элементов у выбранного элемента справочника?
  • Как узнать количество подчиненных элементов у выбранного элемента справочника, если подчиненных справочников нексолько?
  • Как получить всех родителей выбранного элемента справочника?
  • Как получить запросом «полный» код элементов справочника, если тип кода — Строка?
  • Как получить все элементы справочника, содержащие в наименовании определенную подстроку, со всей иерархией, в которую они входят?
  • Как найти все элементы справочника, в которых не заполнен строковый реквизит?
  • Как перенести все элементы справочника «Контрагенты» из одной группы в другую?
  • Как организовать программный выбор элемента справочника?
  • Как сохранить фотографию сотрудника в справочнике «Сотрудники»?

Как создать элемент (группу) справочника?

НовыйЭлемент = Справочники.ДокументыУдостоверяющиеЛичность.СоздатьЭлемент();
НовыйЭлемент.Наименование = "военный билет"; 
// Установить другие реквизиты.  
// .....
НовыйЭлемент.Записать(); 

НовыйЭлемент = Справочники.Банки.СоздатьЭлемент(); 
// Получить ссылку на группу, в которой будет находиться новый элемент
Родитель = Справочники.Банки.НайтиПоКоду("000000001"); 
НовыйЭлемент.Наименование = "АКБ"; 
НовыйЭлемент.Код = "000000011"; 
НовыйЭлемент.Родитель = Родитель; 
// Установить другие реквизиты 
// .....
НовыйЭлемент.Записать(); 

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

// Создать новый элемент в корне справочника
НовыйЭлемент = Справочники.Подразделения.СоздатьЭлемент(); 
НовыйЭлемент.Наименование = "IT отдел";  
НовыйЭлемент.Записать(); 

// Получить ссылку на родителя для добавляемых элементов
Родитель = НовыйЭлемент.Ссылка; 
// Создать дочерний элемент. 
НовыйЭлемент = Справочники.Подразделения.СоздатьЭлемент(); 
НовыйЭлемент.Наименование = "Группа разработки"; 
НовыйЭлемент.Родитель = Родитель;  
НовыйЭлемент.Записать();

Как найти элемент справочника?

// Поиск по коду
РезультатПоиска = Справочники.Номенклатура.НайтиПоКоду("00030"); 
Если РезультатПоиска.Пустая() Тогда 
    // Выполнить действия, предусмотренные в случае, когда элемент не найден.  
КонецЕсли; 

// Поиск по наименованию
РезультатПоиска = Справочники.Номенклатура.НайтиПоНаименованию("Кроссовки"); 

// Поиск по реквизиту
РезультатПоиска = Справочники.Номенклатура.НайтиПоРеквизиту("Артикул", "К-120002");

Как удалить элемент справочника?

// Найти ссылки на удаляемый элемент. 
МассивСсылок = Новый Массив; 
МассивСсылок.Добавить(СсылкаНаУдаляемыйЭлемент); 
НайденныеСсылки = НайтиПоСсылкам(МассивСсылок); 

Если НайденныеСсылки.Количество() > 0 Тогда 
    Сообщить("Нельзя удалять элемент, на него имеются ссылки"); 
Иначе 
    УдаляемыйЭлемент = СсылкаНаУдаляемыйЭлемент.ПолучитьОбъект(); 
    УдаляемыйЭлемент.Удалить(); 
КонецЕсли; 

УдаляемыйЭлемент.УстановитьПометкуУдаления(Истина);

Как перебрать элементы справочника?

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

Запрос = Новый Запрос(
    "ВЫБРАТЬ 
    |    Ссылка, 
    |    Наименование 
    |ИЗ 
    |    Справочник.Номенклатура 
    |АВТОУПОРЯДОЧИВАНИЕ"
); 
Результат = Запрос.Выполнить().Выбрать(); 
Пока Результат.Следующий() Цикл 
    Наименование = Результат.Наименование;  
КонецЦикла;

Как выбрать все элементы из определенной группы?

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

Запрос = Новый Запрос(
    "ВЫБРАТЬ 
    |    Ссылка, 
    |    Наименование 
    |ИЗ 
    |    Справочник.Номенклатура 
    |ГДЕ 
    |    Родитель = &Родитель 
    |АВТОУПОРЯДОЧИВАНИЕ"
); 
Запрос.УстановитьПараметр("Родитель", ПолеВводаРодитель); 
Результат = Запрос.Выполнить().Выбрать(); 
Пока Результат.Следующий() Цикл 
    Наименование = Результат.Наименование;  
КонецЦикла; 

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

Запрос = Новый Запрос(
    "ВЫБРАТЬ 
    |    Ссылка, 
    |    Наименование 
    |ИЗ 
    |    Справочник.Номенклатура 
    |ГДЕ 
    |    Родитель В ИЕРАРХИИ(&Родитель) 
    |АВТОУПОРЯДОЧИВАНИЕ"
); 
Запрос.УстановитьПараметр("Родитель", ПолеВводаРодитель); 
Результат = Запрос.Выполнить().Выбрать(); 
Пока Результат.Следующий() Цикл 
    Наименование = Результат.Наименование;  
КонецЦикла;

Как перебрать элементы подчиненного справочника с помощью запроса?

Процедура ПереборПодчиненыхЭлементов(Контрагент) 
    Запрос = Новый Запрос(); 
    Запрос.Текст =
    "ВЫБРАТЬ 
    |    КонтактныеЛица.Ссылка 
    |ИЗ 
    |    Справочник.КонтактныеЛица КАК КонтактныеЛица 
    |ГДЕ 
    |    КонтактныеЛица.Владелец = &Владелец"; 
    Запрос.УстановитьПараметр("Владелец", Контрагент); 
    Результат = Запрос.Выполнить(); 
    Выборка = Результат.Выбрать(); 
    Пока Выборка.Следующий() Цикл 
        ОчереднойПодчиненый = Выборка.Ссылка; 
    КонецЦикла; 
КонецПроцедуры

Как перебрать элементы подчиненного справочника с помощью выборки справочника?

Процедура ПереборПодчиненыхЭлементов(Контрагент) 
    // Получить выборку по указанному контрагенту
    Выборка = Справочники.КонтактныеЛица.Выбрать( , Контрагент); 
    Пока Выборка.Следующий() Цикл 
        ОчереднойПодчиненый = Выборка.Ссылка; 
    КонецЦикла; 
КонецПроцедуры

Как открыть форму списка (элемента) справочника?

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

Элемент = Справочники.Номенклатура.НайтиПоКоду("00070"); 
Форма = Элемент.ПолучитьФорму(); 
Форма.Открыть();

Как добавить запись в табличную часть элемента справочника?

ЭлементОбъект = СсылкаКонтрагент.ПолучитьОбъект(); 
НоваяСтрока = ЭлементОбъект.ВидыДеятельности.Добавить(); 
// Заполнить реквизиты
НоваяСтрока.ВидДеятельности = ПолеВводаВидДеятельности; 
// .....
ЭлементОбъект.Записать();

Как удалить строки из табличной части справочника?

ЭлементСправочника = Справочники.Контрагенты.НайтиПоКоду("Ю0006"); 
ОбъектСправочника = ЭлементСправочника.ПолучитьОбъект(); 
ОбъектСправочника.ВидыДеятельности.Очистить(); 
ОбъектСправочника.Записать(); 

ОбъектСправочника = ВыбранныйЭлемент.ПолучитьОбъект(); 

// Создать структуру для отбора удаляемых строк
СтруктураОтбора = Новый Структура("ВидДеятельности", ВыбранныйВидДеятельности); 

// Получить массив удаляемых строк
ПодходящиеСтроки = ОбъектСправочника.ВидыДеятельности.НайтиСтроки(СтруктураОтбора); 

// Удалить строки
Для Каждого ОчереднаяСтрока Из ПодходящиеСтроки Цикл 
    ОбъектСправочника.ВидыДеятельности.Удалить(ОчереднаяСтрока); 
КонецЦикла; 

ОбъектСправочника.Записать();

Как перебрать строки табличной части справочника?

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

Как создать элемент в нужной группе?

КодГруппы = "330100"; 
ПоискПоПолномуКоду = Ложь; // значение по умолчанию 
Группа = Справочники.Номенклатура.НайтиПоКоду(КодГруппы, ПоискПоПолномуКоду); 

Если Группа.Пустая() Тогда 
    Группа = Справочники.Номенклатура.СоздатьГруппу(); 
    Группа.Код = КодГруппы; 
    Группа.Наименование = "Загруженные"; 
    Группа.Записать(); 
ИначеЕсли НЕ Группа.ЭтоГруппа Тогда 
    Сообщить("Найден элемент справочника с указанным кодом!"); 
    // Предусмотреть прерывание алгоритма...
КонецЕсли; 

Спр = Справочники.Номенклатура.СоздатьЭлемент(); 
Спр.Наименование = "Программно созданный"; 
// Реквизиты заполняются в соответствии с задачей
// .....
Спр.Родитель = Группа.Ссылка; 
Спр.Записать(); 

Группа = Справочники.Номенклатура.Загруженные; 

КодЭлемента = "330100"; 
ПоискПоПолномуКоду = Ложь; // Значение по умолчанию 
Родитель = Справочники.Номенклатура.НайтиПоКоду(КодЭлемента, ПоискПоПолномуКоду); 

Если Родитель.Пустая() Тогда 
Родитель = Справочники.Номенклатура.СоздатьЭлемент(); 

Родитель.Код = КодЭлемента; 
Родитель.Наименование = "Загруженные"; 

Родитель.Записать(); 
КонецЕсли; 

Спр = Справочники.Номенклатура.СоздатьЭлемент(); 
Спр.Наименование = "Программно созданный"; 
// Реквизиты заполняются в соответствии с задачей
// .....
Спр.Родитель = Родитель.Ссылка; 
Спр.Записать();

Как узнать, есть ли у текущего элемента подчиненные?

Выборка = Справочники.Номенклатура.Выбрать( , Владелец); 
Если Выборка.Следующий() = Истина Тогда 
    // Есть подчиненные элементы.
КонецЕсли;

Запрос = Новый Запрос(); 
Запрос.Текст =
    "ВЫБРАТЬ ПЕРВЫЕ 1 
    |    ЕдиницыИзмерения.Ссылка 
    |ИЗ 
    |    Справочник.ЕдиницыИзмерения КАК ЕдиницыИзмерения 
    |ГДЕ 
    |    ЕдиницыИзмерения.Владелец = &Владелец"; 
Запрос.УстановитьПараметр("Владелец", Владелец); 
Если НЕ Запрос.Выполнить().Пустой() Тогда 
    // Есть подчиненные элементы!
КонецЕсли;

Как узнать количество подчиненных элементов у выбранного элемента справочника?

Выборка = Справочники.ЕдиницыИзмерения.Выбрать( , Владелец); 
КоличествоЭлементов = 0; 
Пока Выборка.Следующий() Цикл 
    КоличествоЭлементов = КоличествоЭлементов + 1; 
КонецЦикла; 

Запрос = Новый Запрос(); 
Запрос.Текст =
    "ВЫБРАТЬ 
    |    КОЛИЧЕСТВО(*) КАК КоличествоЗаписей 
    |ИЗ 
    |    Справочник.ЕдиницыИзмерения КАК ЕдиницыИзмерения 
    |ГДЕ 
    |    ЕдиницыИзмерения.Владелец = &Владелец"; 
Запрос.УстановитьПараметр("Владелец", Владелец); 
Выборка = Запрос.Выполнить().Выбрать(); 

Если Выборка.Следующий() Тогда 
    КоличествоЗаписей = Выборка.КоличествоЗаписей; 
КонецЕсли;

Как узнать количество подчиненных элементов у выбранного элемента справочника, если подчиненных справочников несколько?

ВЫБРАТЬ
    СУММА(КоличествоПодчиненных) КАК КоличествоПодчиненныхЭлементов 
ИЗ 
    (ВЫБРАТЬ 
        КОЛИЧЕСТВО(*) КАК КоличествоПодчиненных 
    ИЗ 
        Справочник.ЕдиницыИзмерения КАК ЕдиницыИзмерения 
    ГДЕ
        ЕдиницыИзмерения.Владелец = &Владелец 

    ОБЪЕДИНИТЬ ВСЕ 

    ВЫБРАТЬ 
        КОЛИЧЕСТВО(*) 
    ИЗ 
        Справочник.СерииНоменклатуры КАК СерииНоменклатуры 
    ГДЕ
        СерииНоменклатуры.Владелец = &Владелец
    ) КАК ВложенныйЗапрос

Как получить всех родителей выбранного элемента справочника?

МассивРодителей = Новый Массив; 
Родитель = СсылкаНаЭлемент.Родитель; 

Пока НЕ Родитель.Пустая() Цикл
    МассивРодителей.Добавить(Родитель);
    Родитель = Родитель.Родитель; 
КонецЦикла; 

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

Запрос = Новый Запрос(
    "ВЫБРАТЬ 
    |    Номенклатура.Родитель, 
    |    Номенклатура.Родитель.Родитель, 
    |    Номенклатура.Родитель.Родитель.Родитель, 
    |    Номенклатура.Родитель.Родитель.Родитель.Родитель, 
    |    Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель 
    |ИЗ 
    |    Справочник.Номенклатура КАК Номенклатура 
    |ГДЕ 
    |    Номенклатура.Ссылка = &ТекущийЭлементНоменклатуры"; 

Пока Истина Цикл 
    Запрос.УстановитьПараметр("ТекущийЭлементНоменклатуры", ТекущийЭлементНоменклатуры); 
    Результат = Запрос.Выполнить(); 
    Если Результат.Пустой() Тогда 
        Прервать; 
    КонецЕсли; 
    Выборка = Результат.Выбрать(); 
    Выборка.Следующий(); 

    Для НомерКолонки = 0 По Результат.Колонки.Количество() - 1 Цикл 
        ТекущийЭлементНоменклатуры = Выборка[НомерКолонки]; 
        Если ТекущийЭлементНоменклатуры = Справочники.Номенклатура.ПустаяСсылка() Тогда 
            Прервать; 
        Иначе 
            Сообщить(ТекущийЭлементНоменклатуры); 
        КонецЕсли; 
    КонецЦикла; 

    Если ТекущийЭлементНоменклатуры = Справочники.Номенклатура.ПустаяСсылка() Тогда 
        Прервать;
    КонецЕсли; 
КонецЦикла;

Как получить запросом «полный» код элементов справочника, если тип кода — Строка?

ВЫБРАТЬ 
    Контрагенты.Ссылка, 
    ВЫБОР 
        КОГДА (Контрагенты.Родитель.Код ЕСТЬ NULL ) ТОГДА Контрагенты.Код 
        КОГДА (Контрагенты.Родитель.Родитель.Код ЕСТЬ NULL ) ТОГДА 
            Контрагенты.Родитель.Код + "/" + Контрагенты.Код 
        ИНАЧЕ Контрагенты.Родитель.Родитель.Код + "/" + Контрагенты.Родитель.Код + 
            "/" + Контрагенты.Код 
    КОНЕЦ КАК ПолныйКод 
ИЗ 
    Справочник.Контрагенты КАК Контрагенты

Как получить все элементы справочника, содержащие в наименовании определенную подстроку, со всей иерархией, в которую они входят?

Запрос = Новый Запрос(
    "ВЫБРАТЬ 
    |    Контрагенты.Ссылка КАК Ссылка 
    |ИЗ 
    |    Справочник.Контрагенты КАК Контрагенты 
    |ГДЕ 
    |    (Контрагенты.Наименование ПОДОБНО &ЧастьНаименования) И (НЕ Контрагенты.ЭтоГруппа) 
    |ИТОГИ ПО 
    |    Ссылка ТОЛЬКО ИЕРАРХИЯ"
); 
Запрос.УстановитьПараметр("ЧастьНаименования", "%" + ПолеВводаПодстрока + "%");

Как найти все элементы справочника, в которых не заполнен строковый реквизит?

ВЫБРАТЬ 
    ФизическиеЛица.Ссылка 
ИЗ 
    Справочник.ФизическиеЛица КАК ФизическиеЛица 
ГДЕ 
    (ФизическиеЛица.ИНН = "") 

ВЫБРАТЬ 
    ФизическиеЛица.Ссылка 
ИЗ 
    Справочник.ФизическиеЛица КАК ФизическиеЛица 
ГДЕ 
    (ФизическиеЛица.СтраховойНомерПФР = "") ИЛИ (ФизическиеЛица.СтраховойНомерПФР = " - -")

Как перенести все элементы справочника «Контрагенты» из одной группы в другую?

Запрос = Новый Запрос; 
Запрос.Текст =
    "ВЫБРАТЬ 
    |    Контрагенты.Ссылка 
    |ИЗ 
    |    Справочник.Контрагенты КАК Контрагенты 
    |ГДЕ 
    |    Контрагенты.Родитель = &СтарыйРодитель"; 
Запрос.УстановитьПараметр("СтарыйРодитель", СтарыйРодитель); 
Результат = Запрос.Выполнить(); 

Выборка = Результат.Выбрать(); 
Пока Выборка.Следующий() Цикл 
    Контрагент = Выборка.Ссылка.ПолучитьОбъект(); 
    Контрагент.Родитель = НовыйРодитель; 
    Контрагент.Записать(); 
КонецЦикла;

Как организовать программный выбор элемента справочника?

// Получить форму выбора справочника как подчиненную форме документа 
ФормаВыбора = Справочники.Номенклатура.ПолучитьФормуВыбора( , ЭтаФорма); 

// Открыть полученную форму 
ФормаВыбора.Открыть(); 

Процедура ОбработкаВыбора(ЗначениеВыбора, Источник) 
    ПолученноеЗначение = ЗначениеВыбора; 
    // Дальнейшая обработка значения...
КонецПроцедуры 

ФормаВыбора = Справочники.Номенклатура.ПолучитьФормуВыбора( , ЭтаФорма); 
Выбрано = ФормаВыбора.ОткрытьМодально(); 

Процедура ПолеВводаНачалоВыбора(Элемент, СтандартнаяОбработка) 
    // Запретить стандартную обработку. 
    СтандартнаяОбработка = Ложь; 
    // Получить форму выбора справочника как подчиненную полю ввода
    ФормаВыбора = Справочники.Номенклатура.ПолучитьФормуВыбора( , Элемент); 
    // Открыть полученную форму 
    ФормаВыбора.Открыть(); 
КонецПроцедуры 

Процедура ПолеВводаОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка) 
    // Отключить стандартную обработку (при необходимости)
    СтандартнаяОбработка = Ложь; 
    ПолученноеЗначение = ВыбранноеЗначение; 
    // Дальнейшая обработка значения...
КонецПроцедуры

Как сохранить фотографию сотрудника в справочнике «Сотрудники»?

Процедура ЗагрузитьФотографию(Элемент)
    Режим = РежимДиалогаВыбораФайла.Открытие;
    ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим);
    ДиалогОткрытияФайла.ПолноеИмяФайла = "";
    Фильтр = "Текст (*,*)|*.*";
    ДиалогОткрытияФайла.Фильтр = Фильтр;
    ДиалогОткрытияФайла.МножественныйВыбор = Ложь;
    ДиалогОткрытияФайла.Заголовок = "Выберите картинку";
    Если ДиалогОткрытияФайла.Выбрать() Тогда 
        ВыбраннаяКартинка = Новый Картинка(ДиалогОткрытияФайла.ПолноеИмяФайла);
        ЭлементХранилища = Новый ХранилищеЗначения(ВыбраннаяКартинка);
        Фотография = ЭлементХранилища;
    КонецЕсли;
КонецПроцедуры

ВыбФайл = Новый ДвоичныеДанные(ДиалогОткрытияФайла.ПолноеИмяФайла);
элХранилища = Новый ХранилищеЗначения(ВыбФайл);
Фотография = элХранилища;

На чтение 6 мин Просмотров 11.2к. Опубликовано 26.04.2017

Справочники в 1С — это объекты конфигурации, предназначенные для хранения данных, имеющих одинаковую структуру и носящие списочный характер. Например, в справочниках может храниться: перечень номенклатуры, контрагентов, сотрудников, банковских счетов и т.д. В статье рассматриваются базовые принципы работы с этим объектом метаданных.

  • Создание элемента справочника
  • Поиск элементов справочника
  • Изменение элементов справочника
  • Удаление элементов справочника
  • Обход элементов справочника
  • Выбор элементов справочника запросом
  • Открытие форм справочника

Содержание

  1. Создание элемента справочника
  2. Поиск элементов справочника
  3. Изменение элементов справочника
  4. Удаление элементов справочника
  5. Обход элементов справочника
  6. Выбор элементов справочника запросом
  7. Открытие форм справочника

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

Создание новых элементов и групп справочника производится с помощью программного объекта СправочникМенеджер.<Имя справочника>. Данный объект доступен только на сервере.
Создание нового элемента или группы справочника состоит из следующих этапов:

  1. Создание элемента или группы;
  2. Заполнение владельца (если справочник подчиненный);
  3. Заполнение родителя (если справочник иерархический);
  4. Заполнение наименования и реквизитов (если не задана автоматическая нумерация, то и кода);
  5. Заполнение табличных частей;
  6. Запись элемента.

Создание новой группы:
НоваяГруппа = Справочники.Контрагенты.СоздатьГруппу(); // Создание группы
НоваяГруппа.Наименование = "Покупатели"; // Заполнение наименования
НоваяГруппа.Записать
(); // Запись группы

Создание нового элемента:
НовыйЭлемент = Справочники.Контрагенты.СоздатьЭлемент(); // Создание элемента
НовыйЭлемент.Родитель = Справочники.Контрагенты.НайтиПоНаименованию("Покупатели"); // Заполнение родителя
НовыйЭлемент.Наименование = "Ромашка ООО"; // Заполнение наименования
НовыйЭлемент.ИНН = "123456789"; // Заполнение реквизита

// Добавление новой строки табличной части
НоваяСтрока = НовыйЭлемент.КонтактнаяИнформация.Добавить();
НоваяСтрока.Тип = "Адрес";
НоваяСтрока.Представление = "Москва";

НовыйЭлемент.Записать(); // Запись элемента

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

Для поиска элементов справочников в языке программирования 1С предусмотрено несколько методов:

  • НайтиПоКоду(<Код>, <ПоискПоПолномуКоду>, <Родитель>, <Владелец>)
  • НайтиПоНаименованию(<Наименование>, <ТочноеСоответствие>, <Родитель>, <Владелец>)
  • НайтиПоРеквизиту(<ИмяРеквизита>, <ЗначениеРеквизита>, <Родитель>, <Владелец>)

Во всех методах если поиск успешный, то будет возвращена ссылка на найденный элемент.
НайденныйКонтрагент = Справочники.Контрагенты.НайтиПоКоду("123"); // Поиск контрагента с кодом "123"
НайденныйДоговор = Справочники.ДоговорыКонтрагентов.НайтиПоКоду("1", , , НайденныйКонтрагент); // Поиск подчиненного найденному контрагенту договора с номером "1"
НайденныйКонтрагент = Справочники.Контрагенты.НайтиПоНаименованию("Покупатели"); // Поиск элемента с наименованием "Покупатели"
НайденныйКонтрагент1 = Справочники.Контрагенты.НайтиПоНаименованию("Ромашка ООО", , НайденныйКонтрагент); // Поиск элемента с наименованием "Ромашка ООО" в группе "Покупатели"
НайденныйКонтрагент = Справочники.Контрагенты.НайтиПоРеквизиту
("ИНН", "123456789"); // Поиск контрагента с ИНН "123456789"

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

Для изменения реквизитов справочника необходимо выполнить следующие действия:

  1. Получить объект элемента справочника (метод ПолучитьОбъект(), возвращает тип СправочникОбъект.<Имя справочника>);
  2. Присвоить новые значения реквизитам объекта;
  3. Записать объект элемента справочника.

Программное изменение справочника возможно только на стороне сервера.

Например, на форму обработки выведен реквизит Номенклатура типа СправочникСсылка.Номенклатура. Вот пример кода, изменяющего наименование выбранной пользователем номенклатуры:
НоменклатураОбъект = Номенклатура.ПолучитьОбъект();
НоменклатураОбъект.Наименование = "Новое наименование";
НоменклатураОбъект.Записать();

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

Элементы справочника могут быть помечены на удаление и удалены из базы непосредственно.

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

Пометку на удаление можно установить/снять двумя разными способами:
// Способ 1. Использование метода УстановитьПометкуУдаления()
НайденныйКонтрагент = Справочники.Контрагенты.НайтиПоКоду("123");
КонтрагентОбъект = НайденныйКонтрагент.ПолучитьОбъект();
КонтрагентОбъект.УстановитьПометкуУдаления(Истина);

// Способ 2. Изменение свойства ПометкаУдаления
НайденныйКонтрагент = Справочники.Контрагенты.НайтиПоКоду("123");
КонтрагентОбъект = НайденныйКонтрагент.ПолучитьОбъект();
КонтрагентОбъект.ПометкаУдаления = Истина;
КонтрагентОбъект.Записать();

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

Обход элементов справочника

Для обхода элементов справочника в языке программирования 1С предусмотрено два метода:

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

Методы отличаются порядком следования отобранных элементов: при иерархической выборке для каждого элемента сначала выбираются элементы, для которых он является родителем, а затем уже выбираются элементы следующего уровня.

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

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

// Обход договоров контрагента "Ромашка ООО"
НайденныйКонтрагент = Справочники.Контрагенты.НайтиПоНаименованию("Ромашка ООО");
Выборка = Справочники.ДоговорыКонтрагентов.Выбрать(, НайденныйКонтрагент);
Пока
Выборка.Следующий() Цикл
Сообщить(Выборка.Наименование);
КонецЦикла;

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

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

Поиск данных в базе 1С предпочтительнее выполнять при помощи запросов. Запрос позволяет описать практически любые условия для отбора, в отличие от методов Выбрать() и ВыбратьИерархически(), на которые накладываются существенные ограничения. К тому же, в большинстве случаев работа с использованием запросов быстрее, чем работа с использованием программного кода.

Простой пример поиска и вывода товаров со стоимостью больше 1000:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Товары.Наименование
|ИЗ
| Справочник.Товары КАК Товары
|ГДЕ
| Товары.Стоимость > 1000"
;
Выборка = Запрос.Выполнить().Выбрать();
Пока
Выборка.Следующий() Цикл
Сообщить(Выборка.Наименование
);
КонецЦикла;

Открытие форм справочника

Для открытия любых форм справочников рекомендуется использовать метод
ОткрытьФорму(<ИмяФормы>, <Параметры>, <Владелец>, <Уникальность>, <Окно>, <НавигационнаяСсылка>, <ОписаниеОповещенияОЗакрытии>, <РежимОткрытияОкна>)

Для открытия формы элемента или группы справочника также возможно использовать более простой метод
ПоказатьЗначение(<ОписаниеОповещенияОЗавершении>, <Значение>)

Кроме методов ОткрытьФорму() и ПоказатьЗначение() есть и другие (ОткрытьФормуМодально, ОткрытьЗначение, ПолучитьФорму), но их использование не рекомендуется, т.к. часть этих методов использует режим модального открытия, часть противоречит свежим рекомендациям фирмы 1С.

Приведем примеры программного открытия форм справочника:
// Открыть форму списка
ОткрытьФорму("Справочник.Контрагенты.ФормаСписка");

// Открыть форму элемента
// Контрагент – реквизит формы, заполняемый пользователем интерактивно

ПоказатьЗначение(, Контрагент);

// Еще один способ открытия формы элемента
ПараметрыОткрытия = Новый Структура("Ключ", Контрагент);
ОткрытьФорму("Справочник.Контрагенты.Форма.ФормаЭлемента", ПараметрыОткрытия);

// Открыть форму группы
// ГруппаКонтрагентов– реквизит формы, заполняемый пользователем интерактивно

ПоказатьЗначение(, ГруппаКонтрагентов);

// Еще один способ открытия формы группы
ПараметрыОткрытия = Новый Структура("Ключ", ГруппаКонтрагентов);
ОткрытьФорму("Справочник.Контрагенты.Форма.ФормаГруппы", ПараметрыОткрытия);


Внимание!

Следует понимать, что интерактивная работа (в том числе открытие форм) в 1С возможна только на стороне клиента. В то же время поиск и изменение данных возможны только на стороне сервера.

&НаСервере
Процедура СозданиеИИзменениеЭлементовИГруппСправочникаНаСервере()
 
    /// Как создать новый элемент справочника в 1с 8.3, 8.2
 
    // создадим новый элемент справочника Города
    // с именем Владивосток
    Владивосток = Справочники.Города.СоздатьЭлемент();
    Владивосток.Наименование = "Владивосток";
    Владивосток.Записать();
 
    /// Как создать новую группу справочника в 1с 8.3, 8.2
 
    // создадим новую группу справочника Города
    ГородаУМоря = Справочники.Города.СоздатьГруппу();
    ГородаУМоря.Наименование = "Города у моря";
    ГородаУМоря.Записать();
 
    /// Как перенести элемент справочника в другую группу в 1с 8.3, 8.2
 
    // перенесём созданный Владивосток в группу "Города у моря"
    Владивосток.Родитель = ГородаУМоря.Ссылка;
    Владивосток.Записать();
 
    /// Как внести изменения в элемент справочника по ссылке 
    /// в 1с 8.3, 8.2
 
    // найдём город Калькутта
    КалькуттаСсылка = Справочники.Города.НайтиПоНаименованию("Калькутта");
    Если Не КалькуттаСсылка.Пустая() Тогда
        // изменим и запишем численность жителей в городе
        Калькутта = КалькуттаСсылка.ПолучитьОбъект();
        Калькутта.Численность = 1000000;
        Калькутта.Записать();
    КонецЕсли;
 
    /// Как получить и проверить пустую ссылку типа справочник в 1с 8.3, 8.2
 
    ПустаяСсылка = Справочники.Города.ПустаяСсылка();
    Если ПустаяСсылка.Пустая() Тогда
        Сообщить("Ссылка действительно пустая.");
    КонецЕсли;
 
    /// Как узнать принадлежность элемента справочника группе
    /// с учетом уровней иерархии в 1с 8.3, 8.2
 
    ПермьСсылка = Справочники.Города.НайтиПоНаименованию("Пермь");
    РоссияСсылка = Справочники.Города.НайтиПоНаименованию("Россия");
 
    // проверим принадлежит ли город Пермь группе Россия
 
    Если ПермьСсылка.ПринадлежитЭлементу(РоссияСсылка) Тогда
        Сообщить("Элемент Пермь находится в группе Россия.");
    КонецЕсли;
 
    /// Как скопировать существующий элемент справочника в 1с 8.3, 8.2
 
    // скопируем элемент Пермь
 
    КопияПерми = ПермьСсылка.Скопировать();
    КопияПерми.Наименование = КопияПерми.Наименование + " КОПИЯ";
    КопияПерми.УстановитьНовыйКод();
    КопияПерми.Записать();
 
    /// Как выяснить уровень вложенности элемента справочника 
    /// в 1с 8.3, 8.2
 
    Сообщить(КопияПерми.Уровень()); // 1
 
    /// Как заблокировать элемент справочника перед изменениями 
    /// в 1с 8.3, 8.2
 
    // выполним блокировку элемента справочника
    // от изменения другими режимами или пользователями
 
    Пермь = ПермьСсылка.ПолучитьОбъект();
    Если Не Пермь.Заблокирован() Тогда
        Пермь.Заблокировать();
        // тут идёт какой-то долгий алгоритм
        // в результате которого мы меняем
        // заблокированный элемент
        Пермь.Численность = 5000;
        Пермь.Записать();
        // и только потом освобождаем его
        // для других режимов и пользователей
        Пермь.Разблокировать();
    КонецЕсли;
 
    /// Как заполнить новый элемент справочника на основании 
    /// в 1с 8.3, 8.2
 
    // в модуле справочника Города я определил процедуру
    // ОбработкаЗаполнения, которая обрабатывает ситуации
    // когда мы заполняем один элемент на основании
    // данных другого (см. в базе для скачивания)
 
    Хабаровск = Справочники.Города.СоздатьЭлемент();
    Хабаровск.Заполнить(
        Справочники.Города.НайтиПоНаименованию("Рио-де-Жанейро")
    );
    Хабаровск.Наименование = "Хабаровск";
    Хабаровск.Записать();
 
    /// Как пометить на удаление элемент справочника в 1с 8.3, 8.2
 
    // пометим на удаление только что созданный Хабаровск
    Хабаровск.УстановитьПометкуУдаления(
        Истина, // пометка удаления
        Ложь // включая подчиненные (если речь о группе справочника)
    );
    // метод Записать вызывать не нужно
 
КонецПроцедуры
 
&НаСервереБезКонтекста
Функция ПолучитьКлиентаПоИмени(Имя)
    Возврат Справочники.Клиенты.НайтиПоНаименованию(Имя);
КонецФункции
 
/// Как открыть форму существующего элемента справочника 
/// по ссылке в 1с 8.3, 8.2
 
&НаКлиенте
Процедура КакОткрытьФормуСуществующегоЭлементаСправочника(Команда)
 
    СсылкаНаЭлемент = ПолучитьКлиентаПоИмени("Андрей");
 
    ПараметрыФормы = Новый Структура("Ключ", СсылкаНаЭлемент);
 
    ОткрытьФорму(
        "Справочник.Клиенты.ФормаОбъекта", // имя формы
        ПараметрыФормы // параметры для формы
    );
 
КонецПроцедуры
 
/// Как открыть форму существующей группы справочника 
/// по ссылке в 1с 8.3, 8.2
 
&НаКлиенте
Процедура КакОткрытьФормуСуществующейГруппыСправочника(Команда)
 
    СсылкаНаГруппу = ПолучитьКлиентаПоИмени("Vip");
 
    ПараметрыФормы = Новый Структура("Ключ", СсылкаНаГруппу);
 
    ОткрытьФорму(
        "Справочник.Клиенты.ФормаГруппы", // имя формы
        ПараметрыФормы // параметры для формы
    );
 
КонецПроцедуры
 
/// Как открыть форму выбора элемента справочника и
/// отследить её закрытие в 1с 8.3, 8.2
 
&НаКлиенте
Процедура КакОткрытьФормуВыбораЭлементаСправочника(Команда)
 
    ОповещениеОЗакрытии = Новый ОписаниеОповещения("ПослеВыбораЭлемента",
        ЭтотОбъект);
 
    ОткрытьФорму(
        "Справочник.Клиенты.ФормаВыбора",,,,,,ОповещениеОЗакрытии        
    );
 
КонецПроцедуры
 
&НаКлиенте
Процедура ПослеВыбораЭлемента(Результат, Параметры) Экспорт
 
    Если Результат <> Неопределено Тогда
        Сообщить("Был выбран элемент " + Результат);
    КонецЕсли;	
 
КонецПроцедуры
 
/// Как открыть форму выбора группы справочника и
/// отследить её закрытие в 1с 8.3, 8.2
 
&НаКлиенте
Процедура КакОткрытьФормуВыбораГруппыСправочника(Команда)
 
    ОповещениеОЗакрытии = Новый ОписаниеОповещения("ПослеВыбораГруппы",
        ЭтотОбъект);
 
    ОткрытьФорму(
        "Справочник.Клиенты.ФормаВыбораГруппы",,,,,,ОповещениеОЗакрытии        
    );
 
КонецПроцедуры
 
&НаКлиенте
Процедура ПослеВыбораГруппы(Результат, Параметры) Экспорт
 
    Если Результат <> Неопределено Тогда
        Сообщить("Была выбрана группа " + Результат);
    КонецЕсли;	
 
КонецПроцедуры
 
/// Как открыть форму списка справочника и
/// установить отбор по реквизиту в 1с 8.3, 8.2
 
&НаКлиенте
Процедура КакОткрытьФормаСпискаСправочникаСОтбором(Команда)
 
    // откроем список клиентов, оставив
    // только мужчин
 
    ПараметрыОтбора = Новый Структура;
    ПараметрыОтбора.Вставить("Пол", ПолучитьПеречислениеМужской());
 
    ПараметрыФормы = Новый Структура;
    ПараметрыФормы.Вставить("Отбор", ПараметрыОтбора);
 
    ОткрытьФорму(
        "Справочник.Клиенты.ФормаСписка",
        ПараметрыФормы
    );
 
КонецПроцедуры
 
&НаСервереБезКонтекста
Функция ПолучитьПеречислениеМужской()
    Возврат Перечисления.Пол.Мужской;
КонецФункции
 
/// Как открыть форму списка справочника с нужным отображением
/// в 1с 8.3, 8.2
 
&НаКлиенте
Процедура КакОткрытьФормуСпискаСправочникаСНужнымОтображением(Команда)
 
    // откроем список клиентов с отображением "Список"
 
    ФормаСписка = ПолучитьФорму("Справочник.Клиенты.ФормаСписка");    
    ФормаСписка.Открыть();
    ФормаСписка.Элементы.Список.Отображение = ОтображениеТаблицы.Список;
 
КонецПроцедуры
 
/// Как открыть форму только что созданного, но ещё
/// не записанного элемента справочника в 1с 8.3, 8.2
 
&НаКлиенте
Процедура КакОткрытьФормуНовогоНеЗаписанногоСправочника(Команда)
 
    // получаем форму нового справочника
    ФормаНовогоСправочника = ПолучитьФорму(
        "Справочник.Еда.ФормаОбъекта",,, Истина); 
 
    // делаем копию её данных (так как напрямую их менять
    // нельзя)
    КопияДанныхФормы = ФормаНовогоСправочника.Объект;
 
    // заполняем эти данные на сервере
    ЗаполнитьДанныеФормыНаСервере(КопияДанныхФормы);
 
    // копируем заполненные данные в исходную форму
    КопироватьДанныеФормы(КопияДанныхФормы,
        ФормаНовогоСправочника.Объект);
 
    // показываем форму нового заполненного
    // элемента справочника пользователю
    ФормаНовогоСправочника.Открыть();
 
КонецПроцедуры
 
&НаСервере
Процедура ЗаполнитьДанныеФормыНаСервере(ДанныеФормы)
 
    // преобразуем данные формы в документ
    Еда = ДанныеФормыВЗначение(ДанныеФормы,
        Тип("СправочникОбъект.Еда")); 
 
    Еда.Наименование = "Груша";
    Еда.Калорийность = 500;
 
    // преобразуем документа обратно в данные формы
    ЗначениеВДанныеФормы(Еда, ДанныеФормы);
 
КонецПроцедуры
 
/// Скачать и выполнить эти примеры на компьютере

1

2

Показывать по
10
20
40
сообщений

Новая тема

Ответить

ЗаЕц

Дата регистрации: 09.02.2009
Сообщений: 560

Печатная форма из документа (например реализация) в ней хочу получить реквизит товара, которого нет в документе, но есть в справочнике номенклатура<br>через документ много возни, придется прописывать реквизит и в документ, где-то было на форуме не могу найти, подскажите для тех кто в танке.<br>На прямую обратится к справочнику Номенклатура не выходит:<br> Справочник.Номенклатура.НужныйРеквизит<br>пишет, что «Номенклатура» не найдена.

Thorvardr

Дата регистрации: 25.02.2005
Сообщений: 3082

«В 7.7:<br>ЗначениеНужногоРеквизита=»»»»;<br>Спр=СоздатьОбъект(«Справочник.Номенклатура»);<br>Если Спр.НайтиПоНаименованию(«Гайка»)=1 Тогда<br> ЗначениеНужногоРеквизита=Спр.НужныйРеквизит;<br>КонецЕсли;<br><br>Но чтобы каждый раз по наименованию (или по коду) не искать и каждый раз имеем дело с одним и тем же элементом справочника номенклатуры, надо его в какую нибудь константу поместить и потом делать так:<br><br>ЗначениеНужногоРеквизита=Константа.КакойТоИдентификатор.НужныйРеквизит;»

BelikovS

Дата регистрации: 05.03.2007
Сообщений: 1701

Я, наверно, не понял вопроса: например Реализация.Номенклатура.НужныйРеквизит

ЗаЕц

Дата регистрации: 09.02.2009
Сообщений: 560

Еще раз ))<br>в документе подцепляю печ.форму. В ней выводим таблицу: выбранный товар (из таблицы документа) — первый столбец и №Сертификата — второй столбец.<br><br>№Сертификата в доке нет, а заполняется он только в справочнике номенклатура для каждого товара.<br>Чтобы не добавлять №Сертификата в док.реализация, а напрямую обратится из ячейки печатной формы дока к реквизиту справочника<br> <br>Если ставить как предложил BelikovS, то опять же ошибка:<br><br>Реализация<<?>>.Номенклатура.НомСерт.Получить(ДатаДок)<br>Переменная не определена (Реализация)<br><br><br>…так еще попробовала Докум.Номенклатура.НомСерт.Получить(ДатаДок), но теперь другая ошибка<br>Докум.Номенклатура.НомСерт.Получить(ДатаДок<<?>>)<br>Переменная не определена (ДатаДок)<br><br>у меня №Сертификата — периодический<br>делаю в Торговля и склад 954

zak555 (398843952)

Дата регистрации: 27.03.2008
Сообщений: 4656

> Печатная форма из документа (например реализация) в ней хочу получить реквизит товара, которого нет в документе, но есть в справочнике номенклатура<br>> через документ много возни, придется прописывать реквизит и в документ, где-то было на форуме не могу найти, подскажите для тех кто в танке.<br>> На прямую обратится к справочнику Номенклатура не выходит:<br>> Справочник.Номенклатура.НужныйРеквизит<br>> пишет, что «Номенклатура» не найдена.<br><br>что за бред? наименование конфигурации??

ЗаЕц

Дата регистрации: 09.02.2009
Сообщений: 560

читайте выше<br>объясняю третий раз: торговля 954<br>в справочник «номенклатура» добавила новый периодический реквизит «№Сертификата»<br>добавила колонку в печ форму «реализации», теперь хочу напрямую из спр-ка в ячейку получить №Сертификата для каждого товара выбранного в реализации!<br>

Thorvardr

Дата регистрации: 25.02.2005
Сообщений: 3082

«Ну и пишите:<br>Номенклатура.НомерСертификата.Получить(ДатаДок);»

ЗаЕц

Дата регистрации: 09.02.2009
Сообщений: 560

«> Ну и пишите:<br>> Номенклатура.НомерСертификата.Получить(ДатаДок);<br>ошибка:<br>Номенклатура<<?>>.НомСерт.Получить(ДатаДок)<br>Переменная не определена (Номенклатура)<br><br>»

zak555 (398843952)

Дата регистрации: 27.03.2008
Сообщений: 4656

«> читайте выше<br>> объясняю третий раз: торговля 954<br>> в справочник «номенклатура» добавила новый периодический реквизит «№Сертификата»<br>> добавила колонку в печ форму «реализации», теперь хочу напрямую из спр-ка в ячейку получить №Сертификата для каждого товара выбранного в реализации!<br>> <br><br>НеНужныйПериодРеквизит = Номенклатура.НомСерт.Получить(ДатаДок);<br><br><br>1. в справочнике номенклатуры добавлен реквизит НомСерт ?<br>2. в документ что-нибудь добавлялось?<br>p.s. до стандартный или самописный док и как он называется?»

Thorvardr

Дата регистрации: 25.02.2005
Сообщений: 3082

Ну не Номенклатура, а Товар, я не помню как именован реквизит в ТиС в табличной части

Понравилась статья? Поделить с друзьями:
  • 1с получить реквизит формы в модуле менеджера
  • 1с при записи проверить изменился ли реквизит
  • 250 часов обязательных работ это сколько дней
  • 280 часов обязательных работ это сколько дней
  • 1с проверить реквизит справочник или документ