Перепись стандартной обработки во внешнюю. Ошибка
Есть "вшитая" обработка загрузки данных из Excel, которая подключена к документу ПеремещениеТоваров.
Во время выполнения процедуры
В Товары попадают именно строки загружаемого документа Excel (ДанныеКоллекции).
Когда делаю внешней обработкой, то уже ругается на то, что Товары не определены
"{Обработка.ЗагрузкаНоменклатурыИзExcel.Форма.Форма.Форма(247)}: Поле объекта не обнаружено (Товары)
НоваяСтрока = Объект.Товары.Добавить();"
Как правильно инициализировать загрузку строк?
&НаКлиенте
Процедура ВыполнитьЗагрузкуИзФайла(Команда)
Если не ЗначениеЗаполнено(Объект.ПутьКФайлу) ТОгда
предупреждение("Не указан файл для загрузки.");
возврат;
КонецЕсли;
Файл = Новый Файл(Объект.ПутьКФайлу);
Если не Файл.Существует() ТОгда
Предупреждение("Указанный файл не существет. Выберите другой файл.");
возврат;
КонецЕсли;
Попытка
Эксель = ИнициализироватьExcel(Объект.ПутьКФайлу);
Если Эксель = Неопределено Тогда
Сообщить("Не удалось открыть файл Excel для получения данных об отгрузке. Проверьте путь к файлу данных: " + Объект.ПутьКФайлу, СтатусСообщения.Важное);
Возврат;
КонецЕсли;
МассивДанных = ПолучитьТаблицуДанныхИзExcel(Эксель);
Эксель.Workbooks.Close();
Эксель.Quit();
Исключение
Сообщить("Возникла ошибка при считывании документа Excel", СтатусСообщения.Важное);
Сообщить(ОписаниеОшибки());
Эксель.Workbooks.Close();
Эксель.Quit();
Возврат;
КонецПопытки;
Если МассивДанных = Неопределено Тогда
возврат;
КонецЕсли;
ЗагрузитьДанныеВДокумент(МассивДанных);
//СтруктураВыбора = Новый Структура();
//СтруктураВыбора.Вставить("АдресТоваровВХранилище", ПоместитьТоварыВХранилище(МассивДанных));
//ОповеститьОВыборе(СтруктураВыбора);
КонецПроцедуры
&НаКлиенте
Функция ИнициализироватьExcel(ПутьКФайлуДанных)
Состояние("Инициализация Excel...");
Эксель = Неопределено;
Попытка
Эксель = Новый COMОбъект("Excel.Application");
Эксель.Workbooks.Open(ПутьКФайлуДанных);
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
Состояние("");
Возврат Эксель;
КонецФункции
&НаКлиенте
Функция ПолучитьТаблицуДанныхИзExcel(Эксель)
МассивДанных = Новый Массив;
КоличествоСтрокВФайле = Эксель.Sheets(1).Cells.SpecialCells(11).Row();
Индексы = ПолучитьИндексыExcel(Эксель, КоличествоСтрокВФайле);
Если Индексы = неопределено Тогда
Предупреждение("Файл не содержит данных.");
Возврат Неопределено;
КонецЕсли;
КолНоменклатура = Индексы.КолНоменклатура;
КолКоличество = Индексы.КолКоличество;
КолЦена = Индексы.КолЦена;
КолНомер = Индексы.КолНомер;
КолДата = Индексы.КолДата;
Индекс = Индексы.Индекс;
Пока Индекс < КоличествоСтрокВФайле + 1000 Цикл
Индекс = Индекс + 1;
Артикул = СокрЛП(Эксель.Sheets(1).Cells(Индекс, КолНоменклатура).Text);
Если ПустаяСтрока(Артикул) Тогда
прервать;
КонецЕсли;
НоваяСтрока = Новый Структура;
НоваяСтрока.Вставить("Номенклатура", ПолучитьНоменклатуру(Артикул));
Попытка
НоваяСтрока.Вставить("Количество", Число(СокрЛП(Эксель.Sheets(1).Cells(Индекс, КолКоличество).Text)));
Исключение
НоваяСтрока.Вставить("Количество", 0);
КонецПопытки;
Попытка
НоваяСтрока.Вставить("Цена",Число(СокрЛП(Эксель.Sheets(1).Cells(Индекс, КолЦена).Text)))
Исключение
НоваяСтрока.Вставить("Цена", 0);
КонецПопытки;
Попытка
НоваяСтрока.Вставить("Номер",СокрЛП(Эксель.Sheets(1).Cells(Индекс, КолНомер).Text));
Исключение
НоваяСтрока.Вставить("Номер", "");
КонецПопытки;
Попытка
ДатаПолная = Лев(СокрЛП(Эксель.Sheets(1).Cells(Индекс, КолДата).Text),10);
Год = Прав(ДатаПолная, 4);
День = Лев(ДатаПолная, 2);
Месяц = Сред(ДатаПолная, 4,2);
Дата = Дата("" + Год + Месяц + День);
НоваяСтрока.Вставить("Дата",Дата);
Исключение
НоваяСтрока.Вставить("Дата", Дата("00010101"));
КонецПопытки;
МассивДанных.Добавить(НоваяСтрока);
КонецЦикла;
Возврат МассивДанных;
КонецФункции
&НаКлиенте
Функция ПолучитьИндексыExcel(Эксель, КоличествоСтрокВФайле)
//Если КоличествоСтрокВФайле > 20 Тогда
// КоличествоСтрокВФайле = 20;
//КонецЕсли;
индекс = 0;
Пока Индекс < КоличествоСтрокВФайле Цикл
Индекс = Индекс + 1;
Для й = 1 по 10 Цикл
Данные = СокрЛП(Эксель.Sheets(1).Cells(Индекс, й).Text);
Если ВРег(Данные) = "АРТИКУЛ" Тогда
Индексы = Новый Структура;
Индексы.Вставить("КолНоменклатура", й);
Индексы.Вставить("КолКоличество", й + 1);
Индексы.Вставить("КолЦена", й + 2);
Индексы.Вставить("КолНомер", й + 3);
Индексы.Вставить("КолДата", й + 4);
Индексы.Вставить("Индекс", Индекс);
Возврат Индексы;
ИначеЕсли ЭтоЧисло(Данные) Тогда
Индексы = Новый Структура;
Индексы.Вставить("КолНоменклатура", й - 1);
Индексы.Вставить("КолКоличество", й);
Индексы.Вставить("КолЦена", й + 1);
Индексы.Вставить("КолНомер", й + 2);
Индексы.Вставить("КолДата", й + 3);
Индексы.Вставить("Индекс", Индекс - 1);
Возврат Индексы;
КонецЕсли;
КонецЦикла
КонецЦикла;
Возврат неопределено;
КонецФункции
&НаСервере
Функция ПолучитьНоменклатуру(Артикул)
Номенклатура = Справочники.Номенклатура.ПустаяСсылка();
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.ПометкаУдаления = ЛОЖЬ
| И Номенклатура.Артикул = &Артикул";
Запрос.Параметры.Вставить("Артикул", Артикул);
Результат = Запрос.Выполнить().Выбрать();
Если Результат.Количество() > 1 Тогда
сообщить("Найдено несколько позиций номенклатуры по артикулу: " + Артикул, СтатусСообщения.Важное);
ИначеЕсли Результат.Следующий() Тогда
Номенклатура = Результат.Ссылка;
Иначе
сообщить("Номенклатура по артикулу: " + Артикул + ", не найдена.", СтатусСообщения.Важное);
КонецЕсли;
возврат Номенклатура;
КонецФункции
&НаКлиенте
Функция ЭтоЧисло(Данные)
Попытка
Число = Число(Данные);
возврат истина;
Исключение
возврат ложь;
КонецПопытки;
КонецФункции
&НаКлиенте
Процедура ПутьКФайлуНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
// Вставить содержимое обработчика.
Режим = РежимДиалогаВыбораФайла.Открытие;
ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим);
ДиалогОткрытияФайла.ПолноеИмяФайла = "";
Фильтр = "Документы Excel(*.xls; *.xlsx)|*.xls;*.xlsx";
ДиалогОткрытияФайла.Фильтр = Фильтр;
ДиалогОткрытияФайла.МножественныйВыбор = Ложь;
ДиалогОткрытияФайла.Заголовок = "Выберите файл";
Если ДиалогОткрытияФайла.Выбрать() Тогда
Объект.ПутьКФайлу = ДиалогОткрытияФайла.ПолноеИмяФайла;
Иначе
Текст = "ru = ""Файл(ы) не выбран!""; en = ""File(s) not selected!""";
Предупреждение(НСтр(Текст));
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ЗагрузитьДанныеВДокумент(ТаблицаДанных)
Режим = РежимДиалогаВопрос.ДаНет;
Если Объект.Товары.Количество() > 0 Тогда
Ответ = Вопрос(НСтр("ru='Список ""Товары"" содержит данные. Очистить табличную часть?'"), Режим, 0, КодВозвратаДиалога.Да,);
Если Ответ = КодВозвратаДиалога.Да Тогда
Объект.Товары.Очистить();
КонецЕсли;
КонецЕсли;
Для Каждого Строка из ТаблицаДанных Цикл
НоваяСтрока = Объект.Товары.Добавить();
НоваяСтрока.Номенклатура = Строка.Номенклатура;
НоваяСтрока.КоличествоУпаковок = Строка.Количество;
//НоваяСтрока.Цена = Строка.Цена;
//НоваяСтрока.ДатаПоступления = Строка.Дата;
ЗаполнитьСтроку(НоваяСтрока);
КонецЦикла;
КонецПроцедуры
Процедура ЗаполнитьСтроку(ТекущаяСтрока)
КонецПроцедуры
ПоказатьВо время выполнения процедуры
Процедура ЗагрузитьДанныеВДокумент(ТаблицаДанных)
Режим = РежимДиалогаВопрос.ДаНет;
Если Объект.Товары.Количество() > 0 Тогда
Ответ = Вопрос(НСтр("ru='Список ""Товары"" содержит данные. Очистить табличную часть?'"), Режим, 0, КодВозвратаДиалога.Да,);
Если Ответ = КодВозвратаДиалога.Да Тогда
Объект.Товары.Очистить();
КонецЕсли;
КонецЕсли;
Для Каждого Строка из ТаблицаДанных Цикл
НоваяСтрока = Объект.Товары.Добавить();
НоваяСтрока.Номенклатура = Строка.Номенклатура;
НоваяСтрока.КоличествоУпаковок = Строка.Количество;
//НоваяСтрока.Цена = Строка.Цена;
//НоваяСтрока.ДатаПоступления = Строка.Дата;
ЗаполнитьСтроку(НоваяСтрока);
КонецЦикла;
КонецПроцедуры
ПоказатьВ Товары попадают именно строки загружаемого документа Excel (ДанныеКоллекции).
Когда делаю внешней обработкой, то уже ругается на то, что Товары не определены
"{Обработка.ЗагрузкаНоменклатурыИзExcel.Форма.Форма.Форма(247)}: Поле объекта не обнаружено (Товары)
НоваяСтрока = Объект.Товары.Добавить();"
Как правильно инициализировать загрузку строк?
Прикрепленные файлы:
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(8)
переписал так:
Создал для обработки Товары вТабличнойЧасти
Теперь получаю Поле объекта не обнаружено (Товары)
Такой реквизит в табличной части документа есть. Что не так теперь?
переписал так:
Режим = РежимДиалогаВопрос.ДаНет;
Если Объект.СсылкаНаОбъект.Товары.Количество() > 0 Тогда
Ответ = Вопрос(НСтр("ru='Список ""Товары"" содержит данные. Очистить табличную часть?'"), Режим, 0, КодВозвратаДиалога.Да,);
Если Ответ = КодВозвратаДиалога.Да Тогда
Объект.СсылкаНаОбъект.Товары.Очистить();
КонецЕсли;
КонецЕсли;
Для Каждого Строка из ТаблицаДанных Цикл
НоваяСтрока = Объект.СсылкаНаОбъект.Товары.Добавить();
НоваяСтрока.Номенклатура = Строка.Номенклатура;
НоваяСтрока.Количество = Строка.Количество;
//НоваяСтрока.Цена = Строка.Цена;
//НоваяСтрока.ДатаПоступления = Строка.Дата;
ЗаполнитьСтроку(НоваяСтрока);
КонецЦикла;
ПоказатьСоздал для обработки Товары вТабличнойЧасти
Теперь получаю Поле объекта не обнаружено (Товары)
Такой реквизит в табличной части документа есть. Что не так теперь?
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот