Создание обработки для загрузки элементов справочника Номенклатура из Excel.

Сегодня мы рассмотрим пример создания обработки для загрузки номенклатуры из Excel в конфигурацию "Управление торговым предприятие для Украины".


Итак все по порядку:

1.Переходим в конфигуратор.

2.Создаем новую обработку.

Для этого переходим в меню "Файл" - "Новый" - "Внешняя обработка"


 открывается Окно новой внешней обработки:


Заполняем поля отмеченные красным:
  • Имя - внутреннее имя обработки, заполняется без пробелов
  • Синоним - наименование обработки так как будет видеть его пользователь
  • Комментарий - предназначение обработки или любая другая информация

Я заполнил из так:

3.Добавление реквизитов обработки.

Добавим в нашу обработку следующие реквизиты:
  • НазваниеФайла - Тип :Строка
  • ТипЦен - Тип : СправочникСсылка.ТипыЦенНоменклатуры
  • ДатаЦен - Тип : Дата
  • Поставщик - Тип: СправочникСсылка.Контрагенты


   4.Создаем форму обработки.

В обработке в разделе "Формы" нажимаем правой кнопкой мыши и контекстном меню выбираем "Добавить"


Открывается окно создания формы обработки в котором необходимо заполнить поля как у меня и нажать кнопку "Далее"


Появляется окно с нашими введенными реквизитами, ставим галочки в чек боксы и нажимаем готово.


Получившаяся форма будет иметь примерно такой вид:
Нужно изменить в сделав "человеческий вид".Я изменил свою форму придав ей такой вид:


5.Пишем текст программы.

Перем ВходнойФайлОткрыт; // флаг того, что импортируемый файл открыт
Перем ВходExcel; // Excel-сервер для импортируемой Excel-таблицы (когда ВходнойФайлОткрыт=1 и ВидОткрытогоФайла - XLS)
Перем WorkSheets;
Перем НомераКолонок;
Перем ВалютаНоменклатуры;
Перем ТипЦенНоменклатуры;

Перем ТаблицаТоваров;

Процедура ЗакрытьИмпортируемыйФайл()               
Если ВходнойФайлОткрыт = 1 Тогда
ВходExcel.ActiveWorkbook.Close();
ВходExcel.Quit();
ВходнойФайлОткрыт = 0;
НачальнаяСтрока   = 0; 
КонечнаяСтрока    = 0;                                   
ЧислоКолонок      = 0; 
КонецЕсли;
КонецПроцедуры // ЗакрытьИмпортируемыйФайл()

Функция ОткрытьИмпортируемыйФайл()  
Перем ЗапущенExcel;
Перем ОшибкаОткрытия;
Если ВходнойФайлОткрыт = 1 Тогда // уже открыт
Возврат 1;                                     
КонецЕсли;
Если СокрЛП(НазваниеФайла) = "" Тогда // нечего открывать
Возврат 0;                                     
КонецЕсли;
ЗапущенExcel = 1;
Попытка 
// запускаем Excel-Server 
ВходExcel = Новый COMОбъект("Excel.Application");
Исключение       
ЗапущенExcel = 0;
КонецПопытки;
Если ЗапущенExcel=1 Тогда
Попытка
// открываем файл
ВходExcel.Application.Workbooks.Open(НазваниеФайла);
ВходнойФайлОткрыт = 1;
Исключение
ВходExcel.Quit();
КонецПопытки;
КонецЕсли;
Если ВходнойФайлОткрыт = 1 Тогда // успешно открыт            
Иначе
Предупреждение("Не удалось открыть файл "+НазваниеФайла);
Возврат 0;
КонецЕсли;
//Worksheets=ВходExcel.Application.WorkSheets;
//ЭлементыФормы.СписокЗакладок.Значение.Очистить();
//Для Каждого Закладка Из Worksheets Цикл
// ЭлементыФормы.СписокЗакладок.Значение.Добавить(СокрЛП(Закладка.Name),СокрЛП(Закладка.Name),Истина);
//Сообщить( ws.Name);
//КонецЦикла;
Возврат ВходнойФайлОткрыт;
КонецФункции // ОткрытьИмпортируемыйФайл()

Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка)
ЗакрытьИмпортируемыйФайл();
КонецПроцедуры

Процедура ПроверкаСтруктурыФайла(Режим=0)
Если Режим=0 Тогда // 0 - переоткрыть, только если файл был открыт                
Если ВходнойФайлОткрыт=1 Тогда
ЗакрытьИмпортируемыйФайл();
ОткрытьИмпортируемыйФайл();
КонецЕсли;
ИначеЕсли Режим=1 Тогда      // 1 - открыть         
ЗакрытьИмпортируемыйФайл();
ОткрытьИмпортируемыйФайл();
КонецЕсли;
// ЗаполнитьНажатие();        
КонецПроцедуры  // ПроверкаСтруктурыФайла()

Процедура ПриСменеНазванияФайла()
ЗакрытьИмпортируемыйФайл();
Если ПустаяСтрока(НазваниеФайла)=1 Тогда
Возврат;
КонецЕсли;
ФС = Новый Файл(НазваниеФайла);
Если ФС.Существует() Тогда // то, что ввели, является названием существующего файла
ПроверкаСтруктурыФайла(1); // надо открывать
Иначе       // то, что ввели, не является названием существующего файла
Предупреждение("Файл "+НазваниеФайла+" не существует");
КонецЕсли;
КонецПроцедуры  // ПриСменеНазванияФайла()

Процедура ВвестиНазваниеФайла()
// процедура ввода названия входного файла
Перем Путь,Расширение,СтароеНазваниеФайла;
СтароеНазваниеФайла = НазваниеФайла;
Если Найти(НазваниеФайла,"\")<=0 Тогда
Иначе      
Индекс = СтрДлина(НазваниеФайла);
Пока Сред(НазваниеФайла,Индекс,1)<>"\" Цикл
Индекс = Индекс - 1;
КонецЦикла;            
Путь = Лев(НазваниеФайла,Индекс);
КонецЕсли;
ДиалогФыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
//ДиалогФыбораФайла.Фильтр = "Файл данных (*.xls)|*.xls";
ДиалогФыбораФайла.Заголовок = "Выберите файл";
ДиалогФыбораФайла.ПредварительныйПросмотр = Ложь;
ДиалогФыбораФайла.Расширение = "xls";
ДиалогФыбораФайла.ИндексФильтра = 0;
ДиалогФыбораФайла.ПолноеИмяФайла = СтароеНазваниеФайла;
ДиалогФыбораФайла.ПроверятьСуществованиеФайла = Истина;
Если ДиалогФыбораФайла.Выбрать() Тогда
НазваниеФайла = ДиалогФыбораФайла.ПолноеИмяФайла;
Если НазваниеФайла<>СтароеНазваниеФайла Тогда // изменилось название импортируемого файла
ПриСменеНазванияФайла();
ЧислоСтрокВФайле = ВходExcel.Application.WorkSheets(1).UsedRange.Rows.Count;
КонецЕсли;
Иначе // отказались от выбора - восстанавливаем старое название файла
НазваниеФайла = СтароеНазваниеФайла;
КонецЕсли;
КонецПроцедуры  // ВвестиНазваниеФайла()

Процедура НазваниеФайлаПриИзменении(Элемент)
ПриСменеНазванияФайла();
КонецПроцедуры

Процедура НазваниеФайлаНачалоВыбора(Элемент, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ВвестиНазваниеФайла();
КонецПроцедуры

Процедура НазваниеФайлаОткрытие(Элемент, СтандартнаяОбработка)
ЗапуститьПриложение(Элемент.Значение);
КонецПроцедуры

Процедура КнопкаВыполнитьНажатие(Кнопка)
Если НазваниеФайла = "" тогда
Сообщить("Не задан файл!");
Возврат;
КонецЕсли;
ТекущаяЗакладка=ВходExcel.Application.WorkSheets(1);
К_СтавкаНДС = Перечисления.СтавкиНДС.БезНДС;
ЭлементыФормы.Индикатор.МаксимальноеЗначение = ТекущаяЗакладка.UsedRange.Rows.Count;
мКоличествоСтрок = ТекущаяЗакладка.UsedRange.Rows.Count;
мКоличествоСтрок = ЧислоСтрокВФайле;
ТекПользователь  = ПараметрыСеанса.ТекущийПользователь.ПолучитьОбъект().Наименование;
мТекПользователь = Справочники.Пользователи.НайтиПоНаименованию(ТекПользователь);
ДокУстановки = Документы.УстановкаЦенНоменклатуры.СоздатьДокумент();
ДокУстановки.Дата = ТекущаяДата();
ТипЦенДок  =ДокУстановки.ТипыЦен.Добавить();
ТипЦенДок.ТипЦен = ТипЦен;
Для К=2 По мКоличествоСтрок Цикл

ОбработкаПрерыванияПользователя();
ЭлементыФормы.Индикатор.Значение = К ;
// читаем колонки из текущей строки
//Артикул
К_Артикул = СокрЛП(ТекущаяЗакладка.Cells(К,НомерКолонкиАртикул).Value); 
К_Артикул    = СтрЗаменить(К_Артикул," ","");
К_Артикул    = СтрЗаменить(К_Артикул,Символы.НПП,"");

//Наименование
К_Наименование = СокрЛП(ТекущаяЗакладка.Cells(К,НомерКолонкиНаименование).Value); 
К_Наименование = СтрЗаменить(К_Наименование," ","");

//Размер
К_Размер = СокрЛП(ТекущаяЗакладка.Cells(К,НомерКолонкиРазмер).Value); 
К_Размер     = СтрЗаменить(К_Размер," ","");
//Цвет
к_Цвет = СокрЛП(ТекущаяЗакладка.Cells(К,НомерКолонкиЦвет).Value);
к_Цвет       = СтрЗаменить(к_Цвет," ","");

//Страна происхождения
К_Страна = СокрЛП(ТекущаяЗакладка.Cells(К,НомерКолонкиСтрана).Value); 
К_Страна     = СтрЗаменить(К_Страна," ","");

//Еденица
К_Еденица = СокрЛП(ТекущаяЗакладка.Cells(К,НомерКолонкиЕденицаИзмерения).Value); 
К_Еденица    = СтрЗаменить(К_Еденица," ","");
//Страна происхождения
К_Цена   = СокрЛП(ТекущаяЗакладка.Cells(К,НомерКолонкиЦена).Value); 
К_Цена       = СтрЗаменить(К_Цена," ","");


Если СокрЛП(К_Наименование) = "" Тогда 
Продолжить;
КонецЕсли;
ЗапросПоНоменклатуре = новый запрос;
ЗапросПоНоменклатуре.Текст = "ВЫБРАТЬ
                            | Номенклатура.Ссылка
                            |ИЗ
                            | Справочник.Номенклатура КАК Номенклатура
                            |ГДЕ
                            | Номенклатура.Наименование = &Наименование
                            | И Номенклатура.ОсновнойПоставщик = &ОсновнойПоставщик";

ЗапросПоНоменклатуре.УстановитьПараметр("Наименование",СокрЛП(К_Наименование));
ЗапросПоНоменклатуре.УстановитьПараметр("ОсновнойПоставщик",Поставщик);
РезЗапр = ЗапросПоНоменклатуре.Выполнить().Выгрузить();
Если РезЗапр.Количество()>0 Тогда
Найденная_Номенклатура  = РезЗапр[0].ссылка;
иначе
Найденная_Номенклатура  = Справочники.Номенклатура.ПустаяСсылка();
КонецЕсли;
Если Найденная_Номенклатура.Пустая() Тогда

НоваяНоменклатура = Справочники.Номенклатура.СоздатьЭлемент();
НоваяНоменклатура.Артикул          = К_Артикул;
НоваяНоменклатура.Наименование      = К_Наименование;
НоваяНоменклатура.НаименованиеПолное  = К_Наименование;
НоваяНоменклатура.БазоваяЕдиницаИзмерения = НайтиСоздатьЕденицуПоКласификатору(К_Еденица);;
НоваяНоменклатура.ВидНоменклатуры  = Справочники.ВидыНоменклатуры.НайтиПоНаименованию("Товар");
НоваяНоменклатура.Записать();
Еденица = Справочники.ЕдиницыИзмерения.СоздатьЭлемент();
Еденица.ЕдиницаПоКлассификатору = НоваяНоменклатура.БазоваяЕдиницаИзмерения;
Еденица.Наименование        = НоваяНоменклатура.БазоваяЕдиницаИзмерения.Наименование;
Еденица.Коэффициент             = 1;
Еденица.Владелец                = НоваяНоменклатура.Ссылка;
Еденица.Записать();
НоваяНоменклатура.ЕдиницаДляОтчетов          = Еденица.Ссылка;
НоваяНоменклатура.ЕдиницаИзмеренияМест       = Еденица.Ссылка;
НоваяНоменклатура.ЕдиницаХраненияОстатков    = Еденица.Ссылка;
НоваяНоменклатура.ВестиУчетПоХарактеристикам = Истина;
НоваяНоменклатура.ОсновнойПоставщик = Поставщик;
НоваяНоменклатура.Записать();
Найденная_Номенклатура = НоваяНоменклатура.Ссылка;
 
МенеджерЗаписи = РегистрыСведений.ЗначенияСвойствОбъектов.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Объект = Найденная_Номенклатура;
МенеджерЗаписи.Свойство = ПланыВидовХарактеристик.СвойстваОбъектов.НайтиПоНаименованию("Страна происхождения");
МенеджерЗаписи.Значение = НайтиСоздатьЗначениеСправочника(К_Страна,ПланыВидовХарактеристик.СвойстваОбъектов.НайтиПоНаименованию("Страна происхождения"));
МенеджерЗаписи.Записать(Истина);

Иначе 
Найденная_Номенклатураоб = Найденная_Номенклатура.ПолучитьОбъект();

Найденная_Номенклатураоб.записать();
Найденная_Номенклатура = Найденная_Номенклатураоб.ссылка;
КонецЕсли;
ЗапросПоХар = новый запрос;
ЗапросПоХар.Текст =  "ВЫБРАТЬ
                    | ХарактеристикиНоменклатуры.Ссылка
                    |ИЗ
                    | Справочник.ХарактеристикиНоменклатуры КАК ХарактеристикиНоменклатуры
                    |ГДЕ
                    | ХарактеристикиНоменклатуры.Владелец = &Номенклатура
                    | И ХарактеристикиНоменклатуры.Наименование = &Наименование";
ЗапросПоХар.УстановитьПараметр("Наименование",К_Размер +", " +к_Цвет);
ЗапросПоХар.УстановитьПараметр("Номенклатура",Найденная_Номенклатура);
РезЗапрХар = ЗапросПоХар.Выполнить().Выгрузить();
Если РезЗапрХар.Количество()>0 Тогда 
Хар = РезЗапрХар[0].ссылка;
Иначе
Хар = Справочники.ХарактеристикиНоменклатуры.ПустаяСсылка();
КонецЕсли;
Если Хар.Пустая() Тогда 
Хар = Справочники.ХарактеристикиНоменклатуры.СоздатьЭлемент();
хар.Владелец     = Найденная_Номенклатура.Ссылка;
Хар.Наименование = К_Размер +", " +к_Цвет; 
Хар.Записать();
Хар = хар.Ссылка;
МенеджерЗаписи = РегистрыСведений.ЗначенияСвойствОбъектов.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Объект = хар;
МенеджерЗаписи.Свойство = ПланыВидовХарактеристик.СвойстваОбъектов.НайтиПоНаименованию("Размер");
МенеджерЗаписи.Значение = НайтиСоздатьЗначениеСправочника(К_Размер,ПланыВидовХарактеристик.СвойстваОбъектов.НайтиПоНаименованию("Размер"));
МенеджерЗаписи.Записать(Истина);
МенеджерЗаписи = РегистрыСведений.ЗначенияСвойствОбъектов.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Объект = хар;
МенеджерЗаписи.Свойство = ПланыВидовХарактеристик.СвойстваОбъектов.НайтиПоНаименованию("Цвет");
МенеджерЗаписи.Значение = НайтиСоздатьЗначениеСправочника(к_Цвет,ПланыВидовХарактеристик.СвойстваОбъектов.НайтиПоНаименованию("Цвет"));
МенеджерЗаписи.Записать(Истина);

КонецЕсли;
СтрокаДок = ДокУстановки.Товары.Добавить();
СтрокаДок.Валюта = ТипЦен.ВалютаЦены;
СтрокаДок.ЕдиницаИзмерения = Найденная_Номенклатура.ссылка.ЕдиницаДляОтчетов;
СтрокаДок.Номенклатура = Найденная_Номенклатура;
СтрокаДок.ХарактеристикаНоменклатуры = Хар;
СтрокаДок.ТипЦен = ТипЦен;
СтрокаДок.Цена   = К_Цена;

   КонецЦикла;
 ДокУстановки.Записать(РежимЗаписиДокумента.Запись);
 ДокУстановки.ПолучитьФорму("ФормаДокумента").Открыть();
 Сообщить("Загрузка завершена!");
КонецПроцедуры


Функция СвернутьТабТоваровПоХарактеристикамИЦенам_ДляДокУстановкиСкидок(ТаблицаТоваров)
Если ТаблицаТоваров.Количество() = 0 Тогда
Возврат ТаблицаТоваров;
КонецЕсли;
РезТаблицаТоваров = ТаблицаТоваров.Скопировать();
РезТаблицаТоваров.Очистить();
ТаблицаТоваров.Сортировать("Номенклатура,ХарактеристикаНоменклатуры");

ТаблицаТоваров.Колонки.Добавить("ЦенаОбщаяПоНоменлатуре");
Для Каждого Строка из ТаблицаТоваров Цикл
СтруктураОтбора = Новый Структура("Номенклатура",Строка.Номенклатура);
Массив =  ТаблицаТоваров.НайтиСтроки(СтруктураОтбора);
Строка.ЦенаОбщаяПоНоменлатуре      = Массив[0].Цена;
КонецЦикла;
ТекНоменклатура       = "";
ТекЦена               = 0;
ТекВидЦены            = "ОбщаяЦена"; // флаг, показывающий общая ли цена на артикул идет или специфическая (как пример цена на некоторые цвета одного артикула отличается от общей для артикула)
СчетчикИндексаСтрокиТаблЦен = 0;
Для Каждого Строка из ТаблицаТоваров Цикл
Если Строка.Цена = Строка.ЦенаОбщаяПоНоменлатуре Тогда
Строка.ХарактеристикаНоменклатуры = Справочники.ХарактеристикиНоменклатуры.ПустаяСсылка();
КонецЕсли;
КонецЦикла;
ТаблицаТоваров.Свернуть("Номенклатура, ХарактеристикаНоменклатуры, Цена, ПроцентСкидкиНаценки, Качество, ОграничениеСкидкиНаценки");
Возврат ТаблицаТоваров;
КонецФункции


Процедура НазначитьСвойство(Номенклатура,стрСвойство,знСвойства,НаборЗаписей)
ПВХ = ПланыВидовХарактеристик.СвойстваОбъектов.НайтиПоНаименованию(стрСвойство);
Если ПВХ <> ПланыВидовХарактеристик.СвойстваОбъектов.ПустаяСсылка() Тогда   //Ищем предопределнную характеристику
ЗначениеСвойства = Справочники.ЗначенияСвойствОбъектов.НайтиПоНаименованию(знСвойства,Истина,,ПВХ);
Если ЗначениеСвойства = Справочники.ЗначенияСвойствОбъектов.ПустаяСсылка() Тогда 
ЗначениеСвойства = Справочники.ЗначенияСвойствОбъектов.СоздатьЭлемент(); 
ЗначениеСвойства.Владелец = ПВХ.Ссылка;
ЗначениеСвойства.Наименование = знСвойства;
ЗначениеСвойства.Записать();
КонецЕсли;
НоваяЗапись = НаборЗаписей.Добавить();
НоваяЗапись.Объект = Номенклатура.Ссылка;
НоваяЗапись.Свойство = ПВХ;
НоваяЗапись.Значение = Справочники.ЗначенияСвойствОбъектов.НайтиПоНаименованию(знСвойства,Истина,,НоваяЗапись.Свойство);
НаборЗаписей.Отбор.Объект.Установить(Номенклатура.Ссылка );
НаборЗаписей.Записать();
Иначе
Предупреждение("В плане видов характестик не обнаружено свойство "+стрСвойство);
Возврат;
КонецЕсли;
КонецПроцедуры // ЗаполнитьСвойство()()

Процедура ЗаполнитьНажатие()
ЭлементыФормы.ПорядокЗагрузки.Колонки.ВидРеквизита.ЭлементУправления.СписокВыбора.Очистить();
ЭлементыФормы.ПорядокЗагрузки.Колонки.Свойство.ЭлементУправления.СписокВыбора.Очистить();
ЭлементыФормы.ПорядокЗагрузки.Колонки.ПолеТаблицы.ЭлементУправления.СписокВыбора.Очистить();
ЭлементыФормы.ПорядокЗагрузки.Колонки.ВидРеквизита.ЭлементУправления.СписокВыбора.Добавить("Реквизит");
ЭлементыФормы.ПорядокЗагрузки.Колонки.ВидРеквизита.ЭлементУправления.СписокВыбора.Добавить("Свойство");
НомераКолонок = Новый Структура;
Для Каждого Закладка Из ЭлементыФормы.СписокЗакладок.Значение Цикл
Если Закладка.Пометка Тогда
ТекущаяЗакладка=ВходExcel.Application.WorkSheets(Закладка.Значение);
Н=1;
Пока ТекущаяЗакладка.Cells(1,Н).Value <> Неопределено Цикл
К2=СокрЛП(ТекущаяЗакладка.Cells(1,Н).Value);
ЭлементыФормы.ПорядокЗагрузки.Колонки.ПолеТаблицы.ЭлементУправления.СписокВыбора.Добавить(К2);
НомераКолонок.Вставить(Строка(СтрЗаменить(К2," ","999")),Н); 
Н = Н+1;
КонецЦикла;
КонецЕсли;
Конеццикла;
ЭлементыФормы.ПорядокЗагрузки.Колонки.Свойство.ЭлементУправления.СписокВыбора.Очистить();
ЭлементыФормы.ПорядокЗагрузки.Колонки.Свойство.ЭлементУправления.СписокВыбора.Добавить("Код");
ЭлементыФормы.ПорядокЗагрузки.Колонки.Свойство.ЭлементУправления.СписокВыбора.Добавить("Наименование");
//Закидываем реквизиты
Для каждого Реквизит из Метаданные.Справочники["Номенклатура"].Реквизиты Цикл
ЭлементыФормы.ПорядокЗагрузки.Колонки.Свойство.ЭлементУправления.СписокВыбора.Добавить(Реквизит.Имя);
КонецЦикла;
//Закидываем свойства
ТекстЗапроса = "ВЫБРАТЬ
| СвойстваОбъектов.Ссылка
|ИЗ
| ПланВидовХарактеристик.СвойстваОбъектов КАК СвойстваОбъектов
|
|ГДЕ
| СвойстваОбъектов.НазначениеСвойства = &НазначениеСвойства";
Запрос = Новый Запрос();
Запрос.Текст = ТекстЗапроса;
Запрос.УстановитьПараметр("НазначениеСвойства",ПланыВидовХарактеристик.НазначенияСвойствКатегорийОбъектов.Справочник_Номенклатура);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
ЭлементыФормы.ПорядокЗагрузки.Колонки.Свойство.ЭлементУправления.СписокВыбора.Добавить(Выборка.Ссылка.Наименование);
КонецЦикла;
КонецПроцедуры

Процедура ПриОткрытии()
НомерКолонкиФото     = 1;
НомерКолонкиАртикул     = 2;
    НомерКолонкиНаименование = 3;
НомерКолонкиЕденицаИзмерения= 4;
НомерКолонкиРазмер   = 5;
НомерКолонкиЦвет         = 6;
    НомерКолонкиЦена = 7;
НомерКолонкиСтрана   = 8;
   
ДатаЦен = РабочаяДата;   
ПриСменеНазванияФайла();
КонецПроцедуры

Процедура ОбновлениеОтображения()
ПриСменеНазванияФайла();
КонецПроцедуры


Функция СвернутьТаблицуТоваровПоХарактеристикамИЦенам_ДляЦенообразования(ТаблицаТоваров,ТипДокументаУстановкиЦен)
Если ТаблицаТоваров.Количество() = 0 Тогда
Возврат ТаблицаТоваров;
КонецЕсли;
ТаблицаТоваров.Сортировать("Номенклатура,ХарактеристикаНоменклатуры");
ТаблицаТоваров.Колонки.Добавить("ЦенаОбщаяПоНоменлатуре");
Для Каждого Строка из ТаблицаТоваров Цикл
СтруктураОтбора = Новый Структура("Номенклатура",Строка.Номенклатура);
Массив =  ТаблицаТоваров.НайтиСтроки(СтруктураОтбора);
Строка.ЦенаОбщаяПоНоменлатуре      = Массив[0].Цена;
КонецЦикла;
ТекНоменклатура       = "";
ТекЦена               = 0;
ТекВидЦены            = "ОбщаяЦена"; // флаг, показывающий общая ли цена на артикул идет или специфическая (как пример цена на некоторые цвета одного артикула отличается от общей для артикула)
СчетчикИндексаСтрокиТаблЦен = 0;
Для Каждого Строка из ТаблицаТоваров Цикл
Строка.ИндексСтрокиТаблицыЦен = 1; // установка цены на один тип цен
Если Строка.Цена = Строка.ЦенаОбщаяПоНоменлатуре Тогда
Строка.ХарактеристикаНоменклатуры = Справочники.ХарактеристикиНоменклатуры.ПустаяСсылка();
КонецЕсли;
КонецЦикла;
Если ТипДокументаУстановкиЦен = "УстановкаЦенНоменклатуры" Тогда
ТаблицаТоваров.Свернуть("Номенклатура, ХарактеристикаНоменклатуры, Цена, Валюта, ЕдиницаИзмерения, ТипЦен, СпособРасчетаЦены, ИндексСтрокиТаблицыЦен");
ИначеЕсли ТипДокументаУстановкиЦен = "УстановкаЦенНоменклатурыКонтрагентов" Тогда
ТаблицаТоваров.Свернуть("Номенклатура, ХарактеристикаНоменклатуры, Цена, Валюта, ЕдиницаИзмерения, ТипЦен, ИндексСтрокиТаблицыЦен");
КонецЕсли;
Возврат ТаблицаТоваров;
КонецФункции

Функция НайтиСоздатьЕденицуПоКласификатору(СтрокаПоиска)
Эл = Справочники.КлассификаторЕдиницИзмерения.НайтиПоНаименованию(СтрокаПоиска);
Если Эл.Пустая() Тогда 
Эл = Справочники.КлассификаторЕдиницИзмерения.СоздатьЭлемент();
Эл.Наименование = СтрокаПоиска;
Эл.Код = СтрокаПоиска; 
Эл.Записать();
Эл = эл.Ссылка;
КонецЕсли;
Возврат эл;
КонецФункции

Функция НайтиСоздатьЕденицу(СтрокаПоиска,Владелец)
Эл = Справочники.ЕдиницыИзмерения.НайтиПоНаименованию(СтрокаПоиска);
Если Эл.Пустая() Тогда 
Эл = Справочники.ЕдиницыИзмерения.СоздатьЭлемент();
Эл.Наименование = СтрокаПоиска;
эл.Владелец = Владелец;
Эл.Записать();
Эл = эл.Ссылка;
КонецЕсли;
Возврат эл;
КонецФункции

Функция НайтиСоздатьЗначениеСправочника(СтрокаПоиска,владелец)
Эл = Справочники.ЗначенияСвойствОбъектов.НайтиПоНаименованию(СтрокаПоиска,,,владелец);
Если Эл.Пустая() Тогда 
Эл = Справочники.ЗначенияСвойствОбъектов.СоздатьЭлемент();
Эл.Наименование = СтрокаПоиска;
Эл.Владелец = владелец;
Эл.Записать();
Эл = эл.Ссылка;
КонецЕсли;
Возврат эл;
КонецФункции


Функция ЗначениеНеЗаполнено(Значение)
Результат = Ложь;
ТипЗначения = ТипЗнч(Значение);
// Сначала примитивные типы
Если Значение = Неопределено Тогда
Результат = Истина;
ИначеЕсли Значение = NULL Тогда
Результат = Истина;
ИначеЕсли ТипЗначения = Тип("Строка") Тогда
Если СокрЛП(Значение) = "" Тогда
Результат = Истина;
КонецЕсли; 
ИначеЕсли ТипЗначения = Тип("Число") Тогда
Если Значение = 0 Тогда
Результат = Истина;
КонецЕсли; 
ИначеЕсли ТипЗначения = Тип("Дата") Тогда
Если Значение = Дата('00010101') Тогда
Результат = Истина;
КонецЕсли; 
ИначеЕсли ТипЗначения = Тип("Булево") Тогда
Результат = Ложь; // Булево будем считать не пустым
//Отдельное определение, так как конструкторов данного типа не существует
ИначеЕсли ТипЗначения = Тип("РежимПроведенияДокумента") Тогда
Если Значение = РежимПроведенияДокумента.Неоперативный или Значение = РежимПроведенияДокумента.Оперативный тогда
Результат = Ложь;
КонецЕсли;
// Для остальных будем считать значение пустым, если оно равно
// дефолтному значению своего типа
Иначе
Попытка
Если Значение = Новый(ТипЗначения) Тогда
Результат = Истина;
КонецЕсли; 
Исключение
Результат = Ложь;
КонецПопытки;
КонецЕсли; 
Возврат Результат;
КонецФункции // ЗначениеНеЗаполнено()

Функция ПолучитьНовыйКодДляШтрихКода()
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| МАКСИМУМ(Штрихкоды.УдалитьКод) КАК Код
|ИЗ
| РегистрСведений.Штрихкоды КАК Штрихкоды";
Выборка = Запрос.Выполнить().Выбрать();
Код = 1;
Если Выборка.Количество() > 0 Тогда
Выборка.Следующий();
Если НЕ ЗначениеНеЗаполнено(Выборка.Код) Тогда
Код = Выборка.Код+1;
КонецЕсли;
КонецЕсли;
Возврат Код;
КонецФункции // ПолучитьНовыйКодДляШтрихКода()

Функция ПроверитьУникальностьШтрихКода(ШтрихКод, Код)
Перем НайденныеШтрихкоды;
Перем Запрос;
Если ЗначениеНеЗаполнено(ШтрихКод) Тогда
НайденныеШтрихкоды = Новый ТаблицаЗначений();
Иначе
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("ШтрихКод", ШтрихКод);
Запрос.УстановитьПараметр("УдалитьКод", Код);
Запрос.Текст = "
|ВЫБРАТЬ
| Штрихкоды.УдалитьКод,
| Штрихкоды.ТипШтрихкода,
| Штрихкоды.ШтрихКод,
| Штрихкоды.Владелец,
| Штрихкоды.ЕдиницаИзмерения,
| Штрихкоды.ХарактеристикаНоменклатуры,
| Штрихкоды.СерияНоменклатуры,
| Штрихкоды.Качество
|ИЗ
| РегистрСведений.Штрихкоды КАК Штрихкоды
|
|ГДЕ
| Штрихкоды.УдалитьКод <> &УдалитьКод
| И Штрихкоды.ШтрихКод = &ШтрихКод
|
|УПОРЯДОЧИТЬ ПО
| Владелец
|";
НайденныеШтрихкоды = Запрос.Выполнить().Выгрузить();
КонецЕсли;
Возврат НайденныеШтрихкоды;
КонецФункции // ПроверитьУникальностьШтрихКода()


Функция КонтрольныйСимволEAN(ШтрихКод, Тип) Экспорт
Четн   = 0;
Нечетн = 0;
КоличествоИтераций = ?(Тип = 13, 6, 4);
Для Индекс = 1 По КоличествоИтераций Цикл
Если (Тип = 8) и (Индекс = КоличествоИтераций) Тогда
Иначе
Четн   = Четн   + Сред(ШтрихКод, 2 * Индекс, 1);
КонецЕсли;
Нечетн = Нечетн + Сред(ШтрихКод, 2 * Индекс - 1, 1);
КонецЦикла;
Если Тип = 13 Тогда
Четн = Четн * 3;
Иначе
Нечетн = Нечетн * 3;
КонецЕсли;
КонтЦифра = 10 - (Четн + Нечетн) % 10;
Возврат ?(КонтЦифра = 10, "0", Строка(КонтЦифра));
КонецФункции // КонтрольныйСимволEAN()