gifts2017

Чтение из Эксель-файла

Опубликовал Alex Nikitin (nikitin19819) в раздел Программирование - Практика программирования

Некоторые выдержки из моих наработок, связанных с работой 1С и приложений майкрософт-оффис

Появилось желание опубликовать некоторые выдержки из моих наработок. У нас имелась собственная база данных, в которой были связанные справочники Спецификаций и Номенклатуры.

Но все же остановимся на некоторых моментах касательно выгрузки.

В общем, есть некоторые неудобные моменты, связанные с загрузкой данных, если брать типовые конфигурации:

Несколько актуальных моментов, с которыми мы часто сталкиваемся при интеграции сайтов с 1С или Excel.

1) Не все компании готовы показывать цены, в силу разных причин, таких как конкуренция, персональные цены для контрагентов или групп контрагентов, цены по договоренности. 

Как можно решить проблему – указывать на сайте розничную цену, для того, чтобы в каталоге была возможность сделать заказ любому клиенту. После отправки каждый заказ обрабатывается менеджером, который предоставляет скидки или особые условия контрагенту. Клиенту дается возможность сделать заказ, не обращая внимания на цены. 
Еще один вариант: указать цену «от».
Отображение цены дает преимущество в продвижении сайта, поисковики отдают преимуществу сайту, содержащему точную актуальную информацию.

2) Обязательная регистрация пользователей.

Пользователи не любят регистрироваться, это известный статистический факт. Если при заказе вы ставите обязательным условием регистрацию, можно сказать с большой вероятностью, что регистраций не будет, и вы можете потерять заказы.

Если регистрация очень важна, дайте пользователям бонус или объясните, для чего нужна регистрация. 
В данном случае речь не идет об авторизации по логину и паролю, которая необходима для закрытых систем онлайн заказа или, например, для выписки счета или биллинга по контрагентам. Как правило, в таких системах контрагенты вместе с логинами и паролями выгружаются из 1С.

3) Промежуточная выгрузка в Excel

Часто 1С используют только для выписки счетов по проданным товарам. Номенклатура не структурирована, часть товаров находятся в прайсах поставщиков. Поэтому сначала выгружают в Excel, затем корректируют, правят цены, структурируют. После этого Excel уже загружают на сайт.
На первый взгляд, кажется удобно, но в результате возникает масса ошибок, поскольку Excel не очень надежный источник данных с точки зрения их сохранности и минимизации ошибок, вызванных человеческим фактором.
Как можно решить – настроить механизм загрузки прайсов в 1С и их структуризацию, чтобы в дальнейшем сделать более стабильный обмен данных 1С и сайта.

4) Отсутствие артикулов

Бывает, что большая номенклатура в 1С организована хаотично, но необходимость в выгрузке есть, при этом в карточках товаров может не быть артикулов товаров. В 1С есть внутренний код товаров, по которому можно производить синхронизацию данных с сайтом. При этом если это делать через Excel, то при каждой новой загрузке данных на сайт программа синхронизации может удалять все товары и добавлять их как новые, это чревато переиндексацией сайта и потерей уже проиндексированных поисковиком страниц.

Приведу несколько независимых кодов.

выдержки:

 

Общие определения (допустим, в процедуре ПриНажатии кнопки выполнить (как на картинке))

//определимся с тем, что надо искать. В полеСпецификаций можно выло "забить" или выбрать нужную СП
ТЗРазбора = Справочники.Спецификации.НайтиПоНаименованию(ЭлементыФормы.ПолеСпецификаций.Значение).Состав;
//у вас скорее по другому получаем данные по наименованиям. Но суть в том, чтобы получить массив наименований. 
//будьте внимательны, могут быть подсборки в СП.Но это зависит от вашей БД. Ниже получим данные по элементам СП в виде ТЗ
	ТЗРез = Новый ТаблицаЗначений;
	ТЗРез.Колонки.Добавить("КодБД");
	ТЗРез.Колонки.Добавить("Номенклатура");
	ТЗРез.Колонки.Добавить("Количество");
	
	//надо количество и т.п.
	Для каждого стрР из ТЗРазбора Цикл
	     Нов = ТЗРез.Добавить();
	     Нов.КодБД = стрР.Номенклатура.Код;
	     Нов.Номенклатура = стрР.Номенклатура;
	     Нов.Количество = стрР.Количество;
	КонецЦикла;
	
	ТЗРез.Сортировать("Номенклатура ВОЗР");
	ТЗРез.Свернуть("КодБД, Номенклатура","Количество");
 
Имяфайла = "D:\1C_Databases\File.xls";
Если СокрЛП(Имяфайла)<>"" Тогда
MSExcel = Новый COMОбъект("Excel.Application"); 
Книга = MSExcel.Workbooks.Open(Сокрлп(Имяфайла));
//здесь можно в цикле вызывать ниже приведенную функцию. Касательно НаименованияБД, зависит от самой структуры вашей БД.
//можно организовать вывод через сообщения или вывести в макет...
MSExcel.Quit();

Теперь функция читки

Функция ЧиткаИзЭксФайла(НаименованиеБД,Книга)

КоличествоЛистов = Книга.WorkSheets.Count;
//прогулка по листам
Для НомерЛиста = 1 по КоличествоЛистов Цикл
   //гуляем по листу
   Лист = Книга.WorkSheets(НомерЛиста);

   Лист.UnProtect();

   ВсегоКолонок = Лист.Cells(1,1).SpecialCells(11).Column;
   ВсегоСтрок = Лист.Cells(1,1).SpecialCells(11).Row;


   ОбластьПоиска = Лист.Cells;
   НачалоЛиста = ОбластьПоиска.Cells(1, 1);
   //ИскатьДо = ОбластьПоиска.Cells(ВсегоСтрок, ВсегоКолонок);
   ОбластьПараметр = ОбластьПоиска.Find("*"+СокрЛП(НаименованиеБД)+"*", НачалоЛиста);

   //определим колонку "Цена"
   Если ОбластьПараметр <> неопределено Тогда
   СтрокаКолонкаЦена = ОбластьПоиска.Find("*цена*", НачалоЛиста);

     Если СтрокаКолонкаЦена = неопределено тогда СтрокаКолонкаЦена = ОбластьПоиска.Find("*Цена*", НачалоЛиста);КонецЕсли;

     Если СтрокаКолонкаЦена<>неопределено тогда
        НомКолонкиЦена = СтрокаКолонкаЦена.Column;

        Если ОбластьПараметр.Cells(1,НомКолонкиЦена).Value<>0 тогда 
          Результат = ОбластьПараметр.Cells(1,НомКолонкиЦена).Value;
          Прервать; 
        КонецЕсли;
     Иначе Результат = неопределено;
  КонецЕсли;
//КонецЦикла;

КонецЕсли;


КонецЦикла;

Возврат Результат;
КонецФункции;

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Сергей Самарин (Samarin) 26.05.15 14:33
ИМХО, подобный подход к чтению xls устарел с выходом 8.3.6.
Теперь надо делать так, как в этой статье: http://infostart.ru/public/341855/
2. Alex Nikitin (nikitin19819) 26.05.15 21:36
(1) Samarin, приниму к сведению. Я еще копаюсь в 8.2. А вообще.. посмотрите что творится, Украина сейчас вообще отходит от привычных уже для многих Компаса3D да и от 1С. Так что и не приходится говорить про новые версии. Наши вроде пока не выпендриваются. Имеются какие-то собственные БД, но это по большому счету Сишные или Дельфовские в связке с Интербейзом под личный заказ. А так чтобы глобально. Глобально только World of Tanks ^^))
3. Aleksandr Filonov (AleksSF) 27.05.15 09:13
(2) nikitin19819,
Ну Украина скоро вообще отойдет в мир иной. А Казахстан, Белорусь, частично Прибалтика и еще многие из СССР работают с 1С. Так что про новые версии говорить и осваивать их актуально.
4. Сергей Самарин (Samarin) 27.05.15 09:15
(2) nikitin19819, Зато Крым теперь потихоньку оживился и закупается для автоматизации. Что по поводу ситуации в целом - еще есть клиенты, которые готовы платить за поддержку актуальности учета в базах на 7.7. Сопровождать приходится весь ряд ПП 1С, а разработка сейчас ведется на 8.3 со всеми новыми фишками.
5. Серж Пеленг (Peleng) 27.05.15 12:37
(2) nikitin19819, ну, про то, что Украина отходит от 1С это Вы сильно загнули... лично я не знаю ни одной фирмы не применяющей 1С, хотя бы только для бухгалтерии...
6. Alex Nikitin (nikitin19819) 27.05.15 18:36
(5) Peleng, дай Бог, чтобы Вы были правы.. с лицензией могут быть проблемы.. хотя. ну Вы сами знаете :))) В 1С что-то есть особенное. Своё, особенное. Ребята из 1С (совместно с Букой) когда-то создали Дальнобойщиков. Дальнобойщики-2 имела требования минимальные и по видяхе и по памяти, и по винту, но визуально превосходила своего на то время конкурента "18 колёс" именно требованиями и качеством. Так что насчет 1С Украина попустится. Когда только с 1С начинал, тоже много чего не нравилось... Но как углубился в смысл БД, понял - 1С-как раз то что надо. На Укр. к сожалению нет центров модификации системы 1С.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа