Блок 1: 1С:Предприятие 8. Первые шаги.

В данном разделе задаются вопросы по конкретным курсам.
(Раздел предназначен для тех, кто уже прошел обучение и возникли вопросы по тематике курса)

Блок 1: 1С:Предприятие 8. Первые шаги.

Сообщение admin » 14 дек 2011, 12:55

Вопросы по тематике курса.
admin
Администратор
 
Сообщений: 233
Зарегистрирован: 14 дек 2011, 11:11

Re: Блок 1: 1С:Предприятие 8. Первые шаги.

Сообщение Sergey-Chelny » 01 сен 2016, 22:47

Заранее пардон. Не совсем понятно что в этих блоках обсуждать. Как вы читаете материал или же вопросы возникшие при просмотре.

У меня рассуждение. Точнее живой пример хотел бы обсудить. Суть беседы: день 8, время: 1 час 09 минут. Вы там рассказываете о том что запрос в цикле это грубейшая ошибка при программировании, но не все следуют этому правилу.
И вот мне фартануло. :) Сегодня днем я делал одну из "хотелок" заказчика. Конфигурация : УТ 10, вдоль и поперек переписанная. Фирма занимается продажей шин и дисков. Появилась необходимость следить за весом отгружаемой продукции (про махинации с перегрузом машины не тут писать).

Теория: У элемента справочника "Номенклатура" есть закладка "Единицы". Там указывается объем и вес. Хроняться они в подчиненном справочнике "ЕдиницыИзмерения".

Изображение

По халатности или еще какому недоразумению у большинства единиц номенклатуры вес и объем не заполнены. Шерстить весь справочник- с ума сойдешь. Решили при заполнении документа "Поступлении товаров и услуг" проверять вес и объем (переменные в табличную часть добавил сам).

Изображение

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

Нужно обходить все строки табличного документа в цикле и запросом интересоваться код элемента подчиненного справочника "ЕдиницыИзмерения", через владельца. Далее искать эту запись и вносить изменения (Вес и Объем). Получается запрос (пусть и маленький) в цикле. Если по утверждению 1С`ников это грубейшая ошибка программирования, то обЪясните как тоже самое можно было сделать без запроса в цикле.

P.S. написано много, но хотел максимально понятно донести свой вопрос. :)
Sergey-Chelny
 
Сообщений: 7
Зарегистрирован: 16 сен 2014, 12:58

Re: Блок 1: 1С:Предприятие 8. Первые шаги.

Сообщение admin » 02 сен 2016, 11:07

Примерно так:
Код: выделить все
Процедура ПриЗаписи(Отказ)

   Если Проведен Тогда
   
      ТЗ = Товары.Выгрузить(,"ЕдиницаИзмерения,Вес,Объем");
      
      Запрос = Новый Запрос;
      Запрос.Текст =
         "ВЫБРАТЬ
         |   ТЗ.ЕдиницаИзмерения,
         |   ТЗ.Вес,
         |   ТЗ.Объем
         |ПОМЕСТИТЬ ВТ
         |ИЗ
         |   &ТЗ КАК ТЗ
         |;
         |
         |////////////////////////////////////////////////////////////////////////////////
         |ВЫБРАТЬ
         |   ВТ.ЕдиницаИзмерения,
         |   ВТ.Вес,
         |   ВТ.Объем
         |ИЗ
         |   ВТ КАК ВТ
         |ГДЕ
         |   (ВТ.Вес <> 0
         |         ИЛИ ВТ.Объем <> 0)
         |   И (ВТ.ЕдиницаИзмерения.Вес <> ВТ.Вес
         |         ИЛИ ВТ.ЕдиницаИзмерения.Объем <> ВТ.Объем)";
      Запрос.УстановитьПараметр("ТЗ", ТЗ);   
      РезультатЗапроса = Запрос.Выполнить();
      
      ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
      
      Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
         Объект = ВыборкаДетальныеЗаписи.ЕдиницаИзмерения.ПолучитьОбъект();
         ЗаполнитьЗначенияСвойств(Объект, ВыборкаДетальныеЗаписи);
         Объект.Записать();
      КонецЦикла;
   
   КонецЕсли;
   
КонецПроцедуры
admin
Администратор
 
Сообщений: 233
Зарегистрирован: 14 дек 2011, 11:11


Вернуться в Вопросы по курсам

Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

cron