8.х Произвольный запрос к форме выбора справочника.

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем deman_ru, 3 окт 2013.

  1. TopicStarter Overlay
    deman_ru
    Offline

    deman_ru Опытный в 1С

    Регистрация:
    27 дек 2011
    Сообщения:
    165
    Симпатии:
    1
    Баллы:
    29
    Суть проблемы в названии темы. Не могу разобраться как в 8.1 это реализовать. Пример как это сделать в 8.2 нашел, все понятно. Но в 8.1 никак! Подскажите пожалуйста, как это сделать?
    Я хочу сделать такой запрос, чтобы при выборе позиции номенклатуры из справочника, сразу тянулось из регистра накопления информация об остатках номенклатуры.
  2. nickpugachev
    Offline

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

    Регистрация:
    28 май 2012
    Сообщения:
    3.266
    Симпатии:
    131
    Баллы:
    104
    в 8.1 в табличное поле на форме добавляйте свои колонки для остатков и вешайтесь на событие ПриВыводеСтроки табличного поля. По данным строки определяйте номенклатуру, вытягивайте ее остатки и заполняйте текст оформления ячейки для колонок остатков
  3. TopicStarter Overlay
    deman_ru
    Offline

    deman_ru Опытный в 1С

    Регистрация:
    27 дек 2011
    Сообщения:
    165
    Симпатии:
    1
    Баллы:
    29
    то есть эта фишка с запросом появилась только в версии 8.2 да?
  4. TopicStarter Overlay
    deman_ru
    Offline

    deman_ru Опытный в 1С

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

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

    Регистрация:
    28 май 2012
    Сообщения:
    3.266
    Симпатии:
    131
    Баллы:
    104
    СправочникСписок.ТекущиеДанные - это текущая выделенная строка, если нет выделенной строки, значение будет Неопределено.

    А та строка, которая выводится по событию, приходит в процедуру в параметре ДанныеСтроки, т.е. надо
    Код:
    Запрос.УстановитьПараметр("Препарат", ДанныеСтроки.Ссылка);
    К тому же у вас, я так понимаю, не строка в измерении регистра, а ссылка.


    Ну и фишка с запросом есть и в 8.2 только в управляемых формах, в обычных - так же, как и в 8.1
  6. TopicStarter Overlay
    deman_ru
    Offline

    deman_ru Опытный в 1С

    Регистрация:
    27 дек 2011
    Сообщения:
    165
    Симпатии:
    1
    Баллы:
    29
    Спасибо!

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

    где я не прав?
  7. TopicStarter Overlay
    deman_ru
    Offline

    deman_ru Опытный в 1С

    Регистрация:
    27 дек 2011
    Сообщения:
    165
    Симпатии:
    1
    Баллы:
    29
    И так, разобрался, вот что у меня получилось:
    Код:
    Процедура СправочникСписокПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
    Если НЕ ДанныеСтроки.ЭтоГруппа тогда
    
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    | ОстаткиНоменклатурыОстатки.Препарат,
    | ОстаткиНоменклатурыОстатки.КоличествоОстаток
    |ИЗ
    | РегистрНакопления.ОстаткиНоменклатуры.Остатки КАК ОстаткиНоменклатурыОстатки
    |ГДЕ
    | ОстаткиНоменклатурыОстатки.Препарат = &Препарат";
    
    Запрос.УстановитьПараметр("Препарат", ОформлениеСтроки.ДанныеСтроки.Ссылка);
    Выборка = Запрос.Выполнить().Выбрать();
    ОформлениеСтроки.Ячейки.Остаток.ОтображатьТекст = Истина;
    ОформлениеСтроки.Ячейки.Остаток.Текст = Выборка.КоличествоОстаток;
    
    Пока Выборка.Следующий() Цикл
    ОформлениеСтроки.Ячейки.Остаток.Текст = Выборка.КоличествоОстаток;
    КонецЦикла
    
    КонецЕсли
    КонецПроцедуры
    
    Все работает!
  8. nickpugachev
    Offline

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

    Регистрация:
    28 май 2012
    Сообщения:
    3.266
    Симпатии:
    131
    Баллы:
    104
    Код:
    ОформлениеСтроки.Ячейки.Остаток.ОтображатьТекст= Истина;
    Если Выборка.Следующий() Тогда
    ОформлениеСтроки.Ячейки.Остаток.Текст = ""+Выборка.КоличествоОстаток;
    Иначе
    ОформлениеСтроки.Ячейки.Остаток.Текст = "";
    КонецЕсли;
  9. TopicStarter Overlay
    deman_ru
    Offline

    deman_ru Опытный в 1С

    Регистрация:
    27 дек 2011
    Сообщения:
    165
    Симпатии:
    1
    Баллы:
    29
    Хотел раскрасить отрицательные остатки, сделал так:
    Код:
     Если НЕ ДанныеСтроки.ЭтоГруппа тогда
    
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    | ОстаткиНоменклатурыОстатки.Препарат,
    | ОстаткиНоменклатурыОстатки.КоличествоОстаток
    |ИЗ
    | РегистрНакопления.ОстаткиНоменклатуры.Остатки КАК ОстаткиНоменклатурыОстатки
    |ГДЕ
    | ОстаткиНоменклатурыОстатки.Препарат = &Препарат";
    
    Запрос.УстановитьПараметр("Препарат", ОформлениеСтроки.ДанныеСтроки.Ссылка);
    Выборка = Запрос.Выполнить().Выбрать();
    ОформлениеСтроки.Ячейки.Остаток.ОтображатьТекст = Истина;
    Пока Выборка.Следующий() Цикл
    Если Выборка.КоличествоОстаток<0 Тогда
    ОформлениеСтроки.Ячейки.Остаток.ЦветТекста = WebЦвета.Красный;
    ОформлениеСтроки.Ячейки.Остаток.Выравнивание = ГоризонтальноеПоложение.Право;
    ОформлениеСтроки.Ячейки.Остаток.Текст = Выборка.КоличествоОстаток;
    Иначе
    ОформлениеСтроки.Ячейки.Остаток.ЦветТекста = WebЦвета.Черный;
    ОформлениеСтроки.Ячейки.Остаток.Выравнивание = ГоризонтальноеПоложение.Право;
    ОформлениеСтроки.Ячейки.Остаток.Текст = Выборка.КоличествоОстаток;
    КонецЕсли
    КонецЦикла
    
    Информацию не выводит. Что я не так мог сделать, подскажите пожалуйста!
  10. nickpugachev
    Offline

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

    Регистрация:
    28 май 2012
    Сообщения:
    3.266
    Симпатии:
    131
    Баллы:
    104
    если Препарат - измерение в регистре, то в запросе лучше использовать виртуальную таблицу
    РегистрНакопления.ОстаткиНоменклатуры.Остатки( , Препарат=&Препарат)

    ну и преобразование числа к строке сделать
  11. TopicStarter Overlay
    deman_ru
    Offline

    deman_ru Опытный в 1С

    Регистрация:
    27 дек 2011
    Сообщения:
    165
    Симпатии:
    1
    Баллы:
    29
    Ладно, сравнения чисел я опустил. Мне в голову взбрела другая идейка)
    Обращение к выше созданной форме у меня выполняется из табличной части документа. Так вот, как сделать, чтобы после выбора нужной строки из справочника (с произвольным запросом) у меня не только наименование препарата попало в ТЧ документа, но и значение количества?? В ТЧ документа такое поле присутствует.
  12. nickpugachev
    Offline

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

    Регистрация:
    28 май 2012
    Сообщения:
    3.266
    Симпатии:
    131
    Баллы:
    104
    если хочется весь остаток в количество подставить - то отрабатывать выбор в обработчике ПриНачалеВыбора элемента ячейки полностью, программно принимая выбранную номенктатуру из формы выбора и устанавливая ее и ее количество (еще раз тот же запрос :)) в ТЧ документа, а не просто открывать форму выбора
  13. vartanet
    Offline

    vartanet Опытный в 1С Команда форума

    Регистрация:
    16 ноя 2010
    Сообщения:
    2.698
    Симпатии:
    15
    Баллы:
    29
    все таки лучше использовать ПриПолученииДаннных(), чтобы не получилось запроса в цикле - для каждой выводимой строки.
  14. TopicStarter Overlay
    deman_ru
    Offline

    deman_ru Опытный в 1С

    Регистрация:
    27 дек 2011
    Сообщения:
    165
    Симпатии:
    1
    Баллы:
    29
    Я не понял Ваш способ, сам попробовал сделать так:
    В событии "Обработка выбора" поля препарат, табличной части номенклатура я прописал:
    Код:
     ТДНоменклатура = ЭлементыФормы.Номенклатура.ТекущиеДанные;
    Препарат =  ТДНоменклатура.Препарат;
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    | ОстаткиНоменклатурыОстатки.Препарат,
    | ОстаткиНоменклатурыОстатки.КоличествоОстаток
    |ИЗ
    | РегистрНакопления.ОстаткиНоменклатуры.Остатки КАК ОстаткиНоменклатурыОстатки
    |ГДЕ
    | ОстаткиНоменклатурыОстатки.Препарат = &amp;Препарат";
    
    Запрос.УстановитьПараметр("Препарат", Препарат);
    Выборка = Запрос.Выполнить().Выбрать();
    
    Стр = ЭлементыФормы.Номенклатура.ТекущиеДанные;
    Стр.Количество = Выборка.Количество;
    Не работает, я не знаю почему(

    Пробовал вот так:
    Код:
    Стр=ЭлементыФормы.Номенклатура.Добавить();
    Стр.Препарат = Выборка.Препарат;
    Стр.Количество = Выборка.Количество;
    Но тогда добавляет мне пустую строку, а мне это не нужно.

    Подскажите пожалуйста как правильно?
  15. TopicStarter Overlay
    deman_ru
    Offline

    deman_ru Опытный в 1С

    Регистрация:
    27 дек 2011
    Сообщения:
    165
    Симпатии:
    1
    Баллы:
    29
    Может быть мне данные строки тч справочника, поместить в массив, а потом из массива загрузить в текущую строку тч документа?
    Только в какой последовательности это сделать и при отработке каких событий?
    Если это не бред конечно...
  16. vartanet
    Offline

    vartanet Опытный в 1С Команда форума

    Регистрация:
    16 ноя 2010
    Сообщения:
    2.698
    Симпатии:
    15
    Баллы:
    29
    что вы привязались к форме выбора справочника. создайте свою собственную форму. открывайте эту форму для выбора. при открытии поместите в неё все необходимые вам данные. обрабатывайте результат выбора.

    посмотрите как подбор работает.
  17. TopicStarter Overlay
    deman_ru
    Offline

    deman_ru Опытный в 1С

    Регистрация:
    27 дек 2011
    Сообщения:
    165
    Симпатии:
    1
    Баллы:
    29
    просто данная форма выбора автоматически формирует мне форму иерархического справочника, слева группы, справа элементы. как это сделать самостоятельно я не знаю(
    если Вы мне подскажите или покажите пример, буду Вам очень благодарен!
    В идеале хотелось бы сделать так:
    С лева (справочник дерево), а справа (справочник список) у меня бы отображались движения по регистру накопления "остатки номенклатуры". Той номенклатуры которая относится к выбранной группе в справочник дерево.
  18. TopicStarter Overlay
    deman_ru
    Offline

    deman_ru Опытный в 1С

    Регистрация:
    27 дек 2011
    Сообщения:
    165
    Симпатии:
    1
    Баллы:
    29
    Сделал как посоветовали, но опять уперся в проблему плохого знания языка.
    В документе есть табличная часть "Номенклатура", в ней есть поля "Препарат" и "Количество".
    Я добавляю новую строку, нажимаю на поле выбора "Препарат", у меня открывается произвольная форма, в которой есть табличное поле, в котором отображаются строки выбора из запроса, запрос к регистру накопления. В этой таблице так же есть поля, препарат и количество.
    Так вот, как мне выбрать нужную строку в этой табличной части и ее данные занести в строку табличной части документа?
    В каких событиях, при помощи каких методов? Подскажите пожалуйста! Очень нужно!
  19. TopicStarter Overlay
    deman_ru
    Offline

    deman_ru Опытный в 1С

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

    Если я в обработчике события "Выбор" табличного поля дочерней формы пишу:
    Код:
    Процедура ТабличноеПоле1Выбор(Элемент, ВыбраннаяСтрока, Колонка, СтандартнаяОбработка)
    ОповеститьОВыборе(ВыбраннаяСтрока);
    КонецПроцедуры
    Дочерняя форма закрывается, данные из нее в табличную часть родительской не попадают
    что не так?

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