Добрый день! Задача решается примерно так. Ниже фрагмент кода процедуры формирования заказов поставщикам по всем заказам покупателей с группировкой по поставщикам из ТЧ заказа покупателей. Данная процедура у меня дергается из регламентного задания и идет отправка на сайт.
X
Права = Неопределено;
//Заказы берем только за текщий день
ДатаНачала=НачалоДня(ТекущаяДата());
ДатаКонца=КонецДня(ТекущаяДата());
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ
| ЗаказСписок.Поставщик,
| ЗаказСписок.Ссылка.ПодразделениеКомпании,
| ЗаказСписок.Ссылка.Организация,
| ЗаказСписок.ЗаказОтправленПоставщику
|ИЗ
| Документ.ЗаказПокупателя.Товары КАК ЗаказСписок
|ГДЕ
| ЗаказСписок.Ссылка.Дата МЕЖДУ &ДатаНачала И &ДатаКонца
| И ЗаказСписок.Ссылка.Проведен = ИСТИНА
| И (НЕ ЗаказСписок.ЗаказОтправленПоставщику = ИСТИНА)
|
|СГРУППИРОВАТЬ ПО
| ЗаказСписок.Поставщик,
| ЗаказСписок.Ссылка.ПодразделениеКомпании,
| ЗаказСписок.Ссылка.Организация,
| ЗаказСписок.ЗаказОтправленПоставщику";
Запрос.УстановитьПараметр("ДатаНачала",ДатаНачала);
Запрос.УстановитьПараметр("ДатаКонца", ДатаКонца);
Результат = Запрос.Выполнить();
ВыборкаЗаказов = Результат.Выбрать();
//Получим список поставщиков в СЗ
Список.Очистить();
Пока ВыборкаЗаказов.Следующий() Цикл
Стр = Список.Добавить();
Стр.Поставщик = ВыборкаЗаказов.Поставщик;
Стр.Подразделение = ВыборкаЗаказов.ПодразделениеКомпании;
Стр.Организация = ВыборкаЗаказов.Организация;
КонецЦикла;
Для каждого ном из Список Цикл
Подр=Справочники.ПодразделенияКомпании.НайтиПоКоду(ном.Подразделение.Код);
Орг =Справочники.Организации.НайтиПоКоду(ном.Организация.Код);
Пост=Справочники.Контрагенты.НайтиПоКоду(ном.Поставщик.Код);
Документ=Документы.ЗаказПоставщику.СоздатьДокумент();
Документ.УстановитьНовыйНомер();
Документ.Дата = ТекущаяДата();
Документ.Автор = ПараметрыСеанса.Пользователь;
Документ.ПодразделениеКомпании = Подр.Ссылка;
Документ.Организация = Орг.Ссылка;
Документ.Комментарий = "Автоформирование от: "+ ТекущаяДата();
Если обЗначениеНеЗаполнено(ном.Поставщик.Ссылка)Тогда
//Сообщить("Не указан поставщик "+(ном.Поставщик.Ссылка));
Иначе
Документ.Контрагент = Пост.Ссылка;
ВидДоговора = Перечисления.ВидыДоговоров.Покупка;
ДопПараметры = Документ.ДополнительныеСвойства;
УчитыватьПодразделение = Истина;
Документ.ДоговорВзаиморасчетов = дкПолучитьДоговорВзаиморасчетов(Документ.Контрагент,ВидДоговора ,Документ,ДопПараметры, УчитыватьПодразделение = Истина);
Документ.ОбработкаРеквизита("Контрагент");
Если обЗначениеНеЗаполнено(Документ.ДоговорВзаиморасчетов) Тогда
ПодразделениеДоговора=Документ.ПодразделениеКомпании;
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ
| ДоговорыВзаиморасчетов.Ссылка,
| ДоговорыВзаиморасчетов.Код,
| ДоговорыВзаиморасчетов.Владелец,
| ДоговорыВзаиморасчетов.ВидДоговора КАК ВидДоговора
|ИЗ
| Справочник.ДоговорыВзаиморасчетов КАК ДоговорыВзаиморасчетов
|ГДЕ
| ДоговорыВзаиморасчетов.Владелец.Ссылка = &ВладелецДоговора
| И ДоговорыВзаиморасчетов.ВидДоговора = ЗНАЧЕНИЕ(Перечисление.ВидыДоговоров.Продажа)
| И ДоговорыВзаиморасчетов.Подразделение В(&ПодрДоговора)
|
|УПОРЯДОЧИТЬ ПО
| ВидДоговора,
| ДоговорыВзаиморасчетов.Наименование
|АВТОУПОРЯДОЧИВАНИЕ";
Запрос.УстановитьПараметр("ВладелецДоговора",Документ.Контрагент);
Запрос.УстановитьПараметр("ПодрДоговора",ПодразделениеДоговора);
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
ДоговорВзаиморасчетовСсылка=Выборка.Ссылка;
КонецЦикла;
Если Запрос.Выполнить().Пустой() Тогда
//Сообщить("|Создаем корректный договор!!!!");
//иначе создадим новый
НовыйДоговор = Справочники.ДоговорыВзаиморасчетов.СоздатьЭлемент();
НовыйДоговор.УстановитьНовыйКод();
НовыйДоговор.Владелец = Документ.Контрагент;
НовыйДоговор.Организация = Документ.Организация;
НовыйДоговор.Подразделение = Документ.ПодразделениеКомпании;
НовыйДоговор.ВидДоговора = Перечисления.ВидыДоговоров.Покупка;
НовыйДоговор.ВалютаВзаиморасчетов = Документ.ВалютаДокумента;
НовыйДоговор.ДатаНачала = НачалоДня(Документ.Дата);
НовыйДоговор.ТипЦенПокупки = "";
НовыйДоговор.ТипЦенПродажи = "";
НовыйДоговор.ВидОплаты = Перечисления.ВидыОплаты.ПроизвольнаяОплата;
НовыйДоговор.ТипСкидкиНаценки = "";
НовыйДоговор.ТипСкидкиНаценкиРабот = "";
НовыйДоговор.СпособЗакрытияСделок = Перечисления.СпособЗакрытияСделок.ПоРасчетнымДокументам;
Если обЗначениеНеЗаполнено(НовыйДоговор.СпособЗакрытияСделок) Тогда
НовыйДоговор.СпособЗакрытияСделок = Перечисления.СпособЗакрытияСделок.ПоРасчетнымДокументам;
КонецЕсли;
НовыйДоговор.АвтоЗакрытиеСделок = Истина;
НовыйДоговор.НомерДоговора = Документ.ПодразделениеКомпании.Наименование;
НовыйДоговор.Комментарий = "Создан "+Документ.ХозОперация+ " от: " +Документ.Дата;
НовыйДоговор.СформироватьНаименование();
НовыйДоговор.ПроверятьЗаполнение = Ложь;
Попытка
НовыйДоговор.Записать();
Исключение КонецПопытки;
Если обЗначениеНеЗаполнено(Документ.Контрагент.ОсновнойДоговорВзаиморасчетов) Тогда
КонтрагентОбъект = Документ.Контрагент.ПолучитьОбъект();
КонтрагентОбъект.ОсновнойДоговорВзаиморасчетов = НовыйДоговор.Ссылка;
КонтрагентОбъект.Записать();
КонецЕсли;
Документ.ДоговорВзаиморасчетов="";
ДоговорВзаиморасчетовСсылка = НовыйДоговор.Ссылка;
Документ.ДоговорВзаиморасчетов=ДоговорВзаиморасчетовСсылка;
Иначе
Документ.ДоговорВзаиморасчетов=ДоговорВзаиморасчетовСсылка;
КонецЕсли;
Иначе
Документ.ДоговорВзаиморасчетов = дкПолучитьДоговорВзаиморасчетов(Документ.Контрагент,ВидДоговора ,Документ,ДопПараметры, УчитыватьПодразделение = Истина);
Документ.ОбработкаРеквизита("Контрагент");
КонецЕсли;
КонецЕсли;
Документ.ВалютаДокумента = Константы.ВалютаРегламентированногоУчетаОрганизаций.Получить();
Документ.КурсДокумента = 1;
Документ.ТипЦен = Справочники.ТипыЦен.ОсновнойТипЦенЗакупки;
Документ.ОбработкаРеквизита("ТипЦен");
Документ.ХозОперация = Справочники.ХозОперации.ЗаказПоставщику;
Документ.Проект = "";
Документ.ВнешнийНомерЗаказа = Документ.Номер;
//Заполнение Распределения заказа
Результат = "ЗаполнитьПоПоставщику";
Если Результат = "ЗаполнитьПоПоставщику" Тогда
Если обЗначениеНеЗаполнено(Документ.Контрагент) Тогда
Возврат;
КонецЕсли;
Если Документ.РаспределениеЗаказа.Количество() > 0 Тогда
Документ.РаспределениеЗаказа.Очистить();
КонецЕсли;
ТекстЗапроса =
"ВЫБРАТЬ
| ЗаказыПокупателейОстатки.Заказ КАК ЗаказПокупателя,
| ЗаказыПокупателейОстатки.Номенклатура КАК Номенклатура,
| ЗаказыПокупателейОстатки.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
| ЗаказТовары.ЗаказОтправленПоставщику КАК ЗаказОтправленПоставщику,
| ЗаказыПокупателейОстатки.ЗаказаноОстаток - ЗаказыПокупателейОстатки.РезервОстаток - ЕСТЬNULL(ЗаказыРаспределениеОстатки.КоличествоОстаток, 0) / ЗаказыПокупателейОстатки.Номенклатура.ОсновнаяЕдиницаИзмерения.Коэффициент КАК Количество
|ИЗ
| РегистрНакопления.ЗаказыПокупателей.Остатки(&Момент, Заказ ССЫЛКА Документ.ЗаказПокупателя) КАК ЗаказыПокупателейОстатки
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ЗаказыРаспределение.Остатки(&Момент, ЗаказПокупателя ССЫЛКА Документ.ЗаказПокупателя) КАК ЗаказыРаспределениеОстатки
| ПО ЗаказыПокупателейОстатки.Заказ = ЗаказыРаспределениеОстатки.ЗаказПокупателя
| И ЗаказыПокупателейОстатки.Номенклатура = ЗаказыРаспределениеОстатки.Номенклатура
| И ЗаказыПокупателейОстатки.ХарактеристикаНоменклатуры = ЗаказыРаспределениеОстатки.ХарактеристикаНоменклатуры
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЗаказПокупателя.Товары КАК ЗаказТовары
| ПО ЗаказыПокупателейОстатки.Заказ = ЗаказТовары.Ссылка
| И ЗаказыПокупателейОстатки.Номенклатура = ЗаказТовары.Номенклатура
| И ЗаказыПокупателейОстатки.ХарактеристикаНоменклатуры = ЗаказТовары.ХарактеристикаНоменклатуры
|ГДЕ
| ЗаказыПокупателейОстатки.ЗаказаноОстаток - ЗаказыПокупателейОстатки.РезервОстаток > ЕСТЬNULL(ЗаказыРаспределениеОстатки.КоличествоОстаток, 0)
| И ЗаказТовары.Поставщик = &Поставщик
| И (НЕ ЗаказТовары.ЗаказОтправленПоставщику = ИСТИНА)";
Запрос = Новый Запрос(ТекстЗапроса);
Запрос.УстановитьПараметр("Момент", ?(Документ.ЭтоНовый(), КонецДня(ТекущаяДата()), ТекущаяДата())); //Документ.Дата -- > МоментВремени()
Запрос.УстановитьПараметр("Поставщик", Документ.Контрагент);
ТаблицаРезультат = Запрос.Выполнить().Выгрузить();
//РаспределениеЗаказа
Для Каждого СтрокаТаблицыРезультата Из ТаблицаРезультат Цикл
НоваяСтрока = Документ.РаспределениеЗаказа.Добавить();
НоваяСтрока.Номенклатура = СтрокаТаблицыРезультата.Номенклатура;
НоваяСтрока.ХарактеристикаНоменклатуры = СтрокаТаблицыРезультата.ХарактеристикаНоменклатуры;
Документ.ОбработкаРеквизита("РаспределениеЗаказа.Номенклатура",НоваяСтрока, ЭтотОбъект);
НоваяСтрока.Количество = СтрокаТаблицыРезультата.Количество;
Документ.ОбработкаРеквизита("РаспределениеЗаказа.Количество",НоваяСтрока, ЭтотОбъект);
НоваяСтрока.ЗаказПокупателя = СтрокаТаблицыРезультата.ЗаказПокупателя;
Документ.ОбработкаРеквизита("РаспределениеЗаказа.ЗаказПокупателя", НоваяСтрока, ЭтотОбъект);
НоваяСтрока.ЗаказОтправленПоставщику = СтрокаТаблицыРезультата.ЗаказОтправленПоставщику;
КонецЦикла;
//Товары
Для Каждого СтрокаТаблицыРезультата Из ТаблицаРезультат Цикл
НоваяСтрока = Документ.Товары.Добавить();
НоваяСтрока.Номенклатура = СтрокаТаблицыРезультата.Номенклатура;
НоваяСтрока.ХарактеристикаНоменклатуры = СтрокаТаблицыРезультата.ХарактеристикаНоменклатуры;
Документ.ОбработкаРеквизита("Товары.Номенклатура",НоваяСтрока, ЭтотОбъект);
НоваяСтрока.Количество = СтрокаТаблицыРезультата.Количество;
Документ.ОбработкаРеквизита("Товары.Количество",НоваяСтрока, ЭтотОбъект);
НоваяСтрока.Распределено = СтрокаТаблицыРезультата.Количество;
Документ.ОбработкаРеквизита("Товары.Распределено",НоваяСтрока, ЭтотОбъект);
Документ.ОбработкаРеквизита("Товары.ЕдиницаИзмерения", НоваяСтрока, ЭтотОбъект);
КонецЦикла;
КонецЕсли;
Если Документ.РаспределениеЗаказа.Количество() > 0 Тогда
Попытка
Документ.Записать(РежимЗаписиДокумента.Проведение);
Исключение
Документ.Записать(РежимЗаписиДокумента.Запись);
КонецПопытки;
Иначе
Продолжить;
КонецЕсли;
КонецЦикла;
Но основная проблема вылазает позднее, когда столкнетесь с ошибкой:
1.Есть в программе три организации и 3-и подразделения, у каждой организации свой склад.
2. Формируем заказ покупателя по организации №1, подразделению №1, даже склад резервирования укажем №1
поставщика в ТЧ уакажем как "Основной поставщик"
3.Точно такой же товар, как в заказе покупателя по организации №1 приходуем на склад организации №2 от "Основной поставщик".
Видим что поступление товара списало заказ поставщика и зарезервировало товар, под заказ покупателя по организации №1, на складе организации №2 !!!!!