8.х Как сделать видимой колонку для сервера

Тема в разделе "Общие вопросы "1С:Предприятие 8"", создана пользователем бухг123, 22 дек 2012.

  1. TopicStarter Overlay
    бухг123
    Offline

    бухг123 Опытный в 1С

    Регистрация:
    8 дек 2011
    Сообщения:
    219
    Симпатии:
    0
    Баллы:
    26
    Здравсвтуйте. Помогите.

    Пробую сделать следующее. В табличной части докумета ПриИзменении в колонке Номенклатуры (Спр.Номенклатура) он должен передавать значения подчиненного ему справочника Параметры Длина, Высота.
    Код:
    &НаКлиенте
    Процедура ПроверНоменклатураПриИзменении(Элемент)
    Запрашиваем();
    КонецПроцедуры
    &НаСервере
    Процедура Запрашиваем()
    
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
    | НовыеПараметры.Ссылка.Владелец,
    | НовыеПараметры.Длина,
    | НовыеПараметры.Высота
    |ИЗ
    | Справочник.НовыеПараметры.Таблиц КАК НовыеПараметры
    |ГДЕ
    | НовыеПараметры.Ссылка.Владелец = &Владелец";
    Запрос.УстановитьПараметр("Владелец", Объект.Провер.Номенклатура);
    
    Рез = Запрос.Выполнить().Выбрать();
    Пока Рез.Следующий() Цикл
    
    Объект.Провер.Длина = Рез.Длина;
    Объект.Провер.Высота = Рез.Высота;
    
    КонецЦикла;
    
    КонецПроцедуры
    Выскакивает сообщение;
    Код:
    // {Документ.ПоНовымПараметрам.Форма.ФормаДокумента.Форма(19)}: Поле объекта не обнаружено (Номенклатура)
    //  Запрос.УстановитьПараметр("Владелец", Объект.Провер.Номенклатура);
    Анлогичная операция с реквизитами формы документа получалась.
    С табличной частью пробовал разное, передавать к клиента,
    Код:
    Элементы.Провер.ТекущиеДанные;
    на сервере тоже пробовал запрашивать ТекущиеДанные выскакивают ошибки. Как сделать видимой колонку для сервера?
  2. 1cUserAndrew
    Offline

    1cUserAndrew Профессионал в 1С Команда форума

    Регистрация:
    27 май 2010
    Сообщения:
    4.948
    Симпатии:
    149
    Баллы:
    104
    Код:
    ТекСтрока = Элементы.Провер.ТекущиеДанные;
    Запрос.УстановитьПараметр("Владелец", ТекСтрока.Номенклатура);
    ...
    ТекСтрока.Длина = Рез.Длина;
    ТекСтрока.Высота = Рез.Высота;
  3. TopicStarter Overlay
    бухг123
    Offline

    бухг123 Опытный в 1С

    Регистрация:
    8 дек 2011
    Сообщения:
    219
    Симпатии:
    0
    Баллы:
    26
    Код:
    &НаКлиенте
    Процедура ПроверНоменклатураПриИзменении(Элемент)
    Запрашиваем();
    КонецПроцедуры
    &НаСервере
    Процедура Запрашиваем()
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
    | НовыеПараметры.Ссылка.Владелец,
    | НовыеПараметры.Длина,
    | НовыеПараметры.Высота
    |ИЗ
    | Справочник.НовыеПараметры.Таблиц КАК НовыеПараметры
    |ГДЕ
    | НовыеПараметры.Ссылка.Владелец = &Владелец";
    ТекСтрока = Элементы.Провер.ТекущиеДанные;
    Запрос.УстановитьПараметр("Владелец", ТекСтрока.Номенклатура);
    
    Рез = Запрос.Выполнить().Выбрать();
    Пока Рез.Следующий() Цикл
    
    ТекСтрока.Длина = Рез.Длина;
    ТекСтрока.Высота = Рез.Высота;
    
    КонецЦикла;
    
    КонецПроцедуры
    
    Выскакивает сообщение:
    Код:
    //{Документ.ПоНовымПараметрам.Форма.ФормаДокумента.Форма(19)}: Ошибка при получении значения атрибута контекста (ТекущиеДанные)
    //ТекСтрока = Элементы.Провер.ТекущиеДанные;
    
    Спасибо за помощь но что то не так может быть из за того что Справочник.Параметры подчинен Справочнику.Номенклатура вроде запрос проверял выдает то что нужно.
  4. 1cUserAndrew
    Offline

    1cUserAndrew Профессионал в 1С Команда форума

    Регистрация:
    27 май 2010
    Сообщения:
    4.948
    Симпатии:
    149
    Баллы:
    104
    Нее ... тут дело в другом.
    Я сам немного протупил ))
    Свойство "ТекущиеДанные" не доступно на сервере.

    Тут несколько вариантов:
    1) через идентификатор строки.
    2) через структуру (как в типовых).

    Создаете структуру, в качестве ключей которой будут имена нужных колонок. Заполняете значения этой структуры данными строки, передаете на сервер, там с ней что-то делаете. По возвращении на клиента заполняете текущую строку значениями из структуры. Всё :)

    Код:
    &НаКлиенте
    Процедура ПроверНоменклатураПриИзменении(Элемент)
    ДанныеСтрокаТаблицы = Новый Структура("Номенклатура, Длина, Высота");
    ЗаполнитьЗначенияСвойств(ДанныеСтрокаТаблицы, Элементы.Провер.ТекущиеДанные);
    Запрашиваем(ДанныеСтрокаТаблицы);
    ЗаполнитьЗначенияСвойств(Элементы.Провер.ТекущиеДанные, ДанныеСтрокаТаблицы);
    КонецПроцедуры
    
    
    
    &НаСервереБезКонтекста
    Процедура Запрашиваем(СтрокаТабЧасти)
    ...
    Запрос.УстановитьПараметр("Владелец", СтрокаТабЧасти.Номенклатура);
    Рез = Запрос.Выполнить().Выбрать();
    Пока Рез.Следующий() Цикл
    СтрокаТабЧасти.Длина = Рез.Длина;
    СтрокаТабЧасти.Высота = Рез.Высота;
    КонецЦикла;
    КонецПроцедуры
    
  5. TopicStarter Overlay
    бухг123
    Offline

    бухг123 Опытный в 1С

    Регистрация:
    8 дек 2011
    Сообщения:
    219
    Симпатии:
    0
    Баллы:
    26
    Спасибо большое все получилось!

    Вообще получается что на сервере и клиенте методы получения строк разные. На сервере это просто пустые ячейки и строки а на клиенте это значения уже предопределенных ячеек сервером. Север при открытии каждого документа на клиенте уже передает все данные этому документу в том числе каждую строку и какой у него будет тип и по умолчанию, документ даже без заполненной таблицы имеет эти поля и строки с уже установленными типами этих ячеек. Поэтому наверное обращение к строкам таблицы от Клиента идет через метод ТекущиеДанные?
    Это в принципе понятно когда мы создаем документ мы сразу же прописываем какого типа будет каждое из реквизитов полей (строки или булево или ссылка и тд) Не понимаю почему Сервер не может видеть эти значения просто прямым обращением Объект.Провер.Номенклатура ведь создавая документ в конфигураторе мы уже задаем все значения этой таблицы на сервер.
    А вообще спасибо большое за помощь 1CUserAndrew
  6. 1cUserAndrew
    Offline

    1cUserAndrew Профессионал в 1С Команда форума

    Регистрация:
    27 май 2010
    Сообщения:
    4.948
    Симпатии:
    149
    Баллы:
    104
    Не за что ))

    Плохо понял Вашу мысль из предыдущего сообщения :smile:.

    В общем виде данные табличной части существуют и на клиенте и на сервере. И там, и там мы можем к ним обращаться.
    Но только не так: Объект.Провер.Номенклатура.

    Потому что это КОЛЛЕКЦИЯ. Там может быть много-много строк. Можно только либо обратиться к конкретной строке
    Код:
    //К первой строке
    Объект.Провер[0].Номенклатура
    Либо обойти все строки в цикле
    Код:
    Для каждого Стр Из Объект.Провер Цикл
    ЗначениеНоменклатуры = Стр.Номенклатура;
    КонецЦикла;
  7. TopicStarter Overlay
    бухг123
    Offline

    бухг123 Опытный в 1С

    Регистрация:
    8 дек 2011
    Сообщения:
    219
    Симпатии:
    0
    Баллы:
    26
    Спасибо.

Поделиться этой страницей