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