Здравствуйте.
Используется:
1С:Предприятие 8.2 (8.2.14.540)
Типовое отраслевое решение
"Альфа-Авто: Автосервис+Автозапчасти, украинская версия 4.1"
Разработка: "1С-Рарус" Локализация: "АБИ Украина" (4.1.11.01)
Потребовалось из XLS файла подгрузить номенклатуру с УКТВЭД в Альфа-авто.
Пробовал стандартной обработкой "Загрузка данных в справочники или в табличную часть", что как-то не сложилось с этой обработкой - не грузит почему-то.
Написал свою, но столкнулся с трудностью, которая заключается в следующем.
Не получается загружать УКТВЭД, т.к. что-то тма замудрено.
Если вручную добавлять позицию товара, нужно заполнить карточку товара, сохранить, только после этого поле выбора ГТД и УКТВЭД станет активным.
Ладно допустим это решаемо.
Дальше жму кнопку и открывается справочник ГТД в котором нужно указать номер ГТД (xxxx/yyyyy/zzzz), дату и выбрать УКТВЭД.
Нажимаю для выбора УКТВЭД открывается справочник УКТВЭД в который добавляю номер УКТВЭД, сохраняю, выбираю.
В ГТД жму в Наименовании сгенерировать - формируется наименование вида (xxxx/yyyyy/zzzz от <дата> <номер УКТВЭД>), потом жму ОК и только после этого в реквезите УКТВЭД товара отображается его наименование.
Например в 1С8.2. Бухгалтерия нет таких заморочек с ГТД (его там вообще нет) и заполнение УКТВЭД сводится к обычному заполнению справочника УКТВЭД.
Подскажите пожалуйста, как можно это организовать программно.
Т.е. вначале я добавляю позицию товара в Номенклатуру, сохраняю, после на его основании создаю ГТД и к нему УКТВЭД, но как это организовать ума не приложу.
Спасибо.
С Уважением, Дмитрий.
! | Правила, п. 4,5 |
Переделайте систему как вам удобно
(Тоесть выржте гтд и т.д.) так как гтд сейчас не нужна.
Если есть более свкжая альфаавто - то смотрите в ней.
Как говорится "отпустил" проблему и через день пришло озарение.
Вот что из этого получилось.
//------------------------------------------------------------------------------------------
Функция НайтиСоздатьНоменклатураГТД(ТаможенныйКод, Владелец, Страна)
НомГТД = Справочники.НоменклатураГТД;
НайденНомГТД = НомГТД.НайтиПоНаименованию(ТаможенныйКод,,Владелец,Владелец);
Если НайденНомГТД.Пустая() и ЗначениеЗаполнено(ТаможенныйКод) Тогда
Попытка
НовыйГТД = НомГТД.СоздатьЭлемент();
НовыйГТД.Владелец = Владелец;
//НовыйГТД.НомерГТД = НайтиСоздатьГТД(Владелец, Страна); // т.к. пока не используется, но сделал на всякий случай (на работоспособность не проверял)
НовыйГТД.КодУКТВЭД = НайтиСоздатьКТВЭД(ТаможенныйКод);
НовыйГТД.СформироватьНаименование();
НовыйГТД.УстановитьНовыйКод();
НовыйГТД.Записать();
Возврат НовыйГТД.Ссылка;
Исключение
Сообщить("ОШИБКА добавления Номенклатура ГТД: """ + ТаможенныйКод + """ | " + ОписаниеОшибки());
// Возврат НайденНомГТД.Пустая();
КонецПопытки;
Иначе
Возврат НайденНомГТД.Ссылка;
КонецЕсли;
КонецФункции
//------------------------------------------------------------------------------------------
Функция НайтиСоздатьГТД(Владелец, Страна)
НайденаГТД = Справочники.ГТД.НайтиПоНаименованию(СокрЛП(Владелец));
Если НайденаГТД.Пустая() и ЗначениеЗаполнено(Владелец) Тогда
Попытка
НовыйГТД = Справочники.ГТД.СоздатьЭлемент();
НовыйГТД.УстановитьНовыйКод();
НовыйГТД.Наименование = Владелец;
НовыйГТД.Страна = Справочники.КлассификаторСтранМира.НайтиПоНаименованию(Страна);
НовыйГТД.Дата = ТекущаяДата();
НовыйГТД.Записать();
Возврат НовыйГТД.Ссылка;
Исключение
Сообщить("ОШИБКА добавления ГТД: """ + Владелец + """ | " + ОписаниеОшибки());
//Возврат НайденаГТД.Пустая();
КонецПопытки;
Иначе
Возврат НайденаГТД.Ссылка;
КонецЕсли;
КонецФункции
//------------------------------------------------------------------------------------------
Функция НайтиСоздатьКТВЭД(ТаможенныйКод)
НайденКодУКТВЭД = Справочники.КлассификаторУКТВЭД.НайтиПоКоду(СокрЛП(ТаможенныйКод));
Если НайденКодУКТВЭД.Пустая()и ЗначениеЗаполнено(ТаможенныйКод) Тогда
Попытка
НовыйКодУКТВЭД = Справочники.КлассификаторУКТВЭД.СоздатьЭлемент();
НовыйКодУКТВЭД.Код = СокрЛП(ТаможенныйКод);
НовыйКодУКТВЭД.Наименование = СокрЛП(ТаможенныйКод);
НовыйКодУКТВЭД.НаименованиеПолное = СокрЛП(ТаможенныйКод);
НовыйКодУКТВЭД.Записать();
Возврат НовыйКодУКТВЭД.Ссылка;
Исключение
Сообщить("ОШИБКА добавления УКТВЭД: """ + ТаможенныйКод + """ | " + ОписаниеОшибки());
//Возврат НайденКодУКТВЭД.Пустая();
КонецПопытки;
Иначе
Возврат НайденКодУКТВЭД.Ссылка;
КонецЕсли;
КонецФункции
//--------------------------------------------------------------------------------------------------------------
Функция НайтиПроизводителя(Производитель) // В xls есть столбец с производителем
НайденПроизводитель = Справочники.Производители.НайтиПоНаименованию(СокрЛП(Производитель));
Если НайденПроизводитель.Пустая() = Ложь Тогда
Возврат НайденПроизводитель.Ссылка;
Иначе
Возврат НайденПроизводитель.Пустая();
КонецЕсли;
КонецФункции
//--------------------------------------------------------------------------------------------------------------
Процедура КнопкаВыполнитьНажатие(Кнопка)
СтандартнаяОбработка=ложь;
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
Диалог.Заголовок = "Выберите файл";
Диалог.ПолноеИмяФайла = "";
Фильтр = "Excel (*.xls)|*.xls";
Диалог.Фильтр = Фильтр;
Диалог.МножественныйВыбор = Ложь;
Диалог.Каталог = "";
Если Диалог.Выбрать() Тогда
ПутьКДаннымXLS = Диалог.ПолноеИмяФайла;
Excel = Новый COMОбъект("Excel.Application"); //создаем объект COMОбъект отвечает за работу с форматом XLS
Excel.Application.Workbooks.Open(ПутьКДаннымXLS); //Открываем файл XLS в переменной ПутьКДаннымXLS путь к файлу
ЛистExcel= Excel.Sheets(1); //Подключаемся к странице. функция получения листа Sheets(«указываем номер листа»);
// Определяем число строк на листе
Строк = Excel.Cells.CurrentRegion.Rows.Count;
ЭлементыФормы.ИндикаторВыполнения.МинимальноеЗначение = 0;
ЭлементыФормы.ИндикаторВыполнения.МаксимальноеЗначение = Строк-НомерНачальнойСтроки;
//Перебираем строки в цикле с помощью функции Cells(«номер строки», «номер колонки») и сразу получаем значение ячейки Value
Для Строка=НомерНачальнойСтроки По Строк Цикл
ПерНомКаталог = ЛистExcel.Cells(Строка, 1).Value;
ПерНомАльтернатива = ЛистExcel.Cells(Строка, 2).Value;
ПерНомКорейский = ЛистExcel.Cells(Строка, 3).Value;
ПерНаименование = ЛистExcel.Cells(Строка, 4).Value;
ПерАнглНаименование = ЛистExcel.Cells(Строка, 6).Value;
ПерУкрНаименование = ЛистExcel.Cells(Строка, 7).Value;
ПерМарка = ЛистExcel.Cells(Строка, 8).Value;
ПерМодель = ЛистExcel.Cells(Строка, 9).Value;
ПерБренд = ЛистExcel.Cells(Строка, 10).Value;
ПерУКТВЭД = ЛистExcel.Cells(Строка, 18).Value;
Если ФлОбновитьГТД = Ложь Тогда
Товар = Справочники.Номенклатура.НайтиПоРеквизиту("Артикул",СокрЛП(ПерНомКаталог));
Если Товар.Пустая() = Истина Тогда
// Если ненайдет - создаем
Попытка
Товар = Справочники.Номенклатура.СоздатьЭлемент();
Товар.Артикул = СокрЛП(ПерНомКаталог);
Товар.АртикулАльт = СокрЛП(ПерНомАльтернатива);
Товар.АртикулКор = СокрЛП(ПерНомКорейский);
Товар.Наименование = СокрЛП(ПерНаименование);
Товар.НаименованиеИностранное = СокрЛП(ПерАнглНаименование);
Если СокрЛП(ПерУкрНаименование) = "" Тогда
Товар.НаименованиеПолное = СокрЛП(ПерНаименование);
Иначе
Товар.НаименованиеПолное = СокрЛП(ПерУкрНаименование);
КонецЕсли;
Товар.ТипНоменклатуры = ПолеТипНоменклатуры;
Товар.ВидНоменклатуры = ПолеВидНоменклатуры;
Товар.ВалютаУчета = ПолеВалюта;
Товар.БазоваяЕдиницаИзмерения = ПолеБазоваяЕдиница;
Товар.ОсновнаяЕдиницаИзмерения = ПолеОсновнаяЕдиница;
Товар.Производитель = НайтиПроизводителя(ПерБренд);
Товар.СтранаПроисхождения = ПолеСтрана;
Товар.СтавкаНДС = ПолеСтавкаНДС;
Товар.Родитель = ПолеРодительНоменклатуры;
Товар.УстановитьНовыйКод();
Товар.Записать();
//Переоткрываем и записываем значение ГТД
Товар = Справочники.Номенклатура.НайтиПоРеквизиту("Артикул",СокрЛП(ПерНомКаталог));
Если Товар.Пустая() = Ложь Тогда
Объект = Товар.ПолучитьОбъект();
Попытка
Объект.НоменклатураГТД = НайтиСоздатьНоменклатураГТД(ПерУКТВЭД, Объект.Ссылка, Объект.СтранаПроисхождения);
Объект.Записать();
Исключение
Сообщить("ОШИБКА модификации. """ + ПерНомКаталог + """ | " + ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
Исключение
Сообщить("ОШИБКА добавления. """ + ПерНомКаталог + """ | " + ОписаниеОшибки());
КонецПопытки;
ИначеЕсли флОбновлятьСправочник = Истина Тогда
// Если найде и отмечен флаг ОбновлятьСправочник
Попытка
Объект = Товар.ПолучитьОбъект();
Объект.Артикул = СокрЛП(ПерНомКаталог);
Объект.АртикулАльт = СокрЛП(ПерНомАльтернатива);
Объект.АртикулКор = СокрЛП(ПерНомКорейский);
Объект.Наименование = СокрЛП(ПерНаименование);
Объект.НаименованиеИностранное = СокрЛП(ПерАнглНаименование);
Если СокрЛП(ПерУкрНаименование) = "" Тогда
Объект.НаименованиеПолное = СокрЛП(ПерНаименование);
Иначе
Объект.НаименованиеПолное = СокрЛП(ПерУкрНаименование);
КонецЕсли;
Объект.ТипНоменклатуры = ПолеТипНоменклатуры;
Объект.ВидНоменклатуры = ПолеВидНоменклатуры;
Объект.ВалютаУчета = ПолеВалюта;
Объект.БазоваяЕдиницаИзмерения = ПолеБазоваяЕдиница;
Объект.ОсновнаяЕдиницаИзмерения = ПолеОсновнаяЕдиница;
Объект.Производитель = НайтиПроизводителя(ПерБренд);
Объект.СтранаПроисхождения = ПолеСтрана;
Объект.СтавкаНДС = ПолеСтавкаНДС;
Объект.НоменклатураГТД = НайтиСоздатьНоменклатураГТД(ПерУКТВЭД, Объект.Ссылка, Объект.СтранаПроисхождения);
Объект.Родитель = ПолеРодительНоменклатуры;
Объект.Записать();
Исключение
Сообщить("ОШИБКА модификации. """ + ПерНомКаталог + """ | " + ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
Иначе
Товар = Справочники.Номенклатура.НайтиПоРеквизиту("Артикул",СокрЛП(ПерНомКаталог));
Если Товар.Пустая() = Ложь Тогда
Объект = Товар.ПолучитьОбъект();
Попытка
Объект.НоменклатураГТД = НайтиСоздатьНоменклатураГТД(ПерУКТВЭД, Объект.Ссылка, Объект.СтранаПроисхождения);
Объект.Записать();
Исключение
Сообщить("ОШИБКА модификации. """ + ПерНомКаталог + """ | " + ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
КонецЕсли;
ЭлементыФормы.ИндикаторВыполнения.Значение = ЭлементыФормы.ИндикаторВыполнения.Значение+1;
КонецЦикла;
//По окончанию работы закрываем файл
Excel.Quit();
Предупреждение("Обработка выполнена успешно");
ЭлементыФормы.ИндикаторВыполнения.Значение = 0;
КонецЕсли;
КонецПроцедуры
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua