
Создание обработки для загрузки элементов справочника Номенклатура из Excel.
Создание обработки для загрузки элементов справочника Номенклатура из Excel.
Сегодня мы рассмотрим пример создания обработки для загрузки номенклатуры из Excel в конфигурацию "Управление торговым предприятие для Украины".
Итак все по порядку:
Для этого переходим в меню "Файл" - "Новый" - "Внешняя обработка"
открывается Окно новой внешней обработки:
Заполняем поля отмеченные красным:
- Имя - внутреннее имя обработки, заполняется без пробелов
- Синоним - наименование обработки так как будет видеть его пользователь
- Комментарий - предназначение обработки или любая другая информация
Я заполнил из так:
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()
Комментариев нет:
Отправить комментарий