Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
05 дек 2023, 06:24

Соединить excel файл в ТЗ с Врем.Таблицами

Автор maxxi, 26 июн 2023, 06:32

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

maxxi


Здравствуйте, есть ТабЗнач, с 8 ми колонками, туда я выгружаю данные из нескольких временных таблиц,

еще есть excel-файл с двумя колонками: "Номенклатура" и "Остатки".

Этот файл открываю без проблем(проверил в отладчике), но не могу соединить с другими временными таблицами по названию товара и показать данные файла в колонке ТЗ.

Спасибо.

alexandr_ll

maxxi, А зачем из excel-файла выгружать во временные таблицы? Соединяйте сразу с ТЗ.

maxxi

alexandr_ll, да, так и надо сделать, моя ошибка, но не знаю как ((

fruitella

maxxi, первая ссылка в гугле: Приемы эффективной загрузки данных из Excel в 1С

Приемы эффективной загрузки данных из Excel в 1С

44. ImHunter 275 17.04.18 09:25 Сейчас в теме

(0) (38) Разбивка по листам, похоже, не раскрыта?
Недавно тоже вот перешел на этот способ с ADO.
Разбивать по листам, в принципе, несложно. В загруженном ТабДоке присутствует несколько областей с названиями листов.

В итоге, получилось вот так:


///////////////////////////////////
// Работа с Excel через ТабДок
// Функция - Прочитать excel
//
// Параметры:
// ФайлExcel - Файл, Строка - Объект Файл или полное имя файла.
// ФункцияОбработкиСтрок - Строка, Неопределено - Шаблон выражения для обработки строковых значений ячеек.
// В шаблоне производится подстановка - вместо символа ? будет подставляться обрабатываемое значение строки.
// Если передать Неопределено или пустую строку, то обработка производиться не будет.
// МаксШирина - Число - Максимальное кол-во колонок, просматриваемых при усечении таблицы по ширине.
// ОграничиватьСверху - Булево - Убирать пустые строки сверху
// ОграничиватьСлева - Булево - Убирать пустые строки слева
// ОграничиватьСнизу - Булево - Убирать пустые строки снизу
// ОграничиватьСправа - Булево - Убирать пустые строки справа
//
// Возвращаемое значение:
// СписокЗначений - Список значений содержимого. Элементы списка в поле Значение содержат ячейки листа (объект ОбластьЯчеекТабличногоДокумента), в поле Представление - имя листа
//
Функция ПрочитатьExcel(ФайлExcel, ФункцияОбработкиСтрок = "СокрЛП(?)",
ОграничиватьСверху = Истина, ОграничиватьСлева = Истина, ОграничиватьСнизу = Истина, ОграничиватьСправа = Истина) Экспорт

Ф = НовыйФайл(ФайлExcel);
ВесьТабДок = Новый ТабличныйДокумент();
ВесьТабДок.Прочитать(Ф.ПолноеИмя, СпособЧтенияЗначенийТабличногоДокумента.Значение);

Результат = Новый СписокЗначений;
Области = ВесьТабДок.Области;
Если Области.Количество()=0 Тогда
ВызватьИсключение("В файле нет областей");
КонецЕсли;

Для Каждого Обл Из Области Цикл
ТекТабДок = Новый ТабличныйДокумент;
ОгрОбласть = ПолучитьОграниченнуюОбласть(ВесьТабДок, Обл);
// вставим область в табдок
ОгрОбласть.Имя = Обл.Имя;
ТекТабДок.ВставитьОбласть(ОгрОбласть,
ТекТабДок.Область(1, ОгрОбласть.Лево, ОгрОбласть.Низ - ОгрОбласть.Верх + 1, ОгрОбласть.Право)
);
СократитьСтроки(ТекТабДок, ФункцияОбработкиСтрок);
Результат.Добавить(ТекТабДок, Обл.Имя);
КонецЦикла;
// зачищаем исходный таб док. хз, может лишнее
ВесьТабДок.Очистить();
ВесьТабДок = Неопределено;

Возврат Результат;

КонецФункции
Процедура СократитьСтроки(ТабДок, ФункцияОбработкиСтрок = "СокрЛП(?)")

Если ПустаяСтрока(ФункцияОбработкиСтрок) Тогда
Возврат;
КонецЕсли;

Если Ложь Тогда ТабДок = Новый ТабличныйДокумент; КонецЕсли; // фейк

Для Стр = 1 По ТабДок.ВысотаТаблицы Цикл
Для Кол = 1 По ТабДок.ШиринаСтраницы Цикл
ТекОбласть = ТабДок.Область(Стр, Кол);
ТекстОбласти = ТекОбласть.Текст;
Если Не ТекОбласть.СодержитЗначение И Не ПустаяСтрока(ТекОбласть.Текст) Тогда
Выражение = СтрЗаменить(ФункцияОбработкиСтрок, "?", "ТекстОбласти");
ТекОбласть.Текст = Вычислить(Выражение);
КонецЕсли;
КонецЦикла;
КонецЦикла;

КонецПроцедуры
Функция ПолучитьОграниченнуюОбласть(ТабДок, ОбластьЯчеек,
ОграничиватьСверху = Истина, ОграничиватьСлева = Истина, ОграничиватьСнизу = Истина, ОграничиватьСправа = Истина)

Если Не ОграничиватьСверху И Не ОграничиватьСлева И Не ОграничиватьСправа И Не ОграничиватьСнизу Тогда
Возврат ОбластьЯчеек;
КонецЕсли;

Если Ложь Тогда // фейк
ТабДок = Новый ТабличныйДокумент;
ОбластьЯчеек = ТабДок.Области[0];
КонецЕсли;

Лево = Неопределено; Право = Неопределено; Верх = Неопределено; Низ = Неопределено;
МаксШирина = ТабДок.ШиринаТаблицы;
Для Стр = ОбластьЯчеек.Верх По ОбластьЯчеек.Низ Цикл
Для Кол = 1 По МаксШирина Цикл
ТекОбласть = ТабДок.Область(Стр, Кол);
Если ЭтоЗначащаяОбласть(ТекОбласть) Тогда
Лево = ?(Лево=Неопределено, Кол, Мин(Лево, Кол));
Право = ?(Право=Неопределено, Кол, Макс(Право, Кол));
Верх = ?(Верх=Неопределено, Стр, Верх);
Низ = ?(Низ=Неопределено, Стр, Макс(Низ, Стр));
КонецЕсли;
КонецЦикла;
КонецЦикла;

Результат = ТабДок.Область(
?(ОграничиватьСверху, ?(Верх=Неопределено, ОбластьЯчеек.Верх, Верх), ОбластьЯчеек.Верх),
?(ОграничиватьСлева, ?(Лево=Неопределено, ОбластьЯчеек.Лево, Лево), ОбластьЯчеек.Лево),
?(ОграничиватьСнизу, ?(Низ=Неопределено, ОбластьЯчеек.Низ, Низ), ОбластьЯчеек.Низ),
?(ОграничиватьСправа, ?(Право=Неопределено, ОбластьЯчеек.Право, Право), ОбластьЯчеек.Право)
);

Возврат Результат;

КонецФункции
Функция ЭтоЗначащаяОбласть(ОбластьЯчеек)
Возврат Не ПустаяСтрока(ОбластьЯчеек.Текст)
Или ОбластьЯчеек.Гиперссылка
Или ОбластьЯчеек.СодержитЗначение
//Или ОбластьЯчеек.ГраницаСверху.ТипЛинии<>ТипЛинииЯчейкиТабличногоДокумента.НетЛинии
//Или ОбластьЯчеек.ГраницаСнизу.ТипЛинии<>ТипЛинииЯчейкиТабличногоДокумента.НетЛинии
Или ОбластьЯчеек.ГраницаСлева.ТипЛинии<>ТипЛинииЯчейкиТабличногоДокумента.НетЛинии
Или ОбластьЯчеек.ГраницаСправа.ТипЛинии<>ТипЛинииЯчейкиТабличногоДокумента.НетЛинии
;
КонецФункции
// Функция - Текст области листа
// Предполагаем, что имеем дело с ТабДоком, обрезанным по нужным размерам.
// Параметры:
// Лист - ЭлементСпискаЗначений, ТабличныйДокумент - Где искать текст.
// Верх - Число, Неопределено - Верхняя граница области
// Лево - Число, Неопределено - Левая граница области
// Низ - Число, Неопределено - Нижняя граница области
// Право - Число, Неопределено - Правая граница области
//
// Возвращаемое значение:
// Строка - Объединенный текст указанной области. Ячейки по горизонтали разделяются символом ТАБ, строки переносятся ВК
//
Функция ТекстОбластиЛиста(Лист, Знач Верх = Неопределено, Знач Лево = Неопределено, Знач Низ = Неопределено, Знач Право = Неопределено) Экспорт

ТипЗнчЛист = ТипЗнч(Лист);
Если ТипЗнчЛист=КэшФункции.ТипТабличныйДокумент() Тогда
ТабДок = Лист;
ИначеЕсли ТипЗнчЛист=КэшФункции.ТипЭлементСпискаЗначений() Тогда
ТабДок = Лист.Значение;
Иначе
ТабДок = Новый ТабличныйДокумент; // фейк
ВызватьИсключение("Неподдерживаемый тип параметра Лист " + ТипЗнчЛист);
КонецЕсли;

Область = ТабДок.Область(Верх, Лево, Низ, Право);
Результат = "";
ГорРазд = Символы.Таб;
ВертРазд = Символы.ВК;

ОблЛево = ?(Область.Лево=0, 1, Область.Лево);
ОблПраво = ?(Область.Право=0, ТабДок.ШиринаТаблицы, Мин(Область.Право, ТабДок.ШиринаТаблицы));
ОблВерх = ?(Область.Верх=0, 1, Область.Верх);
ОблНиз = ?(Область.Низ=0, ТабДок.ВысотаТаблицы, Мин(Область.Низ, ТабДок.ВысотаТаблицы));

Для Стр=ОблВерх По ОблНиз Цикл

Для Кол=ОблЛево По ОблПраво Цикл

ТекстЯчейки = ТабДок.Область(Стр, Кол).Текст;
ЭтоПустаяЯчейка = ПустаяСтрока(ТекстЯчейки);

Если ЭтоПустаяЯчейка Тогда
ТекстЯчейки = ГорРазд;
КонецЕсли;
Если Кол=ОблПраво И Стр=ОблНиз Тогда
Разделитель = "";
ИначеЕсли Кол=ОблПраво Тогда
Разделитель = ВертРазд;
Иначе
Разделитель = ?(ЭтоПустаяЯчейка, "", ГорРазд);
КонецЕсли;

Результат = Результат + ТекстЯчейки + Разделитель;

КонецЦикла;

КонецЦикла;

Возврат Результат;

КонецФункции

Показать


Теги:

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

Рейтинг@Mail.ru

Поиск