7.7 Подскажите чайнику

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 7.7"", создана пользователем Илья Ильич, 22 ноя 2011.

  1. TopicStarter Overlay
    Илья Ильич
    Offline

    Илья Ильич

    Регистрация:
    22 ноя 2011
    Сообщения:
    2
    Симпатии:
    0
    Баллы:
    1
    Я только начал изучение 1С. И у меня многое не получается. Так что не судите строго.
    Вопрос 1: у меня на форме есть 2 поля со списком. После выбора элемента в первом поле во втором должен появляться список его реквизитов. Так вот как реализовать обработчик события первого поля при изменении.
    Вопрос 2: у меня справочник преобразован в список значений. Проблема: у меня не получается добыть само значение по реквизиту.

    Код:
    x = ПолучитьЗначение(s_arr, (first + last) / 2).ВыборРеквизита();
    
    говорит: Поле агрегатного объекта не обнаружено (ВыборРеквизита)

    Код:
    Функция ВыборРеквизита()
    <span style='cursor: pointer; color:red' Onclick="window.open('http://www.1c-pro.ru/wiki/index.php/возврат')">Возврат   ПолеРеквизит.ПолучитьЗначение(ПолеРеквизит.ТекущаяСтрока());</span>
    КонецФункции 
    
    а если указываю напрямую:
    Код:
    x = ПолучитьЗначение(s_arr, (first + last) / 2).Код;
    
    то все норм. Только у меня реквизит заранее неизвестен и такой способ не подходит.
  2. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    1) Обработчик события реализуйте в виде процедуры. Вызов запихните в поле формула реквизита формы
    2) Немного не понял. Весь справочник Запихнули в СЗ? ЗАЧЕМ?
    И поясните фразу не получается добыть само значение по реквизиту. Приведите пример. Возможно при установке путаете значение с представлением
  3. TopicStarter Overlay
    Илья Ильич
    Offline

    Илья Ильич

    Регистрация:
    22 ноя 2011
    Сообщения:
    2
    Симпатии:
    0
    Баллы:
    1
    мне нужна статическая фильтрация по реквизиту, который выбирается пользователем. поэтому решил запихнуть его в СЗ.

    и наверное не так выразился. у меня в переменную х помещается значение из справочника, то есть полностью строка (Код=1, Наименование="глобус", Цена=230, ..., и т.д.). а мне надо в х поместить значение не всей строки а какого-то элемента из этой строки (например 230) по выбранным пользователем реквизитам.

    Это можно решить таким способом:

    x = ПолучитьЗначение(s_arr, (first + last) / 2).Цена;

    Но все дело в том, что у меня заранее не известен реквизит для отбора. Его выбирает пользователь, для чего у меня есть функция:

    Функция ВыборРеквизита()
    Возврат ПолеРеквизит.ПолучитьЗначение(ПолеРеквизит.ТекущаяСтрока()) ;
    КонецФункции

    если я пишу
    x = ПолучитьЗначение(s_arr, (first + last) / 2).ВыборРеквизита();
    то выдает ошибку.

    и я не могу решить проблему.
  4. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Вам нужно только одно. Знать реквизит справочника номенклатуры. Все остальное зависит уже от него (цена, код наименование). Вот и помещайте его! А что получаем - уже можно узнать из позиции списка значений
  5. dianofob
    Offline

    dianofob (-_-)y-.o0O

    Регистрация:
    3 июл 2009
    Сообщения:
    711
    Симпатии:
    0
    Баллы:
    26
    такая конструкция конечно работать не будет, потому что у твоего значения "ПолучитьЗначение(s_arr, (first + last) / 2)" нет такого метода "ВыборРеквизита()"..
    ща

    как-то так, если я правильно тебя понял.. хотя можно сделать и по-хитрее

    перезалил..
    Единственное нужны проверки для периодических.. По ним как известно с отбором все не так просто, но возможно :)

    не-то перезалил.. но вобщем создаем еще поле на форме "ВыбЗнач" с типом Неопределенный, на список2 в формулу вешаем вызов "ИзменитьТипЗначения()"
    Код:
    Procedure ИзменитьТипЗначения()
    ЗначВыбора = GetEmptyValue();
    ВыбранныйСправочник = ПолеСоСписком1.GetValue(ПолеСоСписком1.CurSel());
    ВидРеквизита = "";
    If ПолеСоСписком2.CurSel() = 1 Then
    ТипРеквизита = MetaData.Reference(ВыбранныйСправочник).CodeType;
    If ТипРеквизита = "Числовой" Then
    ТипРеквизита = "Число";
    Else
    ТипРеквизита = "Строка";
    EndIf;
    ElsIf  ПолеСоСписком2.CurSel() = 2 Then
    ТипРеквизита = "Строка";
    Else
    ВыбранныйРеквизит = ПолеСоСписком2.GetValue(ПолеСоСписком2.CurSel());
    ТипРеквизита = MetaData.Reference(ВыбранныйСправочник).Attribute(ВыбранныйРеквизит).Type;
    If (ТипРеквизита <>"Число") And (ТипРеквизита <>"Строка") And (ТипРеквизита <>"Дата") Then
    ВидРеквизита = MetaData.Reference(ВыбранныйСправочник).Attribute(ВыбранныйРеквизит).Kind;
    EndIf;
    EndIf;
    Form.ЗначВыбора.SetType(ТипРеквизита+?(ВидРеквизита = "","","."+ВидРеквизита));
    EndProcedure
    
    Procedure ПерезаполнитьРеквизиты()
    ПолеСоСписком2.RemoveAll();
    ВыбранныйСправочник = ПолеСоСписком1.GetValue(ПолеСоСписком1.CurSel());
    ПолеСоСписком2.AddValue("Код");
    ПолеСоСписком2.AddValue("Наименование");
    For i = 1 To MetaData.Reference(ВыбранныйСправочник).Attribute() Do
    ПолеСоСписком2.AddValue(MetaData.Reference(ВыбранныйСправочник).Attribute(i).Identifier);
    EndDo;    
    ПолеСоСписком2.CurSel(1);
    ИзменитьТипЗначения();
    EndProcedure
    
    Procedure OnOpen()
    For i = 1 To MetaData.Reference() Do
    ПолеСоСписком1.AddValue(MetaData.Reference(i).Identifier);
    EndDo;
    ПолеСоСписком1.CurSel(1);
    ПерезаполнитьРеквизиты();
    EndProcedure
    
    Procedure Main()
    Message("Выбрали справочник '"+ПолеСоСписком1.GetValue(ПолеСоСписком1.CurSel())+"' и реквизит '"+ПолеСоСписком2.GetValue(ПолеСоСписком2.CurSel())+"'");
    EndProcedure
    
    
    

    Вложения:

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