![]() |
![]() |
![]() |
|
Построчное сравнение строк табличной части с таблицей значений | ☑ | ||
---|---|---|---|---|
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
|
ок. спасибо.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |