Как программно обратиться к реквизиту объекта

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

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


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

В нашем случае, для того чтобы получить ссылку на поставщика, нужно будет выполнить следующий код:

ПоставщикДокумента = Объект.Поставщик; 

Как обратиться к реквизиту формы в УФ

Я
   DenisSS

09.04.18 — 08:37

Есть реквизит формы, созданный программно. Как обратиться к этому реквизиты, например, в ПослеЗаписиНаСервере? При отладке значение этого реквизита доступно, но такая строка естественно вызывает ошибку:

Сообщить(РеквизитСозданныйПрограммно)

Переменная не определена (РеквизитСозданныйПрограммно)

  

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

   DmitrO

1 — 09.04.18 — 08:45

ЭтотОбъект[«ИмяРеквизита»]

   DenisSS

2 — 09.04.18 — 08:54

Спасибо работает, но так тоже работает, не ругается: ЭтаФорма.ИмяРеквизита

   Lexey_

3 — 09.04.18 — 08:58

(2) ЭтотОбъект = ЭтаФорма

   DmitrO

4 — 09.04.18 — 10:01

1.ЭтаФорма — оставлено для совместимости.

2.С какого-то релиза (не помню) платформа явно блокирует исключением обращение к программным реквизитам через точку (это уже для совместимости на будущее). Об этом видел официальное заявление в документации.

   ildary

5 — 09.04.18 — 10:15

(4) извините что вмешиваюсь, то есть на сегодня самый правильный способ — это ЭтотОбъект[«ИмяРеквизита»], а ЭтаФорма.ИмяРеквизита — не рекомендуется по причине устаревания?

   Cyberhawk

6 — 09.04.18 — 10:17

(5) Правильнее всего для чтения значения программно созданного реквизита создавать структуру-зонд + ЗаполнитьЗначенияСвойств (т.к. реквизит может быть и удален)

   Cyberhawk

7 — 09.04.18 — 10:24

(ну а для получения реквизита формы как объекта встроенного языка — без точки и без «ЭтаФорма», о чем сказано выше)

   ildary

8 — 09.04.18 — 10:25

(6) извините, я правильно понял: структура-зонд — это структура с именами как у формы, которую (структуру) будем заполнять через ЗаполнитьЗначенияСвойств()? Выглядит рабоче, но вот ради одного поля гонять столько данных — не очень рационально.

   Cyberhawk

9 — 09.04.18 — 10:27

(8) Это структура с именем ключа, совпадающим с именем реквизита, о существовании которого заранее неизвестно (он мог быть уже и удален, т.к. создан программно и для таких это возможно).

Насчет «гонять столько данных» — во-первых, сколько «столько»? А во-вторых это, видимо, единственный способ получить значение без оборачивания в попытку.

  

hhhh

10 — 09.04.18 — 10:28

(8) зачем гонять? в ЗаполнитьЗначенияСвойств() задаете список реквизитов в 3м параметре. Может вы там один реквизит напишете.

TurboConf — расширение возможностей Конфигуратора 1С

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

Статья носит справочный характер. Предназначена для начинающих программистов.

Получить массив реквизитов объекта можно при помощи самого объекта:

                ДокСсылка = СсылкаНаДокумент(ТипДокумента, НомерДок);
                ДокОбъект = ДокСсылка.ПолучитьОбъект();
                МассивРеквизитовОбъекта = ДокОбъект.Метаданные().Реквизиты;

  Получив массив реквизитов, можно организовать Цикл для просмотра имен реквизитов:

 Для каждого Реквизит Из ДокОбъект.Метаданные().Реквизиты Цикл
                        Сообщить(Реквизит.Имя + " :" + Реквизит.Представление());
КонецЦикла;

Для того, чтобы получить значения реквизитов объекта вообще говоря надо обратиться с запросом к БД, типа:

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

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

Удобнее конечно для поиска значений реквизитов воспользоваться готовыми решениями, например фунцией ПолучитьЗначенияРеквизитов() общего модуля ОбщегоНазначения.

 
// Возвращает структуру, содержащую значения реквизитов прочитанные из информационной базы
// по ссылке на объект.
//
//  Если доступа к одному из реквизитов нет, возникнет исключение прав доступа.
//  Если необходимо зачитать реквизит независимо от прав текущего пользователя,
//  то следует использовать предварительный переход в привилегированный режим.
//
// Параметры:
//  Ссылка       - ссылка на объект, - элемент справочника, документ, ...
//  ИменаРеквизитов - Строка или Структура - Если Строка, то имена реквизитов,
//               перечисленные через запятую, в формате требований к свойствам структуры.
//               Например, "Код, Наименование, Родитель".
//               Если Структура, то в качестве ключа передается псевдоним поля для
//               возвращаемой структуры с результатом, а в качестве значения (опционально)
//               - фактическое имя поля в таблице.
//               Если значение не определено, то имя поля берется из ключа.
//
// Возвращаемое значение:
//  Структура    - содержит список свойств, как список имен в строке
//                 ИменаРеквизитов, со значениям реквизитов, прочитанных
//                 из информационной базы.
//
Функция ПолучитьЗначенияРеквизитов(Ссылка, ИменаРеквизитов) Экспорт
        Если ТипЗнч(ИменаРеквизитов) = Тип("Структура") Тогда
                СтруктураРеквизитов = ИменаРеквизитов;
        ИначеЕсли ТипЗнч(ИменаРеквизитов) = Тип("Строка") Тогда
                СтруктураРеквизитов = Новый Структура(ИменаРеквизитов);;
        Иначе
                ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
                        НСтр("ru = 'Неверный тип второго параметра ИменаИлиСтруктураРеквизитов: %1'"),
                        Строка(ТипЗнч(ИменаРеквизитов)));
        КонецЕсли;
        ТекстПолей = "";
        Для каждого КлючИЗначение Из СтруктураРеквизитов Цикл
                ИмяПоля   = ?(ЗначениеЗаполнено(КлючИЗначение.Значение), СокрЛП(КлючИЗначение.Значение), СокрЛП(КлючИЗначение.Ключ));
                Псевдоним = СокрЛП(КлючИЗначение.Ключ);
                ТекстПолей  = ТекстПолей + ?(ПустаяСтрока(ТекстПолей), "", ",") + "
                        |       " + ИмяПоля + " КАК " + Псевдоним;
        КонецЦикла;
        Запрос = Новый Запрос(
                "ВЫБРАТЬ
                |" + ТекстПолей + "
                |ИЗ
                |       " + Ссылка.Метаданные().ПолноеИмя() + " КАК ПсевдонимЗаданнойТаблицы
                |ГДЕ
                |       ПсевдонимЗаданнойТаблицы.Ссылка = &Ссылка
                |");
        Запрос.УстановитьПараметр("Ссылка", Ссылка);
        Выборка = Запрос.Выполнить().Выбрать();
        Выборка.Следующий();
        Результат = Новый Структура;
        Для каждого КлючИЗначение Из СтруктураРеквизитов Цикл
                Результат.Вставить(КлючИЗначение.Ключ);
        КонецЦикла;
        ЗаполнитьЗначенияСвойств(Результат, Выборка);
        Возврат Результат;
КонецФункции

Значение реквизитов в этой функции получено через запрос к БД. Возвращаемое значение — структура (ключ-значение). Пример использования:

         ДокСсылка = СсылкаНаДокумент(ТипДокумента, НомерДок);
        СтруктураНастроек = Новый Структура;
         //инициируем структуру настроек именами реквизитов
        Для каждого Реквизит Из ДокОбъект.Метаданные().Реквизиты Цикл
                СтруктураНастроек.Вставить(Реквизит.Имя, Реквизит.Имя);
        КонецЦикла;      
                
        ЗначенияРеквизитов = ПолучитьЗначенияРеквизитов(ДокСсылка , СтруктураНастроек);
        СканПростойСтруктуры(ЗначенияРеквизитов); //вывести структуру для просмотра
 

Поскольку в функцию ПолучитьЗначенияРеквизитов() во второй параметр надо передать структуру, то мы создали структуру и организовали Цикл ее инициализации данными из массива имен реквизитов объекта. Возвращает функция так же структуру (ключ-значение), с которой удобно работать. Для просмотра этой структуры можно воспользоваться циклом, либо вызвать функцию СканПростойСтруктуры(), которой передать структуру для просмотра.

 
Функция СканПростойСтруктуры(Структура)
        Для каждого Элемент из Структура Цикл
                Сообщить(Элемент.Ключ + ": " + Элемент.Значение);
        КонецЦикла;
КонецФункции

Если исследуемый объект использует так же еще и общие реквизиты, и их необходимо найти, то можно воспользоваться функцией МассивИменРеквизитовОбъекта(), которая находит не только реквизиты объекта но и общие и даже стандартные реквизиты, которые использует объект:

 
// Возвращает массив имен всех реквизитов переданного объекта
//
Функция МассивИменРеквизитовОбъекта(Объект) Экспорт
    МассивИменРеквизитов = Новый Массив;
    Если ТипЗнч(Объект) = Тип("ОбъектМетаданных") Тогда
        МетаданныеОбъекта = Объект;
    Иначе
        МетаданныеОбъекта = Метаданные.НайтиПоТипу(ТипЗнч(Объект));
        Если МетаданныеОбъекта = Неопределено Тогда
            Возврат МассивИменРеквизитов;
        КонецЕсли;
    КонецЕсли;
    Для индекс = 0 по 1 Цикл
//        КоллекцияРеквизитов = ?(индекс = 0, МетаданныеОбъекта.СтандартныеРеквизиты, МетаданныеОбъекта.Реквизиты);
        КоллекцияРеквизитов = МетаданныеОбъекта.Реквизиты;
        Для каждого Реквизит Из КоллекцияРеквизитов Цикл
            МассивИменРеквизитов.Добавить(Реквизит.Имя);
        КонецЦикла;
    КонецЦикла;
    Для каждого ОбщийРеквизит Из Метаданные.ОбщиеРеквизиты Цикл
        Если ИспользуетсяОбщийРеквизит(ОбщийРеквизит, МетаданныеОбъекта) Тогда
            МассивИменРеквизитов.Добавить(ОбщийРеквизит.Имя);
        КонецЕсли;
    КонецЦикла;
    Возврат МассивИменРеквизитов;
КонецФункции

Тогда программа будет выглядеть так:

 
                ДокСсылка = СсылкаНаДокумент(ТипДокумента, НомерДок);
                ДокОбъект = ДокСсылка.ПолучитьОбъект();
                                
                мМассивИмен =  МассивИменРеквизитовОбъекта(ДокОбъект);
                СтруктураНастроек = Новый Структура;
                Для каждого эл Из мМассивИмен Цикл
                        СтруктураНастроек.Вставить(эл, эл);
                КонецЦикла;
                ЗначенияРеквизитов = ОбщегоНазначения.ПолучитьЗначенияРеквизитов(ДокСсылка , СтруктураНастроек);
                СканПростойСтруктуры(ЗначенияРеквизитов);

Вспомогательная функция:

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

Как получить значение отдельного реквизита объекта?

Иногда необязательно получать значения всего массива реквизитов. Программист как правило знает имя реквизита, значение которого необходимо получить. К отдельному реквизиту объекта можно обратиться просто по его имени:

Поставщик = ДокОбъект.Метаданные().Реквизиты.Поставщик;

Получить значение этого реквизита можно так же через запрос, написанный специально для этого реквизита. Но можно воспользоваться все той же функцией ПолучитьЗначенияРеквизитов(). Цикл для настройки структуры в этом случае не нужен, так как нам надо найти значение всего одного элемента:

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

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

Как найти имена реквизитов в таб части объекта?

Функция определяет есть ли реквизит в таб части документа:

// Позволяет определить есть ли среди реквизитов табличной части документа
// реквизит с переданным именем.
//
// Параметры:
//  ИмяРеквизита - строковое имя искомого реквизита,
//  МетаданныеДокумента - объект описания метаданных документа, среди реквизитов которого производится поиск.
//  ИмяТабЧасти  - строковое имя табличной части документа, среди реквизитов которого производится поиск
//
// Возвращаемое значение:
//  Истина - нашли реквизит с таким именем, Ложь - не нашли.
//
 
Функция ЕстьРеквизитТабЧастиДокумента(ИмяРеквизита, МетаданныеДокумента, ИмяТабЧасти) Экспорт
    ТабЧасть = МетаданныеДокумента.ТабличныеЧасти.Найти(ИмяТабЧасти);
    Если ТабЧасть = Неопределено Тогда // Нет такой таб. части в документе
        Возврат Ложь;
    Иначе
        Возврат НЕ (ТабЧасть.Реквизиты.Найти(ИмяРеквизита) = Неопределено);
    КонецЕсли;
КонецФункции

Пример использования:

 

        ИмяРеквизита = "Номенклатура";
        МетаданныеДокумента = ДокОбъект.Метаданные();
        ИмяТабЧасти = "Товары";
        
         Если ЕстьРеквизитТабЧастиДокумента(ИмяРеквизита, МетаданныеДокумента, ИмяТабЧасти) Тогда
            Сообщить("Реквизит есть!");
         Иначе
            Сообщить("Реквизита нет");
         КонецЕсли;
 

Сообщить имя реквизитов таб части:

 
Для каждого Реквизит Из ДокОбъект.Метаданные().ТабличныеЧасти.Найти("Товары").Реквизиты Цикл
        Собщить(Реквизит.Имя);
КонецЦикла; 

Как найти значение всех реквизитов всех таб частей документа через запрос

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

ПолучитьЗначенияРеквизитовТабЧасти().

Функция ПолучитьЗначенияРеквизитовТабчасти(Ссылка, ИменаРеквизитов, ИмяТабЧасти) Экспорт
        
        ИмяТЧ = ИмяТабЧасти;
        ПолноеИмя = Ссылка.Метаданные().ПолноеИмя();
           
        Если ТипЗнч(ИменаРеквизитов) = Тип("Структура") Тогда
                СтруктураРеквизитов = ИменаРеквизитов;
        ИначеЕсли ТипЗнч(ИменаРеквизитов) = Тип("Строка") Тогда
                СтруктураРеквизитов = Новый Структура(ИменаРеквизитов);;
        Иначе
                ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
                        НСтр("ru = 'Неверный тип второго параметра ИменаИлиСтруктураРеквизитов: %1'"), 
                        Строка(ТипЗнч(ИменаРеквизитов)));
        КонецЕсли;
        ТекстПолей = "";
        Для Каждого КлючИЗначение Из СтруктураРеквизитов Цикл
                ИмяПоля   = ?(ЗначениеЗаполнено(КлючИЗначение.Значение), СокрЛП(КлючИЗначение.Значение), СокрЛП(КлючИЗначение.Ключ));
                Псевдоним = СокрЛП(КлючИЗначение.Ключ);
                ТекстПолей  = ТекстПолей + ?(ПустаяСтрока(ТекстПолей), "", ",") + "
                        |       " + ИмяПоля + " КАК " + Псевдоним;
        КонецЦикла;
        Запрос = Новый Запрос(
                "ВЫБРАТЬ
                |" + ТекстПолей + "
                |ИЗ
                |       " + ПолноеИмя + "." + ИмяТЧ + " КАК ПсевдонимЗаданнойТаблицы
                |ГДЕ
                |       ПсевдонимЗаданнойТаблицы.Ссылка = &Ссылка
                |");
                                
        Запрос.УстановитьПараметр("Ссылка", Ссылка);
        Результат = Запрос.Выполнить().Выгрузить();
                
        Возврат Результат;
КонецФункции

 Пример использования:

 
        ДокСсылка = СсылкаНаДокумент(ТипДокумента, НомерДок);
        ДокОбъект = ДокСсылка.ПолучитьОбъект();
                                
        
        МассивТабЧастей = Новый Массив;
        Для каждого ТабЧасть Из ДокОбъект.Метаданные().ТабличныеЧасти Цикл
                МассивТабЧастей.Добавить(ТабЧасть.Имя);                 
        КонецЦикла;                                             
                
        Для Каждого ТабЧасть Из МассивТабЧастей Цикл
                        
                СтруктураНастроек = Новый Структура;
                Для каждого Реквизит Из ДокОбъект.Метаданные().ТабличныеЧасти.Найти(ТабЧасть).Реквизиты Цикл
                        СтруктураНастроек.Вставить(Реквизит.Имя, Реквизит.Имя);
                КонецЦикла;                                             
                        
                Сообщить("Имя таб части: " + ТабЧасть);
                ТабЗнач = ПолучитьЗначенияРеквизитовТабЧасти(ДокСсылка , СтруктураНастроек, ТабЧасть);
                                
                ПоказатьТаблицу(ТабЗнач);
                                
        КонецЦикла;
 

Вспомогательная функция:

 
функция ПоказатьТаблицу(Табл)
        
        Сообщить("///Функция ПоказатьТаблицу///");
        
        Количество = Табл.Колонки.Количество();
        
        Для каждого Строка из Табл Цикл
                Для Индекс = 0 По Количество-1 Цикл 
                        Сообщить(СокрЛП(Индекс)+" "+СокрЛП(Табл.Колонки[Индекс].Имя)+ ": " + Строка[СокрЛП(Табл.Колонки[Индекс].Имя)]);
                КонецЦикла;
        КонецЦикла;
        Сообщить("///Конец Функция ПоказатьТаблицу///");
КонецФункции  

Результат для документа «Реализация товаров услуг»:

Имя таб части: Товары
///Функция ПоказатьТаблицу///
0 ЕдиницаИзмерения: шт
1 ЕдиницаИзмеренияМест:
2 Качество: Новый
3 Количество: 1
4 КоличествоМест: 0
5 Коэффициент: 1
6 Номенклатура: Вентилятор настольный
7 ПроцентСкидкиНаценки: 0
8 СерияНоменклатуры: Н-908, С-890 от 01.01.2003
9 СпособСписанияОстаткаТоваров: Со склада
10 СтавкаНДС: Без НДС
11 Сумма: 445,5
12 СуммаНДС: 0
13 ХарактеристикаНоменклатуры:
14 Цена: 450
15 Склад: Магазин «Бытовая техника»
16 ПроцентАвтоматическихСкидок: 1
17 УсловиеАвтоматическойСкидки: По виду дисконтных карт
18 ЗначениеУсловияАвтоматическойСкидки: Серебряная карта
19 КлючСтроки: 3
20 КлючСвязи: 0
21 ЗаказПокупателя: Заказ покупателя ТД000000001 от 08.06.2008 12:00:00
0 ЕдиницаИзмерения: шт
1 ЕдиницаИзмеренияМест:
2 Качество: Новый
3 Количество: 1
4 КоличествоМест: 0
5 Коэффициент: 1
6 Номенклатура: Набор вентиляторов
7 ПроцентСкидкиНаценки: 0
8 СерияНоменклатуры:
9 СпособСписанияОстаткаТоваров: Со склада
10 СтавкаНДС: Без НДС
11 Сумма: 1948,32
12 СуммаНДС: 0
13 ХарактеристикаНоменклатуры:
14 Цена: 1968
15 Склад: Магазин «Бытовая техника»
16 ПроцентАвтоматическихСкидок: 1
17 УсловиеАвтоматическойСкидки: По виду дисконтных карт
18 ЗначениеУсловияАвтоматическойСкидки: Серебряная карта
19 КлючСтроки: 4
20 КлючСвязи: 0
21 ЗаказПокупателя: Заказ покупателя ТД000000001 от 08.06.2008 12:00:00
///Конец Функция ПоказатьТаблицу///

Имя таб части: ВозвратнаяТара
///Функция ПоказатьТаблицу///
///Конец Функция ПоказатьТаблицу///

Имя таб части: Услуги
///Функция ПоказатьТаблицу///
///Конец Функция ПоказатьТаблицу///

Имя таб части: СоставНабора
///Функция ПоказатьТаблицу///
0 Номенклатура: Вентилятор BINATONE ALPINE 160вт, напольный ,
1 ХарактеристикаНоменклатуры:
2 СерияНоменклатуры: 01234/11020/7654321, БОЛГАРИЯ
3 Количество: 1
4 ЕдиницаИзмерения: шт
5 Склад: Магазин «Бытовая техника»
6 Качество: Новый
7 СпособСписанияОстаткаТоваров: Со склада
8 КлючСтроки: 4
9 Цена: 1068
10 КлючСвязи: 0
0 Номенклатура: Вентилятор JIPONIC (Тайв.),
1 ХарактеристикаНоменклатуры:
2 СерияНоменклатуры: 11234/11020/7654321, ТАЙВАНЬ (КИТАЙ)
3 Количество: 1
4 ЕдиницаИзмерения: шт
5 Склад: Магазин «Бытовая техника»
6 Качество: Новый
7 СпособСписанияОстаткаТоваров: Со склада
8 КлючСтроки: 4
9 Цена: 900
10 КлючСвязи: 0
///Конец Функция ПоказатьТаблицу///

Имя таб части: СерийныеНомера

///Функция ПоказатьТаблицу///
///Конец Функция ПоказатьТаблицу///

Имя таб части: СерийныеНомераСоставНабора

///Функция ПоказатьТаблицу///
///Конец Функция ПоказатьТаблицу///

Имя таб части: ДокументыРасчетовСКонтрагентом

 ///Функция ПоказатьТаблицу///
///Конец Функция ПоказатьТаблицу///

ДокументыМенеджер

Объект ДокументыМенеджер позволяет получить доступ ко всем менеджерам документов. Это можно сделать перебрав все менеджеры в цикле или обратившись к конкретному менеджеру по имени. Также данный объект позволяет проверить является ли ссылка ссылкой на какой-нибудь документ:

//получение конкретного менеджера документа по имени
МенеджерДокаПриход = Документы.ПриходТовара;
МенеджерДокаРасход = Документы["РасходТовара"];

//перебор всех менеджеров документа
Для Каждого МенеджерДока Из Документы Цикл
	Сообщить(МенеджерДока);	
КонецЦикла;	

СсылкаНаЧтото = ПолучитьСсылкуНаЧтото();

//проверка является ли ссылка ссылкой на документ
ВсеДоки = Документы.ТипВсеСсылки();
Если ВсеДоки.СодержитТип(ТипЗнч(СсылкаНаЧтото)) Тогда
	//это ссылка на документ
Иначе
	//что-то другое
КонецЕсли;

Создание документа программно

Чтобы программно создать документ нужно использовать метод менеджера документа СоздатьДокумент:

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


Программное заполнение документа

Для программного заполнения документа нужно обращаться к каждому реквизиту объекта по имени, через точку от объекта:

//создаем новый документ
ПриходныйДок = Документы.ПриходТовара.СоздатьДокумент();
//обязательно заполняем дату
ПриходныйДок.Дата = ТекущаяДатаСеанса();
//заполняем реквизиты Поставщик, Склад, Комментарий
ПриходныйДок.Поставщик = СсылкаНаПоставщика;
ПриходныйДок.Склад = СсылкаНаСклад;
ПриходныйДок.Комментарий = "документ создан программно";
//записываем в базу данных
ПриходныйДок.Записать();

Программное заполнение табличной части документа

К табличной части документа можно обратиться по имени, через точку от объекта. Затем через метод Добавить добавить новую строку табличной части. К реквизитам строки можно обращаться по имени, через точку от строки. В целом работа с табличной частью документа похожа на работу с таблицей значений:

//создаем новый документ
ПриходныйДок = Документы.ПриходТовара.СоздатьДокумент();
//добавим несколько строк в табличную часть СписокТоваров
НоваяСтрТЧ = ПриходныйДок.СписокТоваров.Добавить();
НоваяСтрТЧ.Товар = СсылкаНаТоварОдин;
НоваяСтрТЧ.Количество = 18;

НоваяСтрТЧ = ПриходныйДок.СписокТоваров.Добавить();
НоваяСтрТЧ.Товар = СсылкаНаТоварДва;
НоваяСтрТЧ.Количество = 36;

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

//записываем в базу данных
ПриходныйДок.Записать();

Программное изменение документа

Изменить документ можно только через программный объект. Для этого методом ПолучитьОбъект нужно получить из ссылки объект и потом изменить его реквизиты:

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


Программное копирование документа

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

//копия документа через ссылку
НоваяКопия = СсылкаНаДок.Скопировать();
НоваяКопия.Дата = ТекущаяДатаСеанса();
НоваяКопия.Записать();

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

Программное удаление документа

Пометить на удаление документ можно с помощью метода УстановитьПометкуУдаления. Параметром нужно передать значение пометки на удаление. При установке пометки на удаление документ автоматически распроводится, если он был проведен и записывается. Также можно полностью удалить документ из базы методом Удалить:

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

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

//снять пометку на удаление
ПриходныйДок.УстановитьПометкуУдаления(Ложь);

//удаление документа из базы
ПриходныйДок.Удалить();

Программное проведение документа

У документа нет отдельного метода для проведения документа. Проведение — это запись документа с проведением. Для проведения документа используется метод Записать, в который параметром нужно передать режим записи документа. Всего есть три режима записи: запись, проведение, отмена проведения. Если параметр не указан, то используется запись:

ПриходныйДок = Документы.ПриходТовара.СоздатьДокумент();
ПриходныйДок.Дата = ТекущаяДатаСеанса();

//запись документа
ПриходныйДок.Записать(РежимЗаписиДокумента.Запись);
//тоже запись
ПриходныйДок.Записать();

//проведение документа
ПриходныйДок.Записать(РежимЗаписиДокумента.Проведение);

//отмена проведения документа
ПриходныйДок.Записать(РежимЗаписиДокумента.ОтменаПроведения);

Программная работа с движениями документа

Через свойство Движения можно обращаться к движениям проведенного документа и даже редактировать их. Рассмотрим на примере:

ДатаПоиска = ТекущаяДатаСеанса();
ПриходныйДок = Документы.ПриходТовара.НайтиПоНомеру("АА0000003", ДатаПоиска);

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

//перебор всех регистров, по которым выполняются движения документом
Для Каждого Рег Из ДвиженияДока Цикл
	Сообщить(Рег);
КонецЦикла;	

//количество регистров из коллекции движений
КолвоРег = ДвиженияДока.Количество(); 

//поиск по имени регистра
РегОстатки = ДвиженияДока.Найти("ОстаткиТоваров");
Если Не РегОстатки = Неопределено Тогда
	//есть такой регистр
	//читаем записи регистра из базы данных
	РегОстатки.Прочитать();
	//перебирам в цикле и увеличиваем количество вдвое
	Для Каждого ЗаписьРег Из РегОстатки Цикл
		ЗаписьРег.Количество = ЗаписьРег.Количество * 2;	
	КонецЦикла;	
	//записываем
	РегОстатки.Записать();
КонецЕсли;

Программный поиск документа

Чтобы программно найти документ можно использовать методы НайтиПоНомеру и НайтиПоРеквизиту менеджера документа.

НайтиПоНомеру

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

ДатаПоиска = Дата(2021,1,1);
//в настройках нумерации указана Периодичность = В пределах года
ПриходныйДок = Документы.ПриходТовара.НайтиПоНомеру("000000017", ДатаПоиска);
//поиск будет выполняться среди документов за 2021 год с номером 000000017

//в настройках нумерации указана Периодичность = В пределах месяца
ПриходныйДок= Документы.ПриходТовара.НайтиПоНомеру("000000017", ДатаПоиска);
//поиск будет выполняться среди документов за январь 2021 год с номером 000000017

//в настройках нумерации указана Периодичность = Непериодический
//дату можно не указывать
ПриходныйДок = Документы.ПриходТовара.НайтиПоНомеру("000000017");
//поиск будет выполняться среди всех документов

//если документ не найден, то в ПриходныйДок будет пустая ссылка
Если ПриходныйДок = Документы.ПриходТовара.ПустаяСсылка() Тогда
	//не нашли
ИначеЕсли ПриходныйДок = Неопределено Тогда
	//для документа указана нулевая длина номера
Иначе
	//ПриходныйДок - ссылка на документ
КонецЕсли;

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

Метод НайтиПоРеквизиту принимает два параметра: имя реквизита и значение реквизита. Если реквизит имеет тип Строка, то поиск выполняется по точному соответствию. Нельзя искать по реквизиту с типом ХранилищеЗначения или неограниченная строка.

//поиск по реквизиту
//первый параметр - имя реквизита
//второй параметр - значение реквизита
ПриходныйДок = Документы.ПриходТовара.НайтиПоРеквизиту("Поставщик", СсылкаНаПоставщика);

//если документ не найден, то в ПриходныйДок будет пустая ссылка
Если ПриходныйДок = Документы.ПриходТовара.ПустаяСсылка() Тогда
	//не нашли
Иначе
	//ПриходныйДок - ссылка на найденный документ
	//если было несколько документов с таким значением реквизита, то 
	//будет найден первый попавшийся
КонецЕсли;

Выборка документов

Чтобы получить выборку документов можно воспользоваться методом Выбрать менеджера документа. Затем полученную выборку можно перебрать с помощью цикла Пока. На каждом витке цикла будут данные об одном документе. Через параметры метода можно ограничить выборку по периоду или по реквизитам.

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

//выборка документов за 2 месяца
ВыборкаПриходов = Документы.ПриходТовара.Выбрать(Дата(2021,1,1), Дата(2021,2,28));

//выборка всех документов, у которых дата больше 1 марта 2021
ВыборкаПриходов = Документы.ПриходТовара.Выбрать(Дата(2021,3,1));

//выборка всех документов, у которых дата меньше 15 марта 2021
ВыборкаПриходов = Документы.ПриходТовара.Выбрать(, Дата(2021,3,15));

//выборка документов с конкретной датой 
ОтборДок = Новый Структура("Дата", Дата(2021,3,22));
ВыборкаПриходов = Документы.ПриходТовара.Выбрать(,, ОтборДок);

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

//выборка отсортированная по убыванию даты
ВыборкаПриходов = Документы.ПриходТовара.Выбрать(,,, "Дата Убыв");

Выборка позволяет получать данные из базы порциями. Если в базе будет 1000000 документов, то выборка будет получить их небольшими порциями, а не загружать сразу все документы в оперативную память.

Программная работа с ссылкой на документ

Через ссылку на документ можно обратиться к реквизитам объекта. При этом будет неявно выполнен запрос к базе данных для получения значения реквизита. Так как работа с базой данных возможна только на сервере, то на клиенте нельзя от ссылки получать значения реквизитов:

Поставщик = СсылкаНаДокПриход.Поставщик;
ДатаДок = СсылкаНаДокПриход.Дата;
//однако на клиенте такой код не сработает с ошибкой:
// поле объекта не обнаружено

Для получения пустой ссылки можно использовать метод ПустаяСсылка. Для проверки на пустую ссылку можно воспользоваться методом Пустая:

//получение пустой ссылки на документ
ПустойДокПриход = Документы.ПриходТовара.ПустаяСсылка();

//проверка на пустую ссылку
Если ПустойДокПриход.Пустая() Тогда
	//пустая ссылка
КонецЕсли;	
//или так
Если ПустойДокПриход = Документы.ПриходТовара.ПустаяСсылка() Тогда
	//тоже пустая ссылка
КонецЕсли;

Сопоставление документов по идентификатору

У каждого документа есть уникальный идентификатор, который присваивается при первой записи документа и не может быть изменен. Часто при обмене между двумя базами данных требуется сопоставлять документы. Для этого можно использовать идентификаторы.

Пример выгрузки идентификатора документа. Уникальный идентификатор получается из ссылки методом УникальныйИдентификатор:

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

Пример сопоставления документов по идентификатору. Здесь используется метод ПолучитьСсылку для получения ссылки на документ по уникальному идентификатору и метод УстановитьСсылкуНового чтобы уникальный идентификатор нового документа был равен уникальному идентификатору, полученному из другой базы.

//ТаблицаЗагрузки - некая таблица с данными из другой базы
Для Каждого Стр ИЗ ТаблицаЗагрузки Цикл
	УИДПриходаСтрокой = Стр.УИД;
	//создаем уникальный идентификатор
	УИДПрихода = Новый УникальныйИдентификатор(УИДПриходаСтрокой);
	
	//получаем ссылку на документ
	ПриходныйДок = Документы.ПриходТовара.ПолучитьСсылку(УИДПрихода);
	//из ссылки получаем объект
	ДокПриходОбъект = ПриходныйДок.ПолучитьОбъект();
	Если ДокПриходОбъект = Неопределено Тогда
		//если объект = Неопределено значит документа с таким
		//идентификатором еще нет, создаем его
		ДокПриходОбъект = Документы.ПриходТовара.СоздатьДокумент();
		//...заполнение
		
		//до записи обязательно устанавливаем полученную ссылку 
		//тогда идентификаторы будут совпадать
		ДокПриходОбъект.УстановитьСсылкуНового(ПриходныйДок);
		ДокПриходОбъект.Записать();
	Иначе
		//уже есть документ с таким идентификатором,
		//перезаписываем его
	КонецЕсли;	
КонецЦикла;	

Смотрите также:
Электронный учебник по программированию в 1С
Рекомендации по изучению программирования 1С с нуля
Игра «Кто хочет стать миллионером?» с вопросами на определенную тематику (язык программирования JavaScript, английские, немецкие, французские, испанские, португальские, ни­дер­ландские, итальянские слова, электробезопасность, промышленная безопасность, бокс и т.п.), написанная на 1С
Программирование в 1С 8.3 с нуля — краткий самоучитель
Комплексная подготовка программистов 1С:Предприятие 8.2
Сайты с уроками программирования и со справочниками
Youtube-каналы с уроками программирования
Сайты для обучения программированию
Лекции и уроки

Как обратиться к реквизитам справочника из модуля формы

Автор Andrepan, 23 янв 2017, 11:06

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

Здравствуйте! Подскажите пожалуйста, как обратиться к реквизитам справочника из модуля формы документа. Есть табличная часть документа, в которой производится отбор номенклатуры товара по поставщикам из справочника НоменклатураПоставщиков. Нужно, чтобы при записи номенклатуры в документе, из соответствующих реквизитов Справочника поставщиков переносились в ячейки таблицы Документа характеристики товаров.
Делаю ПриИзменении (для записи Номенклатуры в документе) и объявляю переменную

СтрокаТабличнойЧасти = Элементы.ПриложениеКЗаявлению.ТекущиеДанные;
СтрокаТабличнойЧасти.ТНВД = ??


Если долго всматриваться в учебник…то в голову может прийти мысль его открыть!




Цитата: Andrepan от 23 янв 2017, 13:06Объект — Имя справочника справочника, реквизит — необходимый реквизит??

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

Спасибо за Сказать спасибо


...
СтрокаТабличнойЧасти = Элементы.ПриложениеКЗаявлению.ТекущиеДанные;
СтруктураРеквизитов = ПолучитьСтруктуруРеквизитов(СтрокаТабличнойЧасти.Номенклатура);
СтрокаТабличнойЧасти.ТНВД = СтруктураРеквизитов.ТНВД;
СтрокаТабличнойЧасти.ЛюбойРеквизитНоменклатуры = СтруктураРеквизитов.ЛюбойРеквизитНоменклатуры;
...

&НаСервере
Функция ПолучитьСтруктуруРеквизитов(НоменклатураСсылка)
    СтруктураРеквизитов = Новый Структура;
    СтруктураРеквизитов.Вставить("ТНВД", НоменклатураСсылка.ТНВД);
    СтруктураРеквизитов.Вставить("ЛюбойРеквизитНоменклатуры", НоменклатураСсылка.ЛюбойРеквизитНоменклатуры);
    Возврат СтруктураРеквизитов;
КонецФункции

Правило поведения на форуме №6: Не следует пытаться привлечь внимание к своему сообщению … рассылкой персональных сообщений и/или электронных писем отдельным участникам форума с просьбой ответить в теме.


Цитата: Golickoff от 24 янв 2017, 05:01
...
СтрокаТабличнойЧасти = Элементы.ПриложениеКЗаявлению.ТекущиеДанные;
СтруктураРеквизитов = ПолучитьСтруктуруРеквизитов(СтрокаТабличнойЧасти.Номенклатура);
СтрокаТабличнойЧасти.ТНВД = СтруктураРеквизитов.ТНВД;
СтрокаТабличнойЧасти.ЛюбойРеквизитНоменклатуры = СтруктураРеквизитов.ЛюбойРеквизитНоменклатуры;
...
&НаСервере
Функция ПолучитьСтруктуруРеквизитов(НоменклатураСсылка)
    СтруктураРеквизитов = Новый Структура;
    СтруктураРеквизитов.Вставить("ТНВД", НоменклатураСсылка.ТНВД);
    СтруктураРеквизитов.Вставить("ЛюбойРеквизитНоменклатуры", НоменклатураСсылка.ЛюбойРеквизитНоменклатуры);
    Возврат СтруктураРеквизитов;
КонецФункции

Спасибо большое! Все получилось.


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


ПолучениеСправочника = Справочники.НужныСправочник.НайтиПоНаименованию(«наименование»).ПолучитьОбъект;

И Потом ПолучениеСправочника.НужныйВамРеквизит;

Но такой скрипт выполняется только на стороне сервера


То есть, я из процедуры модуля формы:

Процедура ПриложениеКЗаявлениюНоменклатураТоваровПриИзменении(Элемент)

Должен вызвать Функцию на сервере в которой будет выполняться данный скрипт?


20 / 19 / 1

Регистрация: 13.08.2012

Сообщений: 779

1

Доступ к реквизиту справочника

26.10.2013, 18:55. Показов 26060. Ответов 12


Извиняюсь за дурацкий вопрос, но я что-то не могу понять как получить доступ к реквизиту существующего справочника из модуля обработки события «ПриИзменении» элемента формы документа, подскажите как правильно это сделать?

Добавлено через 6 минут
версия 1С 8.2.



0



Модератор

Эксперт 1С

3708 / 2905 / 572

Регистрация: 10.03.2011

Сообщений: 11,442

Записей в блоге: 1

26.10.2013, 19:01

2

Из обработки или документа?



0



856 / 655 / 111

Регистрация: 01.11.2012

Сообщений: 2,410

26.10.2013, 19:10

3

Обычное или управляемое приложение?



0



20 / 19 / 1

Регистрация: 13.08.2012

Сообщений: 779

26.10.2013, 19:56

 [ТС]

4

честно говоря не знаю обычное оно или управляемое, ну в документе есть табличная часть, в этой табличной части есть реквизит и вот модуль вызывается при изменении реквизита табличной части документа, необходимо реализовать что-то типо авто рассчета…



0



856 / 655 / 111

Регистрация: 01.11.2012

Сообщений: 2,410

26.10.2013, 19:58

5

Код выкладывай процедуры



0



NEvOl

20 / 19 / 1

Регистрация: 13.08.2012

Сообщений: 779

26.10.2013, 20:12

 [ТС]

6

Вот код

1C
1
2
3
4
5
6
7
8
&НаКлиенте
Процедура РасчетЗарплатыКоличествоЧасовПриИзменении(Элемент)
    ЗП = Справочники.Зарплата.НайтиПоНаименованию("НазваниеЗаписиВСправочнике").ПолучитьОбъект();//пытаюсь получить доступ реквизиту
    СтоимостьЧаса = ЗП.СтоимостьЧаса;
    СтрокаТабличнойЧасти = Элементы.РасчетЗарплаты.ТекущиеДанные;
    СтрокаТабличнойЧасти.Сумма = СтрокаТабличнойЧасти.КоличествоДней*СтрокаТабличнойЧасти.КоличествоЧасов*СтоимостьЧаса;
 
КонецПроцедуры

говорит необъявленная переменная «Справочники»



0



856 / 655 / 111

Регистрация: 01.11.2012

Сообщений: 2,410

26.10.2013, 20:24

7

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



0



NEvOl

20 / 19 / 1

Регистрация: 13.08.2012

Сообщений: 779

26.10.2013, 21:04

 [ТС]

8

переделал так:

1C
1
2
3
4
5
6
7
&НаСервере
Процедура РасчетЗарплатыКоличествоЧасовПриИзменении(Элемент)
    ЗП = Справочники.Зарплата.НайтиПоНаименованию("Николаев Сергей").ПолучитьОбъект();
    СтоимостьЧаса = ЗП.СтоимостьЧаса;
    СтрокаТабличнойЧасти = Элементы.РасчетЗарплаты.ТекущиеДанные;
    СтрокаТабличнойЧасти.Сумма = СтрокаТабличнойЧасти.КоличествоДней*СтрокаТабличнойЧасти.КоличествоЧасов*СтоимостьЧаса;
КонецПроцедуры

теперь не работает, не заполняет поле Сумма, но ошибки не выдает

Добавлено через 17 минут
сделал вот так вот:

1C
1
2
3
4
5
6
&НаКлиенте
Процедура РасчетЗарплатыКоличествоЧасовПриИзменении(Элемент)
    СтоимостьЧаса = ПолучениеРеквизита.ПолучитьРеквизит();
    СтрокаТабличнойЧасти = Элементы.РасчетЗарплаты.ТекущиеДанные;
    СтрокаТабличнойЧасти.Сумма = СтрокаТабличнойЧасти.КоличествоДней*СтрокаТабличнойЧасти.КоличествоЧасов;
КонецПроцедуры

Создал общий модуль
ПолучениеРеквизита
вот содержимое его:

1C
1
2
3
4
5
6
&НаСервере
Функция ПолучитьРеквизит() Экспорт
    ЗП = Справочники.Зарплата.НайтиПоНаименованию("НазваниеЗаписиВСправочнике").ПолучитьОбъект();
    СтоимостьЧаса = ЗП.СтоимостьЧаса;
    Возврат СтоимостьЧаса;
КонецФункции

при изменении количество часов выпригивает ошибка » Метод объекта не обнаружен (ПолучитьРеквизит)» что я напортачил ?



0



Dethmontt

Модератор

Эксперт 1С

3708 / 2905 / 572

Регистрация: 10.03.2011

Сообщений: 11,442

Записей в блоге: 1

26.10.2013, 21:52

9

Каша у вас в голове (в коде)

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

» Метод объекта не обнаружен (ПолучитьРеквизит)» что я напортачил ?

Это потому что ты галочку у модуля не поставил (вызов сервера)

Добавлено через 28 секунд

Не по теме:

То что у вас написано вряд ли вообще работать будет…

Добавлено через 8 минут

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
&НаКлиенте
Процедура РасчетЗарплатыКоличествоЧасовПриИзменении(Элемент)
    СтоимостьЧаса = ПолучитьСтоимостьЧаса("Иванов Иван Иванович"); //Наверное в табличной части и ссылка на справочник сотрудников есть?
    Сообщить(СтоимостьЧаса);
    СтрокаТабличнойЧасти = Элементы.РасчетЗарплаты.ТекущиеДанные;
    СтрокаТабличнойЧасти.Сумма = СтрокаТабличнойЧасти.КоличествоДней*СтрокаТабличнойЧасти.КоличествоЧасов;
КонецПроцедуры
 
&НаСервереБезКонтекста
Функция ПолучитьСтоимостьЧаса(ФормальныйПараметр)
 
   ТекЧило = 0;
   тСсылка = Справочники.НайтиПоНаименованию(ФормальныйПараметр,Истина);
   Если Не тСсылка.Пустая() Тогда
       ТекЧисло = тСсылка.СтоимостьЧаса;
   КонецЕсли;
   Возврат ТекЧисло;
 
КонецФункции



1



20 / 19 / 1

Регистрация: 13.08.2012

Сообщений: 779

26.10.2013, 21:59

 [ТС]

10

а что делает функция Сообщить ? зачем она ? и в качестве форматного параметра можно передовать строковую константу если мне всегда необходимо для 1 сотрудника рассчитывать ?

Добавлено через 48 секунд
эти обе функции в одном модуле изменения описать ?



0



duk337

26.10.2013, 22:05

Не по теме:

а что делает функция Сообщить ?

вот единственно: на сервере не работает. А так: сообщает. Синт.пом глядим, да?



0



20 / 19 / 1

Регистрация: 13.08.2012

Сообщений: 779

26.10.2013, 22:19

 [ТС]

12

и почему пропущено имя справочника ? при получении ссылки

Добавлено через 10 минут
все заработало, спасибо)



0



0 / 0 / 0

Регистрация: 17.12.2015

Сообщений: 1

17.12.2015, 19:37

13

СПАСИБО!



0



Содержание:

1.    Реквизиты объекта и реквизиты формы в 1С

2.    Как получить значения из элементов формы 1С  

1.    Реквизиты объекта и реквизиты формы в 1С

В обычном приложении у элемента формы 1С 8.3 было свойство «Значение», доступное как для чтения, так и для записи. Какой аналог в управляемом приложении?

Элементы формы 1С 8.3 могут содержать реквизиты двух видов: реквизиты объекта 1С и реквизиты формы.

Красным помечен реквизит объекта 1С Контрагент, а зеленым – реквизит формы в 1С.

Интерактивно выберем эти элементы в пользовательском режиме 1С и попробуем прочитать их «программно» кнопкой «Прочитать».

Если читать значения реквизитов в клиентской процедуре, то код для 1С Предприятия будет следующий:


Все бы хорошо: мы получили на клиенте значения реквизитов объекта 1С и формы, но – не значения элементов формы 1С. На клиенте значение элементов формы 1С получить нельзя. 

2.    Как получить значения из элементов формы 1С

Чтобы получить значения из элементов формы 1С, нам потребуется серверный вызов:

Именно на сервере у элемента формы 1С 8.3 становится доступно свойство ПутьКДанным, по которому его можно извлечь либо из Объекта, который имеет тип ДанныеФормыСтруктура:

…либо из Формы, которая имеет тип ФормаКлиентскогоПриложения:


Форма и ее элементы не видны на сервере без контекста. То есть код для 1С:Предприятия выдаст множество ошибок.

Также Форму нельзя передать как параметр в процедуру и функцию на сервер или в общий модуль.


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


Новое значение доступно как параметр процедуры ВыбранноеЗначение.


Система дает шанс что-то сделать в этой ситуации.

Специалист компании ООО «Кодерлайн»

Добрыгин Михаил

Понравилась статья? Поделить с друзьями:
  • Какие авто подходят под бизнес в яндекс такси
  • Какие автомобильные компании кому принадлежат
  • Как продать акции иностранных компаний сейчас
  • Какие акции китайских компаний стоит покупать
  • Как продать долю в компании если соучредитель