8.х добавление новой колонки и заполнение результатом запроса

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

  1. TopicStarter Overlay
    smitog
    Offline

    smitog Опытный в 1С

    Регистрация:
    14 авг 2011
    Сообщения:
    52
    Симпатии:
    0
    Баллы:
    26
    Привет. Нужно создать и заполнить колонку в табличном поле форме списка справочника контактные лица данными из регистра сведений КонтактнаяИнформация, колонка будет называться телефоны. Колонку я создал, но как ее заполнить результатом запроса ни как не могу сообразить, плюс еще телефоны должны появляться у тех у кого они есть. Делаю все в процедуре ПриОткрытии формы Списка. Табличное поле формы списка имеет ТипЗначение "СправочникСписок.КонтактныеЛица"

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

    Вложения:

  2. ASh
    Offline

    ASh Опытный в 1С

    Регистрация:
    10 сен 2008
    Сообщения:
    568
    Симпатии:
    0
    Баллы:
    26
    Для того, чтобы заполнить колонку не связанную с данными, нужно воспользоваться одним из событий табличного поля - ПриВыводеСтроки или ПриПолученииДанных.
    В Вашем случае, имхо, ПриВыводеСтроки предпочтительнее. Запрос у Вас составлен неверно, конечный результат должен выглядеть примерно так:

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

    BabySG Администраторы Команда форума Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    12
    Баллы:
    29
    В ПриВыводе строки не будет предпочтительнее.
    Использовать необходимо ПриПолученииДанных.
    Пример http://www.1c-pro.ru/index.php?showtopic=10706
  4. TopicStarter Overlay
    smitog
    Offline

    smitog Опытный в 1С

    Регистрация:
    14 авг 2011
    Сообщения:
    52
    Симпатии:
    0
    Баллы:
    26
    ASh, BabySG спасибо буду пробовать!
  5. TopicStarter Overlay
    smitog
    Offline

    smitog Опытный в 1С

    Регистрация:
    14 авг 2011
    Сообщения:
    52
    Симпатии:
    0
    Баллы:
    26
    ASh Спасибо огромное все получилось, жалко что сам не догадался!
  6. TopicStarter Overlay
    smitog
    Offline

    smitog Опытный в 1С

    Регистрация:
    14 авг 2011
    Сообщения:
    52
    Симпатии:
    0
    Баллы:
    26
    BabySG пробую твоим методом
    , но не могу понять параметры нужно мне тоже в массив что ли передать? Т.е вот так
    Код:
    |....
    |ГДЕ
    |	КонтактнаяИнформация.Тип В(&МассивДокументов);
    |	И КонтактнаяИнформация.Объект В(&МассивДокументов);
    ...
    
    
    или так не правильно?
  7. ASh
    Offline

    ASh Опытный в 1С

    Регистрация:
    10 сен 2008
    Сообщения:
    568
    Симпатии:
    0
    Баллы:
    26
    Я не имел в виду, что будет быстрее. Просто понятнее это событие.

    В массив нужно передать ссылки на объекты из строк, которые будут выводиться на экран, чтобы по ним произвести отбор в запросе. Тип контактной информации менять не нужно.
  8. TopicStarter Overlay
    smitog
    Offline

    smitog Опытный в 1С

    Регистрация:
    14 авг 2011
    Сообщения:
    52
    Симпатии:
    0
    Баллы:
    26
    ASh Спасибо за ответ, но что-то не пойму ни как, установил в объекте параметр в &массив затем создал условие на видимость колонки Телефон1, если условие выполняется (т.е. колонка видна) то создаем массив и добавляем новый с Индексом[0] и Значением (ДанныеСтроки.Ссылка) и далее мы устанавливаем параметры на запрос. Так вот мне не понятно:
    1) зачем мы вообще объект в массив передаем
    2) После того как мы запрос выгрузили в переменную выборка у нас получается что выборка это таблица значения с колонками и индексом, а мне то нужно из запроса вынуть просто телефон...
    Код:
    
    Если Элемент.Колонки.телефон1.Видимость Тогда
    Массив = Новый Массив;
    Для Каждого ОформленияСтроки Из ОформленияСтрок Цикл
    Массив.Добавить(ОформленияСтроки.ДанныеСтроки.Ссылка);
    КонецЦикла;
    Запрос.УстановитьПараметр("Тип", Перечисления.ТипыКонтактнойИнформации.Телефон);
    Запрос.УстановитьПараметр("Массив", Массив);//почему мы не можем написать сюда ДанныеСтроки.Ссылка
    Выборка = Запрос.Выполнить().Выгрузить();//здесь у нас получается таблица значений и как мне отсюда вытащить телефон..
    ...........         
    КонецЕсли;
    
    
    
    Вообщем сильно не ругайте я только учусь)
  9. BabySG
    Offline

    BabySG Администраторы Команда форума Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    12
    Баллы:
    29
    Так используете ПриВыводе или ПриПолучении?
    По ссылке выше описано готовое решение.
    Ваши комментарии-вопросы показывают, что Вы плохо смотрели пример.
  10. TopicStarter Overlay
    smitog
    Offline

    smitog Опытный в 1С

    Регистрация:
    14 авг 2011
    Сообщения:
    52
    Симпатии:
    0
    Баллы:
    26
    Вообщем попробовал сделать так
    Код:
    
    Если Элемент.Колонки.телефон1.Видимость Тогда
    Массив = Новый Массив;
    Для Каждого ОформленияСтроки Из ОформленияСтрок Цикл
    Массив.Добавить(ОформленияСтроки.ДанныеСтроки.Ссылка);
    КонецЦикла;
    Запрос.УстановитьПараметр("Тип", Перечисления.ТипыКонтактнойИнформации.Телефон);
    Запрос.УстановитьПараметр("Массив", Массив);
    Выборка = Запрос.Выполнить().Выгрузить();
    Для каждого ОформлениеСтроки Из ОформленияСтрок Цикл
    Нашли = Выборка.Найти(ОформлениеСтроки.ДанныеСтроки.Ссылка, "Телефон12");
    Результат = Запрос.Выполнить().Выбрать();
    Если Нашли = Неопределено Тогда 
    ОформленияСтроки.Ячейки.Телефон1.Значение = Выборка[0].Телефон12;
    КонецЕсли;
    //ОформленияСтроки.Ячейки.Телефон1.Значение = ?(Нашли = Неопределено,Результат.Телефон12,"");
    КонецЦикла;
    
    
    
    выводит он телефоны через 2 строчки и вылазит сообщение "Индекс находится за пределами массива". Буду сидеть разбираться.
  11. ASh
    Offline

    ASh Опытный в 1С

    Регистрация:
    10 сен 2008
    Сообщения:
    568
    Симпатии:
    0
    Баллы:
    26
    Код:
    Процедура СправочникСписокПриПолученииДанных(Элемент, ОформленияСтрок)
    //Если колонку "Телефон1" видно, тогда будем ее заполнять
    Если Элемент.Колонки.Телефон1.Видимость Тогда
    //В запросе получаем не только телефон, но и объект (контактное лицо),
    //которому телефон принадлежит
    Запрос = Новый Запрос("
    |ВЫБРАТЬ
    |	КонтактнаяИнформация.Объект КАК Объект,
    |	КонтактнаяИнформация.Представление КАК Телефон12
    |ИЗ
    |	РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
    |ГДЕ
    |	КонтактнаяИнформация.Тип = &Тип
    |	И КонтактнаяИнформация.Объект В(&МассивОбъектов)
    |");
    Запрос.УстановитьПараметр("Тип", Перечисления.ТипыКонтактнойИнформации.Телефон);
    
    //В массиве собираем ссылки на все контактные лица, которые попадают на экран
    МассивОбъектов = Новый Массив;
    Для Каждого ОформлениеСтроки Из ОформленияСтрок Цикл
    МассивОбъектов.Добавить(ОформлениеСтроки.ДанныеСтроки.Ссылка);
    КонецЦикла; 
    //Передаем этот массив в запрос, чтобы в результате запроса были только нужные данные,
    //а не весь регистр сведений болтался.
    //"ДанныеСтроки.Ссылка" мы здесь не можем использовать, потому что, во-первых, "ДанныеСтроки"
    //здесь просто не доступны - к ним нужно обращаться через "ОформленияСтрок", как мы и сделали
    //при заполнении массива. А, во-вторых, нам нужны данные не одной строки (как в "ПриВыводеСтроки"),
    //а всех строк, которые выводятся на экран
    Запрос.УстановитьПараметр("МассивОбъектов", МассивОбъектов);
    ТабОбъектов = Запрос.Выполнить().Выгрузить();
    //В общем, именно в этом и заключается разница между событиями "ПриПолученииДанных" и "ПриВыводеСтроки":
    //в "ПриВыводеСтроки" мы получаем телефон для каждой строки отдельно и выводим его на экран,
    //в "ПриПолученииДанных" получаем телефоны одним запросом для всех строк на экране, потом их прорисовываем.
    Для Каждого ОформлениеСтроки Из ОформленияСтрок Цикл
    //В этом цикле перебираем все выводимые на экран строки
    Нашли = ТабОбъектов.Найти(ОформлениеСтроки.ДанныеСтроки.Ссылка, "Объект");
    //Если находим в ТЗ Контактное лицо из данных строки, то вставляем в колонку соответствующий ему телефон
    ОформлениеСтроки.Ячейки.Телефон1.Значение = ?(Нашли <> Неопределено, Нашли.Телефон12, "");
    КонецЦикла;
    КонецЕсли;
    КонецПроцедуры
    
    
  12. TopicStarter Overlay
    smitog
    Offline

    smitog Опытный в 1С

    Регистрация:
    14 авг 2011
    Сообщения:
    52
    Симпатии:
    0
    Баллы:
    26
    ASh Спасибо огромное!! все разжевал прям неудобно как то! =)
  13. ls600
    Offline

    ls600 Опытный в 1С

    Регистрация:
    14 май 2012
    Сообщения:
    132
    Симпатии:
    0
    Баллы:
    26
    Добрый день всем. не стал создавать новую тему. столкнулся с такой же ситуацией. В справочник Основных средств. добавил в форму списка колонку Инвентарные Номера. Хочу что бы с Регистра сведений в колонку попадали номера. Инвентарные номера попадают в РегистрСведений (ПервоначальныеСведенияОСБухгалтерскийУчет) после того как Документом Принятие к учету принимаем ОС, и в табличной части указываем Инвентарный номер.
    Использую процедуру ПриПолученииДанных.

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

    Заранее благодарю!!!

    P.S
    Конфигурация Бухгалтерия 2.0.9.7
    Платформа 8.2.18.61
  14. Tiger86
    Offline

    Tiger86 Модераторы Команда форума Модератор

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    первое что бросилось в глаза. Что это?
    Код:
    Запрос.УстановитьПараметр("МассивОбъектов", РегистрыСведений.ПервоначальныеСведенияОСБухгалтерскийУчет.ИнвентарныйНомер);
    думаю, что у вас МассивОбЪектов не заполняется. Посмотрите отладчиком что в нем есть
  15. ls600
    Offline

    ls600 Опытный в 1С

    Регистрация:
    14 май 2012
    Сообщения:
    132
    Симпатии:
    0
    Баллы:
    26
    Код:
    Запрос.УстановитьПараметр("МассивОбъектов", РегистрыСведений.ПервоначальныеСведенияОСБухгалтерскийУчет.ИнвентарныйНомер);
    делал по примеру что выше,
  16. ls600
    Offline

    ls600 Опытный в 1С

    Регистрация:
    14 май 2012
    Сообщения:
    132
    Симпатии:
    0
    Баллы:
    26
    Код:
    Процедура СправочникСписокПриПолученииДанных (Элемент, ОформлениеСтрок)
    Запрос = Новый запрос;
    Запрос.Текст = "ВЫБРАТЬ
    | ПервоначальныеСведенияОСБухгалтерскийУчетСрезПоследних.ИнвентарныйНомер,
    | ПервоначальныеСведенияОСБухгалтерскийУчетСрезПоследних.ОсновноеСредство
    |ИЗ
    | РегистрСведений.ПервоначальныеСведенияОСБухгалтерскийУчет.СрезПоследних КАК ПервоначальныеСведенияОСБухгалтерскийУчетСрезПоследних
    |ГДЕ
    | ПервоначальныеСведенияОСБухгалтерскийУчетСрезПоследних.ОсновноеСредство В (&МассивОбъектов)";
    Запрос.УстановитьПараметр("МассивОбъектов", РегистрыСведений.ПервоначальныеСведенияОСБухгалтерскийУчет.ОсновноеСредство);
    
    МассивОбъектов = Новый Массив;
    
    Для каждого ОформлениеСтроки Из ОформлениеСтрок Цикл
    МассивОбъектов.Добавить(ОформлениеСтроки.ДанныеСтроки.Ссылка);
    КонецЦикла;
    
    Запрос.УстановитьПараметр("МассивОбъектов", МассивОбъектов);
    ТабОбъектов = Запрос.Выполнить();
    
    Для каждого ОформлениеСтроки Из ОформлениеСтрок Цикл
    ИН = ТабОбъектов.Найти(ОформлениеСтроки.ДанныеСтроки.Ссылка, "ОсновноеСредство");
    ОформлениеСтроки.Ячейки.ИнвНомер.Значение = ?(ИН <> Неопределено, ИН.ИнвентарныйНомер, "");
    КонецЦикла;
    
    КонецПроцедуры
    
    Изменил запрос, в массив передал ОС. и тоже ничего не происходит.....
  17. Tiger86
    Offline

    Tiger86 Модераторы Команда форума Модератор

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    1. вы меня не поняли. Вы 2 раза устанавливаете параметр МассивОбЪектов в запросе. определитесь где правильнее
    2. Запрос.Выполнить() - возвращает результат выполнения запроса, но дальше то с этим результатом что делаете? вам надо его сначала в тз выгрузить наверное, чтобы искать строки

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