Имя: Пароль:
1C
Админ
Построчное сравнение строк табличной части с таблицей значений
0 bvy_vetal
 
29.07.13
18:56
Добрый день!
Помогите решить следующую задачу начинающему программисту.
Для каждого непроведенного документа "Приходная накладная"  необходимо обеспечить запись цен номенклатуры из табличной части "Товары" в регистр сведений "Цены номенклатуры".
Следует учесть, что записывать в регистр нужно лишь изменившиеся на дату документа цены, учитывая периодичность регистра "В пределах дня".
Избегайте запросов в цикле!
1 Мимохожий Однако
 
29.07.13
18:57
Конфигурация "Документооборот"?
2 bvy_vetal
 
29.07.13
18:57
Запрос = Новый Запрос;
Запрос.текст = "ВЫБРАТЬ
    |    ЦеныНоменклатуры.Период КАК Период,
    |    ЦеныНоменклатуры.Номенклатура,
    |    ЦеныНоменклатуры.Цена
    |ИЗ
    |    РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
    |
    |УПОРЯДОЧИТЬ ПО
    |    Период УБЫВ" ;

ТЗ = Запрос.выполнить().Выгрузить();


  
  
  ЗАпрос2 = Новый Запрос;
   Запрос2.текст =
   "ВЫБРАТЬ
    |    ПриходнаяНакладнаяТовары.Ссылка как ссылкаНаДок,
    |    ПриходнаяНакладнаяТовары.Ссылка.Проведен,
    |    ПриходнаяНакладнаяТовары.Ссылка.Дата как Дат,
    |    ПриходнаяНакладнаяТовары.Номенклатура,
    |    ПриходнаяНакладнаяТовары.Цена
    |ИЗ
    |    Документ.ПриходнаяНакладная.Товары КАК ПриходнаяНакладнаяТовары
    |ГДЕ
    |    ПриходнаяНакладнаяТовары.Ссылка.Проведен = ЛОЖЬ";
    Выборка = Запрос2.выполнить().Выбрать();
    Пока   Выборка.следующий() цикл
    Отбор = Новый Структура;
    Отбор.вставить("Номенклатура", Выборка.Номенклатура);
    Отбор.вставить("Период", выборка.дат);
    НайденныеСтроки = ТЗ.НайтиСтроки(Отбор);
    кол = НайденныеСтроки.количество();
    Если кол = 0 Тогда
           НаборЗаписей = РегистрыСведений.ценыНоменклатуры.создатьНаборЗаписей();
           НаборЗаписей.отбор.регистратор.установить(Выборка.ссылкаНаДок);
          НоваяЗапись =  НаборЗаписей.Добавить();
          НоваяЗапись.Период = Выборка.дат;
          НоваяЗапись.Номенклатура = Выборка.Номенклатура;
          НоваяЗапись.цена = Выборка.цена;
          НоваяЗапись.регистратор = Выборка.ссылкаНаДок;
          НаборЗаписей.записать();
      
      иначе
        найденныестроки.получить();
        стр = Найденныестроки[0];
          
                    Если не Выборка.Цена = Стр.цена Тогда
         НаборЗаписей = РегистрыСведений.ценыНоменклатуры.создатьНаборЗаписей();
           НаборЗаписей.отбор.регистратор.установить(Выборка.ссылкаНаДок);
          НоваяЗапись =  НаборЗаписей.Добавить();
          НоваяЗапись.Период = Выборка.дат;
          НоваяЗапись.Номенклатура = Выборка.Номенклатура;
          НоваяЗапись.цена = Выборка.цена;
          НоваяЗапись.регистратор = Выборка.ссылкаНаДок;
          НаборЗаписей.записать();
                      конецЕсли;
  
    
конецЕсли;    
    
    
    конецЦикла;
3 andreymongol82
 
29.07.13
19:01
Ого. Цены лучше брать  срезом последних. И сравнить с ТЧ документа. Или лучше вообще одним запросом цены срез последних соединить с ТЧ документа.
4 bvy_vetal
 
29.07.13
19:03
Извините еще не разобрался с форумом. Сообщения уходят пакетами, а не одним текстом. Это учебное задание. зарегистрировался на сайте http://www.its22.ru/spec-1s-8 У них есть продукт "самоучитель 1с для разработчиков". Вам пишут задание, а вы пишите пример кода, этот код интерактивно проверяется
5 Полотенчик
 
29.07.13
19:03
Соедини сразу два запроса по цене, оставь строки с изменившимися ценами и запиши скопом в регистр.
6 bvy_vetal
 
29.07.13
19:04
В качестве подсказки рекомендуют следующий алгоритм:

    - Получить историю цен в разрезе номенклатуры и периодов, выгрузив ее в таблицу значений,
      отсортированную в порядке убывания периодов.
    - Организовать цикл по элементам выборки документов, получая объект
      документа при каждой итерации цикла (Выборка.ПолучитьОбъект()).
    - Организовать вложенный цикл по строкам табличной части Товары,
      в рамках которого обеспечить проверку на начличие записей в таблице значений
      с историей цен.
    - При отсутствии записей или при наличии записей с иной ценой в истории, фиксировать
      движение документа в регистре сведений ЦеныНоменклатуры.
    - Записать изменения для набора записей регистра.

Важно!
     Обратите внимание на периодичность регистра ЦеныНоменклатуры.
     Избегайте запросы в цикле!
7 andreymongol82
 
29.07.13
19:09
Это кто же такие подсказки пишет? О_о
8 bvy_vetal
 
29.07.13
19:11
Разработчики  этого продукта http://www.its22.ru/spec-1s-8. Из 10 заданий прошел 5, а вот на этом застрял. Решил посмотреть в подсказку. А там такое написано. Даже не знаю что делать.
9 Мимохожий Однако
 
29.07.13
19:12
Делай (5)
10 bvy_vetal
 
29.07.13
19:12
ок. спасибо.
Программист всегда исправляет последнюю ошибку.