Выполнить условие при переборе таблицы знаяения

1. UPKA 18.08.22 07:55 Сейчас в теме
Имеется таблица значения. При переборе таблицы значения хочу выполнить условие создания документа каждые 20 000 строк. Подскажите, как можно выполнить подобное?

Перебор ТЗ у нас идет так

Для Каждого Строка Из ТЗ Цикл

//условие

КонецЦикла;

Не запихивать же счетчик внутри цикла?
Найденные решения
7. spacecraft 18.08.22 08:59 Сейчас в теме
(6) проверку нужно внутри цикла делать
НовДок = Неопределено;
Для Каждого СтрокаТЗ Из ТЗ Цикл
  Если ТЗ.Индекс(СтрокаТЗ)%20000 = 0 Тогда
    Если НовДок <> Неопределено Тогда
      НовДок.Записать();
    КонецЕсли;
    НовДок = Документы.ПриходнаяНакладная.СоздатьДокумент();
    НовДок.Дата = ТекущаяДата();
  КонецЕсли;
  СтрокаТЧ = НовДок.Материалы.Добавить();
  ЗаполнитьЗначенияСвойств(СтрокаТЧ, СтрокаТЗ);
КонецЦикла;
Если НовДок <> Неопределено Тогда
  НовДок.Записать();
КонецЕсли;
Показать
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. glek 119 18.08.22 07:58 Сейчас в теме
(1) или вариант ТЗ.Индекс(Строка)
3. collider 18.08.22 08:03 Сейчас в теме
(1)
(2)
Если ТЗ.Индекс(Строка)%20000 = 0 Тогда
СоздатьДок();
КонецЕсли;
4. Vlan 36 18.08.22 08:28 Сейчас в теме
(3) Думаю, создавать документ нужно перед началом цикла, а не после его окончания.
Создали Док
Записали 20000 строк в него
Записали Док
Создали новый

Хотя всякое бывает, не спорю.
6. UPKA 18.08.22 08:35 Сейчас в теме
(4) Согласен. Про это и хотел спросить


Если ТЗ.Индекс(Строка)%20000 = 0 Тогда

НовДок = Документы.ПриходнаяНакладная.СоздатьДокумент();
НовДок.Дата = ТекущаяДата();

Для Каждого Строка Из ТЗ Цикл

ТЧ = НовДок.Материалы.Добавить();
ТЧ.Номенклатура = ТЗ.Номенклатура;
ТЧ.Количество = ТЗ.Количество;
ТЧ.Сумма = ТЗ.Сумма;

КонецЦикла;

НовДок.Записать();

КонецЕсли;



Показать


Так не работает. Если запихнуть создание документа в цикл, то будет создаваться каждую строку новый документ.
7. spacecraft 18.08.22 08:59 Сейчас в теме
(6) проверку нужно внутри цикла делать
НовДок = Неопределено;
Для Каждого СтрокаТЗ Из ТЗ Цикл
  Если ТЗ.Индекс(СтрокаТЗ)%20000 = 0 Тогда
    Если НовДок <> Неопределено Тогда
      НовДок.Записать();
    КонецЕсли;
    НовДок = Документы.ПриходнаяНакладная.СоздатьДокумент();
    НовДок.Дата = ТекущаяДата();
  КонецЕсли;
  СтрокаТЧ = НовДок.Материалы.Добавить();
  ЗаполнитьЗначенияСвойств(СтрокаТЧ, СтрокаТЗ);
КонецЦикла;
Если НовДок <> Неопределено Тогда
  НовДок.Записать();
КонецЕсли;
Показать
8. Vlan 36 18.08.22 09:29 Сейчас в теме
(7) Я бы по-другому сделал:
НовДок = Неопределено;
Если ТЗ.Количество() > 0 Тогда
  НовДок = Документы.ПриходнаяНакладная.СоздатьДокумент();
  НовДок.Дата = ТекущаяДата();
КонецЕсли;
Для Каждого СтрокаТЗ Из ТЗ Цикл
  СтрокаТЧ = НовДок.Материалы.Добавить();
  ЗаполнитьЗначенияСвойств(СтрокаТЧ, СтрокаТЗ);
  Если ТЗ.Индекс(СтрокаТЗ)%20000 = 0 Тогда
    НовДок.Записать();
    НовДок = Документы.ПриходнаяНакладная.СоздатьДокумент();
    НовДок.Дата = ТекущаяДата();
  КонецЕсли;
КонецЦикла;
Если НовДок <> Неопределено Тогда
  НовДок.Записать();
КонецЕсли;
Показать
9. spacecraft 18.08.22 09:33 Сейчас в теме
(8) и получите первый документ всего с одной строкой в ТЧ.
10. Vlan 36 18.08.22 09:39 Сейчас в теме
(9) Чойта? Через 20000 строк только документ должен быть записан. Код не проверял. Сейчас попробую.потестить.
11. spacecraft 18.08.22 09:40 Сейчас в теме
(10) индексы начинаются с 0.
Если ТЗ.Индекс(СтрокаТЗ)%20000 = 0 Тогда
индекс первой строки = 0.
0%20000 = 0
первой же строкой попадаем в условие.
12. UPKA 18.08.22 09:42 Сейчас в теме
(11) Ваш код сработал. Спасибо большое.
13. Vitaly1C8 18.08.22 09:47 Сейчас в теме
(7) ещё нужно учесть случаи:
1. строк менее 20к
2. строк более 20к
(теряем данные в этих случаях)
16. spacecraft 18.08.22 09:49 Сейчас в теме
(13) тут согласен. ну это можно доработать.
14. Vlan 36 18.08.22 09:47 Сейчас в теме
(7) Кстати, представьте, что в ТЗ 2 строки. Условие не выполнится, и документ создан не будет.
15. UPKA 18.08.22 09:48 Сейчас в теме
(14) А что в этом случае тогда предпринять?
17. spacecraft 18.08.22 09:55 Сейчас в теме
(15) вот так попробуйте.
НовДок = Документы.ПриходнаяНакладная.СоздатьДокумент();
НовДок.Дата = ТекущаяДата();
Для Каждого СтрокаТЗ Из ТЗ Цикл
  Если ТЗ.Индекс(СтрокаТЗ)%20000 = 0 И ТЗ.Индекс(СтрокаТЗ) > 0 Тогда
      НовДок.Записать();
      НовДок = Документы.ПриходнаяНакладная.СоздатьДокумент();
      НовДок.Дата = ТекущаяДата();
  КонецЕсли;
  СтрокаТЧ = НовДок.Материалы.Добавить();
  ЗаполнитьЗначенияСвойств(СтрокаТЧ, СтрокаТЗ);
КонецЦикла;
Если НовДок.Материалы.Количество() > 0 Тогда
  НовДок.Записать();
КонецЕсли;
Показать
18. Vlan 36 18.08.22 10:01 Сейчас в теме
(15) Либо мой вариант, только прибавьте единицу к индексу (или используйте атрибут НомерСтроки). Тут согласен с предыдущим оратором.
5. starjevschik 18.08.22 08:31 Сейчас в теме
почему не запихивать? Делать лучше так, как умеешь. Иначе можно вообще ничего не сделать.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот