Реклама на этом месте
Форум 1С
Форум 1С
Программистам. Бухгалтерам. Администраторам. Пользователям
Задай вопрос - получи решение проблемы. Без троллинга и флуда.
16 Дек 2017, 10:31
МультиВход
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Не получили письмо с кодом активации?
 
collapse

Автор Тема: Форма  (Прочитано 7900 раз)

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

Оффлайн Дринкинс

  • **
  • Сообщений: 55
  • РЕПУТАЦИЯ: 0
  • Регистрация: 2011-03-27
  • Сайт: 
  • Профессия: Ученик 1С
Форма
« Первое сообщение: 15 Авг 2013, 00:01 »
На форме списка добавил новую колонку теперь прривыводестроки() получаю некоторые данные поясните пожалуйста как в эту колонку записать полученные данные?


Оффлайн Dethmontt

  • Денис
  • Модератор
  • *****
  • Сообщений: 2857
  • РЕПУТАЦИЯ: 546
  • КПД: 19%
  • Адын Эс
  • Регистрация: 2010-11-01
  • Сайт: 
  • Профессия: Программист 1С
Re: Форма
« Ответ #1: 15 Авг 2013, 00:02 »
ОформлениеСтроки.Ячейки.ИмяКолонки.Значеие = "Привет!"
Если долго всматриваться в учебник...то в голову может прийти мысль его открыть!

Оффлайн Дринкинс

  • **
  • Сообщений: 55
  • РЕПУТАЦИЯ: 0
  • Регистрация: 2011-03-27
  • Сайт: 
  • Профессия: Ученик 1С
Re: Форма
« Ответ #2: 15 Авг 2013, 00:07 »
Процедура СписокПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)

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

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


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

Оффлайн Dethmontt

  • Денис
  • Модератор
  • *****
  • Сообщений: 2857
  • РЕПУТАЦИЯ: 546
  • КПД: 19%
  • Адын Эс
  • Регистрация: 2010-11-01
  • Сайт: 
  • Профессия: Программист 1С
Re: Форма
« Ответ #3: 15 Авг 2013, 01:58 »
Запрос.УстановитьПараметр("Номенклатура", ДанныеСтроки.НаименованиеСсылка);
Добавлено: 15 Авг 2013, 02:00

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

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

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

Оффлайн GRADUS

  • *****
  • Сообщений: 699
  • РЕПУТАЦИЯ: 51
  • КПД: 7%
  • Регистрация: 2013-06-08
  • Сайт: 
  • Профессия: Программист 1С
Re: Форма
« Ответ #4: 15 Авг 2013, 02:28 »
Запрос.УстановитьПараметр("Номенклатура", ДанныеСтроки.НаименованиеСсылка);
Добавлено: 15 Авг 2013, 02:00

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

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

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

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

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

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

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


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

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

Оффлайн mixqn

  • Администратор
  • *****
  • Сообщений: 1346
  • РЕПУТАЦИЯ: 166
  • КПД: 12%
  • Who is John Galt?
  • Регистрация: 2012-08-15
  • Сайт: 3gmaster.net
  • Профессия: Программист 1С
Re: Форма
« Ответ #5: 15 Авг 2013, 08:10 »
И вообще запрос в цикле это не верный подход.
все правильно, так лучше не делать.
лучше использовать событие ПриПолученииДанных, в нем 1 запрос на весь выводимый список номенклатуры и далее в цикле по оформлениям строк (ОформленияСтрок) заполнение значение.

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

Оффлайн Дринкинс

  • **
  • Сообщений: 55
  • РЕПУТАЦИЯ: 0
  • Регистрация: 2011-03-27
  • Сайт: 
  • Профессия: Ученик 1С
Re: Форма
« Ответ #6: 15 Авг 2013, 17:10 »
Запрос.УстановитьПараметр("Номенклатура", ДанныеСтроки.НаименованиеСсылка);
Добавлено: 15 Авг 2013, 02:00

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

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

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

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

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

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

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


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

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

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

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

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

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

Оффлайн mixqn

  • Администратор
  • *****
  • Сообщений: 1346
  • РЕПУТАЦИЯ: 166
  • КПД: 12%
  • Who is John Galt?
  • Регистрация: 2012-08-15
  • Сайт: 3gmaster.net
  • Профессия: Программист 1С
Re: Форма
« Ответ #7: 15 Авг 2013, 19:49 »
Все просто.
Как выполняется запрос? Он формируется на клиенте, уходит по сети на сервер, там выполняется, по сети же возвращается результат и далее обрабатывается.
Что такое запрос в цикле? Это отправка практически одинаковых (за исключением параметров) запросов на сервер многократно, соответственно многократный перегон по сети туда-обратно + многократное выполнение. На экзамене на сертификат «Специалист» за запрос в цикле сразу ставят 2 балла.
В вашем случае цикл может не совсем явный – нет конструкций Цикл – КонецЦикла, но это все равно цикл. Обработчик события ПриВыводеСтроки отрабатывает при выводе каждой строки. Представьте (а еще лучше – проверьте отладчиком), что при открытии формы на экране у вас 20 строк – 20 раз отработало событие, 20 запросов ушло-вернулось; вы прокрутили колесико мышки на пару строк – еще 20 запросов и т.д. А потом представьте, что это делают 50 пользователей на разных машинах. Приятного мало.
ПриПолученииДанных в теории должно отрабатывать 1 раз хотя на практике почему-то отрабатывает 2 раза (не знаю, почему так) – всяко не 20. Т.е. вместо отсылки на сервер 20 запросов уйдет всего 2.

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


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

Оффлайн GRADUS

  • *****
  • Сообщений: 699
  • РЕПУТАЦИЯ: 51
  • КПД: 7%
  • Регистрация: 2013-06-08
  • Сайт: 
  • Профессия: Программист 1С
Re: Форма
« Ответ #8: 15 Авг 2013, 20:06 »
Все просто.
Как выполняется запрос? Он формируется на клиенте, уходит по сети на сервер, там выполняется, по сети же возвращается результат и далее обрабатывается.
Что такое запрос в цикле? Это отправка практически одинаковых (за исключением параметров) запросов на сервер многократно, соответственно многократный перегон по сети туда-обратно + многократное выполнение. На экзамене на сертификат «Специалист» за запрос в цикле сразу ставят 2 балла.
В вашем случае цикл может не совсем явный – нет конструкций Цикл – КонецЦикла, но это все равно цикл. Обработчик события ПриВыводеСтроки отрабатывает при выводе каждой строки. Представьте (а еще лучше – проверьте отладчиком), что при открытии формы на экране у вас 20 строк – 20 раз отработало событие, 20 запросов ушло-вернулось; вы прокрутили колесико мышки на пару строк – еще 20 запросов и т.д. А потом представьте, что это делают 50 пользователей на разных машинах. Приятного мало.
ПриПолученииДанных в теории должно отрабатывать 1 раз хотя на практике почему-то отрабатывает 2 раза (не знаю, почему так) – всяко не 20. Т.е. вместо отсылки на сервер 20 запросов уйдет всего 2.

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


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

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

Оффлайн Dethmontt

  • Денис
  • Модератор
  • *****
  • Сообщений: 2857
  • РЕПУТАЦИЯ: 546
  • КПД: 19%
  • Адын Эс
  • Регистрация: 2010-11-01
  • Сайт: 
  • Профессия: Программист 1С
Re: Форма
« Ответ #9: 16 Авг 2013, 21:32 »
Пока читал твой пост у меня рдп отвалился ...

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


Теги:
 


* Живое общение

Не устроил ответ?

Зарегистрируйся и задай свой вопрос. Живое общение приносит результат намного быстрее.


Зарегистрироваться

* Реклама

* Поиск

* Последние задачи на разработку (фриланс)

* Реклама

* Последние вакансии

* Топ 10 авторов за месяц

Геннадий ОбьГЭС Геннадий ОбьГЭС
154 Сообщений
ilyay ilyay
66 Сообщений
alex0402
53 Сообщений
AIFrame
47 Сообщений
andron81_81
44 Сообщений
oleg-x
44 Сообщений
BuhRust
33 Сообщений
MuI_I_Ika MuI_I_Ika
32 Сообщений
Golickoff Golickoff
31 Сообщений
Dima Dddd Dima Dddd
24 Сообщений

* Кто онлайн

  • Точка Гостей: 254
  • Точка Скрытых: 0
  • Точка Пользователей: 8
  • Точка Сейчас на форуме:

* Облако тэгов

* Форум 1С с мобильного

* Инструменты

* Дополнительно

Поиск

 
SimplePortal 2.3.5 © 2008-2012, SimplePortal