Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
16 апр 2024, 14:03

Объединение документов по условию

Автор gamograff, 20 окт 2015, 14:54

0 Пользователей и 1 гость просматривают эту тему.

gamograff

Добрый день. Есть следующая задача: есть выборка документов "ПоступлениеТоваровУслуг". Нужно их объединить следующим образом: есть предельная сумма, объединение документов должно идти по порядку выборки. Как только сумма следующего документа выводит общую сумму за пределы предельной суммы, документ записывается с датой первого, который вошёл в эту сумму. То есть в итоге сумма итогового документа должна быть равна или чуть меньше предельной суммы. После его записи мы переходим к следующему документу и так же объединяем дальше, пока не закончится выборка. Например:
12.05.2015 20р
13.05.2015 40р
14.05.2015 10р
Предельная сумма 65р
Итоговый документ будет от 12.05.2015 с суммой 60р, а документ от 14.05.2015 пойдёт в следующее объединение. И так далее.
И вот теперь вопрос. Как реализовать это всё реализовать? Как запомнить дату первого вошедшего в объединение документа (если создавать новый документ) или менять этот самый первый документ, это не принципиально, и как начать выбирать новые документы после записи объединения? Заранее спасибо!

Luzer1C

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

cska-fanat-kz

А если на документ от 13го числа есть ссылки, то как быть?
Получил помощь - скажи СПАСИБО.
Разобрался сам - расскажи другим.

Vladimir_Sh

Цитата: gamograff от 20 окт 2015, 14:54
Как запомнить дату первого вошедшего в объединение документа (если создавать новый документ) или менять этот самый первый документ, это не принципиально, 
Первый документ Вы получите как первый элемент коллекции (которую будете использовать), созданные уже документы вошедшие в предел рекомендую помечать неким признаком(так будет проще с ними в дальнейшем работать).
Цитата: gamograff от 20 окт 2015, 14:54
и как начать выбирать новые документы после записи объединения?
Используйте пометку о которой я писал выше и выбирайте новые документы. Потом на следующий круг. Можно добиться универсальности процедуры.
Если я Вам помог, нажми - Спасибо!

gamograff

Цитата: Vladimir_Sh от 21 окт 2015, 09:10
Используйте пометку о которой я писал выше и выбирайте новые документы. Потом на следующий круг. Можно добиться универсальности процедуры.

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

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

Если Приходы.Количество() > 0 Тогда

оснДок = Приходы.Получить(0).Получить(0);
оснДокОбъект = оснДок.ПолучитьОбъект();

ФП = 0;
ФП2 = 0;

Для каждого Строка из Приходы Цикл

Если ФП = 1 Тогда

Сумма = оснДокОбъект.Товары.Получить(0).Сумма;
текОбъект = Строка.Ссылка.ПолучитьОбъект();
СуммаТекОб = текОбъект.Товары.Получить(0).Сумма;
оснДокОбъект.Товары.Получить(0).Сумма = Сумма + СуммаТекОб;
оснДокОбъект.Записать();
текОбъект.УстановитьПометкуУдаления(Истина);

Элемент = Справочники.rm_Цепочки.НайтиПоРеквизиту("Приход", оснДок).ПолучитьОбъект();
Расход = Элемент.Расход.ПолучитьОбъект();
Расход.Товары.Получить(0).Сумма = Сумма + СуммаТекОб;
Расход.Записать();
Сообщить("Изменены документы  " + оснДок + " и " + Расход);

Элемент.Сумма = Сумма + СуммаТекОб;
Элемент.Количество = (Сумма + СуммаТекОб) / Константы.rm_ЦенаТовара.Получить();
Элемент.Записать();
Сообщить("Цепочка изменена");

                                        текЭлемент = Справочники.rm_Цепочки.НайтиПоРеквизиту("Приход", Строка.Ссылка).ПолучитьОбъект();
текЭлемент.Удалить();
ФП2 = 1;
Если Элемент.Сумма >= Объект.ПредельнаяСумма Тогда
Прервать;
КонецЕсли;
Иначе
                                        Если Строка.Ссылка = оснДок Тогда
    ФП = 1 ;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЦикла;

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск