Имя: Пароль:
1C
 
Заполнение табличной части документа
0 vpanasenko
 
07.08.09
11:46
Здравствуйте! Изучаю 1С 8.1 (пытаюсь :-) ) второй день. Хочу реализовать загрузку в табличную часть документа счетов. суть: есть таблица(или как это в 1С называется, объект) счетов, в которой есть поле ЗАКАЗ, есть вторая таблица, связанная с таблице счетов по полю ЗАКАЗ. Счета (заголовки) первоначально заполняются необходимой информацией(дата, №, контрагент, ЗАКАЗ! и т.д.). во второй таблице документов вносится по сути табличная информация, но не привязанная к Счету. Единственная связь - Заказ. Мне необходимо реализовать такой функционал: найти Счета, у которых Заказ не пустой и статус Обработан=Ложь или NULL, выбрать из дополнительной таблицы данные по Заказу и внести их в табличную часть этого самого счета. Уткнулся в то, что не знаю, как добавить данные в табличную часть. Вот, что накропал. Может, конечно, не фантастика, но честно, взялся за 1С второй день, до этого вообще не имел ни малейшего представления об этой системе.

Процедура КнопкаСформироватьНажатие(Элемент)
   // Вставить содержимое обработчика.
перем Счета;    
   Счета = Документы.СчетНаОплатуПокупателю.Выбрать();

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

Можно подсказать?
1 hhhh
 
07.08.09
12:04
(0) самое правильное

Документ = Выборка.Заказ.ПолучитьОбъект();
2 ZZeRRo
 
07.08.09
12:09
текст запроса попробуй написать через "Конструктор запроса". Вызывается через контекстное меню
3 ZZeRRo
 
07.08.09
12:11
Для передачи параметров в запрос используется следующая конструкция:
Запрос = Новый Запрос;
Запрос.Текст = ТвойТекстЗапроса;
Запрос.УстановитьПараметр("ИмяПараметра",ЗначениеПараметра);
РЗ = Запрос.Выполнить();
4 ZZeRRo
 
07.08.09
12:13
У тебя реквизит "Заказ"  какой тип имеет?
5 comp2006
 
07.08.09
12:13
НовСтрока=Документ.Услуги.Добавить();
НовСтрока.Номенклатура = Выборка2.Номенклатура;
НовСтрока.Рубрика = Выборка2.Рубрика;
НовСтрока.Исходник = Выборка2.Исходник;
НовСтрока.Цена = Выборка2.Цена;
НовСтрока.Количество = Выборка2.Количество;
НовСтрока.Сумма = Выборка2.Цена * Выборка2.Количество;
6 vpanasenko
 
07.08.09
12:31
Заказ - строка. А как мне найти нужный документ, чтобы к нему привязать эти самые строки (НовСтрока)? Значение параметра я так и устанавливаю МойЗапрос.УстановитьПараметр("Заказ", Выборка.Заказ);
7 vpanasenko
 
07.08.09
12:33
Просто, допустим, в Делфи для поиска есть методы FindKey/Locate для наборов данных
8 ZZeRRo
 
07.08.09
12:37
Напиши Запрос
"Выбрать Ссылка ИЗ Документ.СчетНаОплатуПокупателю ГДЕ Заказ = &Заказ"
РЗ = Запрос.Выполнить().Выбрать();
Пока РЗ.Следующий Цикл
   Документ = РЗ.Ссылка.ПолучитьОбъект();
9 ZZeRRo
 
07.08.09
12:38
но у тебя изначально неправильно построена логика выполнения данной операции
10 vpanasenko
 
07.08.09
12:39
Мне нужно наоборот - выбрать все счета, где заполнено поле Заказ и он не Обработан. добавить табличную часть и выствить флаг Обработан
11 ZZeRRo
 
07.08.09
12:41
Я иак понимаю тебе надо найти все документы СчетНаОплатуПокупателю и СчетИсходник с одинаковыми значениями поля Заказ, где СчетНаОплатуПокупателю еще не Обработан и скопировать табличные части из СчетИсходник в СчетНаОплатуПокупателю.. Так?
12 vpanasenko
 
07.08.09
12:43
да, и заполнить табличную часть данными из СчетИсходник
13 vpanasenko
 
07.08.09
12:45
повторился, это не дочитал "скопировать табличные части из СчетИсходник в СчетНаОплатуПокупателю". только там список, нету табличных данных. но суть не меняется
14 ZZeRRo
 
07.08.09
12:53
Попробуй как то так:

Запрос = Новый Запрос;
ТекстЗапроса = "ВЫБРАТЬ
   СчетНаОплатуПокупателю.Ссылка КАК СчетНаОплатуПокупателю,
   СчетИсходник.Ссылка КАК СчетИсходник
ИЗ
   Документ.СчетНаОплатуПокупателю КАК СчетНаОплатуПокупателю
ЛЕВОЕ СОЕДИНЕНИЕ(    
   ВЫБРАТЬ
       СчетИсходник.Ссылка,
       СчетИсходник.Заказ
   ИЗ
       Документ.СчетИсходник КАК СчетИсходник
   ГДЕ        
       СчетИсходник.ПометкаУдаления = ЛОЖЬ) КАК СчетИсходник
ПО
   СчетНаОплатуПокупателю.Заказ = СчетИсходник.Заказ        
ГДЕ
   СчетНаОплатуПокупателю.ПометкаУдаления = ЛОЖЬ
   И СчетНаОплатуПокупателю.Обработан = ЛОЖЬ    
ИТОГИ ПО
   СчетНаОплатуПокупателю";
Запрос.Текст = ТекстЗапроса;
РЗ = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам);
Для Каждого СчетПолучатель из РЗ.Строки Цикл
   Док = СчетПолучатель.СчетНаОплатуПокупателю.ПолучитьОбъект();
   Для Каждого СчетИсходник из СчетПолучатель.Строки Цикл
       ТекСчетИсходник = СчетИсходник.СчетИсходник;
       НовСтрока=Док.Услуги.Добавить();
       НовСтрока.Номенклатура = ТекСчетИсходник .Номенклатура;
       НовСтрока.Рубрика = ТекСчетИсходник .Рубрика;
       НовСтрока.Исходник = ТекСчетИсходник .Исходник;
       НовСтрока.Цена = ТекСчетИсходник .Цена;
       НовСтрока.Количество = ТекСчетИсходник .Количество;
       НовСтрока.Сумма = ТекСчетИсходник .Цена * ТекСчетИсходник .Количество;
  КонецЦикла;
  Док.Записать(РежимЗаписиДокумента.Запись)
КонецЦикла;
15 ZZeRRo
 
07.08.09
12:55
Поля счета исходника, которые нужно добавить в табличную часть счета. тоже выведи в запрос, а ссылку на документ СчетИсходник убери. так быстрее наверна будет
16 ZZeRRo
 
07.08.09
12:59
Во.. лучше так

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

Запрос.Текст = ТекстЗапроса;
РЗ = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам);
Для Каждого СчетПолучатель из РЗ.Строки Цикл
   Док = СчетПолучатель.СчетНаОплатуПокупателю.ПолучитьОбъект();
   Для Каждого СчетИсходник из СчетПолучатель.Строки Цикл
       НовСтрока=Док.Услуги.Добавить();
       НовСтрока.Номенклатура = СчетИсходник .Номенклатура;
       НовСтрока.Рубрика = СчетИсходник .Рубрика;
       НовСтрока.Исходник = СчетИсходник .Исходник;
       НовСтрока.Цена = СчетИсходник .Цена;
       НовСтрока.Количество = СчетИсходник .Количество;
       НовСтрока.Сумма = СчетИсходник .Цена * СчетИсходник .Количество;
  КонецЦикла;
  Попытка
  Док.Записать(РежимЗаписиДокумента.Запись);
  Исключение
  Сообщить(ОписаниеОшибки());
  КонецПопытки;
КонецЦикла;
17 vpanasenko
 
07.08.09
14:43
Большое спасибо! Теперь другой проблем: нужно удалить те исходники, которые не попали в выборку. Вообще, суть всего этого: есть газета, куда разные юрлица/физлица дают объявления. Данные идут потоком. Можно, конечно, разобрать все материалы и вносить строго по каждому счету. Но это очень неудобно, проще забить шапки клиентов с названием заказа, а затем вбить все подряд исходники. А потом вот таким выше вами описанным способом прилепить данные к счетам. Но можно при внесении как счета так и исходника опечататься. Потому нужно как-то показать, какие исходники не "привязались". Думаю, самый постой вариант - удалить все привязанные, оставив только беспризорные записи. Выяснить причину, откорректировать Заказ и опять связать...
18 vpanasenko
 
07.08.09
14:43
ОПЕЧАТКА ! Большое спасибо! Теперь другой проблем: нужно удалить те исходники, которые ПОПАЛИ в выборку. Вообще, суть всего этого: есть газета, куда разные юрлица/физлица дают объявления. Данные идут потоком. Можно, конечно, разобрать все материалы и вносить строго по каждому счету. Но это очень неудобно, проще забить шапки клиентов с названием заказа, а затем вбить все подряд исходники. А потом вот таким выше вами описанным способом прилепить данные к счетам. Но можно при внесении как счета так и исходника опечататься. Потому нужно как-то показать, какие исходники не "привязались". Думаю, самый постой вариант - удалить все привязанные, оставив только беспризорные записи. Выяснить причину, откорректировать Заказ и опять связать...
20 vpanasenko
 
10.08.09
11:29
Запрос.Текст = ТекстЗапроса;
РЗ = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам);
Для Каждого СчетПолучатель из РЗ.Строки Цикл

   Для удаления из таблицы СчетИсходник необходимо извлечь все данные
   Исх = Документы.Исходник.Выбрать();

   Док = СчетПолучатель.СчетНаОплатуПокупателю.ПолучитьОбъект();
   Для Каждого СчетИсходник из СчетПолучатель.Строки Цикл
       НовСтрока=Док.Услуги.Добавить();
       НовСтрока.Номенклатура = СчетИсходник .Номенклатура;
       НовСтрока.Рубрика = СчетИсходник .Рубрика;
       НовСтрока.Исходник = СчетИсходник .Исходник;
       НовСтрока.Цена = СчетИсходник .Цена;
       НовСтрока.Количество = СчетИсходник .Количество;
       НовСтрока.Сумма = СчетИсходник .Цена * СчетИсходник .Количество;

       Я так понимаю, для удаления мне необходимо найти необходимую запись
       Исх.НайтиКаким-тоМетодом по СчетИсходник.Ссылка как Исходник и
       Исх.Удалит();

  КонецЦикла;
  Попытка
  Док.Записать(РежимЗаписиДокумента.Запись);
  Исключение
  Сообщить(ОписаниеОшибки());
  КонецПопытки;

Я на верном пути?
21 ZZeRRo
 
10.08.09
15:15
Так если тебе нужно удалить все СчетаИсходники, которые уже используются, зачем ты записывашь ссылку на них в СчетНаОплатуПокупателю? Так низя делать. Если нужно их удалить, то ссылки на них нужно очистить из всех мест, где они были
22 hhhh
 
10.08.09
15:30
просто строки надо удалить, а не сами документы
23 vpanasenko
 
10.08.09
16:06
Так а как их удалить то? На счет ссылочной целостности: мне просто сложно пока с ориентироваться. В СУБД есть конечно же тоже такое понятие как ссылочная целостность. В "обычной" (не в обиду :-) ) СУБД я бы сделал так (тут по сути, реализовано тоже): справочник исходников(Ключ, Название, Связь с Контрагентом), счета(Контрагент, дата,№ и т.д.), табличная часть(связь со Справочником исходников) и собственно вот эта хитрая таблица  счетИсходник (ИД(ключ), ИД справочника исходников, количество, цена и т.д.). Далее процедура Заполняет табличную часть данными из СчетИсходник, удаляет те, что уже привязаны. Но ссылочная целостность организована между: СправочникИсходников и Табличной Частью счетов и между Спровочник исходников и СчетИсходник. т.е. я могу смело удалять данные из СчетИсходник, между Счетами и СчетИсходник-Табличная часть нету жесткого контроля ссылочной целостности...Вот и теперь не знаю, что к чему
24 vpanasenko
 
10.08.09
16:13
Просто таблица СчетИсходник служит как бы данными, которые вводятся вручную с клавы. Ссылка в табличной части Счетов должна быть установлена на соответсвующую позицию Справочника Исходников.
Исходники:
ПК Название
1 исходник1
2 Исходник2

СчетИсходник
ИД ИД_Исходника и т.д.
1  1
2  2
Табличная часть заполняется данными из СчетИсходник
ИД ИД_Исходника
1   1
2   2
После удачного заполнения мне ничто не запрещает удалить из СчетИсходник записи с ИД 1, 2. Но это в, допустим FireBird, MS SQL, MS Access, Paradox и т.д. А тут я так понял, если заполнить данными табличную часть из СчетИсходник, я не могу очистить СчетИсходник, т.к. Ссылки табличной части идут на СчетИсходник, а не Исходники?
25 vpanasenko
 
10.08.09
16:21
Может, я первоначально ввел в заблуждение. Опишу теперь БД подробнее. В принципе, я уже ее описал в    "vpanasenko 23 - 10.08.09 - 16:06". В конфигурации есть: Исходники(было изначально). Каждый Исходник привязан к конкретному контрагенту. Есть СЧетНаОплатуКлиенту(с табличной частью). Я добавил в СчетНаОПлатуКлиенту реквизит Заказ - строка, таблицу СчетИсходник, где есть ссылка на Исходник и реквизит Заказ...Эти два изменения сделал я. Я думал, что смогу запросом объединить СчетНаОплатуКлиенту и СчетИсходник, получить данные для Табличной части СчетаНаОплатуКлиенту из СчетИсходник и заполнить эту самую табличную часть..Хотя! можно и не удалять! ввести еще одно поле, логическое, и если прошло все успешно выставить этот флаг в таблице СчетИсходник... а потом создать отчет или фильтр, чтобы показывал все строки, которые не обработаны. Меня это тоже устроит.  я просто не пойму, как мне найти в СчетИсходник нужную позиции и изменить ее...Особенно в части поиска.
26 ZZeRRo
 
10.08.09
16:27
Ну, можно выбрать все СчетаИсходники. которые не привязаны к СчетамНаОплату примерно так (один из вариантов, не самый я думаю удачный, но всеж):

ВЫбрать
   З2.СчетИсходник
ИЗ
   (Выбрать
       З1.СчетИсходник,
         СУММА(З1.Сч) КАК Сч
   ИЗ
           (ВЫБРАТЬ
               Услуги.СчетИсходник  КАК СчетИсходник,
               1 КАК Сч
           ИЗ
               Документ.СчетНаОплатуПокупателю.Услуги КАК Услуги
   
           ОБЪЕДИНИТЬ ВСЕ
   
           Выбрать    
               ДокСчетИсходник.Ссылка,
               0
           ИЗ
               Документ.СчетИсходник КАК ДокСчетИсходник        ) КАК З1
   СГРУППИРОВАТЬ ПО СчетИсходник) КАК З2
ГДЕ Сч =0
27 ZZeRRo
 
10.08.09
16:29
этот запрос выведет тебе все ссылки на СчетаИсходники, которые еще не привязаны ни к одному счету на оплату покупателю, т.е. в табличной части Услуги Счетов на оплату покупателю нет ссылок на эти счета-исходники (как то так)
28 vpanasenko
 
10.08.09
16:33
А все-таки, как осуществить поиск по ?...Даже не знаю, как назвать. Еще не вкурил. По ключу, что ли.. Чтобы я мог с позиционировать указатель (курсор) на конкретную позицию в таблице и смог ее изменить или удалить
29 vpanasenko
 
10.08.09
16:35
В помощи я не совсем все понял. Такое ощущение, что для каждых справочников/документов есть свои, уникальные методы, не применимые в других частях конфигурации
30 ZZeRRo
 
10.08.09
16:37
На счет (24), ссылок и удаления. Ты не можешь удалить запись, если ссылка на эту запись установлена в любой другой записи (за исключением некоторых ситуаций).

Для всех справочников, всех документов (не важно какого вида) есть свои методы, свойства и т.д. Почитай желтые книжечки, там об этом написано
31 ZZeRRo
 
10.08.09
16:38
Т.е для справочников одни методы, для документов другие, для регистров третьи и т.д.
32 vpanasenko
 
10.08.09
16:39
Я так и подозревал..:-) Оригинально...
33 ZZeRRo
 
10.08.09
16:41
(32) Это разные классы объектов
Поиск... Хм .. смотря по чему ищем.. Проще всего запросом, если знаешь условия поиска..
Запрос.Текст = "Выбрать... ИЗ ... ГДЕ ..."
РЗ = Запрс.Выполнить().Выбрать();
Пока РЗ.Следующий() Цикл
 // тут надо по ссылке получить объет, например так
 ТекОбъект = РЗ.Ссыка.ПолучитьОбъект();
 // ну а дальше удаляй, изменяй, записывай...
КонецЦикла;
34 vpanasenko
 
10.08.09
16:52
Мне больше понравилось то, что в Запросе я должен писать "Документ.ТрахТиБиДох", а в Коде - ДокументЫ.ТрахТиБиДох...Совсем оригинально..:-). Спасибо большое за помощь. Буду ковырять дальше
35 vpanasenko
 
10.08.09
16:55
Относительно 33 - 10.08.09 - 16:41 и моей задачи: я могу по ссылке сделать выборку? Т.е. использовать параметр и установить его в   "СчетИсходник.Ссылка КАК Исходник"?
36 ZZeRRo
 
10.08.09
16:59
Делать выборку по ссылке, типа в условие ГДЕ поставить Документ.ТрахТиБиДох.Ссылка = &Ссылка? - да можешь, но тогда тебе сначала нужно получить эту Ссылку, а смысл в этом?
37 vpanasenko
 
10.08.09
17:06
А разве я ее в верхнем запросе не получил? СчетИсходник.Исходник - это ведь ссылка ? если судить по
ТекстЗапроса = "ВЫБРАТЬ
   СчетНаОплатуПокупателю.Ссылка КАК СчетНаОплатуПокупателю,
      СчетИсходник.Номенклатура,
   СчетИсходник.Рубрика,
   СчетИсходник.Исходник,
   СчетИсходник.Цена,
   СчетИсходник.Количество
ИЗ
   Документ.СчетНаОплатуПокупателю КАК СчетНаОплатуПокупателю
ЛЕВОЕ СОЕДИНЕНИЕ(    
   ВЫБРАТЬ
       СчетИсходник.Заказ,
        СчетИсходник.Номенклатура,
       СчетИсходник.Рубрика,
       СчетИсходник.Ссылка КАК Исходник;
38 ZZeRRo
 
10.08.09
17:16
В запрсе то канечно да... это и есть ссылка на документ СчетИсходник. Я просто не очень могу понять что ты сейчас пытаешься сделать?
39 vpanasenko
 
10.08.09
17:20
Я добавил в СчетИсходник реквизит Обработан логический. И хочу выставить его в Истину. тогда можно будет выбрать/показать необработанные исходники. чтобы видно было привязанные и "висячие"
40 ZZeRRo
 
10.08.09
17:25
А (26) тебя не устраивает?
41 ZZeRRo
 
10.08.09
17:27
Лучше добавил бы в СчетИсходник реквизит с сылкой на документ СчетНаОплатуПокупателю. Тогда сразу бы видел в каком счете у тебя записан этот исходник
42 vpanasenko
 
10.08.09
17:28
Только не могу понять, почему в РЗ нету поля Исходник... Пытаюсь так
РЗ = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам);
Для Каждого СчетПолучатель из РЗ.Строки Цикл
   ЗапрИсх = Новый Запрос();
   ЗапрИсх.Текст =  "ВЫБРАТЬ * ИЗ Документ.СчетИсходник ГДЕ Ссылка=&Ссылка";
   Док = СчетПолучатель.СчетНаОплатуПокупателю.ПолучитьОбъект();
   Для Каждого СчетИсходник из СчетПолучатель.Строки Цикл
       НовСтрока=Док.Услуги.Добавить();
       НовСтрока.Номенклатура = СчетИсходник.Номенклатура;
       НовСтрока.Рубрика = СчетИсходник.Рубрика;
       НовСтрока.Исходник = СчетИсходник.Исходник;
       НовСтрока.Цена = СчетИсходник.ЦенаИсходника;
       НовСтрока.Количество = СчетИсходник.Количество;
       НовСтрока.Сумма = СчетИсходник.ЦенаИсходника * СчетИсходник.Количество;
       //НовСтрока.СтавкаНДС
       //-Удаляем исходник
       ЗапрИсх.УстановитьПараметр("Ссылка", РЗ.Исходник);
       Исходник = ЗапрИсх.Выполнить().Выгрузить();
       пока Исходник.следующий() цикл
           Исх = Исходник.Ссылка.ПолучитьОбъект();
       конеццикла;
Ведь при Выгрузке в РЗ должно быть поле Исходник?
На счет (26) - я просто пытаюсь сделать, как понимаю и когда хоть что-то понимаю...Тот запрос, возможно, решает текущую проблему. А будет новая и что мне делать?
43 vpanasenko
 
10.08.09
17:29
Интересно! Но решит ли это мою текущую проблему? Я по поводу (41)
44 vpanasenko
 
10.08.09
17:30
По поводу (42) - при попытке выполнить получаем сообщение что Объект Исходник не найден
45 vpanasenko
 
10.08.09
17:32
Ошибка возникает тут
ЗапрИсх.УстановитьПараметр("Ссылка", РЗ.Исходник);
46 hhhh
 
10.08.09
17:37
(45) неправильно

РЗ = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам);

надо

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

у тебя же здесь нет группировок. Хотя может дело и не в этом.
47 vpanasenko
 
10.08.09
17:51
Вот вся процедура.
Запрос = Новый Запрос;
ТекстЗапроса = "ВЫБРАТЬ
   |СчетНаОплатуПокупателю.Ссылка КАК СчетНаОплатуПокупателю,
      |СчетИсходник.Номенклатура,
   |СчетИсходник.Рубрика,
   |СчетИсходник.Исходник,
   |СчетИсходник.ЦенаИсходника,
   |СчетИсходник.Количество
|ИЗ
   |Документ.СчетНаОплатуПокупателю КАК СчетНаОплатуПокупателю
|ЛЕВОЕ СОЕДИНЕНИЕ(    
   |ВЫБРАТЬ
       |СчетИсходник.Заказ,
       |СчетИсходник.Номенклатура,
       |СчетИсходник.Рубрика,
       |СчетИсходник.Ссылка КАК Исходник,
       |СчетИсходник.ЦенаИсходника,
       |СчетИсходник.Количество
   |ИЗ
       |Документ.СчетИсходник КАК СчетИсходник
   |ГДЕ        
       |СчетИсходник.ПометкаУдаления = ЛОЖЬ) КАК СчетИсходник
|ПО
   |СчетНаОплатуПокупателю.Заказ = СчетИсходник.Заказ        
|ГДЕ
   |СчетНаОплатуПокупателю.ПометкаУдаления = ЛОЖЬ
   |И СчетНаОплатуПокупателю.Обработан = ЛОЖЬ
   |И (СчетНаОплатуПокупателю.Заказ <> """" ИЛИ СчетНаОплатуПокупателю.Заказ ЕСТЬ НЕ NULL)
|ИТОГИ ПО
   |СчетНаОплатуПокупателю";

Запрос.Текст = ТекстЗапроса;
РЗ = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам);
Для Каждого СчетПолучатель из РЗ.Строки Цикл
   ЗапрИсх = Новый Запрос();
   ЗапрИсх.Текст =  "ВЫБРАТЬ * ИЗ Документ.СчетИсходник ГДЕ Ссылка=&Ссылка";
   Док = СчетПолучатель.СчетНаОплатуПокупателю.ПолучитьОбъект();
   Для Каждого СчетИсходник из СчетПолучатель.Строки Цикл
       НовСтрока=Док.Услуги.Добавить();
       НовСтрока.Номенклатура = СчетИсходник.Номенклатура;
       НовСтрока.Рубрика = СчетИсходник.Рубрика;
       НовСтрока.Исходник = СчетИсходник.Исходник;
       НовСтрока.Цена = СчетИсходник.ЦенаИсходника;
       НовСтрока.Количество = СчетИсходник.Количество;
       НовСтрока.Сумма = СчетИсходник.ЦенаИсходника * СчетИсходник.Количество;
       //НовСтрока.СтавкаНДС
       //-Удаляем исходник
       //ЗапрИсх.УстановитьПараметр("Ссылка", РЗ.Исходник);
       Исходник = ЗапрИсх.Выполнить().Выгрузить();
       пока Исходник.следующий() цикл
           Исх = Исходник.Ссылка.ПолучитьОбъект();
       конеццикла;
       
       
  КонецЦикла;
  Попытка
  Док.Записать(РежимЗаписиДокумента.Запись);
  Исключение
  Сообщить(ОписаниеОшибки());
  КонецПопытки;
КонецЦикла;
Это код, окромя
   ЗапрИсх = Новый Запрос();
   ЗапрИсх.Текст =  "ВЫБРАТЬ * ИЗ Документ.СчетИсходник ГДЕ Ссылка=&Ссылка";
и
       //ЗапрИсх.УстановитьПараметр("Ссылка", РЗ.Исходник);
       Исходник = ЗапрИсх.Выполнить().Выгрузить();
       пока Исходник.следующий() цикл
           Исх = Исходник.Ссылка.ПолучитьОбъект();
       конеццикла;
был указан в
  ZZeRRo
16 - 07.08.09 - 12:59
Я теперь пытаюсь получить результат, используя пример
  ZZeRRo
33 - 10.08.09 - 16:41
48 vpanasenko
 
10.08.09
17:52
Т.е. пытаюсь получить объект СчетИсходник по ссылке из выборки выше и выствить флаг Обработан
49 ZZeRRo
 
10.08.09
17:57
Вот это не надо:
  //ЗапрИсх = Новый Запрос();
  // ЗапрИсх.Текст =  "ВЫБРАТЬ * ИЗ Документ.СчетИсходник ГДЕ Ссылка=&Ссылка";

У тебя же и так в запросе уже есть ссылки на СчетИсходник, так что вот так делай:

  Для Каждого СчетИсходник из СчетПолучатель.Строки Цикл
       НовСтрока=Док.Услуги.Добавить();
       НовСтрока.Номенклатура = СчетИсходник.Номенклатура;
       НовСтрока.Рубрика = СчетИсходник.Рубрика;
       НовСтрока.Исходник = СчетИсходник.Исходник;
       НовСтрока.Цена = СчетИсходник.ЦенаИсходника;
       НовСтрока.Количество = СчетИсходник.Количество;
       НовСтрока.Сумма = СчетИсходник.ЦенаИсходника * СчетИсходник.Количество;

       //- Ставим отметку что СчетИсходник обработан
       СчетИсходникОбъект = СчетИсходник.Исходник.ПолучитьОбъект();
       СчетИсходникОбъект.Обработан = Истина;
       СчетИсходникОбъект.Записать(РежимЗаписиОбъекта.Запись);
       
  КонецЦикла;
50 ZZeRRo
 
10.08.09
17:59
И еще в запрос тогда вставь вот это:

  |ВЫБРАТЬ
       |СчетИсходник.Заказ,
       |СчетИсходник.Номенклатура,
       |СчетИсходник.Рубрика,
       |СчетИсходник.Ссылка КАК Исходник,
       |СчетИсходник.ЦенаИсходника,
       |СчетИсходник.Количество
   |ИЗ
       |Документ.СчетИсходник КАК СчетИсходник
   |ГДЕ        
       |СчетИсходник.ПометкаУдаления = ЛОЖЬ
       // Вот это условие добавь:
       |И СчетИсходник.Обработан = ЛОЖЬ
        ) КАК СчетИсходник
51 ZZeRRo
 
10.08.09
18:01
Ну все, мне домой пора. Если шо завтра пиши
52 ZZeRRo
 
10.08.09
18:02
Только не *РежимЗаписиОбъекта*, а РежимЗаписиДокумента
53 vpanasenko
 
11.08.09
09:23
Уже пишу. Я тут подумал на счет ссылок и то, что нельзя удалять, если есть ссылка на другую таблицу. А ведь в СчетИсходнике, который я придумал есть ссылка на Исходник. Если переписать запрос так
ТекстЗапроса = "ВЫБРАТЬ
   СчетНаОплатуПокупателю.Ссылка КАК СчетНаОплатуПокупателю,
      СчетИсходник.Номенклатура,
   СчетИсходник.Рубрика,
   СчетИсходник.Исходник,
   СчетИсходник.Цена,
   СчетИсходник.Количество,
   СчетИсходник.СсылкаНаИсходник
ИЗ
   Документ.СчетНаОплатуПокупателю КАК СчетНаОплатуПокупателю
ЛЕВОЕ СОЕДИНЕНИЕ(    
   ВЫБРАТЬ
       СчетИсходник.Заказ,
        СчетИсходник.Номенклатура,
       СчетИсходник.Рубрика,
       СчетИсходник.Ссылка КАК Исходник;
       СчетИсходник.Цена,
       СчетИсходник.Количество,
       СчетИсходник.Исходник КАК СсылкаНаИсходник
   ИЗ
       Документ.СчетИсходник КАК СчетИсходник
   ГДЕ        
       СчетИсходник.ПометкаУдаления = ЛОЖЬ) КАК СчетИсходник
ПО
   СчетНаОплатуПокупателю.Заказ = СчетИсходник.Заказ        
ГДЕ
   СчетНаОплатуПокупателю.ПометкаУдаления = ЛОЖЬ
   И СчетНаОплатуПокупателю.Обработан = ЛОЖЬ    
ИТОГИ ПО
   СчетНаОплатуПокупателю";

и делать присвоение не СчетИсходник.Исходник (это ссылка на СчетИсходник), а
НовСтрока.Исходник = СчетИсходник.СсылкаНаИсходник;

Сейчас проверим...
54 vpanasenko
 
11.08.09
10:35
Флаг выставляет, вроде все переносит. Только почему-то выдает эксепшн, что не может преобразовать в число в этом месте
НовСтрока.Сумма = СчетИсходник.ЦенаИсходника * СчетИсходник.Количество;
И еще одна проблемка: нужно указать НДС. НДС - это перечисление. Как мне его присвоить то? Мне тупо нужно одно значение - 20%
55 vpanasenko
 
11.08.09
11:51
Вроде как с перечислениями разобрался, оказалось все проще, чем думалось. Как обычно. И, кстати, дает по крайней мере помечать на удаление данные
56 vpanasenko
 
11.08.09
11:54
в СчетИсходник. Теперь как бы перелить изменения в моей конфигурации в реальную..:-) Руками неохота...
57 vpanasenko
 
11.08.09
12:13
Вроде бы тоже нашел, как куски конфигурации переливать: Конфигурация-Выгрузить файлы конфигурации и, соответственно, Загрузить файлы конфигурации
58 vpanasenko
 
11.08.09
12:46
Что-то не получается импортнуть.
Ошибка загрузки файла '1cv8.pfl': объект метаданных не найден
Ошибка загрузки файла '1cv8cmn.pfl': объект метаданных не найден
Хотя файлы в указанном каталоге есть? Или это сообщение, что какой-то объект КОНКРЕТНЫЙ отсутствует? Хотя я из своей конфигурации выгрузил и пытаюсь в нее же загрузить
59 vpanasenko
 
11.08.09
15:20
Все, нашел, как втянуть изменения. Спасибо большое, ZZeRRo