Здравствуйте. Я плохо знаю русский. Извините за этого. Я еще новичок в 1С программирование. Данные загружается из эксель файла. Мне надо что он проверил все товары. Таким образом как есть ли токай товар в базе или нет. Если нет тогда он в низу показывало сообщение что токай товар не найден и он не добавил его в ТЗ документа. Сообщение сделал можно но как фильтр поставить ?
Написал код но он добавляет товара. Мне проста надо подсказка что как исправится с этим.
Ниже код и картинка
Спасибо всем за ранее.
Написал код но он добавляет товара. Мне проста надо подсказка что как исправится с этим.
Ниже код и картинка
Спасибо всем за ранее.
Перем ТЗ экспорт;
Процедура СоздатьТЗ()
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("Номенклатура",,,);
ТЗ.Колонки.Добавить("Количество",,,);
ТЗ.Колонки.Добавить("Цена",,,);
ТЗ.Колонки.Добавить("Сумма",,,);
КонецПроцедуры // СоздатьТЗ()
Процедура ПереборСтрокВЭксель()
Путь = "C:\Users\User\Desktop\Лист Microsoft Excel.xlsx";
Эксель = Новый COMОбъект("Excel.Application");
Эксель.Workbooks.Open(Путь);
Эксель.Sheets(1).Select();
Версия = Лев(Эксель.Version,Найти(Эксель.Version,".")-1);
Если Версия = "8" тогда
ФайлСтрок = Эксель.Cells.CurrentRegion.Rows.Count;
ФайлКолонок = Макс(Эксель.Cells.CurrentRegion.Columns.Count, 13);
Иначе
ФайлСтрок = Эксель.Cells(1,1).SpecialCells(11).Row;
ФайлКолонок = Эксель.Cells(1,1).SpecialCells(11).Column;
Конецесли;
Для Стр = 1 ПО ФайлСтрок Цикл
НоваяСтрока = ТЗ.Добавить();
НоваяСтрока.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(СокрЛП(Эксель.Cells(Стр,1).Value));
НоваяСтрока.Количество = СокрЛП(Эксель.Cells(Стр,2).Value);
НоваяСтрока.Цена = СокрЛП(Эксель.Cells(Стр,3).Value);
НоваяСтрока.Сумма = СокрЛП(Эксель.Cells(Стр,4).Value);
КонецЦикла;
Эксель.ActiveWorkbook.Close();
Эксель.Application.Quit();
КонецПроцедуры
Процедура ПереборСтрокТЗ()
Для Каждого Ст из ТЗ Цикл
Стр = Товары.Добавить();
Стр.Номенклатура = Ст.Номенклатура;
Стр.Количество = Ст.Количество;
Стр.Цена = Ст.Цена;
Стр.Сумма = Ст.Сумма;
Стр.СтавкаНДС = Перечисления.СтавкиНДС.БезНДС;
Стр.ЕдиницаИзмерения = Справочники.ЕдиницыИзмерения.НайтиПоНаименованию("ƏD");
Стр.Коэффициент = 1;
КонецЦикла;
КонецПроцедуры
Процедура ОсновныеДействияФормыЗагрузкаДанный(Кнопка)
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
Диалог.Заголовок = "Выберите excel - файл";
Диалог.ПолноеИмяФайла = "С:\";
Диалог.Фильтр = "Таблицы (*.xls,*.xlsx)|*.xls;*.xlsx;|Microsoft Excel 97/2000/XP/2003 (*.xls)|*.xls|Microsoft Excel 2007/2010 (*.xlsx)|*.xlsx";
Если Диалог.Выбрать() Тогда
Предупреждение(Диалог.ПолноеИмяФайла, 10 , "Файл выбран.");
Иначе
Предупреждение("Файл не выбран.");
Возврат;
КонецЕсли;
СоздатьТЗ();
ПереборСтрокВЭксель();
ПереборСтрокТЗ();
КонецПроцедуры
ПоказатьПрикрепленные файлы:
По теме из базы знаний
- Универсальная обработка для загрузки данных из Экселя в табличную часть документа
- Загрузка номенклатуры из Эксель (новый взгляд)
- [ШАБЛОН] Загрузка данных из Excel
- Универсальная загрузка данных из Экселя по основным параметрам для УТ 11.5
- Загрузка данных из экселя в Распоряжение на перечисление на карты МИР
Найденные решения
(3) можно просто не добавлять эту строку и все
Для Стр = 1 ПО ФайлСтрок Цикл
Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(СокрЛП(Эксель.Cells(Стр,1).Value));
Если Номенклатура.Пустая() Тогда
Сообщить("Номенклатура " + СокрЛП(Эксель.Cells(Стр,1).Value) + " не найдена!");
Иначе
НоваяСтрока = ТЗ.Добавить();
НоваяСтрока.Номенклатура = Номенклатура;
НоваяСтрока.Количество = СокрЛП(Эксель.Cells(Стр,2).Value);
НоваяСтрока.Цена = СокрЛП(Эксель.Cells(Стр,3).Value);
НоваяСтрока.Сумма = СокрЛП(Эксель.Cells(Стр,4).Value);
НоваяСтрока.Номенклатура = Номенклатура;
Конецесли
КонецЦикла;
Проблему можно так решить
Для Стр = 1 ПО ФайлСтрок Цикл
Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(СокрЛП(Эксель.Cells(Стр,1).Value));
Если Номенклатура.Пустая() Тогда
Сообщить("Номенклатура " + СокрЛП(Эксель.Cells(Стр,1).Value) + " не найдена!");
Иначе
НоваяСтрока = ТЗ.Добавить();
НоваяСтрока.Номенклатура = Номенклатура;
НоваяСтрока.Количество = СокрЛП(Эксель.Cells(Стр,2).Value);
НоваяСтрока.Цена = СокрЛП(Эксель.Cells(Стр,3).Value);
НоваяСтрока.Сумма = СокрЛП(Эксель.Cells(Стр,4).Value);
НоваяСтрока.Номенклатура = Номенклатура;
Конецесли
КонецЦикла;
Проблему можно так решить
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
В коде добишите вот в этом месте
Для Стр = 1 ПО ФайлСтрок Цикл
НоваяСтрока = ТЗ.Добавить();
Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(СокрЛП(Эксель.Cells(Стр,1).Value));
Если Номенклатура.Пустая() Тогда
Сообщить("Номенклатура " + СокрЛП(Эксель.Cells(Стр,1).Value) + " не найдена!");
Иначе
НоваяСтрока.Номенклатура = Номенклатура;
Конецесли
//НоваяСтрока.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(СокрЛП(Эксель.Cells(Стр,1).Value));
НоваяСтрока.Количество = СокрЛП(Эксель.Cells(Стр,2).Value);
НоваяСтрока.Цена = СокрЛП(Эксель.Cells(Стр,3).Value);
НоваяСтрока.Сумма = СокрЛП(Эксель.Cells(Стр,4).Value);
КонецЦикла;
Показать
(2)
Спасибо вам за вниманию
Код работает но по моему надо добавить код для удаление строк из ТЗ или сразу в экселя.
Это так надо решить или есть более оптимальный вариант?
Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(СокрЛП(Эксель.Cells(Стр,1).Value));
Если Номенклатура.Пустая() Тогда
Сообщить("Номенклатура " + СокрЛП(Эксель.Cells(Стр,1).Value) + " не найдена!");
Иначе
НоваяСтрока.Номенклатура = Номенклатура;
Конецесли
Если Номенклатура.Пустая() Тогда
Сообщить("Номенклатура " + СокрЛП(Эксель.Cells(Стр,1).Value) + " не найдена!");
Иначе
НоваяСтрока.Номенклатура = Номенклатура;
Конецесли
Спасибо вам за вниманию
Код работает но по моему надо добавить код для удаление строк из ТЗ или сразу в экселя.
Это так надо решить или есть более оптимальный вариант?
Прикрепленные файлы:
(3) можно просто не добавлять эту строку и все
Для Стр = 1 ПО ФайлСтрок Цикл
Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(СокрЛП(Эксель.Cells(Стр,1).Value));
Если Номенклатура.Пустая() Тогда
Сообщить("Номенклатура " + СокрЛП(Эксель.Cells(Стр,1).Value) + " не найдена!");
Иначе
НоваяСтрока = ТЗ.Добавить();
НоваяСтрока.Номенклатура = Номенклатура;
НоваяСтрока.Количество = СокрЛП(Эксель.Cells(Стр,2).Value);
НоваяСтрока.Цена = СокрЛП(Эксель.Cells(Стр,3).Value);
НоваяСтрока.Сумма = СокрЛП(Эксель.Cells(Стр,4).Value);
НоваяСтрока.Номенклатура = Номенклатура;
Конецесли
КонецЦикла;
Проблему можно так решить
Для Стр = 1 ПО ФайлСтрок Цикл
Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(СокрЛП(Эксель.Cells(Стр,1).Value));
Если Номенклатура.Пустая() Тогда
Сообщить("Номенклатура " + СокрЛП(Эксель.Cells(Стр,1).Value) + " не найдена!");
Иначе
НоваяСтрока = ТЗ.Добавить();
НоваяСтрока.Номенклатура = Номенклатура;
НоваяСтрока.Количество = СокрЛП(Эксель.Cells(Стр,2).Value);
НоваяСтрока.Цена = СокрЛП(Эксель.Cells(Стр,3).Value);
НоваяСтрока.Сумма = СокрЛП(Эксель.Cells(Стр,4).Value);
НоваяСтрока.Номенклатура = Номенклатура;
Конецесли
КонецЦикла;
Проблему можно так решить
(4) Спасибо вам огромное. Вы много раз помогли мне решить проблему.
Но интересна что почему этот код не работал или . Когда запускаешь программу бывает без конечный цикл.
И еще последний какие книги можете рекомендовать для программирование и для COM объектов?
Спасибо вам еще раз
Но интересна что почему этот код не работал
Эксель.Rows(Строка(Стр)).Delete();
Эксель.Worksheets("Лист1").Rows(Стр).Delete();
И еще последний какие книги можете рекомендовать для программирование и для COM объектов?
Спасибо вам еще раз
(5) Да не зачто!
Вот по вопросу Эксель.Rows(Строка(Стр)).Delete(); Смотрите, в екселе 250 тыс. строк, если вы хоть какую то удалите то их количество все равно останется. Сам я ни когда не пробывал удалять строки в ексель но чтобы убедиться работатает или нет, до сделайте 10 строк в екселе с разными цветами и удалите хоть одну, если вы действительно увидите что они удалились то тогда данный функционал работает.
Что касается книжек, мне большего всего нравиться книга "Просты примеры разработки на 1С:Предприятии" в ней собраны основные методы и подходы к решению, там кстати и про com-объекты есть описание
А вот если у вас зацикливание происходит, следовательно, у вас программа не знает когда ее завершить. Тут нужен какой-то либо признак или счетчик чтобы выходит из цикла
Вот по вопросу Эксель.Rows(Строка(Стр)).Delete(); Смотрите, в екселе 250 тыс. строк, если вы хоть какую то удалите то их количество все равно останется. Сам я ни когда не пробывал удалять строки в ексель но чтобы убедиться работатает или нет, до сделайте 10 строк в екселе с разными цветами и удалите хоть одну, если вы действительно увидите что они удалились то тогда данный функционал работает.
Что касается книжек, мне большего всего нравиться книга "Просты примеры разработки на 1С:Предприятии" в ней собраны основные методы и подходы к решению, там кстати и про com-объекты есть описание
А вот если у вас зацикливание происходит, следовательно, у вас программа не знает когда ее завершить. Тут нужен какой-то либо признак или счетчик чтобы выходит из цикла
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот