#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
#Область ПрограммныйИнтерфейс
// Возвращает максимальный номер штрихкода.
//
// Параметры:
// Номенклатура - Справочник ссылка Номенклатура
//
// Возвращаемое значение:
// ШтрихКод - Строка, значение штрихкода
Функция ПолучитьШтрихкодСМаксимальнымНомером(Номенклатура) Экспорт
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| ШтрихкодыНоменклатуры.Штрихкод КАК Штрихкод
|ИЗ
| РегистрСведений.ШтрихкодыНоменклатуры КАК ШтрихкодыНоменклатуры
|ГДЕ
| ШтрихкодыНоменклатуры.Номенклатура = &Номенклатура
|
|УПОРЯДОЧИТЬ ПО
| Штрихкод УБЫВ";
Результат = Запрос.Выполнить().Выбрать();
Пока Результат.Следующий() Цикл
Возврат Результат.Штрихкод;
КонецЦикла;
Возврат "";
КонецФункции
// Возвращает соответствие штрихкодов номенклатуре.
//
// Параметры:
// Штрихкоды - Массив штрихкодов
//
// Возвращаемое значение:
// Соответствие - Соответствие штрихкодов номенклатуре.
Функция ПолучитьДанныеПоШтрихкодам(Штрихкоды, СтруктурнаяЕдиница = Неопределено) Экспорт
ДанныеПоШтрихкодам = Новый Соответствие;
Запрос = Новый Запрос(
"ВЫБРАТЬ
| Рег.Штрихкод КАК Штрихкод,
| Рег.Номенклатура КАК Номенклатура,
| Рег.Характеристика КАК Характеристика,
| Рег.Партия КАК Партия,
| Рег.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
| ЕСТЬNULL(СерииНоменклатуры.Ссылка, ЗНАЧЕНИЕ(Справочник.СерииНоменклатуры.ПустаяСсылка)) КАК Серия
|ИЗ
| РегистрСведений.ШтрихкодыНоменклатуры КАК Рег
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.СерииНоменклатуры КАК СерииНоменклатуры
| ПО (&СерииНоменклатурыИспользуются)
| И Рег.Номенклатура = СерииНоменклатуры.Владелец
| И (Рег.Номенклатура.ИспользоватьСерииНоменклатуры)
| И Рег.Штрихкод = СерииНоменклатуры.Наименование
|ГДЕ
| Рег.Штрихкод В(&МассивШтрихкодов)
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ТЗДанныеОВесовомТоваре.КодВесовогоТовара КАК КодВесовогоТовара,
| ТЗДанныеОВесовомТоваре.ПрефиксВесовогоТовара КАК ПрефиксВесовогоТовара,
| ТЗДанныеОВесовомТоваре.ШтрихКод КАК ШтрихКод
|ПОМЕСТИТЬ ВременнаяТаблицаВесовойТовар
|ИЗ
| &ТЗДанныеОВесовомТоваре КАК ТЗДанныеОВесовомТоваре
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| КодыТоваровSKU.Номенклатура КАК Номенклатура,
| КодыТоваровSKU.Характеристика КАК Характеристика,
| КодыТоваровSKU.Партия КАК Партия,
| КодыТоваровSKU.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
| ВременнаяТаблицаВесовойТовар.ШтрихКод КАК ШтрихКод,
| ВременнаяТаблицаВесовойТовар.КодВесовогоТовара КАК КодВесовогоТовара,
| ВременнаяТаблицаВесовойТовар.ПрефиксВесовогоТовара КАК ПрефиксВесовогоТовара,
| ЕСТЬNULL(СерииНоменклатуры.Ссылка, ЗНАЧЕНИЕ(Справочник.СерииНоменклатуры.ПустаяСсылка)) КАК Серия,
| ЕСТЬNULL(КодыТоваровSKU.Номенклатура.ВидАлкогольнойПродукции.Маркируемый, ЛОЖЬ)
| ИЛИ КодыТоваровSKU.Номенклатура.ТабачнаяПродукция КАК МаркируемаяПродукция
|ИЗ
| РегистрСведений.КодыТоваровSKU КАК КодыТоваровSKU
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВременнаяТаблицаВесовойТовар КАК ВременнаяТаблицаВесовойТовар
| ПО КодыТоваровSKU.SKU = ВременнаяТаблицаВесовойТовар.КодВесовогоТовара
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.СерииНоменклатуры КАК СерииНоменклатуры
| ПО (&СерииНоменклатурыИспользуются)
| И КодыТоваровSKU.Номенклатура = СерииНоменклатуры.Владелец
| И (КодыТоваровSKU.Номенклатура.ИспользоватьСерииНоменклатуры)
| И (ВременнаяТаблицаВесовойТовар.ШтрихКод = СерииНоменклатуры.Наименование)
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВременнаяТаблицаВесовойТовар.КодВесовогоТовара КАК КодВесовогоТовара,
| ВременнаяТаблицаВесовойТовар.ПрефиксВесовогоТовара КАК ПрефиксВесовогоТовара,
| ВременнаяТаблицаВесовойТовар.ШтрихКод КАК ШтрихКод
|ИЗ
| ВременнаяТаблицаВесовойТовар КАК ВременнаяТаблицаВесовойТовар");
МассивШтрихкодов = Новый Массив;
ТЗДанныеОВесовомТоваре = Новый ТаблицаЗначений;
ТЗДанныеОВесовомТоваре.Колонки.Добавить("КодВесовогоТовара", Новый ОписаниеТипов("Число",,, Новый КвалификаторыЧисла(15, 0, ДопустимыйЗнак.Неотрицательный)));
ТЗДанныеОВесовомТоваре.Колонки.Добавить("ПрефиксВесовогоТовара", Новый ОписаниеТипов("Число",,, Новый КвалификаторыЧисла(1, 0, ДопустимыйЗнак.Неотрицательный)));
ТЗДанныеОВесовомТоваре.Колонки.Добавить("Штрихкод", Новый ОписаниеТипов("Строка",,,, Новый КвалификаторыСтроки(200)));
Для каждого ТекШтрихкод Из Штрихкоды Цикл
МассивШтрихкодов.Добавить(ТекШтрихкод.ШтрихКод);
ДанныеПоШтрихкодам.Вставить(ТекШтрихкод.ШтрихКод, Новый Структура);
Если ТекШтрихкод.Свойство("КодВесовогоТовара") Тогда
НоваяСтрокаОВесовомТоваре = ТЗДанныеОВесовомТоваре.Добавить();
НоваяСтрокаОВесовомТоваре.КодВесовогоТовара = ТекШтрихкод.КодВесовогоТовара;
НоваяСтрокаОВесовомТоваре.ПрефиксВесовогоТовара = ТекШтрихкод.ПрефиксВесовогоТовара;
НоваяСтрокаОВесовомТоваре.Штрихкод = ТекШтрихкод.Штрихкод;
КонецЕсли;
КонецЦикла;
Запрос.УстановитьПараметр("МассивШтрихкодов", МассивШтрихкодов);
ИспользоватьСерииНоменклатуры = СерииНоменклатурыУНФ.ИспользоватьСерииНоменклатурыОстатки();
Если ИспользоватьСерииНоменклатуры<>Неопределено Тогда
Запрос.УстановитьПараметр("СерииНоменклатурыИспользуются", Истина);
Иначе
Запрос.УстановитьПараметр("СерииНоменклатурыИспользуются", Ложь);
КонецЕсли;
Запрос.УстановитьПараметр("ТЗДанныеОВесовомТоваре", ТЗДанныеОВесовомТоваре);
Запрос.УстановитьПараметр("СтруктурнаяЕдиница", СтруктурнаяЕдиница);
МассивРезультатов = Запрос.ВыполнитьПакет();
Выборка = МассивРезультатов[2].Выбрать();
Пока Выборка.СледующийПоЗначениюПоля("Штрихкод") Цикл
ТекДанные = ДанныеПоШтрихкодам[Выборка.Штрихкод];
ТекДанные.Вставить("Номенклатура", Выборка.Номенклатура);
ТекДанные.Вставить("Характеристика", Выборка.Характеристика);
ТекДанные.Вставить("Партия", Выборка.Партия);
ТекДанные.Вставить("ЕдиницаИзмерения", Выборка.ЕдиницаИзмерения);
ТекДанные.Вставить("КодВесовогоТовара", Выборка.КодВесовогоТовара);
ТекДанные.Вставить("ПрефиксВесовогоТовара", Выборка.ПрефиксВесовогоТовара);
ТекДанные.Вставить("МаркируемаяПродукция", Выборка.МаркируемаяПродукция);
Если ИспользоватьСерииНоменклатуры<>Неопределено Тогда
ТекДанные.Вставить("Серия", Выборка.Серия);
КонецЕсли;
КонецЦикла;
Выборка = МассивРезультатов[0].Выбрать();
Пока Выборка.СледующийПоЗначениюПоля("Штрихкод") Цикл
ТекДанные = ДанныеПоШтрихкодам[Выборка.Штрихкод];
Если НЕ ТекДанные.Свойство("КодВесовогоТовара") Тогда
ТекДанные.Вставить("Номенклатура", Выборка.Номенклатура);
ТекДанные.Вставить("Характеристика", Выборка.Характеристика);
ТекДанные.Вставить("Партия", Выборка.Партия);
ТекДанные.Вставить("ЕдиницаИзмерения", Выборка.ЕдиницаИзмерения);
Если ИспользоватьСерииНоменклатуры<>Неопределено Тогда
ТекДанные.Вставить("Серия", Выборка.Серия);
КонецЕсли;
КонецЕсли;
КонецЦикла;
Возврат ДанныеПоШтрихкодам;
КонецФункции
// Возвращает соответствие штрихкодов массиву номенклатуры.
//
// Параметры:
// Штрихкоды - Массив штрихкодов
//
// Возвращаемое значение:
// Соответствие - Соответствие штрихкодов массиву номенклатуры.
Функция ПолучитьДанныеПоШтрихкодамВМассиве(Штрихкоды, СтруктурнаяЕдиница = Неопределено) Экспорт
ДанныеПоШтрихкодам = Новый Соответствие;
Запрос = Новый Запрос(
"ВЫБРАТЬ
| Рег.Штрихкод КАК Штрихкод,
| Рег.Номенклатура КАК Номенклатура,
| Рег.Характеристика КАК Характеристика,
| Рег.Партия КАК Партия,
| Рег.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
| ЕСТЬNULL(СерииНоменклатуры.Ссылка, ЗНАЧЕНИЕ(Справочник.СерииНоменклатуры.ПустаяСсылка)) КАК Серия
|ИЗ
| РегистрСведений.ШтрихкодыНоменклатуры КАК Рег
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.СерииНоменклатуры КАК СерииНоменклатуры
| ПО (&СерииНоменклатурыИспользуются)
| И Рег.Номенклатура = СерииНоменклатуры.Владелец
| И (Рег.Номенклатура.ИспользоватьСерииНоменклатуры)
| И Рег.Штрихкод = СерииНоменклатуры.Наименование
|ГДЕ
| Рег.Штрихкод В(&МассивШтрихкодов)
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ТЗДанныеОВесовомТоваре.КодВесовогоТовара КАК КодВесовогоТовара,
| ТЗДанныеОВесовомТоваре.ПрефиксВесовогоТовара КАК ПрефиксВесовогоТовара,
| ТЗДанныеОВесовомТоваре.ШтрихКод КАК ШтрихКод
|ПОМЕСТИТЬ ВременнаяТаблицаВесовойТовар
|ИЗ
| &ТЗДанныеОВесовомТоваре КАК ТЗДанныеОВесовомТоваре
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| КодыТоваровSKU.Номенклатура КАК Номенклатура,
| КодыТоваровSKU.Характеристика КАК Характеристика,
| КодыТоваровSKU.Партия КАК Партия,
| КодыТоваровSKU.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
| ВременнаяТаблицаВесовойТовар.ШтрихКод КАК ШтрихКод,
| ВременнаяТаблицаВесовойТовар.КодВесовогоТовара КАК КодВесовогоТовара,
| ВременнаяТаблицаВесовойТовар.ПрефиксВесовогоТовара КАК ПрефиксВесовогоТовара,
| ЕСТЬNULL(СерииНоменклатуры.Ссылка, ЗНАЧЕНИЕ(Справочник.СерииНоменклатуры.ПустаяСсылка)) КАК Серия,
| ЛОЖЬ КАК МаркируемаяПродукция
|ИЗ
| РегистрСведений.КодыТоваровSKU КАК КодыТоваровSKU
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВременнаяТаблицаВесовойТовар КАК ВременнаяТаблицаВесовойТовар
| ПО КодыТоваровSKU.SKU = ВременнаяТаблицаВесовойТовар.КодВесовогоТовара
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.СерииНоменклатуры КАК СерииНоменклатуры
| ПО (&СерииНоменклатурыИспользуются)
| И КодыТоваровSKU.Номенклатура = СерииНоменклатуры.Владелец
| И (КодыТоваровSKU.Номенклатура.ИспользоватьСерииНоменклатуры)
| И (ВременнаяТаблицаВесовойТовар.ШтрихКод = СерииНоменклатуры.Наименование)
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВременнаяТаблицаВесовойТовар.КодВесовогоТовара КАК КодВесовогоТовара,
| ВременнаяТаблицаВесовойТовар.ПрефиксВесовогоТовара КАК ПрефиксВесовогоТовара,
| ВременнаяТаблицаВесовойТовар.ШтрихКод КАК ШтрихКод
|ИЗ
| ВременнаяТаблицаВесовойТовар КАК ВременнаяТаблицаВесовойТовар");
МассивШтрихкодов = Новый Массив;
ТЗДанныеОВесовомТоваре = Новый ТаблицаЗначений;
ТЗДанныеОВесовомТоваре.Колонки.Добавить("КодВесовогоТовара", Новый ОписаниеТипов("Число",,, Новый КвалификаторыЧисла(15, 0, ДопустимыйЗнак.Неотрицательный)));
ТЗДанныеОВесовомТоваре.Колонки.Добавить("ПрефиксВесовогоТовара", Новый ОписаниеТипов("Число",,, Новый КвалификаторыЧисла(1, 0, ДопустимыйЗнак.Неотрицательный)));
ТЗДанныеОВесовомТоваре.Колонки.Добавить("Штрихкод", Новый ОписаниеТипов("Строка",,,, Новый КвалификаторыСтроки(200)));
Для каждого ТекШтрихкод Из Штрихкоды Цикл
ТекШтрихкод.ШтрихКод = СокрП(ТекШтрихкод.ШтрихКод);
МассивШтрихкодов.Добавить(ТекШтрихкод.ШтрихКод);
ДанныеПоШтрихкодам.Вставить(ТекШтрихкод.ШтрихКод, Новый Массив);
Если ТекШтрихкод.Свойство("КодВесовогоТовара") Тогда
НоваяСтрокаОВесовомТоваре = ТЗДанныеОВесовомТоваре.Добавить();
НоваяСтрокаОВесовомТоваре.КодВесовогоТовара = ТекШтрихкод.КодВесовогоТовара;
НоваяСтрокаОВесовомТоваре.ПрефиксВесовогоТовара = ТекШтрихкод.ПрефиксВесовогоТовара;
НоваяСтрокаОВесовомТоваре.Штрихкод = ТекШтрихкод.Штрихкод;
КонецЕсли;
КонецЦикла;
Запрос.УстановитьПараметр("МассивШтрихкодов", МассивШтрихкодов);
ИспользоватьСерииНоменклатуры = СерииНоменклатурыУНФ.ИспользоватьСерииНоменклатурыОстатки();
Если ИспользоватьСерииНоменклатуры<>Неопределено Тогда
Запрос.УстановитьПараметр("СерииНоменклатурыИспользуются", Истина);
Иначе
Запрос.УстановитьПараметр("СерииНоменклатурыИспользуются", Ложь);
КонецЕсли;
Запрос.УстановитьПараметр("ТЗДанныеОВесовомТоваре", ТЗДанныеОВесовомТоваре);
Запрос.УстановитьПараметр("СтруктурнаяЕдиница", СтруктурнаяЕдиница);
МассивРезультатов = Запрос.ВыполнитьПакет();
Выборка = МассивРезультатов[2].Выбрать();
Пока Выборка.Следующий() Цикл
МассивДанныхПоШтрихкоду = ДанныеПоШтрихкодам[Выборка.Штрихкод];
Если Не ТипЗнч(МассивДанныхПоШтрихкоду) = Тип("Массив") Тогда
Продолжить
КонецЕсли;
ТекДанные = Новый Структура;
МассивДанныхПоШтрихкоду.Добавить(ТекДанные);
ТекДанные.Вставить("Номенклатура", Выборка.Номенклатура);
ТекДанные.Вставить("Характеристика", Выборка.Характеристика);
ТекДанные.Вставить("Партия", Выборка.Партия);
ТекДанные.Вставить("ЕдиницаИзмерения", Выборка.ЕдиницаИзмерения);
ТекДанные.Вставить("КодВесовогоТовара", Выборка.КодВесовогоТовара);
ТекДанные.Вставить("ПрефиксВесовогоТовара", Выборка.ПрефиксВесовогоТовара);
ТекДанные.Вставить("МаркируемаяПродукция", Выборка.МаркируемаяПродукция);
Если ИспользоватьСерииНоменклатуры<>Неопределено Тогда
ТекДанные.Вставить("Серия", Выборка.Серия);
КонецЕсли;
КонецЦикла;
Выборка = МассивРезультатов[0].Выбрать();
Пока Выборка.Следующий() Цикл
МассивДанныхПоШтрихкоду = ДанныеПоШтрихкодам[Выборка.Штрихкод];
Если Не ТипЗнч(МассивДанныхПоШтрихкоду) = Тип("Массив") Тогда
Продолжить
КонецЕсли;
ТекДанные = Новый Структура;
МассивДанныхПоШтрихкоду.Добавить(ТекДанные);
Если НЕ ТекДанные.Свойство("КодВесовогоТовара") Тогда
ТекДанные.Вставить("Номенклатура", Выборка.Номенклатура);
ТекДанные.Вставить("Характеристика", Выборка.Характеристика);
ТекДанные.Вставить("Партия", Выборка.Партия);
ТекДанные.Вставить("ЕдиницаИзмерения", Выборка.ЕдиницаИзмерения);
Если ИспользоватьСерииНоменклатуры<>Неопределено Тогда
ТекДанные.Вставить("Серия", Выборка.Серия);
КонецЕсли;
КонецЕсли;
КонецЦикла;
Возврат ДанныеПоШтрихкодам;
КонецФункции
// Возвращает номенклатуру по штрихкоду
//
// Параметры:
// ДанныеШтрихкода - Соответствие
//
// Возвращаемое значение:
// Номенклатура - Ссылка на соответствующий справочник.
Функция ПолучитьНоменклатуруПоШтрихкоду(ДанныеШтрихкода) Экспорт
Штрихкод = ДанныеШтрихкода.Штрихкод;
ПреобразоватьВесовойШтрихкод(ДанныеШтрихкода);
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ШтрихкодыНоменклатуры.Номенклатура
|ИЗ
| РегистрСведений.ШтрихкодыНоменклатуры КАК ШтрихкодыНоменклатуры
|ГДЕ
| ШтрихкодыНоменклатуры.Штрихкод = &Штрихкод";
Запрос.УстановитьПараметр("Штрихкод", Штрихкод);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Возврат Выборка.Номенклатура;
Иначе
Возврат Неопределено;
КонецЕсли;
КонецФункции
// Возвращает штрихкод по номенклатуре
//
// Параметры:
// Номенклатура - СправочникСсылка Номенклатура
// Характеристика - СправочникСсылка Характеристики
// Партия - СправочникСсылка Партии
// ЕдиницаИзмерения - СправочникСсылка Единицы измерения
//
// Возвращаемое значение:
// Строка - Значение штрихкода
Функция ПолучитьШтрихкодПоНоменклатуре(Номенклатура, Характеристика = Неопределено, Партия = Неопределено, ЕдиницаИзмерения = Неопределено) Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ШтрихкодыНоменклатуры.Штрихкод КАК Штрихкод,
| ШтрихкодыНоменклатуры.Номенклатура КАК Номенклатура,
| ШтрихкодыНоменклатуры.Характеристика КАК Характеристика,
| ШтрихкодыНоменклатуры.Партия КАК Партия,
| ШтрихкодыНоменклатуры.ЕдиницаИзмерения КАК ЕдиницаИзмерения
|ИЗ
| РегистрСведений.ШтрихкодыНоменклатуры КАК ШтрихкодыНоменклатуры
|ГДЕ
| ШтрихкодыНоменклатуры.Номенклатура = &Номенклатура
| И (&Характеристика = НЕОПРЕДЕЛЕНО
| ИЛИ ШтрихкодыНоменклатуры.Характеристика = &Характеристика)
| И (&Партия = НЕОПРЕДЕЛЕНО
| ИЛИ ШтрихкодыНоменклатуры.Партия = &Партия)
| И (&ЕдиницаИзмерения = НЕОПРЕДЕЛЕНО
| ИЛИ ШтрихкодыНоменклатуры.ЕдиницаИзмерения = &ЕдиницаИзмерения)
|
|УПОРЯДОЧИТЬ ПО
| Номенклатура,
| Характеристика,
| Партия,
| ЕдиницаИзмерения,
| Штрихкод";
Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
Запрос.УстановитьПараметр("Характеристика", Характеристика);
Запрос.УстановитьПараметр("Партия", Партия);
Запрос.УстановитьПараметр("ЕдиницаИзмерения", ЕдиницаИзмерения);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Возврат Выборка.Штрихкод;
Иначе
Возврат "";
КонецЕсли;
КонецФункции
// Возвращает массив со штрихкодами.
//
// Параметры:
// Номенклатура - СправочникСсылка.Номенклатура - Номенклатура.
// Характеристика - СправочникСсылка.ХарактеристикиНоменклатуры - Характеристика номенклатуры.
// Партия - СправочникСсылка.Партии
// ЕдиницаИзмерения - СправочникСсылка.УпаковкиЕдиницыИзмерения - Упаковка.
//
// Возвращаемое значение:
// Массив - Штрихкоды номенклатуры.
//
Функция ШтрихкодыНоменклатуры(Номенклатура, Характеристика = Неопределено, Партия = Неопределено, ЕдиницаИзмерения = Неопределено) Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ШтрихкодыНоменклатуры.Штрихкод КАК Штрихкод,
| ШтрихкодыНоменклатуры.Номенклатура КАК Номенклатура,
| ШтрихкодыНоменклатуры.Характеристика КАК Характеристика,
| ШтрихкодыНоменклатуры.Партия КАК Партия,
| ШтрихкодыНоменклатуры.ЕдиницаИзмерения КАК ЕдиницаИзмерения
|ИЗ
| РегистрСведений.ШтрихкодыНоменклатуры КАК ШтрихкодыНоменклатуры
|ГДЕ
| ШтрихкодыНоменклатуры.Номенклатура = &Номенклатура
| И (&Характеристика = НЕОПРЕДЕЛЕНО
| ИЛИ ШтрихкодыНоменклатуры.Характеристика = &Характеристика)
| И (&Партия = НЕОПРЕДЕЛЕНО
| ИЛИ ШтрихкодыНоменклатуры.Партия = &Партия)
| И (&ЕдиницаИзмерения = НЕОПРЕДЕЛЕНО
| ИЛИ ШтрихкодыНоменклатуры.ЕдиницаИзмерения = &ЕдиницаИзмерения)
|
|УПОРЯДОЧИТЬ ПО
| Номенклатура,
| Характеристика,
| Партия,
| ЕдиницаИзмерения,
| Штрихкод";
Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
Запрос.УстановитьПараметр("Характеристика", Характеристика);
Запрос.УстановитьПараметр("Партия", Партия);
Запрос.УстановитьПараметр("ЕдиницаИзмерения", ЕдиницаИзмерения);
Штрихкоды = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Штрихкод");
Возврат Штрихкоды;
КонецФункции
// Процедура выполняет преобразование штрихкода, полученного
// из весов с печатью этикеток в штрихкод, пригодный для поиска в БД.
//
// Параметры:
// ТекШтрихкод - Строка
// ПрефиксыВесовыхШтрихкодов - Массив
//
Процедура ПреобразоватьВесовойШтрихкод(ТекШтрихкод) Экспорт
ПрефиксыВесовыхШтрихкодов = ПрефиксыВесовыхШтрихкодов();
Если СтрДлина(ТекШтрихкод.Штрихкод) = 13 // EAN13
И Лев(ТекШтрихкод.Штрихкод, 1) = "2" // Внутренний штрихкод
И ПрефиксыВесовыхШтрихкодов.Найти(Сред(ТекШтрихкод.Штрихкод, 2, 1)) <> Неопределено Тогда // Найден префикс весового товара
// Штрихкод является весовым, выполняем преобразование.
// Формат весового штрихкода: 2 + П + ЧЧЧЧЧ + BBBBB + K
// Где,
// П - Префикс весового товара
// ЧЧЧЧЧ - код весового товара
// BBBBB - Вес
// К - Контрольное число
ВнутреннийШтрихкод12 = Лев(ТекШтрихкод.Штрихкод, 7) + "00000";
ВнутреннийШтрихкод13 = ВнутреннийШтрихкод12 + КонтрольныйСимволEAN(ВнутреннийШтрихкод12, 13);
Вес = Число(Сред(ТекШтрихкод.Штрихкод, 8, 2)) + Число(Сред(ТекШтрихкод.Штрихкод, 10, 3)) / 1000;
ТекШтрихкод.Штрихкод = ВнутреннийШтрихкод13;
ТекШтрихкод.Количество = ТекШтрихкод.Количество * Вес;
ТекШтрихкод.Вставить("КодВесовогоТовара", Число(Сред(ТекШтрихкод.Штрихкод, 3, 5)));
ТекШтрихкод.Вставить("ПрефиксВесовогоТовара", Число(Сред(ТекШтрихкод.Штрихкод, 2, 1)));
КонецЕсли;
КонецПроцедуры
// Функция осуществляет формирование штрихкода EAN8 для
// штучного товара
//
// Возвращаемое значение:
// Строка
//
Функция СформироватьШтрихкодEAN8() Экспорт
Код = Мин(ПоследнийКодШтучногоТовара(,, 8) + 1, МаксимальныйКодШтучногоТовара(8));
Возврат ПолучитьШтрихкодПоКоду(Код,,, 8);
КонецФункции
// Функция осуществляет формирование штрихкода EAN13 для
// штучного товара
//
// Возвращаемое значение:
// Строка
//
Функция СформироватьШтрихкодEAN13() Экспорт
ПрефиксШтучногоТовара = ПрефиксШтучногоТовара();
ПрефиксВнутреннегоШтрихкода = ПрефиксУзлаШтрихкода();
Код = Мин(ПоследнийКодШтучногоТовара(ПрефиксШтучногоТовара, ПрефиксВнутреннегоШтрихкода, 13) + 1,
МаксимальныйКодШтучногоТовара(13));
Возврат ПолучитьШтрихкодПоКоду(Код, ПрефиксШтучногоТовара, ПрефиксВнутреннегоШтрихкода, 13);
КонецФункции
// Функция осуществляет формирование штрихкода EAN13 для
// Сотрудников
//
// Возвращаемое значение:
// Строка
//
Функция СформироватьШтрихкодEAN13Сотрудник() Экспорт
ПрефиксСотрудника= "1";
ПрефиксВнутреннегоШтрихкода = ПрефиксУзлаШтрихкода();
Код = Мин(ПоследнийКодСотрудника(ПрефиксСотрудника, ПрефиксВнутреннегоШтрихкода) + 1,
МаксимальныйКодШтучногоТовара(13));
Возврат ПолучитьШтрихкодПоКоду(Код, ПрефиксСотрудника, ПрефиксВнутреннегоШтрихкода, 13);
КонецФункции
// Функция осуществляет формирование штрихкода EAN13 для
// весового товара
//
// Параметры:
// ПрефиксВесовогоТовара - Строка
//
// Возвращаемое значение:
// Строка
//
Функция СформироватьШтрихкодВесовогоТовараEAN13(Знач ПрефиксВесовогоТовара) Экспорт
Код = Мин(ПоследнийКодВесовогоТовара(ПрефиксВесовогоТовара) + 1, МаксимальныйКодВесовогоТовара());
Возврат ПолучитьШтрихкодВесовогоТовараПоКоду(Код, ПрефиксВесовогоТовара);
КонецФункции
Функция ПрефиксШтучногоТовара() Экспорт
Возврат Строка(Константы.ПрефиксВнутреннегоШтрихкодаШтучногоТовара.Получить());
КонецФункции
// Функция возвращает массив префиксов весовых штрихкодов
Функция ПрефиксыВесовыхШтрихкодов() Экспорт
УстановитьПривилегированныйРежим(Истина);
Результат = Новый Массив;
Запрос = Новый Запрос(
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| ПравилаОбменаСПодключаемымОборудованиемOffline.ПрефиксВесовогоТовара КАК Префикс
|ИЗ
| Справочник.ПравилаОбменаСПодключаемымОборудованиемOffline КАК ПравилаОбменаСПодключаемымОборудованиемOffline
|ГДЕ
| ПравилаОбменаСПодключаемымОборудованиемOffline.ТипПодключаемогоОборудования = &ТипПодключаемогоОборудования");
Запрос.УстановитьПараметр("ТипПодключаемогоОборудования", Перечисления.ТипыПодключаемогоОборудования.ВесыСПечатьюЭтикеток);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Результат.Добавить(Строка(Выборка.Префикс));
КонецЦикла;
Возврат Результат;
КонецФункции
// Возвращает префикс штрихкода для текущего узла информационной базы
//
// Возвращаемое значение:
// Строка - Префикс узла штрихкода
//
Функция ПрефиксУзлаШтрихкода() Экспорт
Возврат Формат(Константы.ПрефиксШтрихкодовУзлаРИБ.Получить(),"ЧЦ=2; ЧН=; ЧВН=");
КонецФункции
// Функция возвращает максимальный код штучного товара.
//
// Возвращаемое значение:
// Число - Максимальный код штучного товара.
//
Функция МаксимальныйКодШтучногоТовара(EAN) Экспорт
Если EAN = 13 Тогда
Возврат 99999999;
КонецЕсли;
Если EAN = 8 Тогда
Возврат 999999;
КонецЕсли;
ВызватьИсключение НСтр("ru='Недопустимая длина EAN. Ожидается 8 или 13.';uk='Неприпустима довжина EAN. Очікується 8 або 13.'");
КонецФункции
// Функция возвращает максимальный код весового товара.
//
// Возвращаемое значение:
// Число - Максимальный код весового товара.
//
Функция МаксимальныйКодВесовогоТовара() Экспорт
Возврат 99999;
КонецФункции
// Возвращает текст сообщения о недостатке свободных кодов весовых штрихкодов
//
// Возвращаемое значение:
// Строка - Текст сообщения
//
Функция ТекстСообщенияНетСвободныхКодовВесовыхШтрихкодов() Экспорт
Возврат НСтр("ru='Нет свободных кодов весовых штрихкодов."
"Штрихкод не сформирован.';uk='Немає вільних кодів вагових штрихкодів."
"Штрихкод не сформований.'")
КонецФункции
// Возвращает текст сообщения о недостатке свободных кодов штучных штрихкодов
//
// Возвращаемое значение:
// Строка - Текст сообщения
//
Функция ТекстСообщенияНетСвободныхКодовШтучныхШтрихкодов() Экспорт
Возврат НСтр("ru='Нет свободных кодов в доступных диапазонах штучных штрихкодов."
"Штрихкод не сформирован.';uk='Немає вільних кодів в доступних діапазонах штучних штрихкодів."
"Штрихкод не сформований.'")
КонецФункции
#КонецОбласти
#Область СлужебныйПрограммныйИнтерфейс
Функция ДанныеШтрихкода(Штрихкод) Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ШтрихкодыНоменклатуры.Номенклатура,
| ШтрихкодыНоменклатуры.Характеристика,
| ШтрихкодыНоменклатуры.Партия
|ИЗ
| РегистрСведений.ШтрихкодыНоменклатуры КАК ШтрихкодыНоменклатуры
|ГДЕ
| ШтрихкодыНоменклатуры.Штрихкод = &Штрихкод";
Запрос.УстановитьПараметр("Штрихкод", Штрихкод);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
ДанныеШтрихкода = Новый Структура("Номенклатура, Характеристика, Партия");
ЗаполнитьЗначенияСвойств(ДанныеШтрихкода, Выборка);
Возврат ДанныеШтрихкода;
Иначе
Возврат Неопределено;
КонецЕсли;
КонецФункции
Функция НовыйЗапросШтрихкоды(Запись) Экспорт
Результат = Новый Запрос;
Результат.УстановитьПараметр("Штрихкод", Запись.Штрихкод);
Если Константы.ИспользоватьНеуникальныеШтрихКоды.Получить() Тогда
Результат.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| ШтрихкодыНоменклатуры.Штрихкод КАК Штрихкод,
| ШтрихкодыНоменклатуры.Номенклатура КАК Номенклатура,
| ШтрихкодыНоменклатуры.Характеристика КАК Характеристика,
| ШтрихкодыНоменклатуры.Партия КАК Партия,
| ПРЕДСТАВЛЕНИЕ(ШтрихкодыНоменклатуры.Номенклатура) КАК НоменклатураПредставление,
| ПРЕДСТАВЛЕНИЕ(ШтрихкодыНоменклатуры.Характеристика) КАК ХарактеристикаПредставление,
| ПРЕДСТАВЛЕНИЕ(ШтрихкодыНоменклатуры.Партия) КАК ПартияПредставление,
| ШтрихкодыНоменклатуры.ЕдиницаИзмерения КАК ЕдиницаИзмерения
|ИЗ
| РегистрСведений.ШтрихкодыНоменклатуры КАК ШтрихкодыНоменклатуры
|ГДЕ
| ШтрихкодыНоменклатуры.Штрихкод = &Штрихкод
| И ШтрихкодыНоменклатуры.Номенклатура = &Номенклатура
| И ШтрихкодыНоменклатуры.Характеристика = &Характеристика
| И ШтрихкодыНоменклатуры.Партия = &Партия
| И ШтрихкодыНоменклатуры.ЕдиницаИзмерения = &ЕдиницаИзмерения";
Результат.УстановитьПараметр("Номенклатура", Запись.Номенклатура);
Результат.УстановитьПараметр("Характеристика", Запись.Характеристика);
Результат.УстановитьПараметр("Партия", Запись.Партия);
Результат.УстановитьПараметр("ЕдиницаИзмерения", Запись.ЕдиницаИзмерения);
Иначе
Результат.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| ШтрихкодыНоменклатуры.Штрихкод,
| ШтрихкодыНоменклатуры.Номенклатура,
| ШтрихкодыНоменклатуры.Характеристика,
| ШтрихкодыНоменклатуры.Партия,
| ПРЕДСТАВЛЕНИЕ(ШтрихкодыНоменклатуры.Номенклатура) КАК НоменклатураПредставление,
| ПРЕДСТАВЛЕНИЕ(ШтрихкодыНоменклатуры.Характеристика) КАК ХарактеристикаПредставление,
| ПРЕДСТАВЛЕНИЕ(ШтрихкодыНоменклатуры.Партия) КАК ПартияПредставление
|ИЗ
| РегистрСведений.ШтрихкодыНоменклатуры КАК ШтрихкодыНоменклатуры
|ГДЕ
| ШтрихкодыНоменклатуры.Штрихкод = &Штрихкод";
КонецЕсли;
Возврат Результат
КонецФункции
#КонецОбласти
#Область ГенерацияШтрихкодов
// Функция вычисляет контрольный символ кода EAN
//
// Параметры:
// ШтрихКод - штрихкод (без контрольной цифры)
// Тип - тип штрихкода: 13 - EAN13, 8 - EAN8
//
// Возвращаемое значение:
// Контрольный символ штрихкода
//
Функция КонтрольныйСимволEAN(Знач ШтрихКод, Знач Тип)
Четное = 0;
Нечетное = 0;
КоличествоИтераций = ?(Тип = 13, 6, 4);
Для Индекс = 1 По КоличествоИтераций Цикл
Если (Тип = 8) И (Индекс = КоличествоИтераций) Тогда
Иначе
Четное = Четное + Сред(ШтрихКод, 2 * Индекс, 1);
КонецЕсли;
Нечетное = Нечетное + Сред(ШтрихКод, 2 * Индекс - 1, 1);
КонецЦикла;
Если Тип = 13 Тогда
Четное = Четное * 3;
Иначе
Нечетное = Нечетное * 3;
КонецЕсли;
КонтЦифра = 10 - (Четное + Нечетное) % 10;
Возврат ?(КонтЦифра = 10, "0", Строка(КонтЦифра));
КонецФункции // КонтрольныйСимволEAN()
Функция ПоследнийКодСотрудника(Префикс, ПрефиксВнутреннегоШтрихкода) Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| МАКСИМУМ(ПОДСТРОКА(Сотрудники.ШтрихКод, 5, 8)) КАК Код
|ИЗ
| Справочник.Сотрудники КАК Сотрудники
|ГДЕ
| Сотрудники.ШтрихКод ПОДОБНО &ШаблонШтрихкод";
ШаблонШтрихкод = СтрШаблон("2%1%2_________", Префикс, ПрефиксВнутреннегоШтрихкода);
Запрос.УстановитьПараметр("ШаблонШтрихкод", ШаблонШтрихкод);
Выборка = Запрос.Выполнить().Выбрать();
Выборка.Следующий();
ОписаниеТипаЧисла = Новый ОписаниеТипов("Число");
Результат = ОписаниеТипаЧисла.ПривестиЗначение(Выборка.Код);
Возврат Результат;
КонецФункции
Функция ПоследнийКодШтучногоТовара(ПрефиксШтучногоТовара, ПрефиксВнутреннегоШтрихкода, EAN) Экспорт
Запрос = Новый Запрос;
Если EAN = 8 Тогда
Запрос.Текст = "ВЫБРАТЬ
| МАКСИМУМ(ПОДСТРОКА(ШтрихкодыНоменклатуры.Штрихкод, 2, 6)) КАК Код
|ИЗ
| РегистрСведений.ШтрихкодыНоменклатуры КАК ШтрихкодыНоменклатуры
|ГДЕ
| ШтрихкодыНоменклатуры.Штрихкод ПОДОБНО &ШаблонШтрихкод";
ШаблонШтрихкод = "2_______";
ИначеЕсли EAN = 13 Тогда
Запрос.Текст = "ВЫБРАТЬ
| МАКСИМУМ(ПОДСТРОКА(ШтрихкодыНоменклатуры.Штрихкод, 5, 8)) КАК Код
|ИЗ
| РегистрСведений.ШтрихкодыНоменклатуры КАК ШтрихкодыНоменклатуры
|ГДЕ
| ШтрихкодыНоменклатуры.Штрихкод ПОДОБНО &ШаблонШтрихкод";
ШаблонШтрихкод = СтрШаблон("2%1%2_________", ПрефиксШтучногоТовара, ПрефиксВнутреннегоШтрихкода);
Иначе
ВызватьИсключение НСтр("ru='Недопустимая длина EAN. Ожидается 8 или 13.';uk='Неприпустима довжина EAN. Очікується 8 або 13.'");
КонецЕсли;
Запрос.УстановитьПараметр("ШаблонШтрихкод", ШаблонШтрихкод);
Выборка = Запрос.Выполнить().Выбрать();
Выборка.Следующий();
ОписаниеТипаЧисла = Новый ОписаниеТипов("Число");
Результат = ОписаниеТипаЧисла.ПривестиЗначение(Выборка.Код);
Возврат Результат;
КонецФункции
Функция ПолучитьШтрихкодПоКоду(Код, ПрефиксШтучногоТовара, ПрефиксВнутреннегоШтрихкода, EAN) Экспорт
Если EAN = 8 Тогда
Штрихкод = СтрШаблон("2%1", Формат(Код, "ЧЦ=6; ЧВН=; ЧГ="));
ИначеЕсли EAN = 13 Тогда
Штрихкод = СтрШаблон("2%1%2%3", ПрефиксШтучногоТовара, ПрефиксВнутреннегоШтрихкода, Формат(Код, "ЧЦ=8; ЧВН=; ЧГ="));
Иначе
ВызватьИсключение НСтр("ru='Недопустимая длина EAN. Ожидается 8 или 13.';uk='Неприпустима довжина EAN. Очікується 8 або 13.'")
КонецЕсли;
Результат = СтрШаблон("%1%2", Штрихкод, КонтрольныйСимволEAN(ШтрихКод, EAN));
Возврат Результат;
КонецФункции
// Функция возвращает штрихкод весового товара,
// создаваемый из кода с префиксом весового товара и контрольным символом
//
// Параметры:
// Код - Код
// ПрефиксВесовогоТовара - Строка
//
// Возвращаемое значение:
// Строка
//
Функция ПолучитьШтрихкодВесовогоТовараПоКоду(Код, ПрефиксВесовогоТовара) Экспорт
Штрихкод = СтрШаблон("2%1%2%3", ПрефиксВесовогоТовара, Формат(Код, "ЧЦ=5; ЧВН=; ЧГ="), "00000");
Результат = СтрШаблон("%1%2", Штрихкод, КонтрольныйСимволEAN(ШтрихКод, 13));
Возврат Результат;
КонецФункции
// Функция возвращает максимальное значение штрихкода числом
//
// Параметры:
// ПрефиксВесовогоТовара - Строка
//
// Возвращаемое значение:
// Число
//
Функция ПоследнийКодВесовогоТовара(Знач ПрефиксВесовогоТовара) Экспорт
Запрос = Новый Запрос(
"ВЫБРАТЬ
| МАКСИМУМ(ПОДСТРОКА(ШтрихкодыНоменклатуры.Штрихкод, 3, 5)) КАК Код
|ИЗ
| РегистрСведений.ШтрихкодыНоменклатуры КАК ШтрихкодыНоменклатуры
|ГДЕ
| ШтрихкодыНоменклатуры.Штрихкод ПОДОБНО &ФорматШтрихкода");
Запрос.УстановитьПараметр("ФорматШтрихкода", ФорматВесовогоШтрихкода(ПрефиксВесовогоТовара));
Выборка = Запрос.Выполнить().Выбрать();
Выборка.Следующий();
ОписаниеТипаЧисла = Новый ОписаниеТипов("Число");
Результат = ОписаниеТипаЧисла.ПривестиЗначение(Выборка.Код);
Возврат Результат;
КонецФункции
// Функция возвращает формат весового штрихкода для запросов
//
// Параметры:
// ПрефиксВесовогоШтрихкода - Строка
//
// Возвращаемое значение:
// Строка
//
Функция ФорматВесовогоШтрихкода(Знач ПрефиксВесовогоШтрихкода)
Возврат СтрШаблон("2%1_____00000_", ПрефиксВесовогоШтрихкода);
КонецФункции
#КонецОбласти
#КонецЕсли