Задача.
Есть файл Excel и есть уже введенные документы(ввод начальных остатков) . Теперь надо в этих документах сменить определенные реквизиты, взяв их из полей файла. Связь документа и строки файла по 3-м реквизитам.
Количество записей в файле и количество документов совпадает и может быть от 1 тыс до 10тыс. Количество колонок в файле- 5
Вопросы:
1) Каким способом считать файл Excel: Через табличный документ, потом в ТаблицуЗначений; сразу в Таблицу, в Массив или еще как?
1) Что правильнее с точки зрения 1С:
- Перебирать загруженные записи и для них искать документ, корректировать его и записывать
или
- запросом получить сразу все документы, перебирать их, искать соответствие в загруженных записях, корректировать документы и записывать?
(1)Не зная других подробностей:
- читать файл с помощью Excel в таблицу значений
- с точки зрения производительности быстрее сразу найти все документы и нужные номера строк в их ТЧ, чтобы править только их.
(4)как пример: в файле "хитрое" форматирование из-за чего прочитать его весь сразу хоть и можно, но придется обработать результат, чтобы получилась сплошная таблица.
(1)Не очень понятно, почему вообще возник вопрос скорости?
Это же единоразовая задача.
То есть вообще не важно, как именно вы это будете делать.
Как умеете, так делайте.
(6) Согласна. Неверно сформулировала. Скорее должно звучать: как правильнее, как корректнее. Просто хочу понять, как оптимальнее это делать. Не сделать сейчас, а вообще.
(8)Проще всего эксель прочитать в табличный документ стандартными средствами.
Потом уже обработать табличный документ и создать таблицу значений.
Таблицу значений передать в запрос и связать ее с документами ввода остатков по ключевым реквизитам.
Там же задать условие, что значение реквизитов таблицы не равно значениям реквизитов в документе, чтобы на выходе у вас были только документы, которые нужно изменить.
Обойти выборку и изменить реквизиты.
Там же задать условие, что значение реквизитов таблицы не равно значениям реквизитов в документе, чтобы на выходе у вас были только документы, которые нужно изменить.
Нет условия. соответствие должно быть однозначное строка Excel - Документ. Надо в каждом документе изменить в 2х табличных частях определенный реквизит. Все таблицы состоят из одной строки. Но это все равно таблицы :(((
Допустим (упрощенно):
уже есть загруженная таблица ТЗ. и в ней, например, в первой и второй колонке Название ОС и ИнвентНомер, а в третьей - сумма амортизации
- Для каждого документа поиск строки по первым двум колонкам, а амортизацию надо записать в табличную часть(Стоимость.Амортизация) .
Как можно это сделать в запросе?
Предположим, что в табличной части всегда одна строка.
ВЫБРАТЬ
ТЧ1.РеквизитТЧ1 КАК РеквизитТЧ1,
ТЧ2.РеквизитТЧ2 КАК РеквизитТЧ2 ,
Док.Ссылка КАК Ссылка
ИЗ
Документ.МойДок КАК Док
ЛЕВОЕ СОЕДИНЕНИЕ Документ.МойДок .ТЧ1 КАК ТЧ1
ПО (ТЧ1.Ссылка = Док.Ссылка
И ТЧ1.НомерСтроки = 1)
ЛЕВОЕ СОЕДИНЕНИЕ Документ.МойДок .ТЧ2 КАК ТЧ2
ПО (Док.Ссылка = ТЧ2.Ссылка
И ТЧ2.НомерСтроки = 1)
https://infostart.ru/public/585055/ я здесь писал как быстрее всего. То есть в таблицу, запросом найти все документы, корректировать по одному или транзакцией.
(9) Напрямую - это как? Я вообще знаю 3 способа: com объект (не рекомендую), ado - отлично, но есть заморочки с формированием строки подключения (имя листа), и через табличный документ и ПостроительЗапроса - по мне так лучший способ, он в обработке реализован. Если напрямую - это через com, то это медленно(относительно остальных методов), глохнет на большом количестве строк и имеет кучу внешних зависимостей, что не годится для промышленного решения.
Если напрямую - это через com, то это медленно(относительно остальных методов), глохнет на большом количестве строк и имеет кучу внешних зависимостей, что не годится для промышленного решения.
(15)Может быть там есть метод который выдает данные в более менее готовом виде так же как ado и делает это быстро. Все равно com может зависнуть даже c displayalerts = 0 и надо следить чтобы у клиента на компе он вообще был.
(17)У MS Excel - есть. Range(FirstRow, FirstColumn, LastRow, LastColumn).Value выдает многомерный(по количеству колонок) массив. Для формирования ТЗ достаточно 1 раз пробежаться по одному из массивов, остальные массивы просто загружаются в колонки.
OpenOffice/LibreOffice так не умеют, вернее они выдают все тот же многомерный массив, но вся заковырка в том, что этот массив формируется по количеству строк, т.е. чтобы сформировать ТЗ, нужно будет пробежать по всем значениям этого массива, что равносильно загрузке табличного документа нативным 1с-ным методом ТабличныйДокумент.Прочитать().
Вообще, если задача одноразовая и не потребуется делать ее повторно с другим файлом, то намного быстрее имхо будет создать макет в обработке и загрузить в него нужные колонки из excel просто копипастом, а потом в 5 строк кода из этого макета получить ТаблицуЗначений, таблицу значений запихать в запрос и в самом запросе уже все связать по текстовым полям, замеры, конечно, не делал, но этим способом конкретно у меня получается быстрее как в человекочасах так и по процессорному времени.