Есть 7.7, в ней нужно реализовать следующий алгоритм, дано : таблица значений в значениях которой ссылки на документы, надо обработать эти документы так, чтобы все документы сумма которого, больше чем заданное значение, надо разбивать на более мелкие документы, т.е. из одного дока сделать несколько маленьких не превышающий определенную сумму, причем начальный документ, тоже должен сохраниться, но уменьшится по сумме до указанного значения.
Спасибо!
---
```1c
    НабралиСумму = 0;
    ТекущаяСтрока = 1;
    ВремТаблицаРазложенная.ВыбратьСтроки();
    Пока ВремТаблицаРазложенная.ПолучитьСтроку() = 1 Цикл
    Если НабралиСумму < МаксСуммаНакладных Тогда
    //копируем строку из ТабличнойЧастиДока

    НабралиСумму = НабралиСумму + ПромежТаблица.Итог("Сумма");
    ПромежТаблица.НоваяСтрока();
    Для Сч = 1 По ВремТаблицаРазложенная.КоличествоКолонок() Цикл
    ПромежТаблица.УстановитьЗначение(ТекущаяСтрока,Сч,ВремТаблицаРазложенная.ПолучитьЗначение(ТекущаяСтрока,Сч));
    КонецЦикла;
    ТекущаяСтрока = ТекущаяСтрока + 1;
    //закончили копировани

    Иначе
    //закрываем документ и очищаем Табличную часть нового документа.

    //ТекущаяСтрока = ТекущаяСтрока - 1;

    ПромежТаблица.ВыбратьСтроку();
    НабралиСумму = 0;
    ПромежТаблица.УдалитьСтроки();
    КонецЕсли;
    КонецЦикла;
```

Почему ругается номер за пределами значения ????
---
надо обработать эти документы так, чтобы все документы сумма которого, больше чем заданное значение, надо разбивать на более мелкие документы Я бы сделал так: в цикле перебираем документы из строк ТЗ от первой до последней, обращаясь к ним по номерам строк (это важно!). Если сумма меньше порога - пропускаем, если больше - программно создаем новый документ и переносим в него данные из исходного и всё превышение суммы (не контролируя ее размер). Ссылку на этот документ добавляем в конец ТЗ, так что в свое время обработка дойдет и до него, вот тогда и будет проверена его сумма, при необходимости - он тоже будет раздроблен на два и т.д.

Делов на полчаса максимум.
---
переносим в него данные из исходного и всё
Немного не понятно, этим действием мы создадим дубль документа, а надо "болшой" документ уменьшить до нужного размера, перенеся "лишнее" в новый документ, и так далее.
---
на очередной итерации большой документ(Док1) дробится на Док1(нужного размера) + Док11(что осталось) последний добавляете в "хвост" таблицы
---
Псевдокод:

```1c
    Для Сч = 1 По Таблица.КоличествоСтрок() Цикл
    Таб = Таблица.ПолучитьСтроку(Сч);
    Пока (Таб.Документ.СуммаДокумента > СуммаМинимальная) Цикл
    НовыйДок = СоздатьДок(Таб.Документ);
    Пока (НовыйДок.СуммаДокумента < СуммаДробления) Цикл
    Заполняем НовыйДок Строками из Таб.Документ, одновременно удаляем/уменьшаем сумму в строках в документе Таб.Документ
    КонецЦикла;
    Таб.Документ.СуммаДокумента = Таб.Документ.СуммаДокумента - НовыйДок.СуммаДокумента
    КонецЦикла;
    КонецЦикла;
```
---
А что за документ то ? А если там таб.часть есть с одним товаром на сумму больше чем нужная ?
---
да такое тоже может быть...в таком случае надо пропускать такой документ
---
Какая-то ерунда получается.

```1c
    Сч = ";
    ТаблицРеализДляСчФакт.ВыбратьСтроки();
    Для Сч = 1 По ТаблицРеализДляСчФакт.КоличествоСтрок() Цикл
    Таб = ТаблицРеализДляСчФакт.ПолучитьСтроку(Сч);
    Пока (Таб.Док.СуммаВзаиморасчетов > МаксСуммаНакладных) Цикл
    МелкиеРеализации.Новый();
    СкопироватьРеквизитыШапки(Таб.Док, МелкиеРеализации);
    Пока (МелкиеРеализации.СуммаВзаиморасчетов < МаксСуммаНакладных) Цикл
    Таб.Док.ВыбратьСтроки();
    Пока Таб.Док.ПолучитьСтроку() = 1 Цикл
    МелкиеРеализации.НоваяСтрока();
    МелкиеРеализации.Номенклатура = Таб.Док.Номенклатура;
    МелкиеРеализации.Количество = Таб.Док.Количество;
    МелкиеРеализации.ВалютаОсн = Таб.Док.ВалютаОсн;
    МелкиеРеализации.КурсОсн = Таб.Док.КурсОсн;
    МелкиеРеализации.КратностьОсн = Таб.Док.КратностьОсн;
    МелкиеРеализации.Валюта = Таб.Док.Валюта;
    МелкиеРеализации.Курс = Таб.Док.Курс;
    МелкиеРеализации.Кратность = Таб.Док.Кратность;
    МелкиеРеализации.Партия = Таб.Док.Партия;
    МелкиеРеализации.Цена = Таб.Док.Цена;
    МелкиеРеализации.Единица = Таб.Док.Единица;
    МелкиеРеализации.Коэффициент = 1;
    МелкиеРеализации.Проект = Таб.Док.Проект;
    МелкиеРеализации.СтавкаНДС = Таб.Док.СтавкаНДС;

    МелкиеРеализации.СуммаВзаиморасчетов = МелкиеРеализации.Итог("Сумма")+?(МелкиеРеализации.СуммаВклНП =1,0,МелкиеРеализации.Итог("СуммаНП" ))+?(МелкиеРеализации.СуммаВклНДС=1,0,МелкиеРеализации.Итог("СуммаНДС"));

    глПересчетТаблЧасти(МелкиеРеализации,"Сумма");
    КонецЦикла;
    КонецЦикла;
    МелкиеРеализации.Комментарий = "Документ создан автоматически! С помощью обработки.";
    МелкиеРеализации.Записать();

    Таб.Док.СуммаВзаиморасчетов = Таб.Док.СуммаВзаиморасчетов - МелкиеРеализации.СуммаВзаиморасчетов
    КонецЦикла;

    КонецЦикла;
```
---
Да. Строки из основного документа не удаляются.

Нужно табличную часть документа с суммой больше предела сначала выгружать в таблицу значений. А потом делить эту таблицу на два документа.
И соответственно загружать прореженную табличную часть в старый документ. А все оставшее в новый.

Пришлите хотя бы описание колонок таблицы, чтобы написать алгоритм.
---
основная таблица вот эта, в которой сидят ВСЕ документ "ТаблицРеализДляСчФакт", у нее только одна колонка это "Док", в которой сидят ссылки на документы.
---
Ну тогда не так:

```1c
    ТаблицРеализДляСчФакт.ВыбратьСтроки();
    Для Сч = 1 По ТаблицРеализДляСчФакт.КоличествоСтрок() Цикл
```

А так :

```1c
    ТаблицРеализДляСчФакт.ВыбратьСтроки();
    Пока ТаблицРеализДляСчФакт.ПолучитьСтроку()=1 Цикл
    ТабличнаяЧастьДока=СоздатьОбъект("ТаблицаЗначений");
    ТаблицРеализДляСчФакт.Док.ВыгрузитьТабличнуюЧасть(ТабличнаяЧастьДока);
    Если ТабличнаяЧастьДока.Итог("СуммаВзаиморасчетов")>МаксСуммаНакладных Тогда
    //чтобы проще обрабатывать лучше строки отсортировать
    ТабличнаяЧастьДока.Сортировать("СуммаВзаиморасчетов");
    ТабличнаяЧастьДока.ВыбратьСтроки();
    ///будем набирать строки в новый документ, пока сумма строк меньше максимальной суммы
    НабралиСумму=0;
    ТабличнаяЧастьНовогоДокумента=СоздатьОбъект("ТаблицаЗначений");
    ТабличнаяЧастьНовогоДокумента.Загрузить(ТабличнаяЧастьДока);
    ТабличнаяЧастьНовогоДокумента.КоличествоСтрок(0);
    Док=СоздатьОбъект("Документ."+ТаблицРеализДляСчФакт.Док.Вид());

    Пока ТабличнаяЧастьДока.ПолучитьСтроку()=1 Цикл

    НабралиСумму=НабралиСумма+ ТабличнаяЧастьДока.СуммаВзаиморасчетов;
    Если НабралиСумму< МаксСуммаНакладных Тогда
    НомерТекущейСтроки= ТабличнаяЧастьДока.НомерСтроки;
    ТабличнаяЧастьНовогоДокумента.Заполнить(ТабличнаяЧастьДока,НомерТекущейСтроки,НомерТекущейСтроки);
    //проверяем, если последняя строка, то записываем в док
    Если ТабличнаяЧастьДока.НомерСтроки=ТабличнаяЧастьДока.КоличествоСтрок() Тогда
    НомерТекущейСтроки= ТабличнаяЧастьДока.НомерСтроки;
    ТабличнаяЧастьНовогоДокумента.Заполнить(ТабличнаяЧастьДока,НомерТекущейСтроки,НомерТекущейСтроки);
    Док.найтиДокумент(ТаблицРеализДляСчФакт.Док);
    Док.ЗагрузитьТабличнуюЧасть(ТабличнаяЧастьНовогоДокумента);
    Док.Записать();
    КонецЕсли;
    Иначе
    //записываем документ, если последняя строка, то старый документ, иначе новый
    Если ТабличнаяЧастьНовогоДокумента.КоличествоСтрок()>0 Тогда
    Док.Новый();
    СкопироватьРеквизитыШапки(ТаблицРеализДляСчФакт.Док, Док);
    Док.ЗагрузитьТабличнуюЧасть(ТабличнаяЧастьНовогоДокумента);
    Док.Записать();
    ТабличнаяЧастьНовогоДокумента.КоличествоСтрок(0);
    КонецЕсли;
    Если ТабличнаяЧастьДока.НомерСтроки=ТабличнаяЧастьДока.КоличествоСтрок() Тогда
    НомерТекущейСтроки= ТабличнаяЧастьДока.НомерСтроки;
    ТабличнаяЧастьНовогоДокумента.Заполнить(ТабличнаяЧастьДока,НомерТекущейСтроки,НомерТекущейСтроки);
    Док.найтиДокумент(ТаблицРеализДляСчФакт.Док);
    Док.ЗагрузитьТабличнуюЧасть(ТабличнаяЧастьНовогоДокумента);
    Док.Записать();
    КонецЕсли;
    КонецЕсли;
    КонецЦикла;
    КонецЕсли;
    КонецЦикла;
```
---
в строке может быть больше одной единицы, строку тогда надо делить.
---
Ну с делением посложнее будет. Потому что могут появиться ошибки округления и это тоже надо будет учитывать.
---
округление уже руками будут править
---
Тогда проще перед обработкой таблицы документа сделать все позиции единичными.

Скажем есть есть таблица

Яблоко 3 шт 110 руб сделать таблицу

Яблоко 1 шт 36.66 руб
Яблоко 1 шт 36.66 руб
Яблоко 1 шт 36.67 руб

и затем уже обрабатывать эту таблицу по приведенному мной алгоритму.
---
Правда если вы отгружаете 10 тыс. гаек - это слишком усложнит работу системы.

Ну тогда можно разбить не по количеству, а по сумме 100 рублей к примеру.
---
пока кружу Ваш алгоритм, вот тут вылетатет постоянно "ТабличнаяЧастьНовогоДокумента.Заполнить(ТабличнаяЧастьДока,НомерТекущейСтроки,НомерТекущейСтроки);"
---
"ТабличнаяЧастьНовогоДокумента.Заполнить(ТабличнаяЧастьДока,НомерТекущейСтроки,НомерТекущейСтроки);

Ну тут просто копируется текущая строка из таблицы "ТабличнаяЧастьДока" в таблицу ТабличнаяЧастьНовогоДокумента.

Тут вроде я перемудрил.

Заполнить(<Знач>,<НачСтрока>,<КонСтрока>,<Колонки>)
Назначение:
Заполнить соответствующие ячейки таблицы значений переданным значением.
Параметры:
<Знач> - значение одиночное или список значений или таблица значений.
<НачСтрока> - необязательный параметр. Номер начальной строки, с которой надо начинать заполнение. Значение по умолчанию 1.
<КонСтрока> - необязательный параметр. Номер последней строки, по которую надо заполнять. Если не указана, то до последней.

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

```1c
    ТабличнаяЧастьНоговоДокумента.НоваяСтрока();

    Для сч=1 По табличнаяЧастьДока.КоличествоКолонок() Цикл
    ТабличнаяЧастьНовогоДокумента.УстановитьЗначение(ТабличнаяЧастьНоговоДокумента.НомерСтроки,Сч,ТабличнаяЧастьДока.ПолучитьЗначение(ТекущаяСтрока,Сч));
    КонецЦикла;
```
---
ПроблемаДобрый день!
Спасибо за помощь в теме, по алгоритму, маялся я маялся, и начал делать свое.
Застрял сейчас, на одном куске, в итоге я разложил, документ по количеству,
 т.е. в таблице значений, в колонке количество всегда 1 (единица),
имея таблицу, как теперь сбросить по условию превышения во временную таблицу ?
Создать документ (это я знаю как сделать). Мне просто не понятно
 как отловить момент для создания документа
и потом очистить временную и собирать дальше.

Все также.

```1c
    Если НабралиСумму< МаксСуммаНакладных Тогда
    НомерТекущейСтроки= ТабличнаяЧастьДока.НомерСтроки;
    //копируем строку из ТабличнойЧастиДока
    ТекущаяСтрока=ТабличнаяЧастьДока.НомерСтроки;
    ТабличнаяЧастьНоговоДокумента.НоваяСтрока();

    Для сч=1 По табличнаяЧастьДока.КоличествоКолонок() Цикл
    ТабличнаяЧастьНовогоДокумента.УстановитьЗначение(ТабличнаяЧастьНоговоДокумента.НомерСтроки,Сч,ТабличнаяЧастьДока.ПолучитьЗначение(ТекущаяСтрока,Сч));
    КонецЦикла;

    //закончили копирование

    Иначе
    //закрываем документ и очищаем Табличную часть нового документа.
    КонецЕсли;
```
---
```1c
    НабралиСумму = 0;
    ТекущаяСтрока = 1;
    ВремТаблицаРазложенная.ВыбратьСтроки();
    Пока ВремТаблицаРазложенная.ПолучитьСтроку() = 1 Цикл
    Если НабралиСумму < МаксСуммаНакладных Тогда
    //копируем строку из ТабличнойЧастиДока

    НабралиСумму = НабралиСумму + ПромежТаблица.Итог("Сумма");
    ПромежТаблица.НоваяСтрока();
    Для Сч = 1 По ВремТаблицаРазложенная.КоличествоКолонок() Цикл
    ПромежТаблица.УстановитьЗначение(ТекущаяСтрока,Сч,ВремТаблицаРазложенная.ПолучитьЗначение(ТекущаяСтрока,Сч));
    КонецЦикла;
    ТекущаяСтрока = ТекущаяСтрока + 1;
    //закончили копировани

    Иначе
    //закрываем документ и очищаем Табличную часть нового документа.

    //ТекущаяСтрока = ТекущаяСтрока - 1;

    ПромежТаблица.ВыбратьСтроку();
    НабралиСумму = 0;
    ПромежТаблица.УдалитьСтроки();
    КонецЕсли;
    КонецЦикла;
```

Почему ругается номер за пределами значения ????
---
Тут нужно еще и сбрасывать счетчик текущей строки;

```1c
    ПромежТаблица.ВыбратьСтроку();
    НабралиСумму = 0;
    ПромежТаблица.УдалитьСтроки();
    ТекущаяСтрока=1;
    КонецЕсли;
```

Иначе действительно этот счетчик за пределами