Здравствуйте. Подскажите пожалуйста, внес в конфигурации изменения, а именно добавил колонки в форму документа (Вес,Объем), вывел итоговые значения по всему документа в нижнюю чать формы, (сделал расчет итогов в модуле формы документа) но после применения изменений, при открытии документа заказ клиента на тонком клиенте пишет ошибку не обнаружено поле объекта вес числитель, в толстом клиенте все открывается. Базу удалял из списка, создавал новую, но результата нет. Что может быть? как исправит? пока пользователи работают на толстом клиенте!
---
В модуле формы создайте функцию:

```1c
    &НаСервере
    Функция ПолучитьСведенияНоменклатуры(Номенклатура)
    Возврат СведенияНоменклатуры = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Строка.Номенклатура, "ОбъемЧислитель, ВесЧислитель");
    КонецФункции
```

А далее в вашем коде:

```1c
    Объем1 = 0;
    Вес1 = 0;
    Для Каждого Строка Из Объект.Товары Цикл

    СведенияНоменклатуры = ПолучитьСведенияНоменклатуры(Строка.Номенклатура);

    Объем1 = Объем1 + Строка.Количество * СведенияНоменклатуры.ОбъемЧислитель;
    Вес1 = Вес1 + Строка.Количество * СведенияНоменклатуры.ВесЧислитель;

    СтрокаТД.ВесТовара = СтрокаТД.Количество * СведенияНоменклатуры.ВесЧислитель;
    СтрокаТД.ОбъемТовара = СтрокаТД.Количество * СведенияНоменклатуры.ОбъемЧислитель;

    КонецЦикла;
    ИтогоВес = Вес1;
    ИтогоОбъем = Объем1;
```
---
```1c
    &НаСервереБезКонтекста
    Функция ПолучитьСведенияНоменклатуры(Номенклатура)
    Возврат ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Номенклатура, "ОбъемЧислитель, ВесЧислитель");
    КонецФункции
```
---
На "клиенте" обратился через точку. Для толстого клиента это нормально а вот для тонкого нет.
---
а как поправить?

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

    Для каждого СтрокаТД из Объект.Товары Цикл
    СтрокаТД.ВесТовара = СтрокаТД.Количество * СтрокаТД.Номенклатура.ВесЧислитель;
    СтрокаТД.ОбъемТовара = СтрокаТД.Количество * СтрокаТД.Номенклатура.ОбъемЧислитель;
    КонецЦикла;
```
---
Либо сделать все это "НаСервере" либо использовать

```1c
    ОбщегоНазначенияСервер.ЗначениеРеквизитаОбъекта(Строка.Номенклатура, "ОбъемЧислитель");
```
---
а где это вставить, просто я баобаб еще в этом, мне желательно прям пальцем воткнуть или прям рядом с моим кодом?
---
Вот он код:

```1c
    Объем1 = 0;
    Вес1 = 0;
    Для Каждого Строка Из Объект.Товары Цикл

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

    Объем1 = Объем1 + Строка.Количество * СведенияНоменклатуры.ОбъемЧислитель;
    Вес1 = Вес1 + Строка.Количество * СведенияНоменклатуры.ВесЧислитель;

    СтрокаТД.ВесТовара = СтрокаТД.Количество * СведенияНоменклатуры.ВесЧислитель;
    СтрокаТД.ОбъемТовара = СтрокаТД.Количество * СведенияНоменклатуры.ОбъемЧислитель;

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

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

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

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

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

    // Если предопределенный не создан в ИБ, то требуется выполнить проверку доступа к объекту.
    // В других сценариях проверка доступа выполняется в момент исполнения запроса.
    Если Ссылка = Неопределено Тогда

    МетаданныеОбъекта = Метаданные.НайтиПоПолномуИмени(ПолноеИмяОбъектаМетаданных);

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

    КонецЕсли;

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

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

    КонецЕсли;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    КонецЦикла;

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

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

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

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

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

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

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

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

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

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

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

 А это функция куда я проваливаюсь
---
В модуле формы создайте функцию:

```1c
    &НаСервере
    Функция ПолучитьСведенияНоменклатуры(Номенклатура)
    Возврат СведенияНоменклатуры = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Строка.Номенклатура, "ОбъемЧислитель, ВесЧислитель");
    КонецФункции
```

А далее в вашем коде:

```1c
    Объем1 = 0;
    Вес1 = 0;
    Для Каждого Строка Из Объект.Товары Цикл

    СведенияНоменклатуры = ПолучитьСведенияНоменклатуры(Строка.Номенклатура);

    Объем1 = Объем1 + Строка.Количество * СведенияНоменклатуры.ОбъемЧислитель;
    Вес1 = Вес1 + Строка.Количество * СведенияНоменклатуры.ВесЧислитель;

    СтрокаТД.ВесТовара = СтрокаТД.Количество * СведенияНоменклатуры.ВесЧислитель;
    СтрокаТД.ОбъемТовара = СтрокаТД.Количество * СведенияНоменклатуры.ОбъемЧислитель;

    КонецЦикла;
    ИтогоВес = Вес1;
    ИтогоОбъем = Объем1;
```
---
```1c
    &НаСервере
    Функция ПолучитьСведенияНоменклатуры(Номенклатура)
    Возврат ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Строка.Номенклатура, "ОбъемЧислитель, ВесЧислитель");
    КонецФункции
```
---
```1c
    &НаСервереБезКонтекста
    Функция ПолучитьСведенияНоменклатуры(Номенклатура)
    Возврат ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Номенклатура, "ОбъемЧислитель, ВесЧислитель");
    КонецФункции
```
---
&НаСервере
Функция ПолучитьСведенияНоменклатуры(Номенклатура)
Возврат ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Строка.Номенклатура, "ОбъемЧислитель, ВесЧислитель");
КонецФункции
Функция ПолучитьСведенияНоменклатуры(Номенклатура)
Возврат ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Строка.Номенклатура, "ОбъемЧислитель, ВесЧислитель");
КонецФункции
---
см. (13)
---
может быть это из-за того, что в форме у меня нет строки ОбъемЧислитель?
---
ОбъемЧислитель - это реквизит Номенклатуры. Эта функция возвращает значения реквизитов "ОбъемЧислитель" и "ВесЧислитель" из номенклатуры
---
А у вас в справочнике "Номенклатуры" эти реквизиты добавлены?
---
да
---
вроде как разобрался, я просто вынес опять за границу этот цикл и для него он не видит эти реквизиты, сейчас пподредактирую
---
Зачем дважды делать обход таб. части это не корректно
---
получилось, спасибо.
---
```1c
    &НаСервереБезКонтекста
    Функция ПолучитьСведенияНоменклатуры(Номенклатура)
    Возврат ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Номенклатура, "ОбъемЧислитель, ВесЧислитель");
    КонецФункции

    &НаКлиенте
    Процедура ПриОткрытии(Отказ)

    // СтандартныеПодсистемы.Свойства
    УправлениеСвойствамиКлиент.ПослеЗагрузкиДополнительныхРеквизитов(ЭтотОбъект);
    // Конец СтандартныеПодсистемы.Свойства

    МенеджерОборудованияКлиент.НачатьПодключениеОборудованиеПриОткрытииФормы(Неопределено, ЭтаФорма, "СканерШтрихкода");

    // ЭлектронноеВзаимодействие.ОбменСКонтрагентами
    ОбменСКонтрагентамиКлиент.ПриОткрытии(ЭтотОбъект);
    // Конец ЭлектронноеВзаимодействие.ОбменСКонтрагентами

    // ИнтернетПоддержкаПользователей.СПАРКРиски, ПриОткрытии.
    СПАРКРискиКлиент.ПриОткрытии(ЭтотОбъект, Неопределено);
    // Конец ИнтернетПоддержкаПользователей.СПАРКРиски, ПриОткрытии.

    // СтандартныеПодсистемы.ПодключаемыеКоманды
    ПодключаемыеКомандыКлиент.НачатьОбновлениеКоманд(ЭтотОбъект);
    // Конец СтандартныеПодсистемы.ПодключаемыеКоманды
    //VID(
    Объем1 = 0;
    Вес1 = 0;
    Для Каждого Строка Из Объект.Товары Цикл

    СведенияНоменклатуры = ПолучитьСведенияНоменклатуры(Строка.Номенклатура);

    Объем1 = Объем1 + Строка.Количество * СведенияНоменклатуры.ОбъемЧислитель;
    Вес1 = Вес1 + Строка.Количество * СведенияНоменклатуры.ВесЧислитель;

    КонецЦикла;
    ИтогоВес = Вес1;
    ИтогоОбъем = Объем1;

    Для каждого СтрокаТД из Объект.Товары Цикл
    СтрокаТД.ВесТовара = СтрокаТД.Количество * СведенияНоменклатуры.ВесЧислитель;
    СтрокаТД.ОбъемТовара = СтрокаТД.Количество * СтрокаТД.Номенклатура.ОбъемЧислитель;
    КонецЦикла;

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

    //VID)

    КонецПроцедуры
```
---
```1c
    &НаСервереБезКонтекста
    Функция ПолучитьСведенияНоменклатуры(Номенклатура)
    Возврат ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Номенклатура, "ОбъемЧислитель, ВесЧислитель");
    КонецФункции

    &НаКлиенте
    Процедура ПриОткрытии(Отказ)

    // СтандартныеПодсистемы.Свойства
    УправлениеСвойствамиКлиент.ПослеЗагрузкиДополнительныхРеквизитов(ЭтотОбъект);
    // Конец СтандартныеПодсистемы.Свойства

    МенеджерОборудованияКлиент.НачатьПодключениеОборудованиеПриОткрытииФормы(Неопределено, ЭтаФорма, "СканерШтрихкода");

    // ЭлектронноеВзаимодействие.ОбменСКонтрагентами
    ОбменСКонтрагентамиКлиент.ПриОткрытии(ЭтотОбъект);
    // Конец ЭлектронноеВзаимодействие.ОбменСКонтрагентами

    // ИнтернетПоддержкаПользователей.СПАРКРиски, ПриОткрытии.
    СПАРКРискиКлиент.ПриОткрытии(ЭтотОбъект, Неопределено);
    // Конец ИнтернетПоддержкаПользователей.СПАРКРиски, ПриОткрытии.

    // СтандартныеПодсистемы.ПодключаемыеКоманды
    ПодключаемыеКомандыКлиент.НачатьОбновлениеКоманд(ЭтотОбъект);
    // Конец СтандартныеПодсистемы.ПодключаемыеКоманды
    //VID(
    Объем1 = 0;
    Вес1 = 0;
    Для Каждого Строка Из Объект.Товары Цикл

    СведенияНоменклатуры = ПолучитьСведенияНоменклатуры(Строка.Номенклатура);

    Объем1 = Объем1 + Строка.Количество * СведенияНоменклатуры.ОбъемЧислитель;
    Вес1 = Вес1 + Строка.Количество * СведенияНоменклатуры.ВесЧислитель;

    Строка.ВесТовара = Строка.Количество * СведенияНоменклатуры.ВесЧислитель;
    Строка.ОбъемТовара = Строка.Количество * СведенияНоменклатуры.ОбъемЧислитель;

    КонецЦикла;
    ИтогоВес = Вес1;
    ИтогоОбъем = Объем1;

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

    //VID)

    КонецПроцедуры
```
---
Этот код вставьте и все будет нормально, а ошибка была в месте

```1c
    СтрокаТД.ОбъемТовара = СтрокаТД.Количество * СтрокаТД.Номенклатура.ОбъемЧислитель;
```