|
программное создание подчиненных документов на основании | ☑ | ||
---|---|---|---|---|
0
discant
21.06.12
✎
09:26
|
Здравствуйте.
Пишу обработку, которая на основании главного документа создает подчиненные. Речь идет об УПП и Документе ЗаказНаПроизводство. Не могу понять в чем дело, однако, обработка создает то кол-во документов сколько есть на закладке материалы, но все они одинаковы. Мне же надо получить Отдельный заказ на каждую подсборку (Т. е. отдельный заказ на каждую позицию закладки Материалы). Используется алгоритмы типового заполнения с модификацией для заполнения не по всей ТЧ, а по каждой строчке... Ниже привожу код. Заранее большое спасибо. Процедура КнопкаВыполнитьНажатие(Кнопка) Если НЕ ЗначениеЗаполнено(ПроизвЗаказ) Тогда Предупреждение("Выберите главный документ <<Заказы на производство>>!"); Возврат; КонецЕсли; Если ПроизвЗаказ.Материалы.Количество() = 0 Тогда Предупреждение("Заполните табличную часть "+"""Материалы"""); Возврат; КонецЕсли; Для каждого Объект Из РегистрыНакопления Цикл Объект.УстановитьИспользованиеИтогов(Истина); КонецЦикла; ДопПараметры = Новый Структура; МассивПолуфабрикаты = Новый Массив; МассивПолуфабрикаты.Добавить(Перечисления.ВидыВоспроизводстваНоменклатуры.Производство); ДопПараметры.Вставить("ВидВоспроизводства", МассивПолуфабрикаты); ДопПараметры.Вставить("ИмяРеквЗаказТабЧасть", "Заказ"); ДопПараметры.Вставить("ВернутьРезультатЗапроса", Истина); РезЗапроса = Неопределено; ЗаказыНаПроизводствоИПереработку.ЗаполнитьТабличнуюЧастьПоПотребностямЗаказаНаПроизводство(РезЗапроса, ПроизвЗаказ, ДопПараметры); // Создаем список значений подразделений. СписокПодр = Новый СписокЗначений; Обход = РезЗапроса.Выбрать(); Пока Обход.СледующийПоЗначениюПоля("Подразделение") Цикл Если СписокПодр.НайтиПоЗначению(Обход.Подразделение)=неопределено Тогда СписокПодр.Добавить(Обход.Подразделение); КонецЕсли; КонецЦикла; ВыбрПодр = Неопределено; // Подставляем подразделение из шапки Если СписокПодр.Количество() > 1 Тогда СписокПодр.Вставить(0, Неопределено, "<Все подразделения>"); ВыбрПодр = СписокПодр[0].Значение; // По умолчанию значение - <Все подразделения> ВыбрПодр = СписокПодр.ВыбратьЭлемент("Выберите подразделение...", СписокПодр[0]); Если ВыбрПодр <> Неопределено Тогда // Пользователь отказался от выбора ВыбрПодр = ВыбрПодр.Значение; КонецЕсли; ИначеЕсли СписокПодр.Количество() = 1 Тогда ВыбрПодр = СписокПодр[0].Значение; КонецЕсли; Если ВыбрПодр <> Неопределено Тогда // Пользователь выбрал конкретное подразделение Подразделение = ВыбрПодр; КонецЕсли; Для Каждого СтрокаТабличнойЧасти Из ПроизвЗаказ.Материалы Цикл Номенклатура = СтрокаТабличнойЧасти.Номенклатура; НовыйДокумент = Документы.ЗаказНаПроизводство.СоздатьДокумент(); ЗаполнениеДокументов.ЗаполнитьШапкуДокументаПоОснованию(НовыйДокумент, ПроизвЗаказ); НовыйДокумент.ОсновнойЗаказНаПроизводство = ПроизвЗаказ; НовыйДокумент.Подразделение = РегистрыСведений.ЗначенияСвойствОбъектов.Получить(Новый Структура("Объект,Свойство",Номенклатура,ПланыВидовХарактеристик.СвойстваОбъектов.НайтиПоНаименованию("Цех"))).Значение; НовыйДокумент.Дата = ТекущаяДата(); НовыйДокумент.ДатаЗапуска = ПроизвЗаказ.ДатаЗапуска; НовыйДокумент.ДатаИсполнения = ПроизвЗаказ.ДатаЗапуска -1; НовыйДокумент.УстановитьНовыйНомер(ПроизвЗаказ.Организация.Префикс); НовыйДокумент.Ответственный = глЗначениеПеременной("глТекущийПользователь"); Обход = РезЗапроса.Выбрать(); Пока Обход.Следующий() Цикл Если ВыбрПодр = Неопределено ИЛИ ВыбрПодр = Обход.Подразделение Тогда // Заполняем таб. часть Продукция НоваяСтрока = НовыйДокумент.Продукция.Добавить(); ЗаполнитьЗначенияСвойств(НоваяСтрока, Обход); НоваяСтрока.Количество = Обход.Количество * Обход.КоэффициентХраненияОстатков / Обход.Коэффициент; НоваяСтрока.Спецификация = УправлениеПроизводством.ОпределитьСпецификациюПоУмолчанию(НоваяСтрока.Номенклатура, НоваяСтрока.ХарактеристикаНоменклатуры, НовыйДокумент.Дата, НовыйДокумент.Подразделение); КонецЕсли; КонецЦикла; //Заполняем Табл. часть Материалы: ТаблицаИсходныеКомплектующие = НовыйДокумент.Материалы.Выгрузить(); Параметры = Новый Структура("ПараметрыВыпуска, КоличествоУровнейРазузлования, ДатаСпецификации"); Для Каждого СтрокаТабличнойЧасти Из НовыйДокумент.Продукция Цикл Если НЕ ЗначениеЗаполнено(СтрокаТабличнойЧасти.Спецификация) Тогда Продолжить; КонецЕсли; РезультатРазузлования = Новый Структура("ИсходныеКомплектующие"); СтруктураИсточник = Новый Структура("Номенклатура, ХарактеристикаНоменклатуры, ЕдиницаИзмерения, Коэффициент, Количество, Спецификация"); ЗаполнитьЗначенияСвойств(СтруктураИсточник, СтрокаТабличнойЧасти); ПараметрыВыпуска = Новый Соответствие; Для Каждого ПараметрВыпуска из НовыйДокумент.ПараметрыВыпускаПродукции Цикл Если ПараметрВыпуска.КлючСвязи = СтрокаТабличнойЧасти.КлючСвязи Тогда ПараметрыВыпуска.Вставить(ПараметрВыпуска.ВидПараметра.Наименование, ПараметрВыпуска.Значение); КонецЕсли; КонецЦикла; Параметры.ПараметрыВыпуска = ПараметрыВыпуска; Параметры.КоличествоУровнейРазузлования = 1; Параметры.ДатаСпецификации = НовыйДокумент.Дата; МассивОшибок = РазузлованиеНоменклатуры.РазузловатьНоменклатуру(СтруктураИсточник, РезультатРазузлования, Параметры); Если МассивОшибок.Количество() > 0 Тогда Для каждого Ошибка из МассивОшибок Цикл ОбщегоНазначения.Сообщение("Ошибка: " + Ошибка.Причина, Ошибка.СтатусОшибки); ОбщегоНазначения.Сообщение(" Спецификация: " + Ошибка.Спецификация); ОбщегоНазначения.Сообщение(" Номер строки: " + Ошибка.НомерСтроки); ОбщегоНазначения.Сообщение(" Описание ошибки: " + Ошибка.ОписаниеОшибки); КонецЦикла; КонецЕсли; Если РезультатРазузлования.ИсходныеКомплектующие = Неопределено Тогда Продолжить; КонецЕсли; ИсходныеКомплектующие = РезультатРазузлования.ИсходныеКомплектующие; ИсходныеКомплектующие.ЗаполнитьЗначения(ВыбрПодр, "Подразделение"); //заполним подразделение по основной спецификации полуфабрикатов Для каждого Строка из ИсходныеКомплектующие цикл ПодразделениеНоменклатуры = ЗаказыНаПроизводствоИПереработку.ПолучитьПодразделениеИзСпецификации(Строка.Спецификация,Строка.Номенклатура,Строка.ХарактеристикаНоменклатуры); Если ЗначениеЗаполнено(ПодразделениеНоменклатуры) Тогда Строка.Подразделение = ПодразделениеНоменклатуры; КонецЕсли; КонецЦикла; ИсходныеКомплектующие.Колонки.Добавить("Продукция"); ИсходныеКомплектующие.Колонки.Добавить("ХарактеристикаПродукции"); ИсходныеКомплектующие.ЗаполнитьЗначения(СтрокаТабличнойЧасти.Номенклатура, "Продукция"); ИсходныеКомплектующие.ЗаполнитьЗначения(СтрокаТабличнойЧасти.ХарактеристикаНоменклатуры, "ХарактеристикаПродукции"); ИсходныеКомплектующие.ЗаполнитьЗначения(СтрокаТабличнойЧасти.Спецификация, "Спецификация"); ОбщегоНазначения.ЗагрузитьВТаблицуЗначений(ИсходныеКомплектующие, ТаблицаИсходныеКомплектующие); КонецЦикла; ТаблицаИсходныеКомплектующие.Свернуть("Номенклатура, ХарактеристикаНоменклатуры, ЕдиницаИзмерения, Коэффициент, ВидВоспроизводства, Спецификация, Подразделение, Продукция, ХарактеристикаПродукции", "Количество"); НовыйДокумент.Материалы.Загрузить(ТаблицаИсходныеКомплектующие); Для Каждого СтрокаТабличнойЧасти Из НовыйДокумент.Материалы Цикл ОбработкаТабличныхЧастей.ЗаполнитьЕдиницуМестТабЧасти(СтрокаТабличнойЧасти, ЭтотОбъект, Ложь); КонецЦикла; НовыйДокумент.Записать(); Сообщить("Документ "+СокрЛП(НовыйДокумент)); КонецЦикла; КонецПроцедуры Заранее спасибо за отклик! |
|||
1
Yea-Yea
21.06.12
✎
09:30
|
||||
2
Yea-Yea
21.06.12
✎
09:30
|
пилите шура, пилите
|
|||
3
butterbean
21.06.12
✎
09:31
|
(0) у тебя в цикле один и тот-же результат запроса перебирается и документы заполняются одними данными
|
|||
4
Maxus43
21.06.12
✎
09:34
|
автор уже запутался в своём копро-коде.
Начни с нуля, не подглядывая в старое, ну или напейся |
|||
5
discant
21.06.12
✎
09:47
|
(4) Я всегда считал, что подобные комьюнити изначально создаются для того, чтобы помогать, а не тролить... Что ж, видимо, ошибался...
|
|||
6
butterbean
21.06.12
✎
09:48
|
(5) для чего оно создавалось уже никто и не вспомнит
|
|||
7
Maxus43
21.06.12
✎
09:49
|
(5) ты уже 4-ю ветку про одно и тоже создал, ответов там было куча, многие правильные, типа (3). Или вы ждёте что мы за вас код напишем? Указали на ошибку - исправь сначала, потом дальше
|
|||
8
discant
21.06.12
✎
09:53
|
(7) Так ветки новые создавать приходится, потому, что по началу идет активность, а потом, когда появляются новые вопросы по этой же теме и в эту же ветку их постишь - тишина... I'm Sorry за флуд, но как по-другому привлечь внимание к своей проблеме я не знаю...
|
|||
9
Maxus43
21.06.12
✎
10:28
|
опиши задачу, без всяких слов подсборка и т.д.
например: Есть документ, в нём ТЧ. на каждую строку ТЧ хочу сформировать отдельный заказ. так? |
|||
10
Жан Пердежон
21.06.12
✎
10:31
|
(8) заметь, ты в (0) так и не написал, чего тебе надо
|
|||
11
Жан Пердежон
21.06.12
✎
10:46
|
(10)+ сори вроде написал, на вскиду ошибка в цикле
Для каждого Строка из ИсходныеКомплектующие цикл ... |
|||
12
discant
21.06.12
✎
11:07
|
Задача такая:
Есть основной документ. Нужно перебрать его табличную часть "Материалы и по каждой строке этой табличной части создать подчиненный документ. Основной документ - заказ на производство, подчиненный документ тоже должен быть заказом на производство. Подчиненный заказ на производство должен содержать в ТЧ продукция элемент из ТЧ Материалы основного документа. ТЧ Материалы должна заполняться в соответствии с деревом спецификаций элемента из ТЯ Продукция подчиненного документа. Если что непонятно, спрашивайте |
|||
13
discant
21.06.12
✎
13:38
|
АУ, Люди...
|
|||
14
discant
21.06.12
✎
13:57
|
Решил отказаться от обработок типовых механизмов... Пытаюсь заполнять таким образом:
// Заполняем таб. часть Продукция НоваяСтрока = НовыйДокумент.Продукция.Добавить(); НоваяСтрока.Номенклатура = ПроизвЗаказ.Материалы.Номенклатура; НоваяСтрока.ХарактеристикаНоменклатуры = ПроизвЗаказ.Материалы.ХарактеристикаНоменклатураы; НоваяСтрока.Количество = ПроизвЗаказ.Материалы.Количество; НоваяСтрока.ЕдиницаИзмерения = ПроизвЗаказ.Материалы.ЕдиницаИзмерения; НоваяСтрока.Коэффициент = ПроизвЗаказ.Материалы.Коэффициент; НоваяСтрока.Спецификация = ПроизвЗаказ.Материалы.Спецификация; Нормально сохраняется, однако при выполнении выдает ошибку Поле объекта не обнаружено (Номенклатура) Что не так? |
|||
15
Maxus43
21.06.12
✎
14:00
|
ПроизвЗаказ.Материалы[НомерСтроки]Номенклатура
|
|||
16
Maxus43
21.06.12
✎
14:01
|
ЗаполнитьЗначенияСвойств(НоваяСтрока, ПроизвЗаказ.Материалы[номер]);
|
|||
17
discant
21.06.12
✎
14:05
|
Номер - это переменная или надо что-то указывать?
|
|||
18
Maxus43
21.06.12
✎
14:08
|
(17) номер - это номер строчки в ТЧ дока, число
|
|||
19
Maxus43
21.06.12
✎
14:09
|
Для каждого Строчка Из ПроизвЗаказ.Материалы Цикл
.... НоваяСтрока = НовыйДокумент.Продукция.Добавить(); ЗаполнитьЗначенияСвойств(НоваяСтрока, Строчка); КонецЦикла; |
|||
20
discant
21.06.12
✎
14:14
|
Так и сделал... Расибо... Только переменная строчка у меня по иному называется... все равно поле объекта не обнаружено (Номенклатура)
|
|||
21
Maxus43
21.06.12
✎
14:18
|
в цикле не должно быть строк уже типа
НоваяСтрока.Номенклатура = ПроизвЗаказ.Материалы.Номенклатура; |
|||
22
Maxus43
21.06.12
✎
14:18
|
цикл покажи
|
|||
23
discant
21.06.12
✎
14:28
|
Ушла ошибка с номенклатурой... Появилась
Получение элемента по индексу для значения неопределено. Вот цикл: Для Каждого СтрокаТабличнойЧасти Из ПроизвЗаказ.Материалы Цикл Номенклатура = СтрокаТабличнойЧасти.Номенклатура; НовыйДокумент = Документы.ЗаказНаПроизводство.СоздатьДокумент(); ЗаполнениеДокументов.ЗаполнитьШапкуДокументаПоОснованию(НовыйДокумент, ПроизвЗаказ); НовыйДокумент.ОсновнойЗаказНаПроизводство = ПроизвЗаказ; НовыйДокумент.Подразделение = РегистрыСведений.ЗначенияСвойствОбъектов.Получить(Новый Структура("Объект,Свойство",Номенклатура,ПланыВидовХарактеристик.СвойстваОбъектов.НайтиПоНаименованию("Цех"))).Значение; НовыйДокумент.Дата = ТекущаяДата(); НовыйДокумент.ДатаЗапуска = ПроизвЗаказ.ДатаЗапуска; НовыйДокумент.ДатаИсполнения = ПроизвЗаказ.ДатаЗапуска -1; НовыйДокумент.УстановитьНовыйНомер(ПроизвЗаказ.Организация.Префикс); НовыйДокумент.Ответственный = глЗначениеПеременной("глТекущийПользователь"); // Заполняем таб. часть Продукция НоваяСтрока = НовыйДокумент.Продукция.Добавить(); ЗаполнитьЗначенияСвойств(НоваяСтрока, ПроизвЗаказ.Материалы[СтрокаТабличнойЧасти]); КонецЦикла; |
|||
24
Maxus43
21.06.12
✎
14:36
|
ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаТабличнойЧасти);
|
|||
25
discant
21.06.12
✎
14:40
|
А куда индексы делись?
|
|||
26
Maxus43
21.06.12
✎
14:48
|
ПроизвЗаказ.Материалы[Номер строки в ТЧ документа, НОМЕР - цифорой, а не то что у тебя "СтрокаТабличнойЧасти", она не цифра]
|
|||
27
discant
21.06.12
✎
14:58
|
В общем, так взлетела... Спасибо огромное=)
|
|||
28
discant
21.06.12
✎
17:28
|
Есть еще вопрос по заполнению ТЧ материалы по спецификации Продукция. В Заказе на производство есть экспортная процедура ЗаполнитьМатериалыПоСпецификации(ТабличнаяЧасть, ИмяТабличнойЧасти)
Подскажите, пожалуйста, как ее можно вызвать из обработки и какие параметры передавать? |
|||
29
discant
22.06.12
✎
09:16
|
????????????????????
|
|||
30
discant
26.06.12
✎
17:18
|
Добрый день!
Создаю и заполняю подчиненные заказы на производство стандартными процедурами заполнения: ЗаполнитьПродукциюПоЗаказуНаПроизводство() и ЗаполнитьМатериалыПоСпецификации() Поскольку разузлование нужно полное, в первой процедуре делаю разузлование только основного заказа. Далее создаю процедуру, в которой таким же порядком создаются и заполняю подчиненные заказы низших уровней. Процедура разузлование подуровней вызывается рекурсивно. Однако, при выполнении возникает ошибка: {ОбщийМодуль.ЗаказыНаПроизводствоИПереработку.Модуль(1252)}: Ошибка при вызове метода контекста (Выполнить) ТабЧасть = Запрос.Выполнить(); по причине: по причине: {(20, 86)}: Неверные параметры РегистрНакопления.ПотребностиЗаказовНаПроизводство.Остатки(, ЗаказНаПроизводство В (<<?>>&ПроизвЗаказ) И ВидВоспроизводства В(&ВидВоспроизводства) ) КАК РегПотребности Код обработки выглядит так
|
|||
31
discant
26.06.12
✎
17:19
|
(30) В чем может быть дело?
|
|||
32
viktor_vv
26.06.12
✎
17:36
|
Попробую протелепатировать вот здесь
ЗП.ЗаполнитьПродукциюПоЗаказуНаПроизводство(ПроизвЗаказ); Надо ссылку передавать, а ты объект передаешь. |
|||
33
viktor_vv
26.06.12
✎
17:38
|
(32)+ Вренее вот здесь лажа какая-то
Процедура СоздатьВнутреннийУровень(ВерхЗаказ) // Передаешь еще даже не записанный объект ЗП.ЗаполнитьПродукциюПоЗаказуНаПроизводство(ЗП); |
|||
34
viktor_vv
26.06.12
✎
17:39
|
Скорее всего надо
ЗП.ЗаполнитьПродукциюПоЗаказуНаПроизводство(ВерхЗаказа); |
|||
35
discant
27.06.12
✎
11:38
|
Товарищи! это ошибка ушла, однако, почему-то создает документ только для первого уровня. Что-то неверно передается в процедуру "СоздатьвнутреннийУровень()"...
Посмотрите, пожалуйста |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |