Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
22 ноя 2024, 22:34

Форма

Автор Дринкинс, 15 авг 2013, 00:01

0 Пользователей и 1 гость просматривают эту тему.

Дринкинс

На форме списка добавил новую колонку теперь прривыводестроки() получаю некоторые данные поясните пожалуйста как в эту колонку записать полученные данные?

Dethmontt

ОформлениеСтроки.Ячейки.ИмяКолонки.Значеие = "Привет!"
Если долго всматриваться в учебник...то в голову может прийти мысль его открыть!

Дринкинс

Процедура СписокПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)

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

КонецПроцедуры


Не подскажете почему этот код перебирает не всю нменклатуру

Dethmontt

Запрос.УстановитьПараметр("Номенклатура", ДанныеСтроки.НаименованиеСсылка);
Добавлено: 15 авг 2013, 02:00


Цитата: Дринкинс от 15 авг 2013, 00:07Не подскажете почему этот код перебирает не всю нменклатуру

Не для всей номенклатуры установлены цены - например
Добавлено: 15 авг 2013, 02:01


И вообще запрос в цикле это не верный подход. :fdbsdfbsd:
Если долго всматриваться в учебник...то в голову может прийти мысль его открыть!

GRADUS

Цитата: Dethmontt от 15 авг 2013, 01:58
Запрос.УстановитьПараметр("Номенклатура", ДанныеСтроки.НаименованиеСсылка);
Добавлено: 15 авг 2013, 02:00


Цитата: Дринкинс от 15 авг 2013, 00:07Не подскажете почему этот код перебирает не всю нменклатуру

Не для всей номенклатуры установлены цены - например
Добавлено: 15 авг 2013, 02:01


И вообще запрос в цикле это не верный подход. :fdbsdfbsd:

Это же сложный периодический расчет :bleh:
Добавлено: 15 авг 2013, 02:30


Цитата: Дринкинс от 15 авг 2013, 00:07
Процедура СписокПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)

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

КонецПроцедуры


Не подскажете почему этот код перебирает не всю нменклатуру

Изменяете форму при выводе строки.... хм.... И что не циклится? :xfbnsdfb:

mixqn

Цитата: Dethmontt от 15 авг 2013, 01:58И вообще запрос в цикле это не верный подход.
все правильно, так лучше не делать.
лучше использовать событие ПриПолученииДанных, в нем 1 запрос на весь выводимый список номенклатуры и далее в цикле по оформлениям строк (ОформленияСтрок) заполнение значение.

и еще маленькая ремарка: вместо ОформлениеСтроки.Ячейки.ИмяКолонки.Значеие = "Привет!"
можно (и на мой взгляд даже лучше) использовать ОформлениеСтроки.Ячейки.Цена.УстановитьТекст(Формат(Цена, "ЧДЦ=2"));

Дринкинс

Цитата: GRADUS от 15 авг 2013, 02:28
Цитата: Dethmontt от 15 авг 2013, 01:58
Запрос.УстановитьПараметр("Номенклатура", ДанныеСтроки.НаименованиеСсылка);
Добавлено: 15 авг 2013, 02:00


Цитата: Дринкинс от 15 авг 2013, 00:07Не подскажете почему этот код перебирает не всю нменклатуру

Не для всей номенклатуры установлены цены - например
Добавлено: 15 авг 2013, 02:01


И вообще запрос в цикле это не верный подход. :fdbsdfbsd:

Это же сложный периодический расчет :bleh:
Добавлено: 15 авг 2013, 02:30


Цитата: Дринкинс от 15 авг 2013, 00:07
Процедура СписокПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)

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

КонецПроцедуры


Не подскажете почему этот код перебирает не всю нменклатуру

Изменяете форму при выводе строки.... хм.... И что не циклится? :xfbnsdfb:

Нет зацикливания не наблюдалось.
Добавлено: 15 авг 2013, 17:14


Цитата: mixqn от 15 авг 2013, 08:10
Цитата: Dethmontt от 15 авг 2013, 01:58И вообще запрос в цикле это не верный подход.
все правильно, так лучше не делать.
лучше использовать событие ПриПолученииДанных, в нем 1 запрос на весь выводимый список номенклатуры и далее в цикле по оформлениям строк (ОформленияСтрок) заполнение значение.

и еще маленькая ремарка: вместо ОформлениеСтроки.Ячейки.ИмяКолонки.Значеие = "Привет!"
можно (и на мой взгляд даже лучше) использовать ОформлениеСтроки.Ячейки.Цена.УстановитьТекст(Формат(Цена, "ЧДЦ=2"));

Поясните пожалуйста почему так не надо делать?
Вы предлагаете получить все цены номенклатуры  и потом их выводить на форму?

mixqn

Все просто.
Как выполняется запрос? Он формируется на клиенте, уходит по сети на сервер, там выполняется, по сети же возвращается результат и далее обрабатывается.
Что такое запрос в цикле? Это отправка практически одинаковых (за исключением параметров) запросов на сервер многократно, соответственно многократный перегон по сети туда-обратно + многократное выполнение. На экзамене на сертификат «Специалист» за запрос в цикле сразу ставят 2 балла.
В вашем случае цикл может не совсем явный – нет конструкций Цикл – КонецЦикла, но это все равно цикл. Обработчик события ПриВыводеСтроки отрабатывает при выводе каждой строки. Представьте (а еще лучше – проверьте отладчиком), что при открытии формы на экране у вас 20 строк – 20 раз отработало событие, 20 запросов ушло-вернулось; вы прокрутили колесико мышки на пару строк – еще 20 запросов и т.д. А потом представьте, что это делают 50 пользователей на разных машинах. Приятного мало.
ПриПолученииДанных в теории должно отрабатывать 1 раз хотя на практике почему-то отрабатывает 2 раза (не знаю, почему так) – всяко не 20. Т.е. вместо отсылки на сервер 20 запросов уйдет всего 2.

Чисто с целью наглядной демонстрации набросал простенькую обработочку (она во вложении) – скачайте, посмотрите (там в форму выводится справочник Валюты, если нет такого в конфе – выведите любой другой; основная цель – просто иметь непустое таб.поле).


Добавлю даже еще немного к вышесказанному: с некоторых пор (уже не помню, когда точно, кажется, начиная с версии 8.1, в 8.0 вроде не было еще такого) в языке запросов 1С появилась возможность создания пакетных запросов – это все в ту же «степь»: даже если по ходу процедуры несколько совершенно разных запросов (не один и тот же в цикле), все равно есть смысл объединить их в пакетный запрос (если конечно это позволяет логика программы и можно заранее получить все данные). При таком подходе каждый отдельновзятый запрос в СУБД конечно будет выполняться столько же времени, сколько и при отправке по отдельности, но вот на «дороге» (т.е. пересылке на сервер и обратно) вы сэкономите.
Это мелочи, иногда они не заметны, но иногда они могут сыграть существенное значение.

GRADUS

Цитата: mixqn от 15 авг 2013, 19:49
Все просто.
Как выполняется запрос? Он формируется на клиенте, уходит по сети на сервер, там выполняется, по сети же возвращается результат и далее обрабатывается.
Что такое запрос в цикле? Это отправка практически одинаковых (за исключением параметров) запросов на сервер многократно, соответственно многократный перегон по сети туда-обратно + многократное выполнение. На экзамене на сертификат «Специалист» за запрос в цикле сразу ставят 2 балла.
В вашем случае цикл может не совсем явный – нет конструкций Цикл – КонецЦикла, но это все равно цикл. Обработчик события ПриВыводеСтроки отрабатывает при выводе каждой строки. Представьте (а еще лучше – проверьте отладчиком), что при открытии формы на экране у вас 20 строк – 20 раз отработало событие, 20 запросов ушло-вернулось; вы прокрутили колесико мышки на пару строк – еще 20 запросов и т.д. А потом представьте, что это делают 50 пользователей на разных машинах. Приятного мало.
ПриПолученииДанных в теории должно отрабатывать 1 раз хотя на практике почему-то отрабатывает 2 раза (не знаю, почему так) – всяко не 20. Т.е. вместо отсылки на сервер 20 запросов уйдет всего 2.

Чисто с целью наглядной демонстрации набросал простенькую обработочку (она во вложении) – скачайте, посмотрите (там в форму выводится справочник Валюты, если нет такого в конфе – выведите любой другой; основная цель – просто иметь непустое таб.поле).


Добавлю даже еще немного к вышесказанному: с некоторых пор (уже не помню, когда точно, кажется, начиная с версии 8.1, в 8.0 вроде не было еще такого) в языке запросов 1С появилась возможность создания пакетных запросов – это все в ту же «степь»: даже если по ходу процедуры несколько совершенно разных запросов (не один и тот же в цикле), все равно есть смысл объединить их в пакетный запрос (если конечно это позволяет логика программы и можно заранее получить все данные). При таком подходе каждый отдельновзятый запрос в СУБД конечно будет выполняться столько же времени, сколько и при отправке по отдельности, но вот на «дороге» (т.е. пересылке на сервер и обратно) вы сэкономите.
Это мелочи, иногда они не заметны, но иногда они могут сыграть существенное значение.

Пока читал твой пост у меня рдп отвалился ... :bleh:

Dethmontt

Цитата: GRADUS от 15 авг 2013, 20:06Пока читал твой пост у меня рдп отвалился ...

Полезная информация... :)
Если долго всматриваться в учебник...то в голову может прийти мысль его открыть!

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск