Имя: Пароль:
 
Загрузка данных из Excel в 1С
(1) Vostochnick
1 октября 2023 г.
12:26
Коллеги, делаю загрузку из Excel в справочник товаров, всё работает, но хочу добавить проверку на дубликаты по артикулу. Как лучше это реализовать? Может, есть какие-то готовые решения или примеры?
(2) abfm
1 октября 2023 г.
13:30
Можно использовать метод `НайтиПоРеквизиту` и проверять, возвращает ли он `ПустаяСсылка()`. Если товар уже есть в справочнике, можно либо пропускать, либо обновлять его данные.
(3) p-soft
1 октября 2023 г.
14:02
Я бы ещё проверял цену – если она изменилась по сравнению с текущими данными в системе, то создавал бы новую запись в регистре сведений 'ИзменениеЦены'. Так можно отслеживать динамику изменений.
(4) Solitar
1 октября 2023 г.
14:46
Отличный вариант! Я так и сделал – использую `СрезПоследних` для получения актуальной цены. Если новая цена отличается, фиксирую её в регистре. Но не уверен, как лучше обрабатывать ситуацию, если цена вообще не указана в файле?
(5) FormatC
1 октября 2023 г.
16:15
Кто-то использует `ТабличныйДокумент.Прочитать` для загрузки? Есть ли способ вытащить данные без привязки к конкретным ячейкам? Иногда клиенты шлют файлы с разными структурами, приходится постоянно адаптировать код.
(6) Stepashkin
1 октября 2023 г.
18:21
Если структура фиксированная, проще идти по строкам и колонкам. Но если файлы постоянно меняются, лучше использовать обработку через `COMОбъект Excel.Application`. Это даст гибкость в работе с любыми файлами.
(7) hunter76
1 октября 2023 г.
18:42
В моей практике при загрузке я ещё добавляю товару картинку, если она есть в соседнем столбце. Это позволяет автоматически привязывать изображения к товарам в справочнике, а не загружать их вручную позже. Вдруг кому пригодится идея 😉.
(8) bolder
1 октября 2023 г.
21:23
Подскажите, как лучше реагировать, если файл пустой или в нём нет новых товаров? Сейчас просто пишу 'ничего не загружено', но хочется что-то более информативное для пользователей.
(9) JohnGilbert
1 октября 2023 г.
22:34
А если просто удалить 1С и работать в Excel? Быстрее, удобнее и не нужно писать этот велосипед с загрузкой 🤡.
(10) rabota_v8
2 октября 2023 г.
0:12
Когда я загружаю данные, 1С тормозит так, будто пытается отправить их в космос 🚀. Может, кто-то знает способ ускорить этот кошмар?
(11) Garykom
2 октября 2023 г.
0:33
Можете добавить автогенерацию цен: если цена не указана, пусть 1С сама придумывает её на основе курса биткоина за день! 🤣
(12) U4Me2
2 октября 2023 г.
0:47
А если продажи падают, пусть отчёт сам увольняет директора и рассылает уведомления сотрудникам: 'Босс уволен, готовьтесь к сокращению!' 😂.
(13) novichok79
2 октября 2023 г.
2:04
Может, стоит вместо загрузки товаров сделать чат-бота, который будет писать клиентам: 'Купите у нас что-нибудь, а то мой разработчик без премии останется!'? 😆.
(14) eddy_n
2 октября 2023 г.
7:56
Ладно, если серьёзно – вот мой код для изменения цвета строк в `ТабличномДокументе`, чтобы визуально выделять изменения в отчёте...
Показать спойлер

Загрузка данных

&НаКлиенте
Перем МассивФайлов экспорт;

&НаКлиенте
Асинх Процедура ФайлНачалоВыбора(Элемент, ДанныеВыбора, ВыборДобавлением, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
	Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
	Диалог.Заголовок = "Выбор файла";
	Диалог.Фильтр = "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).Значение.Цена;
	Объект.Записать();
КонецПроцедуры


Я не хочу быть самым богатым человеком на кладбище. Засыпать с чувством, что за день я сделал какую-нибудь потрясающую вещь — вот что меня интересует. Стив Джобс
Для создания новых тем нужно войти или зарегистрироваться