Заказ поставщику - Как сделать отбор деталей по заказам конкретному поставщику

Внимание! Данный форум является модерируемым.
Для получения к нему доступа необходимо зарегистрироваться или авторизоваться на сайте.

Страницы: 1
RSS
Заказ поставщику - Как сделать отбор деталей по заказам конкретному поставщику
 
Добрый день!
Вопрос на форуме частично поднимался, но думаю обсудить его более детально.
Кофигурация АА.
Как При заказе поставщику сделать отбор деталей по заказам конкретному поставщику или хотя бы по складу?

1. Днём Менеджеры по продаже при заказе деталей, которых нету на складе оформляют внутренний заказ и должны указать у какого поставщика будет размещаться заказ, это делают они, т.к. разные поставщики - разные цены - разная прибыль для менеджера и он решает где заказывать.
2. Вечером менеджер по закупке оформляет заказ поставщику, и должен как-то отобрать детали(или заказы), которые должны быть заказаны у данного поставщика?
Возможен ли такой алгоритм в конфигурации? На данный момент выводится полный список всего заказанного...  :cry:

P.S. появилась идея наделать складов=количеству поставщиков. В "заказе покупателя"/"внутреннем заказе" указывать заказ детали на определенном складе-поставщике, а вечером как-то на основании того что было заказано на складе-поставщике оформить заказ поставщику... Пока не знаю на сколько реализуема.
 
Подобная задача уже зарегистрирована ранее под номером Ц001644001. Однако пока решения как это реализовать нет. Задача в процессе проработки.
 
Цитата
Александр Яблочкин пишет:
Подобная задача уже зарегистрирована ранее под номером Ц001644001. Однако пока решения как это реализовать нет. Задача в процессе проработки.
Понятно.
Может подскажите, что можно попробовать самостоятельно доработать, чтобы меньше вносить изменений в код?
 
Малой кровью - добавить у заказа покупателя свойство "Поставщик". И в подборе по заказам добавить возможность отбора по этому свойству.
Однако в этом случае отборы будут в разрезе заказов покупателя (не по номенклатуре).
 
Понятно, спасибо!
 
Цитата
Александр Яблочкин пишет:
Малой кровью - добавить у заказа покупателя свойство "Поставщик". И в подборе по заказам добавить возможность отбора по этому свойству.
Однако в этом случае отборы будут в разрезе заказов покупателя (не по номенклатуре).
Нужно, чтобы для каждой строки указывалось у кого товар заказывать.
Есть идея добавить в табличную часть "товары" "Заказа покупателя" колонку, и в ней прописывать поставщика, а потом эту информацию вытягивать оттуда.
Только пока не знаю как это сделать. При этом я вижу, что в данной табличной части можно к каждой строке привязывать скидку, цену выставить в ручную, опять же количество, т.е. уже есть колонки, которые подвязаны на конкретную строку с товаром в заказе.
Подскажите, пожалуйста, хоть один метод(где посмотреть код) как это реализовано в АА?
 
В заказе покупателя цены (и соответственно скидки) относятся к покупателю, а не к поставщику. Это цены, по которым мы реализуем товары.
Собственно можно добавить еще и колонку поставщика. И в обработке заполнения и в подборе по заказам отбирать только товары с требуемым поставщиком.
Что касается "метода". Что конкретно подсказать?
 
Цитата
Александр Яблочкин пишет:
Что касается "метода". Что конкретно подсказать?
Интересует как в конфигурации хранится связь цены/количества выставляемой в строке для товара с заказом покупателя.
Т.е. Есть заказ покупателя, в нём есть строки с продаваемыми товарами, в строках менеджер может выставить количество и цену(если у него разрешено её менять).
Где в конфигурации хранится эта связь?

Хочу добавить поле для каждой строки в табличную часть "товары" "Заказа покупателя" "Поле_N".
Потом, когда делаю заполнение "заказа поставщику" на основе подбора из заказанного(список деталей, в котором есть ссылка на заказ покупателя или внутренний заказ) - имея номенклатуру и заказ - получить "Поле_N" из заказа для номенклатуры и сделать по нему фильтр для данного списка деталей, проверяя равенство "Поля_N" и Контрагента из заказа Поставщику.
 
Связать остатки заказа покупателя с ТЧ самого заказа для получения поставщика можно примерно таким запросом (это набросок в какую сторону копать).
ВЫБРАТЬ
  ЗаказыПокупателейОстатки.Номенклатура,
  ЗаказыПокупателейОстатки.ХарактеристикаНоменклатуры,
  ЗаказыПокупателейОстатки.ЗаказаноОстаток,
  ЗаказПокупателяТовары.Поставщик КАК Поставщик
ИЗ
  РегистрНакопления.ЗаказыПокупателей.Остатки КАК ЗаказыПокупателейОстатки
     ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЗаказПокупателя.Товары КАК ЗаказПокупателяТовары
     ПО ЗаказыПокупателейОстатки.Заказ = ЗаказПокупателяТовары.Ссылка
     И ЗаказыПокупателейОстатки.Номенклатура = ЗаказПокупателяТовары.Номенклатура
     И ЗаказыПокупателейОстатки.ХарактеристикаНоменклатуры = ЗаказПокупателяТовары.ХарактеристикаНоменклатуры

А по поводу первой части вопроса по связи цены и количества - так и не понял где именно (в каком документе) и что есть связь? Цены заказа покупателя и цены заказа поставщику не связаны между собой.
 
Цитата
Александр Яблочкин пишет:
А по поводу первой части вопроса по связи цены и количества - так и не понял где именно (в каком документе) и что есть связь? Цены заказа покупателя и цены заказа поставщику не связаны между собой.
Я имел ввиду, связь между "Заказом покупателя" и строками табличной части, а также между "Заказом покупателя" и отдельными ячейками строк табличной части.

Я думаю, что такая связь ("заказ покупателя"-"номенклатура(строка товара)"-"Поле_N(ячейка строки)") позволит для каждой строки в ТЧ указать ссылку на поставщика, и впоследствии при вводе документа "Заказ Поставщику" сделать фильтрацию по "Поле_N", чтобы отобрать номенклатуру(строки товаров), которые должны быть заказаны именно у этого поставщика.
 
Вам нужно в Конфигураторе у табличной части "Товары" документа "Заказ покупателя" добавить еще один реквизит "Поставщик" с типом "CправочникCcылка.Контрагенты", Откройте форму документа и в контекстном меню табличной части "Товары" (нажмите правой кнопкой мышки в области отображения таблицы "Товары") выберите пункт "Размещение данных" увидите список всех полей табличной части. Для поля "Поставщик" установите флажок в истина. Все теперь можно при вводе заказа покупателя указывать поставщика и при записи или проведении документа данные будут сохраняться. При выборе "Поставщика" в документе "Заказ поставщику" перезаполнять табличную часть, используя представленный выше запрос с небольшими доработками отборов.
 
Спасибо, именно это и имел ввиду.
 
Заполнение сразу табличной части сделал.
Хочется, чтобы в подборе было видно колонку "Поставщик" для каждой товарной позиции, введённой в "Заказе покупателя".
Пробую вот так
Код
Процедура СписокНоменклатурыПриПолученииДанных(Элемент, ОформленияСтрок)
   ПЗаказ = ЭлементыФормы.СписокНоменклатуры.ТекущаяСтрока.Заказ;
   ПНоменклатура = ЭлементыФормы.СписокНоменклатуры.ТекущаяСтрока.Номенклатура;
   ЭлементыФормы.СписокНоменклатуры.ТекущаяСтрока.Поставщик = "Поставщик";

ТекстЗапроса = "ВЫБРАТЬ
|   ЗаказПокупателяТовары.Поставщик КАК Поставщик
|ИЗ
|   РегистрНакопления.ЗаказыПокупателей.Остатки КАК ЗаказыПокупателейОстатки
|      ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЗаказПокупателя.Товары КАК ЗаказПокупателяТовары
|      ПО ЗаказыПокупателейОстатки.Заказ = ЗаказПокупателяТовары.Ссылка
|         И ЗаказыПокупателейОстатки.Номенклатура = ЗаказПокупателяТовары.Номенклатура
|         И ЗаказыПокупателейОстатки.ХарактеристикаНоменклатуры = ЗаказПокупателяТовары.ХарактеристикаНоменклатуры
|ГДЕ
|   ЗаказыПокупателейОстатки.Заказ = &Заказ1
|   И ЗаказыПокупателейОстатки.Номенклатура = &Номенклатура1";

   Запрос = Новый Запрос(ТекстЗапроса);
   Запрос.УстановитьПараметр("Заказ1", ПЗаказ);
   Запрос.УстановитьПараметр("Номенклатура1", ПНоменклатура);
   
   РезультатЗапроса = Запрос.Выполнить();
   Если Не РезультатЗапроса.Пустой() Тогда
      ТЗ = РезультатЗапроса.Выгрузить();
      Сообщить(ТЗ[0].Поставщик);
   КонецЕсли;
КонецПроцедуры
Но ничего не находит(Поставщик=null). Хотя если выполнять через консоль запросов этот запрос - то находит.
Подскажите, пожалуйста, в чём может быть ошибка?
 
В отладке проверьте какие данные попадают в  ПЗаказ и ПНоменклатура скорее всего не то что вы ожидали. И
|ГДЕ
|   ЗаказыПокупателейОстатки.Заказ = &Заказ1
|   И ЗаказыПокупателейОстатки.Номенклатура = &Номенклатура1, отборы нужно писать в виртуальной таблице остатков. Запрос быстрее будет работать.
 
1. Посмотрел в дебаге:

в ПЗаказ и ПНоменклатура попадает то, что ожидал. Но ссылка на контрагента, почему то Null. Может надо что-то другое передавать в качестве параметра? ссылку на объекты, например...
2. А почему тогда в консоле запросов - находит нужного контрагента этот же запрос, если просто скопироватьи выставить параметры?
3. Насчёт виртуальной таблицы можно немного поподробней: имеется ввиду использовать вирт.таблицу, которую создаёт сама обработка "ПодборПоЗаказам"? а будет ли там ссылка на табличную часть "Товары" заказа поставщику?
 
Заранее извиняюсь если будут ошибки главное это смысл, написал на скорую руку.

Попробуйте такой вариант:

Объявите переменную формы
Перем КешПоставщиков;

В событии формы при открытии создайте кеш для хранения поставщиков

КешПоставщиков = Новый ТаблицаЗначений;
КешПоставщиков.Колонки.Добавить("Заказ", Новый ОписаниеТипов("СправочникСсылка.Заказ"));
КешПоставщиков.Колонки.Добавить("Номенклатура", Новый ОписаниеТипов("СправочникСсылка.Номенклатура"));
КешПоставщиков.Колонки.Добавить("ХарактеристикаНоменклатуры", Новый ОписаниеТипов("СправочникСсылка.ХарактеристикаНоменклатуры"));
КешПоставщиков.Колонки.Добавить("Поставщик", Новый ОписаниеТипов("СправочникСсылка.Контрагенты"));
КешПоставщиков.Индексы.Добавить("Номенклатура");
КешПоставщиков.Индексы.Добавить("ХарактеристикаНоменклатуры");


В Событии "СписокНоменклатурыПриПолученииДанных" заменим ваш код на:

ТаблицаТовара = Новый ТаблицаЗначений;
ТаблицаТовара.Колонки.Добавить("Заказ", Новый ОписаниеТипов("СправочникСсылка.Заказ"));
ТаблицаТовара.Колонки.Добавить("Номенклатура", Новый ОписаниеТипов("СправочникСсылка.Номенклатура"));
ТаблицаТовара.Колонки.Добавить("ХарактеристикаНоменклатуры", Новый ОписаниеТипов("СправочникСсылка.ХарактеристикаНоменклатуры"));

СтруктураПоиска = Новый Структура("Заказ, Номенклатура, ХарактеристикаНоменклатуры");
Для Каждого СтрокаТЧ Из ОформленияСтрок Цикл
       Если НЕ ТипЗнч(СтрокаТЧ.Заказ) = Тип("СправочникСсылка.ЗаказПокупателя") Тогда
             Продолжить;
       КонецЕсли;
ЗаполнитьЗначенияСвойств(СтруктураПоиска, СтрокаТЧ);
НайденныеСтроки = КешПоставщиков.НайтиСтроки(СтруктураПоиска);
Если НайденныеСтроки.Количество() = 0 Тогда
НоваяСтрока = ТаблицаТовара.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаТЧ.ДанныеСтроки);
Иначе
Сообщить(НайденныеСтроки[0].Поставщик);
КонецЕсли;
КонецЦикла;

Если ТаблицаТовара.Количество()>0 Тогда
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("ТаблицаТовара", ТаблицаТовара);

Запрос.Текст = "
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| ЗаказПокупателяТовары.Ссылка КАК Заказ,
| ЗаказПокупателяТовары.Номенклатура,
| ЗаказПокупателяТовары.ХарактеристикаНоменклатуры,
| ЗаказПокупателяТовары.Поставщик КАК Поставщик
|ИЗ
| Документ.ЗаказПокупателя.Товары КАК ЗаказПокупателяТовары
|ГДЕ
| (ЗаказПокупателяТовары.Ссылка,
| ЗаказПокупателяТовары.Номенклатура,
| ЗаказПокупателяТовары.ХарактеристикаНоменклатуры) В (&ТаблицаТовара)";

Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Сообщить(Выборка.Поставщик);
НоваяСтрока = КешПоставщиков.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, Выборка.ДанныеСтроки);
КонецЦикла;
КонецЕсли;

такой подход не приведет к меньшей потере производительности т.к. при каждом вызове события "СписокНоменклатурыПриПолученииДанных" будет выполняться поиск по таблице кеша, а обращаться к базе при помощи запроса будет только если данных в кеше не будет.

Будьте внимательны:
В таблице "Товары" документа заказ покупателя есть колонка единица измерения и если один и тот же товар заказывается с разными единицами и у разных поставщиков, то в запросе получим две строки на одну строку поиска, что делать решать вам. Единица измерения в подборе это базовая единица номенклатуры она не подойдет.

Еще есть вариант вместо кеша использовать саму таблицу "Список номенклатуры", но скорей всего при изменении хотябы одной строки таблицы будет повторный вызов события при получении данных.

Самый лучший подход для добавления Подразделения это рассмотреть макет обработки "ТекстЗапроса". В нем увидите области. Их имена соответствуют документу, из которого запущен подбор. Собственно ищите область с нужным именем и в запрос добавляете соединение с документом "заказ покупателя".
 
Цитата
Александр Тугаенко пишет:
в ПЗаказ и ПНоменклатура попадает то, что ожидал. Но ссылка на контрагента, почему то Null. Может надо что-то другое передавать в качестве параметра? ссылку на объекты, например...
2. А почему тогда в консоле запросов - находит нужного контрагента этот же запрос, если просто скопироватьи выставить параметры?
Цитата


В отладке вы сейчас отображаете тип колонки, а не выборку запроса или данные самой таблицы "ТЗ". С типизаций колонок все нормально, так и должно быть. При левом соединении данные из ведущей таблицы выводится полностью, а из ведомой только те, которые совпали условием соединения с ведущей. Если у ведомой таблицы нет подходящих записей по условию ее поля выводятся как NULL, нужно использовать проверки при помощи сравнения ЕСТЬ NULL или функции ЕСТЬNULL().

[QUOTE]Александр Тугаенко пишет:
Насчёт виртуальной таблицы можно немного поподробней: имеется ввиду использовать вирт.таблицу, которую создаёт сама обработка "ПодборПоЗаказам"? а будет ли там ссылка на табличную часть "Товары" заказа поставщику?

Виртуальную таблицу Вы используете для получения остатков по запасам
|   РегистрНакопления.ЗаказыПокупателей.Остатки

ее можно параметризировать, т.е. в качестве параметров передать условия отборов, Например:

|   РегистрНакопления.ЗаказыПокупателей.Остатки(&НаДату, Заказ = &Заказ1 И Номенклатура = &Номенклатура1)

В конструкторе запроса можно увидеть для регистра "ЗаказыПокупателей" нескольно таблиц:
|   РегистрНакопления.ЗаказыПокупателей - Это физическая таблица(таблица движений записей регистра), а все остальные это виртуальные.

Виртуальная она потому, что мы видим всего лишь сокращенную запись на самом деле эта запись разлаживается по определенных алгоритмам и условиям на более сложный запрос зачастую превышающий Ваш запрос. И что бы сделать отбор не после того как выполнится запрос виртуальной таблица, а во время его выполнения нужно использовать параметры.
 
Цитата
Виктор Радько пишет:
Заранее извиняюсь если будут ошибки главное это смысл, написал на скорую руку.
Попробуйте такой вариант:...
Виктор, попробовал добавить код - трохи переписал:
Код
   КешПоставщиков = Новый ТаблицаЗначений;
   КешПоставщиков.Колонки.Добавить("Заказ", Новый ОписаниеТипов("ДокументСсылка.ЗаказПокупателя"));
   КешПоставщиков.Колонки.Добавить("Номенклатура", Новый ОписаниеТипов("СправочникСсылка.Номенклатура"));
   КешПоставщиков.Колонки.Добавить("ХарактеристикаНоменклатуры", Новый ОписаниеТипов("СправочникСсылка.ХарактеристикиНоменклатуры"));
   КешПоставщиков.Колонки.Добавить("Поставщик", Новый ОписаниеТипов("СправочникСсылка.Контрагенты"));
   КешПоставщиков.Индексы.Добавить("Номенклатура");
   КешПоставщиков.Индексы.Добавить("ХарактеристикаНоменклатуры");

и
Код
ТаблицаТовара = Новый ТаблицаЗначений;
   ТаблицаТовара.Колонки.Добавить("ЗаказПокупателя", Новый ОписаниеТипов("ДокументСсылка.ЗаказПокупателя"));
   ТаблицаТовара.Колонки.Добавить("Номенклатура", Новый ОписаниеТипов("СправочникСсылка.Номенклатура"));
   ТаблицаТовара.Колонки.Добавить("ХарактеристикаНоменклатуры", Новый ОписаниеТипов("СправочникСсылка.ХарактеристикиНоменклатуры"));
   
   СтруктураПоиска = Новый Структура("Заказ, Номенклатура, ХарактеристикаНоменклатуры");
   Для Каждого СтрокаТЧ Из ОформленияСтрок Цикл
      Если НЕ ТипЗнч(СтрокаТЧ.ДанныеСтроки.Заказ) = Тип("ДокументСсылка.ЗаказПокупателя") Тогда 
         Продолжить;
      КонецЕсли;
      ЗаполнитьЗначенияСвойств(СтруктураПоиска, СтрокаТЧ.ДанныеСтроки);
      НайденныеСтроки = КешПоставщиков.НайтиСтроки(СтруктураПоиска);
      Если НайденныеСтроки.Количество() = 0 Тогда
         НоваяСтрока = ТаблицаТовара.Добавить();
         ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаТЧ.ДанныеСтроки);
      Иначе
         Сообщить(НайденныеСтроки[0].Поставщик);
      КонецЕсли;
   КонецЦикла;
   
   Если ТаблицаТовара.Количество()>0 Тогда
      Запрос = Новый Запрос;
      Запрос.УстановитьПараметр("ТаблицаТовара", ТаблицаТовара);
      
      Запрос.Текст = "
      |ВЫБРАТЬ РАЗЛИЧНЫЕ
      | ЗаказПокупателяТовары.Ссылка КАК Заказ,
      | ЗаказПокупателяТовары.Номенклатура,
      | ЗаказПокупателяТовары.ХарактеристикаНоменклатуры,
      | ЗаказПокупателяТовары.Поставщик КАК Поставщик
      |ИЗ
      |   Документ.ЗаказПокупателя.Товары КАК ЗаказПокупателяТовары
      |ГДЕ
      | (ЗаказПокупателяТовары.Ссылка,
      | ЗаказПокупателяТовары.Номенклатура,
      | ЗаказПокупателяТовары.ХарактеристикаНоменклатуры) В (&ТаблицаТовара)";
   
      Выборка = Запрос.Выполнить().Выбрать();
      Пока Выборка.Следующий() Цикл
         Сообщить(Выборка.Поставщик);
         НоваяСтрока = КешПоставщиков.Добавить();
         ЗаполнитьЗначенияСвойств(НоваяСтрока, Выборка.ДанныеСтроки);
      КонецЦикла;
   КонецЕсли

, сейчас заработал весь код.
1. Однако на сколько я понял сверки с поставщиком для детали из заказа покупателя не производится - надо добавить.
2. В последней выборке ничего не находит постоянно, и соотвественно КешПоставщиков - пустой. Почему это может быть?

3. Я правильно понимаю, что имея КешПоставщиков(Заказ, Номенклатуру, Поставщика, Характеристику) - можно найти нужные мне детали по поставщику из ЗаказаПокупателя и в табличке отобразить только их? А не могли бы в 2-х словах подсказать как отфильтровать данные в табличке обработки имея уже Кеш и ссылку на поставщика, по которому буду фильтровать.
 
Цитата
Виктор Радько пишет:
В отладке вы сейчас отображаете тип колонки, а не выборку запроса или данные самой таблицы "ТЗ". С типизаций колонок все нормально, так и должно быть.
с этим разобрался.
Цитата
При левом соединении данные из ведущей таблицы выводится полностью, а из ведомой только те, которые совпали условием соединения с ведущей. Если у ведомой таблицы нет подходящих записей по условию ее поля выводятся как NULL, нужно использовать проверки при помощи сравнения ЕСТЬ NULL или функции ЕСТЬNULL().
Хорошо, но это не объясняет, почему если просто тестировать запрос в обработке - он отрабатывает корректно, а в коде - нет. Единственное различие - это в форме задачи параметров запроса. ПОэтому и грешу на них. Или может быть ещё какая-то причина?
Цитата

Виртуальную таблицу Вы используете для получения остатков по запасам
|   РегистрНакопления.ЗаказыПокупателей.Остатки
ее можно параметризировать, т.е. в качестве параметров передать условия отборов, Например:
|   РегистрНакопления.ЗаказыПокупателей.Остатки(&НаДату, Заказ = &Заказ1 И Номенклатура = &Номенклатура1)
А можно в этом запросе сделать отбор, по добавленному полю  в табличную часть ЗаказаПокупателя "Поставщик"?
Я пока не додумался как это сделать.
 
Мы зашли в тупик. При выполнении события "при получении данных" можно только получать и выводить данные в текстовом отображении для отбора не подойдет. Если рассматривать чем является отбор на форме "подбора по заказам" мы увидим путь к его данным "Фильтр.Отбор", где фильтр это объект встроенного языка "Построитель отчетов". У построителя отчетов доступные поля для отбора связаны с его текстом запроса т.е. Нужно изменить текст запроса, а событие при получении данных не трогать вообще.

Цитата
Виктор Радько пишет:
Самый лучший подход для добавления Поставщика это изучить макет обработки "ТекстЗапроса". В нем увидите области. Их имена соответствуют документу, из которого запущен подбор. Собственно ищите область с нужным именем и в запрос добавляете соединение с документом "заказ покупателя".


Цитата
Александр Тугаенко пишет:

Хорошо, но это не объясняет, почему если просто тестировать запрос в обработке - он отрабатывает корректно, а в коде - нет. Единственное различие - это в форме задачи параметров запроса. ПОэтому и грешу на них. Или может быть ещё какая-то причина?

Да это может быть причиной если значение параметров различное т.е. разные отборы по заказу или номенклатуре и т.д.

При одинаковом запросе и параметрах результат должен быть одинаковый.

Чтобы увидеть и сделать скрин результата выполнения запроса в отладчике выполните функцию:
Запрос.Выполнить().Выгрузить()

получим информативный результат в виде таблицы значений.
 
Запрос заработал, что было так и не пойму - перенабрал в конструкторе.
Сделал пока что по тупому - засунул код в СписокНоменклатурыПриПолученииДанных. Работает, хотя действительно постоянно обновляется... трохи нагружает процессор. Зато есть отбор запчастей для ЗаказаПоставщику из ЗаказовПокупателей, по полю Номенклатуры Поставщик :-).
Надо будет всё-таки разобраться и сделать через макет обработки "ТекстЗапроса", чтобы ещё и фильтр можно сделать по Поставщику в обработке.
Спасибо за помощь!
 
Добрый день! Задача решается примерно так. Ниже фрагмент кода процедуры формирования заказов поставщикам по всем заказам покупателей с группировкой по поставщикам из ТЧ заказа покупателей. Данная процедура у меня  дергается из регламентного задания и идет отправка на сайт.

X
Права = Неопределено;
//Заказы берем только за текщий день
ДатаНачала=НачалоДня(ТекущаяДата());
ДатаКонца=КонецДня(ТекущаяДата());


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


Запрос.УстановитьПараметр("ДатаНачала",ДатаНачала);
Запрос.УстановитьПараметр("ДатаКонца", ДатаКонца);


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

//Получим список поставщиков в СЗ
Список.Очистить();
Пока ВыборкаЗаказов.Следующий() Цикл
Стр = Список.Добавить();
Стр.Поставщик = ВыборкаЗаказов.Поставщик;
Стр.Подразделение = ВыборкаЗаказов.ПодразделениеКомпании;
Стр.Организация = ВыборкаЗаказов.Организация;
КонецЦикла;

Для каждого ном из Список Цикл

Подр=Справочники.ПодразделенияКомпании.НайтиПоКоду(ном.Подразделение.Код);
Орг =Справочники.Организации.НайтиПоКоду(ном.Организация.Код);
Пост=Справочники.Контрагенты.НайтиПоКоду(ном.Поставщик.Код);
Документ=Документы.ЗаказПоставщику.СоздатьДокумент();
Документ.УстановитьНовыйНомер();
Документ.Дата                    = ТекущаяДата();
Документ.Автор = ПараметрыСеанса.Пользователь;
Документ.ПодразделениеКомпании   = Подр.Ссылка;
Документ.Организация             = Орг.Ссылка;
Документ.Комментарий             = "Автоформирование от: "+ ТекущаяДата();

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

Запрос.УстановитьПараметр("ВладелецДоговора",Документ.Контрагент);
Запрос.УстановитьПараметр("ПодрДоговора",ПодразделениеДоговора);

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

Пока Выборка.Следующий() Цикл
ДоговорВзаиморасчетовСсылка=Выборка.Ссылка;
КонецЦикла;
Если Запрос.Выполнить().Пустой() Тогда
//Сообщить("|Создаем корректный договор!!!!");
//иначе создадим новый
НовыйДоговор                            = Справочники.ДоговорыВзаиморасчетов.СоздатьЭлемент();
НовыйДоговор.УстановитьНовыйКод();
НовыйДоговор.Владелец                   = Документ.Контрагент;
НовыйДоговор.Организация                = Документ.Организация;
НовыйДоговор.Подразделение              = Документ.ПодразделениеКомпании;
НовыйДоговор.ВидДоговора                = Перечисления.ВидыДоговоров.Покупка;
НовыйДоговор.ВалютаВзаиморасчетов       = Документ.ВалютаДокумента;
НовыйДоговор.ДатаНачала                 = НачалоДня(Документ.Дата);
НовыйДоговор.ТипЦенПокупки              = "";
НовыйДоговор.ТипЦенПродажи              = "";
НовыйДоговор.ВидОплаты                  = Перечисления.ВидыОплаты.ПроизвольнаяОплата;
НовыйДоговор.ТипСкидкиНаценки           = "";
НовыйДоговор.ТипСкидкиНаценкиРабот      = "";
НовыйДоговор.СпособЗакрытияСделок       = Перечисления.СпособЗакрытияСделок.ПоРасчетнымДокументам;
Если обЗначениеНеЗаполнено(НовыйДоговор.СпособЗакрытияСделок) Тогда
НовыйДоговор.СпособЗакрытияСделок   = Перечисления.СпособЗакрытияСделок.ПоРасчетнымДокументам;
КонецЕсли;
НовыйДоговор.АвтоЗакрытиеСделок         = Истина;
НовыйДоговор.НомерДоговора              = Документ.ПодразделениеКомпании.Наименование;
НовыйДоговор.Комментарий = "Создан "+Документ.ХозОперация+ " от: " +Документ.Дата;
НовыйДоговор.СформироватьНаименование();
НовыйДоговор.ПроверятьЗаполнение = Ложь;
Попытка
НовыйДоговор.Записать();
Исключение КонецПопытки;
Если обЗначениеНеЗаполнено(Документ.Контрагент.ОсновнойДоговорВзаиморасчетов) Тогда
КонтрагентОбъект = Документ.Контрагент.ПолучитьОбъект();
КонтрагентОбъект.ОсновнойДоговорВзаиморасчетов = НовыйДоговор.Ссылка;
КонтрагентОбъект.Записать();
КонецЕсли;
Документ.ДоговорВзаиморасчетов="";
ДоговорВзаиморасчетовСсылка = НовыйДоговор.Ссылка;
Документ.ДоговорВзаиморасчетов=ДоговорВзаиморасчетовСсылка;
Иначе
Документ.ДоговорВзаиморасчетов=ДоговорВзаиморасчетовСсылка;
КонецЕсли;
Иначе
Документ.ДоговорВзаиморасчетов   = дкПолучитьДоговорВзаиморасчетов(Документ.Контрагент,ВидДоговора ,Документ,ДопПараметры, УчитыватьПодразделение = Истина);
Документ.ОбработкаРеквизита("Контрагент");
КонецЕсли;
КонецЕсли;

Документ.ВалютаДокумента         = Константы.ВалютаРегламентированногоУчетаОрганизаций.Получить();
Документ.КурсДокумента           = 1;
Документ.ТипЦен                  =  Справочники.ТипыЦен.ОсновнойТипЦенЗакупки;
Документ.ОбработкаРеквизита("ТипЦен");
Документ.ХозОперация             = Справочники.ХозОперации.ЗаказПоставщику;
Документ.Проект                  = "";
Документ.ВнешнийНомерЗаказа      = Документ.Номер;

//Заполнение Распределения заказа

Результат = "ЗаполнитьПоПоставщику";

Если Результат = "ЗаполнитьПоПоставщику" Тогда
Если обЗначениеНеЗаполнено(Документ.Контрагент) Тогда
Возврат;
КонецЕсли;

Если Документ.РаспределениеЗаказа.Количество() > 0 Тогда
Документ.РаспределениеЗаказа.Очистить();
КонецЕсли;

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

Если Документ.РаспределениеЗаказа.Количество() > 0 Тогда
Попытка
Документ.Записать(РежимЗаписиДокумента.Проведение);
Исключение
Документ.Записать(РежимЗаписиДокумента.Запись);
КонецПопытки;
Иначе
Продолжить;
КонецЕсли;

КонецЦикла;

Но основная проблема вылазает позднее, когда столкнетесь с ошибкой:

1.Есть в программе три организации и 3-и подразделения, у каждой организации свой склад.
2. Формируем заказ покупателя по организации №1, подразделению №1, даже склад резервирования укажем №1
поставщика в ТЧ уакажем как "Основной поставщик"
3.Точно такой же товар, как в заказе покупателя по организации №1 приходуем на склад организации №2 от "Основной поставщик".
Видим что поступление товара списало заказ поставщика и зарезервировало товар, под заказ покупателя по организации №1, на складе организации №2 !!!!!
Страницы: 1
Читают тему
Поддержка отраслевых решений «1С-Рарус»
Услуги 1С