Как создать столько документов сколько есть в экселе данных
В эксель файле 100 строк, для каждой строки нужно создать новый документ, т.е. 100 новых документов в Документе Поступление товаров и услуг, как это сделать вот код:
МассивКолонок = Новый ТаблицаЗначений;
МассивКолонок.Колонки.Добавить("НомерКолонки");
МассивКолонок.Колонки.Добавить("НазваниеКолонки");
Для КолонкаОтсчета = 1 по КоличествоКолонок Цикл
ИмяКолонки = Excel.Cells(1, КолонкаОтсчета).Text;
ИмяБезПробелов = СтрЗаменить(ИмяКолонки," ","");
Если НЕ НаличиеРеквизитаТЧ(ИмяБезПробелов, Метаданные.Документы.ПоступлениеТоваровУслуг, "Товары") Тогда
Иначе
НовСтрока = МассивКолонок.Добавить();
НовСтрока.НомерКолонки = КолонкаОтсчета;
НовСтрока.НазваниеКолонки = ИмяБезПробелов;
КонецЕсли;
КонецЦикла;
Если МассивКолонок.Количество() <> 0 и МассивКолонок.НайтиСтроки(Новый Структура("НазваниеКолонки", "Номенклатура")).Количество() <> 0 Тогда
Для каждого СтрокаМассив из МассивКолонок Цикл
Для СтрокаОтсчета = 2 по КоличествоСтрок Цикл
ТекущееЗначение = Excel.Cells(СтрокаОтсчета, СтрокаМассив.НомерКолонки).Value;
НовыйДокумент = Документы.ПоступлениеТоваровУслуг.СоздатьДокумент();
НовыйДокумент.Дата = ТекущаяДата();
НовыйДокумент.Организация = Объект.Организация;
НовыйДокумент.Склад = Объект.Склад;
НовыйДокумент.ВидОперации = Объект.ВидОперации;
НовыйДокумент.Контрагент = ТекущееЗначение;
НаименованиеКонтрагента = Объект.Контрагент.Наименование;
Для СтрокаОтсчета = 2 по КоличествоСтрок Цикл
Если НаименованиеКонтрагента <> Excel.Cells(СтрокаОтсчета, 23).Text Тогда
Продолжить;
КонецЕсли;
НСтр = НовыйДокумент.Товары.Добавить();
Для каждого СтрокаМассив из МассивКолонок Цикл
ТекущееЗначение = Excel.Cells(СтрокаОтсчета, СтрокаМассив.НомерКолонки).Value;
ИмяКолонки = Excel.Cells(1, СтрокаМассив.НомерКолонки).Text;
Значение = Excel.Cells(СтрокаОтсчета, 6).Value;
// Заполнение строки данными
Если ИмяКолонки = "Номенклатура" Тогда
НСтр.Номенклатура = Объект.Номенклатура;
ИначеЕсли ИмяКолонки = "Количество" Тогда
НСтр.Количество = ТекущееЗначение;
ИначеЕсли ИмяКолонки = "Цена" Тогда
НСтр.Цена = Значение;
ИначеЕсли ИмяКолонки = "Сумма" Тогда
НСтр.Сумма = НСтр.Количество*НСтр.Цена;
ИначеЕсли ИмяКолонки = "Ставка НДС" Тогда
НСтр.СтавкаНДС = Перечисления.СтавкиНДС.БезНДС;
ИначеЕсли ИмяКолонки = "Счет учета" Тогда
НСтр.СчетУчета = ПланыСчетов.Хозрасчетный.СырьеИМатериалы;
КонецЕсли;
КонецЦикла;
КонецЦикла;
// Запись и проведение документа
Для СтрокаОтсчета = 2 по КоличествоСтрок Цикл
НовыйДокумент.Записать(РежимЗаписиДокумента.Запись);
КонецЦикла;
КонецЦикла;
КонецЦикла;
Сообщить("Создан и заполнен документ " + Строка(НовыйДокумент));
Иначе
Сообщить("В Excel файле не достаточно данных для заполнения документа!");
КонецЕсли;
Excel.DisplayAlerts = 0;
Excel.Quit();
Excel.DisplayAlerts = 1;
ПоказатьПо теме из базы знаний
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
П.С.: Создает 7 документов по контрагенту, которого выбрал, надо 4 документа по контрагенту, которого выбрал, потому что 4 строчки из Экселя имеют 1 контрагента. Потом надо, чтобы создавало различных контрагентов (4 одинаковых - 1 контрагент - 1 документ). Извините, если не правильно что-то написал, я сонный.
(5) А то что у вас запись в цикле?!
// Запись и проведение документа
Для СтрокаОтсчета = 2 по КоличествоСтрок Цикл
НовыйДокумент.Записать(РежимЗаписиДокумента.Запись);
КонецЦикла;
Это же даже не логично...
Вам нужен сам алгоритм решения данного вопроса, а уже потом написание модуля для решения данного задачи...
За чем вы проходите сначала по колонкам, а потом по строкам таблицы?
Создание и запись документа должны быть в рамках одного цикла, тогда будет результат...
Что-то типа:
Для строк
создать документ
//заполнить данными
номенклатура то тоже в строке, за чем цикл на номенклатуру? Если даже она разная в разных строках, то у вас дубли документов будет...
Записываем документ
Конец цикла по строкам
// Запись и проведение документа
Для СтрокаОтсчета = 2 по КоличествоСтрок Цикл
НовыйДокумент.Записать(РежимЗаписиДокумента.Запись);
КонецЦикла;
Это же даже не логично...
Вам нужен сам алгоритм решения данного вопроса, а уже потом написание модуля для решения данного задачи...
За чем вы проходите сначала по колонкам, а потом по строкам таблицы?
Создание и запись документа должны быть в рамках одного цикла, тогда будет результат...
Что-то типа:
Для строк
создать документ
//заполнить данными
номенклатура то тоже в строке, за чем цикл на номенклатуру? Если даже она разная в разных строках, то у вас дубли документов будет...
Записываем документ
Конец цикла по строкам
А потом еще надо, чтобы он все данные из экселя подтянул и по контрагенту создавал документы, допустим 100 строк, из них 10, 15,20,10,5,25,15 одинаковых контрагентов, обработка должна создать 7 документов и подтянуть данные из строк в табличную часть товары.
Добрый день! Поддержу многих коллег по данной теме. От себя добавлю:
1. Предварительно выгрузить в таблицу значений Лист(ы) Exel.
2. Т.к. (судя по написанному тексту программы) все документы одной датой, стоит вставить сортировку по Контрагенту, если они встречаются одинаковые с помощью
функции
.
3. После (вместе с) сортировки моно отсортировать по Номенклатуре - чтобы красиво ложилось в документе (строки без одинаковых Номенклатурных позиций).
4. Грузить в документ с учетом колонки "Контрагент" - грузим в один документ, пока не поменяется Контрагент. Поменялся - записываем док, проводим: создаем новый документ, заполняем.
1. Предварительно выгрузить в таблицу значений Лист(ы) Exel.
2. Т.к. (судя по написанному тексту программы) все документы одной датой, стоит вставить сортировку по Контрагенту, если они встречаются одинаковые с помощью
функции
ТЗ.Сортировать(, "Контрагент"):
3. После (вместе с) сортировки моно отсортировать по Номенклатуре - чтобы красиво ложилось в документе (строки без одинаковых Номенклатурных позиций).
4. Грузить в документ с учетом колонки "Контрагент" - грузим в один документ, пока не поменяется Контрагент. Поменялся - записываем док, проводим: создаем новый документ, заполняем.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот