Коллеги, делаю загрузку из Excel в справочник товаров, всё работает, но хочу добавить проверку на дубликаты по артикулу. Как лучше это реализовать? Может, есть какие-то готовые решения или примеры?
Можно использовать метод `НайтиПоРеквизиту` и проверять, возвращает ли он `ПустаяСсылка()`. Если товар уже есть в справочнике, можно либо пропускать, либо обновлять его данные.
Я бы ещё проверял цену – если она изменилась по сравнению с текущими данными в системе, то создавал бы новую запись в регистре сведений 'ИзменениеЦены'. Так можно отслеживать динамику изменений.
Отличный вариант! Я так и сделал – использую `СрезПоследних` для получения актуальной цены. Если новая цена отличается, фиксирую её в регистре. Но не уверен, как лучше обрабатывать ситуацию, если цена вообще не указана в файле?
Кто-то использует `ТабличныйДокумент.Прочитать` для загрузки? Есть ли способ вытащить данные без привязки к конкретным ячейкам? Иногда клиенты шлют файлы с разными структурами, приходится постоянно адаптировать код.
Если структура фиксированная, проще идти по строкам и колонкам. Но если файлы постоянно меняются, лучше использовать обработку через `COMОбъект Excel.Application`. Это даст гибкость в работе с любыми файлами.
В моей практике при загрузке я ещё добавляю товару картинку, если она есть в соседнем столбце. Это позволяет автоматически привязывать изображения к товарам в справочнике, а не загружать их вручную позже. Вдруг кому пригодится идея 😉.
Подскажите, как лучше реагировать, если файл пустой или в нём нет новых товаров? Сейчас просто пишу 'ничего не загружено', но хочется что-то более информативное для пользователей.
Может, стоит вместо загрузки товаров сделать чат-бота, который будет писать клиентам: 'Купите у нас что-нибудь, а то мой разработчик без премии останется!'? 😆.
Ладно, если серьёзно – вот мой код для изменения цвета строк в `ТабличномДокументе`, чтобы визуально выделять изменения в отчёте...
Показать спойлер
Загрузка данных
&НаКлиенте
Перем МассивФайлов экспорт;
&НаКлиенте
Асинх Процедура ФайлНачалоВыбора(Элемент, ДанныеВыбора, ВыборДобавлением, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
Диалог.Заголовок = "Выбор файла";
Диалог.Фильтр = "Excel файлы(*.xls;*.xlsx)|*.xls;*.xlsx";
Диалог.ИндексФильтра = 0;
Диалог.ПредварительныйПросмотр = Ложь;
Диалог.ПроверятьСуществованиеФайла = Истина;
Диалог.МножественныйВыбор = Истина;
Диалог.ПолноеИмяФайла = Файл;
МассивФайлов = Ждать Диалог.ВыбратьАсинх();
Файл = "";
Если МассивФайлов = Неопределено тогда
Сообщение = "Файл не выбран или выбранного файла не существует!";
Иначе
Для каждого Элемент из МассивФайлов цикл
Файл = Файл + Элемент + "; ";
КонецЦикла;
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ЗагрузитьНаСервере(МассивФайлов)
Если МассивФайлов = неопределено Тогда
Файл = "";
Сообщение = "Файл не выбран или выбранного файла не существует!";
Сообщить(Сообщение);
Иначе
Товары.Очистить();
Для каждого Значение из МассивФайлов цикл
ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать(Значение, СпособЧтенияЗначенийТабличногоДокумента.Значение);
КоличествоСтрок = ТабДок.ВысотаТаблицы;
Для НомерСтроки = 2 По КоличествоСтрок Цикл
Число = Формат(Число(ТабДок.ПолучитьОбласть("R" + Формат(НомерСтроки, "ЧГ=0") + "C1").ТекущаяОбласть.Текст), "ЧГ=0");
Артикул = Строка(Число);
Если Не ТабДок.ПолучитьОбласть("R" + Формат(НомерСтроки, "ЧГ=0") + "C3").ТекущаяОбласть.Текст = "" тогда
Цена = Число(ТабДок.ПолучитьОбласть("R" + Формат(НомерСтроки, "ЧГ=0") + "C3").ТекущаяОбласть.Текст);
Наименование = ТабДок.ПолучитьОбласть("R" + Формат(НомерСтроки, "ЧГ=0") + "C2").ТекущаяОбласть.Текст;
Если Справочники.Товары.НайтиПоРеквизиту("Артикул", Артикул) = Справочники.Товары.ПустаяСсылка() тогда
Если Не Цена = Неопределено тогда
СтрокаТЗ = Товары.Добавить();
СтрокаТЗ.Артикул = Артикул;
СтрокаТЗ.Наименование = Наименование;
Если Процент = 0 тогда
СтрокаТЗ.Цена = Цена;
Иначе
СтрокаТЗ.Цена = Цена + (Цена * Процент / 100);
КонецЕсли;
НовыйТовар = Справочники.Товары.СоздатьЭлемент();
НовыйТовар.Артикул = Артикул;
НовыйТовар.Наименование = Наименование;
Если Процент = 0 тогда
НовыйТовар.Цена = Цена;
Иначе
НовыйТовар.Цена = Цена + (Цена * Процент / 100);
КонецЕсли;
НовыйТовар.Записать();
Новыйрегистр = РегистрыСведений.ИзменениеЦены.СоздатьМенеджерЗаписи();
Новыйрегистр.Товар = Справочники.Товары.НайтиПоНаименованию(Наименование);
Новыйрегистр.Период = ТекущаяДата(); //Дата(2025,3,27);
Новыйрегистр.Цена = НовыйТовар.Цена;
Новыйрегистр.Записать();
КонецЕсли;
Иначе
Отбор = Новый Структура;
Отбор.Вставить("Товар", Справочники.Товары.НайтиПоНаименованию(Наименование));
ТекущаяЦена = РегистрыСведений.ИзменениеЦены.СрезПоследних(ТекущаяДата(), Отбор)[0].Цена;
Если ТекущаяЦена <> Цена тогда
Новыйрегистр = РегистрыСведений.ИзменениеЦены.СоздатьМенеджерЗаписи();
Новыйрегистр.Товар = Справочники.Товары.НайтиПоНаименованию(Наименование);
Новыйрегистр.Период = ТекущаяДата(); //Дата(2025,3,27);
Новыйрегистр.Цена = Цена;
Новыйрегистр.Записать();
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура Загрузить(Команда)
ЗагрузитьНаСервере(МассивФайлов);
КонецПроцедуры
Регистр изменения цен
Процедура ПередЗаписью(Отказ, Замещение)
Объект = ЭтотОбъект.Отбор.Товар.Значение.ПолучитьОбъект();
Объект.Цена = ЭтотОбъект.Отбор.Получить(1).Значение.Цена;
Объект.Записать();
КонецПроцедуры
Я не хочу быть самым богатым человеком на кладбище. Засыпать с чувством, что за день я сделал какую-нибудь потрясающую вещь — вот что меня интересует. Стив Джобс
Для создания новых тем нужно войти или зарегистрироваться