Всех приветствую. Мужики подскажите есть такой код в форме документа ЗаказКлиенту Процедура УстановитьУсловноеОформление

```1c
    Элемент = УсловноеОформление.Элементы.Добавить();

    ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
    ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыНоменклатура.Имя);

    ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.ВесЧ.ВесЧислитель");
    ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.НеЗаполнено;
    ОтборЭлемента.Использование = Истина;
    Элемент.Оформление.УстановитьЗначениеПараметра("ЦветФона", WebЦвета.Аквамарин);
```

 я создал поле на форме, куда из справочника номенклатура выводится вес (Числитель), так вот с помощью кода, я хочу, чтобы в том товаре где не заполнен вес, фон строки становится иным от белого, но получается, что окрашиваются все строки, не зависимо от заполнения, как будто бы все заполнено, но при этом в колонке видно что вес не заполнен.
---
В дереве реквизитов формы раскрыть реквизит Объект, найти ТЧ Товары, на нем ПКМ - добавить колонку реквизита, колонку назвать "ВесЗаполнен", тип - булево.
В процедуру ПриСозданииНаСервере дописать:

```1c
    Для каждого ТекСтрока из Объект.Товары Цикл
    ТекСтрока.ВесЗаполнен = ТекСтрока.Номенклатура.ВесЧислитель <> 0
    КонецЦикла;
```

В обработчик события ТоварыНоменклатураПриИзменении дописать:

```1c
    ТекДанные = Элементы.Товары.ТекущиеДанные;
    ТекДанные.ВесЗаполнен = ОбщегоНазначения.ПолучитьЗначениеРеквизита(ТекДанные.Номенклатура, "ВесЧислитель") <> 0;
```

В условное оформление добавить окраску фона по полю "ВесЗаполнен".
---
Ну тогда

```1c
    ТекДанные.ВесЗаполнен = ПолучитьЗначениеРеквизита(ТекДанные.Номенклатура, "ВесЧислитель") <> 0;
```

В модуль добавить функцию

```1c
    &НаСервере
    Функция ПолучитьЗначениеРеквизита(Ссылка, ИмяРеквизита)
    Возврат Ссылка[ИмяРеквизита]
    КонецФункции
```
---
```1c
    Отбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.VID_ВесЗаполнен")
```
---
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Заполнено;
Поэтому окрашиваются все.

Так понимаю, нужно сделать:

```1c
    ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.НеЗаполнено;
```
---
Блин да я вчера вечером колдовал и вставил последний код, сейчас исправил, но толку нет, тоже самое. Может я поле не правильно добавил? Я добавил Реквизит ВесЧ в табличную часть Товары, ссылка этого реквизита на справочник Номенклатура, дальше на форме создал поле и ссылку на созданный реквизит, Объект.Товары.ВесЧ.ВесЧислитель
---
Нужно условие-то написать....
Если Объект.Товары.ВесЧ > 0 тогда окрасить конец если
---
а код поймет команду окрасить?
---
это упрощенно нписано)))

Если
ПолеКомпоновкиДанных("Объект.Товары.ВесЧ.ВесЧислитель") > 0 тогда

Элемент.Оформление.УстановитьЗначениеПараметра("ЦветФона", WebЦвета.Аквамарин);
конецесли;

Как-то так должно получиться
---
Если
ПолеКомпоновкиДанных("Объект.Товары.ВесЧ.ВесЧислитель") > 0 тогда

Элемент.Оформление.УстановитьЗначениеПараметра("ЦветФона", WebЦвета.Аквамарин);
конецесли;
{VID Документ.ЗаказКлиента.Форма.ФормаДокумента.Форма(157,1)}: Процедура или функция с указанным именем не определена (ПолеКомпоновкиДанных)
<<?>>ПолеКомпоновкиДанных("Объект.Товары.ВесЧ.ВесЧислитель") > 0 тогда (Проверка: Сервер)
---
Попробуйте по условию больше 0
---
По идее наверное так:
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ОтборЭлемента.ПравоеЗначение = 0;
---
А может сделать не кодом, а в свойства условное оформление формы? Тут можно типы напутать, поля, а там выбрать руками
---
не получается, я пробовал. Но увы, вообще ничего не происходит, даже не окрашивается
---
Вы что то не правильно делаете. Покажите как в свойствах делали
---
В оформляемых полях нужно выбрать конкретный столбец.
---
Может я поле неправильно создал?
---
и еще если там тип число, то условия сделайте равно 0
---
У меня есть колонка с заголовком VID_Вес товара, а имя ТоварыВесЧ, ссылка этой колонки Объект.Товары.Номенклатура.ВесЧислитель. на форме она (колонка) отображается! значения показывает, если заполнено конечно. Так вот как мне прописать ее в коде, чтобы условие срабатывало именно по ней
---
Добавьте в табличную часть "Товары" реквизита формы "Объект" колонку с типом булево, при изменении номенклатуры пишите туда ложь если вес товара заполнен и истину - если нет. Заполняйте ее также при открытии. По ней красьте строки.
---
знать бы как это прописать в коде, с удовольствием бы сделал, сделать реквизит не проблема, а вот прописать, с этим у меня еще сложности
---
ВесЧ - это вообще что? Реквизит справочника Номенклатура? Табличная часть справочника Номенклатура?
---
У меня есть колонка с заголовком VID_Вес товара, а имя ТоварыВесЧ, ссылка этой колонки Объект.Товары.Номенклатура.ВесЧислитель. на форме она (колонка) отображается! значения показывает, если заполнено конечно. Так вот как мне прописать ее в коде, чтобы условие срабатывало именно по ней
---
В дереве реквизитов формы раскрыть реквизит Объект, найти ТЧ Товары, на нем ПКМ - добавить колонку реквизита, колонку назвать "ВесЗаполнен", тип - булево.
В процедуру ПриСозданииНаСервере дописать:

```1c
    Для каждого ТекСтрока из Объект.Товары Цикл
    ТекСтрока.ВесЗаполнен = ТекСтрока.Номенклатура.ВесЧислитель <> 0
    КонецЦикла;
```

В обработчик события ТоварыНоменклатураПриИзменении дописать:

```1c
    ТекДанные = Элементы.Товары.ТекущиеДанные;
    ТекДанные.ВесЗаполнен = ОбщегоНазначения.ПолучитьЗначениеРеквизита(ТекДанные.Номенклатура, "ВесЧислитель") <> 0;
```

В условное оформление добавить окраску фона по полю "ВесЗаполнен".
---
ТекДанные = Элементы.Товары.ТекущиеДанные;
ТекДанные.ВесЗаполнен = ОбщегоНазначения.ПолучитьЗначениеРеквизита(ТекДанные.Номенклатура, "ВесЧислитель") <> 0;
{Документ.ЗаказКлиента.Форма.ФормаДокумента.Форма(1395,29)}: Переменная не определена (ОбщегоНазначения)
    ТекДанные.ВесЗаполнен = <<?>>ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ТекДанные.Номенклатура, "ВесЧислитель") <> 0; (Проверка: Тонкий клиент)
---
Ну тогда

```1c
    ТекДанные.ВесЗаполнен = ПолучитьЗначениеРеквизита(ТекДанные.Номенклатура, "ВесЧислитель") <> 0;
```

В модуль добавить функцию

```1c
    &НаСервере
    Функция ПолучитьЗначениеРеквизита(Ссылка, ИмяРеквизита)
    Возврат Ссылка[ИмяРеквизита]
    КонецФункции
```
---
&НаСервере
Функция ПолучитьЗначениеРеквизита(Ссылка, ИмяРеквизита)
    Возврат Ссылка[ИмяРеквизита]
КонецФункции
В модуль формы или документа?
---
Формы, конечно же.
---
```1c
    {Документ.ЗаказКлиента.Форма.ФормаДокумента.Форма(1396,29)}: Переменная не определена (ОбщегоНазначения)
    ТекДанные.VID_ВесЗаполнен = <<?>>ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Номенклатура, "ВесЧислитель") <> 0; (Проверка: Тонкий клиент)
    {Документ.ЗаказКлиента.Форма.ФормаДокумента.Форма(1396,72)}: Переменная не определена (Номенклатура)
    ТекДанные.VID_ВесЗаполнен = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(<<?>>Номенклатура, "ВесЧислитель") <> 0; (Проверка: Тонкий клиент)
```

ТАКЖЕ!
---
ОбщегоНазначения - это название общего модуля. В конфигурации есть общий модуль под названием ОбщегоНазначения?

Что за переменная Номенклатура? Откуда она взялась?
---
Да есть и он ссылается на него при нажатии F12
---
Значит, он серверный. Плюньте на него и сделайте как в (24)
---
о сейчас норм, а В условное оформление добавить окраску фона по полю "ВесЗаполнен", делать в Процедура УстановитьУсловноеОформление(
---
{Документ.ЗаказКлиента.Форма.ФормаДокумента.Форма(167)}: Поле объекта не обнаружено (VID_ВесЗаполнен)
    ТекСтрока.VID_ВесЗаполнен = ТекСтрока.Номенклатура.ВесЧислитель <> 0
при открытии Заказа в 1с
---
Реквизит-то в табличную часть добавил? Покажи скриншот.
---
Это не реквизит табличной части.
---
так все по инструкции сделал, нужно было в ветку конфигурации сделать реквизит чтоли?
---
В инструкции сказано: "найти ТЧ Товары, на нем ПКМ - добавить колонку реквизита".
---
Вот Ваша инструкция
 дереве реквизитов формы раскрыть реквизит Объект, найти ТЧ Товары, на нем ПКМ - добавить колонку реквизита, колонку назвать "ВесЗаполнен", тип - булево.
В процедуру ПриСозданииНаСервере дописать:
---
блин колонку реквизита
---
Выглядеть он должен так:
---
Перемещать на форму нужно или не обязательно
---
На форме он не нужен, он нужен для условного оформления.
---
Ок. Но условное оформление все равно не работает, хотя значения заполняются(((

```1c
    Оформление = УсловноеОформление.Элементы.Добавить();
    Оформление.Использование = Истина;
    //// VID(
    //Для табличных частей нужно указывать оформляемые поля в ручную.
    Поле = Оформление.Поля.Элементы.Добавить();
    Поле.Поле = Новый ПолеКомпоновкиДанных("ТоварыНоменклатура");
    Отбор = Оформление.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    Отбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("VID_ВесЗаполнен");// неопбходимо обращаться к объекту формы!
    Отбор.ВидСравнения = ВидСравненияКомпоновкиДанных.НеЗаполнено;
    Отбор.Использование = Истина;
    Оформление.Оформление.УстановитьЗначениеПараметра("ЦветФона", WebЦвета.Аквамарин);
```
---
```1c
    Отбор.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
    Отбор.ПравоеЗначение = Ложь;
```
---
ок, тоже додумался до этого, сейчас обновляю
---
Вообще не заполняет

```1c
    Оформление = УсловноеОформление.Элементы.Добавить();
    Оформление.Использование = Истина;
    //// VID(
    //Для табличных частей нужно указывать оформляемые поля в ручную.
    Поле = Оформление.Поля.Элементы.Добавить();
    Поле.Поле = Новый ПолеКомпоновкиДанных("ТоварыНоменклатура");
    Отбор = Оформление.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    Отбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("VID_ВесЗаполнен");// неопбходимо обращаться к объекту формы!
    Отбор.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
    Отбор.ПравоеЗначение = Ложь;
    //Отбор.Использование = Истина;
    Оформление.Оформление.УстановитьЗначениеПараметра("ЦветФона", WebЦвета.Аквамарин)
```
---
```1c
    Отбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.VID_ВесЗаполнен")
```
---
Отбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.VID_ВесЗаполнен")
Спасибо все получилось!
---
ТекДанные = Элементы.Товары.ТекущиеДанные;
ТекДанные.ВесЗаполнен = ОбщегоНазначения.ПолучитьЗначениеРеквизита(ТекДанные.Номенклатура, "ВесЧислитель") <> 0;
(24) ТекДанные.ВесЗаполнен = ПолучитьЗначениеРеквизита(ТекДанные.Номенклатура, "ВесЧислитель") <> 0;

```1c
    Функция ЗначенияРеквизитовОбъекта(Ссылка, Знач Реквизиты, ВыбратьРазрешенные = Ложь) Экспорт

    // Если передано имя предопределенного.
    Если ТипЗнч(Ссылка) = Тип("Строка") Тогда

    ПолноеИмяПредопределенногоЭлемента = Ссылка;

    // Вычисление ссылки по имени предопределенного.
    // - дополнительно выполняет проверку метаданных предопределенного, выполняется предварительно.
    Попытка
    Ссылка = ПредопределенныйЭлемент(ПолноеИмяПредопределенногоЭлемента);
    Исключение
    ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
    НСтр("ru = 'Неверный первый параметр Ссылка в функции ОбщегоНазначения.ЗначенияРеквизитовОбъекта:
    |%1'"), КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
    ВызватьИсключение ТекстОшибки;
    КонецПопытки;

    // Разбор полного имени предопределенного.
    ЧастиПолногоИмени = СтрРазделить(ПолноеИмяПредопределенногоЭлемента, ".");
    ПолноеИмяОбъектаМетаданных = ЧастиПолногоИмени[0] + "." + ЧастиПолногоИмени[1];

    // Если предопределенный не создан в ИБ, то требуется выполнить проверку доступа к объекту.
    // В других сценариях проверка доступа выполняется в момент исполнения запроса.
    Если Ссылка = Неопределено Тогда
    МетаданныеОбъекта = Метаданные.НайтиПоПолномуИмени(ПолноеИмяОбъектаМетаданных);
    Если Не ПравоДоступа("Чтение", МетаданныеОбъекта) Тогда
    ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
    НСтр("ru = 'Недостаточно прав для работы с таблицей "%1"'"), ПолноеИмяОбъектаМетаданных);
    КонецЕсли;
    КонецЕсли;

    Иначе // Если передана ссылка.

    Попытка
    ПолноеИмяОбъектаМетаданных = Ссылка.Метаданные().ПолноеИмя();
    Исключение
    ВызватьИсключение
    НСтр("ru = 'Неверный первый параметр Ссылка в функции ОбщегоНазначения.ЗначенияРеквизитовОбъекта:
    |- Значение должно быть ссылкой или именем предопределенного элемента'");
    КонецПопытки;

    КонецЕсли;

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

    // Удаление пробелов.
    Реквизиты = СтрЗаменить(Реквизиты, " ", ");
    // Преобразование параметра в массив полей.
    Реквизиты = СтрРазделить(Реквизиты, ",");
    КонецЕсли;

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

    СтруктураПолей = Реквизиты;

    ИначеЕсли ТипЗнч(Реквизиты) = Тип("Массив")
    Или ТипЗнч(Реквизиты) = Тип("ФиксированныйМассив") Тогда

    Для Каждого Реквизит Из Реквизиты Цикл

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

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

    // Не удалось распознать ошибку, проброс первичной ошибки.
    ВызватьИсключение;

    КонецПопытки;
    КонецЦикла;
    Иначе
    ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
    НСтр("ru = 'Неверный тип второго параметра Реквизиты в функции ОбщегоНазначения.ЗначенияРеквизитовОбъекта: %1'"),
    Строка(ТипЗнч(Реквизиты)));
    КонецЕсли;

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

    // Формирование текста запроса к выбираемым полям.
    ТекстЗапросаПолей = ";
    Для каждого КлючИЗначение Из СтруктураПолей Цикл

    ИмяПоля = ?(ЗначениеЗаполнено(КлючИЗначение.Значение),
    КлючИЗначение.Значение,
    КлючИЗначение.Ключ);
    ПсевдонимПоля = КлючИЗначение.Ключ;

    ТекстЗапросаПолей =
    ТекстЗапросаПолей + ?(ПустаяСтрока(ТекстЗапросаПолей), ", ",") + "
    | " + ИмяПоля + " КАК " + ПсевдонимПоля;

    // Предварительное добавление поля по псевдониму в возвращаемый результат.
    Результат.Вставить(ПсевдонимПоля);

    КонецЦикла;

    // Если предопределенного нет в ИБ.
    // - приведение результата к отсутствию объекта в ИБ или передаче пустой ссылки.
    Если Ссылка = Неопределено Тогда
    Возврат Результат;
    КонецЕсли;

    ТекстЗапроса =
    "ВЫБРАТЬ РАЗРЕШЕННЫЕ
    |&ТекстЗапросаПолей
    |ИЗ
    | &ПолноеИмяОбъектаМетаданных КАК Таблица
    |ГДЕ
    | Таблица.Ссылка = &Ссылка";

    Если Не ВыбратьРазрешенные Тогда
    ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "РАЗРЕШЕННЫЕ", ");
    КонецЕсли;

    ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ТекстЗапросаПолей", ТекстЗапросаПолей);
    ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ПолноеИмяОбъектаМетаданных", ПолноеИмяОбъектаМетаданных);

    // Выполнение запроса.
    Запрос = Новый Запрос;
    Запрос.УстановитьПараметр("Ссылка", Ссылка);
    Запрос.Текст = ТекстЗапроса;

    Попытка
    Выборка = Запрос.Выполнить().Выбрать();
    Исключение

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

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

    // Не удалось распознать ошибку, проброс первичной ошибки.
    ВызватьИсключение;

    КонецПопытки;

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

    Возврат Результат;

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

    // Возвращает значения реквизита, прочитанного из информационной базы по ссылке на объект.
    // Рекомендуется использовать вместо обращения к реквизитам объекта через точку от ссылки на объект
    // для быстрого чтения отдельных реквизитов объекта из базы данных.
    //
    // Если необходимо зачитать реквизит независимо от прав текущего пользователя,
    // то следует использовать предварительный переход в привилегированный режим.
    //
    // Параметры:
    // Ссылка - ЛюбаяСсылка - объект, значения реквизитов которого необходимо получить.
    // - Строка - полное имя предопределенного элемента, значения реквизитов которого необходимо получить.
    // ИмяРеквизита - Строка - имя получаемого реквизита.
    // ВыбратьРазрешенные - Булево - если Истина, то запрос к объекту выполняется с учетом прав пользователя;
    // если есть ограничение на уровне записей, то возвращается Неопределено;
    // если нет прав для работы с таблицей, то возникнет исключение;
    // если Ложь, то возникнет исключение при отсутствии прав на таблицу
    // или любой из реквизитов.
    //
    // Возвращаемое значение:
    // Произвольный - зависит от типа значения прочитанного реквизита.
    // - если в параметр Ссылка передана пустая ссылка, то возвращается Неопределено;
    // - если в параметр Ссылка передана ссылка несуществующего объекта (битая ссылка),
    // то возвращается Неопределено.
    //
    Функция ЗначениеРеквизитаОбъекта(Ссылка, ИмяРеквизита, ВыбратьРазрешенные = Ложь) Экспорт

    Если ПустаяСтрока(ИмяРеквизита) Тогда
    ВызватьИсключение
    НСтр("ru = 'Неверный второй параметр ИмяРеквизита в функции ОбщегоНазначения.ЗначениеРеквизитаОбъекта:
    |- Имя реквизита должно быть заполнено'");
    КонецЕсли;

    Результат = ЗначенияРеквизитовОбъекта(Ссылка, ИмяРеквизита, ВыбратьРазрешенные);
    Возврат Результат[СтрЗаменить(ИмяРеквизита, ".", ")];

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

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

    Если ТипЗнч(Реквизиты) = Тип("Массив") Или ТипЗнч(Реквизиты) = Тип("ФиксированныйМассив") Тогда
    Реквизиты = СтрСоединить(Реквизиты, ",");
    КонецЕсли;

    Если ПустаяСтрока(Реквизиты) Тогда
    ВызватьИсключение
    НСтр("ru = 'Неверный второй параметр Реквизиты в функции ОбщегоНазначения.ЗначенияРеквизитовОбъектов:
    |- Поле объекта должно быть указано'");
    КонецЕсли;

    Если СтрНайти(Реквизиты, ".") <> 0 Тогда
    ВызватьИсключение
    НСтр("ru = 'Неверный второй параметр Реквизиты в функции ОбщегоНазначения.ЗначенияРеквизитовОбъектов:
    |- Обращение через точку не поддерживается'");
    КонецЕсли;

    ЗначенияРеквизитов = Новый Соответствие;
    Если Ссылки.Количество() = 0 Тогда
    Возврат ЗначенияРеквизитов;
    КонецЕсли;

    СсылкиПоТипам = Новый Соответствие;
    Для Каждого Ссылка Из Ссылки Цикл
    Тип = ТипЗнч(Ссылка);
    Если СсылкиПоТипам[Тип] = Неопределено Тогда
    СсылкиПоТипам[Тип] = Новый Массив;
    КонецЕсли;
    СсылкиПоТипам[Тип].Добавить(Ссылка);
    КонецЦикла;

    ТекстыЗапросов = Новый Массив;
    ПараметрыЗапроса = Новый Структура;

    ИменаОбъектовМетаданных = Новый Массив;

    Для Каждого СсылкиПоТипу Из СсылкиПоТипам Цикл
    Тип = СсылкиПоТипу.Ключ;

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

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

    Если Не ВыбратьРазрешенные Или ТекстыЗапросов.Количество() > 0 Тогда
    ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "РАЗРЕШЕННЫЕ", ");
    КонецЕсли;

    ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&Реквизиты", Реквизиты);
    ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ПолноеИмяОбъектаМетаданных", ПолноеИмяОбъектаМетаданных);
    ИмяПараметра = "Ссылки" + СтрЗаменить(ПолноеИмяОбъектаМетаданных, ".", ");
    ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&Ссылки", "&" + ИмяПараметра);
    ПараметрыЗапроса.Вставить(ИмяПараметра, СсылкиПоТипу.Значение);

    ТекстыЗапросов.Добавить(ТекстЗапроса);
    КонецЦикла;

    ТекстЗапроса = СтрСоединить(ТекстыЗапросов, Символы.ПС + "ОБЪЕДИНИТЬ ВСЕ" + Символы.ПС);

    Запрос = Новый Запрос(ТекстЗапроса);
    Для Каждого Параметр Из ПараметрыЗапроса Цикл
    Запрос.УстановитьПараметр(Параметр.Ключ, Параметр.Значение);
    КонецЦикла;

    Попытка
    Выборка = Запрос.Выполнить().Выбрать();
    Исключение

    // Удаление пробелов.
    Реквизиты = СтрЗаменить(Реквизиты, " ", ");
    // Преобразование параметра в массив полей.
    Реквизиты = СтрРазделить(Реквизиты, ",");

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

    Если ЗначениеЗаполнено(СписокОшибок) Тогда
    ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
    НСтр("ru = 'Неверный второй параметр Реквизиты в функции ОбщегоНазначения.ЗначенияРеквизитовОбъектов: %1'"),
    СтрСоединить(СписокОшибок, Символы.ПС));
    КонецЕсли;

    // Не удалось распознать ошибку, проброс первичной ошибки.
    ВызватьИсключение;

    КонецПопытки;

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

    Возврат ЗначенияРеквизитов;

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

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