Заказы на доработку 1С (сервис удаленной работы)

Хранилище

База знаний
Неназначенных незавершенных заказов: 1
Бесплатные отчеты, обработки, конфигурации, внешние компоненты для 1С Статьи, описание работы, методики по работе с 1С

Здравствуйте, гость ( Вход | Зарегистрироваться )



> Підтвердження дубля штрихкоду у БАС МБ          
bohdan_t Подменю пользователя
сообщение 11.10.25, 13:47
Сообщение #1

Общительный
**
Группа: Пользователи
Сообщений: 23
Спасибо сказали: 1 раз
Рейтинг: 1

Всім добрий день, пишу розширення для БАС МБ щоб при записі штрихкода який є вже в іншій номенклатурі - було підтвердження, щоб було менше помилок. Написав мінімальне розширення, але справа в тому що вікно підтвердження зацикліється і запис не відбувається. У чому може бути справа і як це мені виправити. Я поки початковий програміст 1с.

Моє розширення у модулі форми регіства відемостей ШтрихкодыНоменклатуры:
Код
&НаСервере
Функция ЕстьДубликатШтрихкода(Штрихкод, Номенклатура)

    Запрос = Новый Запрос(
        "ВЫБРАТЬ ПЕРВЫЕ 1
        |   Номенклатура
        |ИЗ РегистрСведений.ШтрихкодыНоменклатуры
        |ГДЕ Штрихкод = &Штрихкод
        |   И Номенклатура <> &Номенклатура"
    );
    Запрос.УстановитьПараметр("Штрихкод", Штрихкод);
    Запрос.УстановитьПараметр("Номенклатура", Номенклатура);

    Результат = Запрос.Выполнить().Выбрать();
    Если Результат.Следующий() Тогда
        Возврат "Штрихкод вже використовується для номенклатури """
            + Результат.Номенклатура + """";
    КонецЕсли;

    Возврат "";

КонецФункции


&НаКлиенте
Процедура ПродолжитьЗаписьДубля(Ответ, ДопПараметры) Экспорт
    Если Ответ = КодВозвратаДиалога.ОК Тогда
        Отказ = Ложь;
        ЭтаФорма.Записать();
        Сообщить(" Запис виконано після підтвердження користувача");
    Иначе
        Сообщить(" Запис скасовано користувачем");
    КонецЕсли;
КонецПроцедуры


&НаКлиенте
Процедура fix_ПередЗаписью(Отказ, ПараметрыЗаписи)
    ОписаниеОшибки = ЕстьДубликатШтрихкода(Запись.Штрихкод, Запись.Номенклатура);

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


І ще скидую стандартний модуль форми:
Код
#Область ОбработчикиСобытийФормы

// Процедура - обработчик события ПриСозданииНаСервере.
//
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // ПодключаемоеОборудование
    ИспользоватьПодключаемоеОборудование = УправлениеНебольшойФирмойПовтИсп.ИспользоватьПодключаемоеОборудование();
    ИспользоватьОбменСПодключаемымОборудованиемOffline = ПолучитьФункциональнуюОпцию("ИспользоватьОбменСПодключаемымОборудованиемOffline");
    // Конец ПодключаемоеОборудование
    
    Элементы.ФормаУдалитьЗапись.Доступность = Не Параметры.Ключ.Пустой();
    
КонецПроцедуры // ПриСозданииНаСервере()

// Процедура - обработчик события ПриОткрытии.
//
&НаКлиенте
Процедура ПриОткрытии(Отказ)
    
    // ПодключаемоеОборудование
    МенеджерОборудованияКлиент.НачатьПодключениеОборудованиеПриОткрытииФормы(Неопределено, ЭтотОбъект, "СканерШтрихкода");
    // Конец ПодключаемоеОборудование
    
КонецПроцедуры // ПриОткрытии()

// Процедура - обработчик события ПриЗакрытии.
//
&НаКлиенте
Процедура ПриЗакрытии()
    
    // ПодключаемоеОборудование
    МенеджерОборудованияКлиент.НачатьОтключениеОборудованиеПриЗакрытииФормы(Неопределено, ЭтотОбъект);
    // Конец ПодключаемоеОборудование
    
КонецПроцедуры // ПриЗакрытии()

// Процедура - обработчик события ОбработкаОповещения.
//
&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
    
    // ПодключаемоеОборудование
    Если Источник = "ПодключаемоеОборудование" И ВводДоступен() Тогда
        Если ИмяСобытия = "ScanData" Тогда
            Данные = МенеджерОборудованияУНФКлиент.ПреобразоватьДанныеСоСканераВМассив(Параметр);
            ПолученыШтрихкоды(Данные);
        ИначеЕсли ИмяСобытия = "DataCollectionTerminal" Тогда
            ПолученыШтрихкоды(Параметр);
        КонецЕсли;
    КонецЕсли;
    // Конец ПодключаемоеОборудование
    
КонецПроцедуры // ОбработкаОповещения()

// Процедура - обработчик события ОбработкаПроверкиЗаполненияНаСервере.
//
&НаСервере
Процедура ОбработкаПроверкиЗаполненияНаСервере(Отказ, ПроверяемыеРеквизиты)

    Запрос = РегистрыСведений.ШтрихкодыНоменклатуры.НовыйЗапросШтрихкоды(Запись);

    Выборка = Запрос.Выполнить().Выбрать();

    Если Выборка.Следующий() // Штрихкод уже записан в БД

        И Запись.ИсходныйКлючЗаписи.Штрихкод <> Запись.Штрихкод Тогда

        ОписаниеОшибки = НСтр("ru='Такой штрихкод уже назначен для номенклатуры %Номенклатура%';uk='Такий штрихкод вже призначений для номенклатури %Номенклатура%'");
        ОписаниеОшибки = СтрЗаменить(ОписаниеОшибки, "%Номенклатура%", """" + Выборка.НоменклатураПредставление + """"
            + ?(ЗначениеЗаполнено(Выборка.Характеристика), " " + НСтр("ru='с характеристикой';uk='з характеристикою'") + " """
            + Выборка.ХарактеристикаПредставление + """", "") + ?(ЗначениеЗаполнено(Выборка.Партия), " """ + НСтр("ru='с партией';uk='з партією'") + " " + Выборка.ПартияПредставление + """", ""));

        ОбщегоНазначения.СообщитьПользователю(ОписаниеОшибки,, "Запись.Штрихкод",, Отказ);

    КонецЕсли;

КонецПроцедуры

&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
    ПерезаписатьЗначениеШтрихКодаВНоменклатуре = Запись.ИсходныйКлючЗаписи.Штрихкод = Запись.Номенклатура.ШтрихКод;
КонецПроцедуры

&НаКлиенте
Процедура ПослеЗаписи(ПараметрыЗаписи)
    
    ПараметрыОповещения = Новый Структура;
    ПараметрыОповещения.Вставить("Номенклатура", Запись.Номенклатура);
    ПараметрыОповещения.Вставить("ШтрихКод", Запись.ШтрихКод);
    ПараметрыОповещения.Вставить("ПерезаписатьЗначениеШтрихКодаВНоменклатуре", ПерезаписатьЗначениеШтрихКодаВНоменклатуре);
    ПараметрыОповещения.Вставить("ШтрихКодУдален", Ложь);
    
    Оповестить("ЗаписьШтрихКода", ПараметрыОповещения);
    
    Элементы.ФормаУдалитьЗапись.Доступность = Истина;
    
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиКомандФормы

// Процедура обработчик команды НовыйШтрихкод.
//
&НаКлиенте
Процедура НовыйШтрихкод(Команда)
    
    Если Не ЗначениеЗаполнено(Запись.Номенклатура) Тогда
        СтрокаСообщения = НСтр("ru='Штрихкод не сгенерирован. Предварительно выберите номенклатуру.';uk='Штрихкод не згенерований. Попередньо виберіть номенклатуру.'");
        ОбщегоНазначенияКлиент.СообщитьПользователю(СтрокаСообщения);
        Возврат
    КонецЕсли;
    
    Если ИспользоватьОбменСПодключаемымОборудованиемOffline И ВесоваяНоменклатура() Тогда
        СформироватьШтрихкодВесовогоТовара();
    Иначе
        Запись.Штрихкод = СформироватьШтрихкодEAN13();
    КонецЕсли;
    
КонецПроцедуры

&НаКлиенте
Процедура УдалитьЗапись(Команда)
    
        ОписаниеОповещения = Новый ОписаниеОповещения("УдалитьЗаписьНаКлиенте", ЭтотОбъект);
        ПоказатьВопрос(ОписаниеОповещения, НСтр("ru = 'Удалить ""Штрихкоды номенклатуры"" ?'; uk = 'Вилучити ""Штрихкоди номенклатури"" ?'"), РежимДиалогаВопрос.ДаНет);

КонецПроцедуры

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

&НаКлиенте
Процедура УдалитьЗаписьНаКлиенте(Ответ, ДополнительныеПараметры) Экспорт

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

    
    ЭтаФорма.Закрыть();
    
КонецПроцедуры

&НаСервере
Процедура УдалитьЗаписьНаСервере()

    НаборЗаписей = РегистрыСведений.ШтрихкодыНоменклатуры.СоздатьНаборЗаписей();
    
    НаборЗаписей.Отбор.Номенклатура.Установить(Запись.Номенклатура);
    НаборЗаписей.Отбор.Штрихкод.Установить(Запись.Штрихкод);
    НаборЗаписей.Отбор.Партия.Установить(Запись.Партия);
    НаборЗаписей.Отбор.ЕдиницаИзмерения.Установить(Запись.ЕдиницаИзмерения);
    НаборЗаписей.Отбор.Характеристика.Установить(Запись.Характеристика);
    НаборЗаписей.Записать();
    
КонецПроцедуры

// ПодключаемоеОборудование
&НаКлиенте
Функция ПолученыШтрихкоды(ДанныеШтрихкодов)
    
    Модифицированность = Истина;
    
    Если ДанныеШтрихкодов.Количество() > 0 Тогда
        Запись.Штрихкод = ДанныеШтрихкодов[ДанныеШтрихкодов.Количество() - 1].Штрихкод;
    КонецЕсли;
    
    Возврат Истина;
    
КонецФункции // ПолученыШтрихкоды()
// Конец ПодключаемоеОборудование

&НаСервере
Функция ВесоваяНоменклатура()
    Возврат ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Запись.Номенклатура, "Весовой");
КонецФункции

&НаКлиенте
Процедура СформироватьШтрихкодВесовогоТовара()
    
    ПрефиксВесовогоТовара = 1;
    
    ОбработчикОповещения = Новый ОписаниеОповещения(
    "ПродолжитьФормированиеШтрихкодаВесовогоТовара",
    ЭтотОбъект);
    
    ПоказатьВводЧисла(
    ОбработчикОповещения,
    ПрефиксВесовогоТовара,
    НСтр("ru='Введите префикс весового товара или нажмите кнопку Отмена';uk='Введіть префікс вагового товару або натисніть кнопку Відмінити'"), 1, 0);
    
КонецПроцедуры

&НаКлиенте
Процедура ПродолжитьФормированиеШтрихкодаВесовогоТовара(ПрефиксВесовогоТовара, Параметры) Экспорт
    
    Если ПрефиксВесовогоТовара <> Неопределено Тогда
        Запись.Штрихкод = СформироватьШтрихкодEAN13ВесовогоТовара(Формат(ПрефиксВесовогоТовара, "ЧЦ=1; ЧН=0"));
    КонецЕсли;
    
КонецПроцедуры // НовыйШтрихкод()

&НаСервереБезКонтекста
Функция СформироватьШтрихкодEAN13ВесовогоТовара(Знач ПрефиксВесовогоТовара)
    
    Возврат РегистрыСведений.ШтрихкодыНоменклатуры.СформироватьШтрихкодВесовогоТовараEAN13(ПрефиксВесовогоТовара);
    
КонецФункции

// Формирует штрихкод EAN13.
//
&НаСервереБезКонтекста
Функция СформироватьШтрихкодEAN13()
    
    Возврат РегистрыСведений.ШтрихкодыНоменклатуры.СформироватьШтрихкодEAN13();
    
КонецФункции // СформироватьШтрихкодEAN13()

#КонецОбласти


Сообщение отредактировал Vofka - 12.10.25, 14:26

andytg Подменю пользователя
сообщение 11.10.25, 22:17
Сообщение #2

Завсегдатай
****
Группа: Пользователи
Сообщений: 135
Из: Киев
Спасибо сказали: 40 раз
Рейтинг: 36.9

Цитата(bohdan_t @ 11.10.25, 14:47) *
&НаКлиенте
Процедура fix_ПередЗаписью(Отказ, ПараметрыЗаписи)


а где оно у вас вызывается, это вот fix_ПередЗаписью()?
вы же штатную процедуру ПередЗаписью() не заменяете в расширении -- вот она и вызывается циклически

надо использовать директивы &Перед("ПередЗаписью") или &Вместо("ПередЗаписью")

[необходимо зарегистрироваться для просмотра ссылки]

Спасибо сказали: bohdan_t,

bohdan_t Подменю пользователя
сообщение 13.10.25, 11:27
Сообщение #3

Общительный
**
Группа: Пользователи
Сообщений: 23
Спасибо сказали: 1 раз
Рейтинг: 1

andytg @ 11.10.25, 23:17 * ,
&Вместо("ПередЗаписью")  &НаКлиенте
Процедура fix_ПередЗаписьюПосле(Отказ, ПараметрыЗаписи)
    ОписаниеОшибки = ЕстьДубликатШтрихкода(Запись.Штрихкод, Запись.Номенклатура);

    Если НЕ ПустаяСтрока(ОписаниеОшибки) Тогда

        ПоказатьВопрос(
            Новый ОписаниеОповещения("ПродолжитьЗаписьДубля", ЭтаФорма),
            ОписаниеОшибки + Символы.ПС + "Продовжити запис незважаючи на збіг?",
            РежимДиалогаВопрос.ОКОтмена
        );  
        
        Отказ = Истина;
        
    КонецЕсли;

КонецПроцедуры


Зробив так і вже не зацикліється. Але дає помилку Заборонено зміну параметра, що скасовує дію (параметр номер 1 в процедурі ) це із за Отказ = Истина;, як я його можу замінити також робив Отказ = Истина; Отказ = Неопределено; то одразу вікно через секунду пропадає і записує, може можна між ними якийсь таймер або сон добавити? Або є якесь інше рішення?


andytg Подменю пользователя
сообщение 13.10.25, 11:39
Сообщение #4

Завсегдатай
****
Группа: Пользователи
Сообщений: 135
Из: Киев
Спасибо сказали: 40 раз
Рейтинг: 36.9

Цитата(bohdan_t @ 13.10.25, 12:27) *
Отказ = Неопределено

такого не бывает, там должно быть булево значение (истина/ложь)

Цитата
то одразу вікно через секунду пропадає і записує

видимо, где-то есть подписка на событие ПриЗаписи() объектов этого типа -- при добавлении элемента что-то происходит

смотрите в ту сторону

bohdan_t Подменю пользователя
сообщение 13.10.25, 13:04
Сообщение #5

Общительный
**
Группа: Пользователи
Сообщений: 23
Спасибо сказали: 1 раз
Рейтинг: 1

andytg @ Сегодня, 12:39 * ,
Немає події при записі, надсилаю скрін зі всіма подіями


andytg Подменю пользователя
сообщение 13.10.25, 13:45
Сообщение #6

Завсегдатай
****
Группа: Пользователи
Сообщений: 135
Из: Киев
Спасибо сказали: 40 раз
Рейтинг: 36.9

bohdan_t @ Сегодня, 14:04 * ,
это вы смотрите модуль формы
а посмотрите еще в модуле объекта -- там точно есть (у меня в старой УНФ -- есть)

bohdan_t Подменю пользователя
сообщение 13.10.25, 14:39
Сообщение #7

Общительный
**
Группа: Пользователи
Сообщений: 23
Спасибо сказали: 1 раз
Рейтинг: 1

Цитата(andytg @ 13.10.25, 14:45) *
а посмотрите еще в модуле объекта -- там точно есть (у меня в старой УНФ -- есть)


У мене модуль набору записів - пустий, а вот в модулі менеджера є код, але згадкі про запис ніякої немає, надсилаю код: (Можливо є якийсь інший підхід щоб не було Отказ = истина)

Багато коду
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда

#Область ПрограммныйИнтерфейс

// Возвращает максимальный номер штрихкода.
//
// Параметры:
//  Номенклатура   - Справочник ссылка Номенклатура
//
// Возвращаемое значение:
//  ШтрихКод - Строка, значение штрихкода
Функция ПолучитьШтрихкодСМаксимальнымНомером(Номенклатура) Экспорт

    Запрос = Новый Запрос;
    
    Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
    
    Запрос.Текст =
    "ВЫБРАТЬ ПЕРВЫЕ 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_", ПрефиксВесовогоШтрихкода);
    
КонецФункции

#КонецОбласти

#КонецЕсли


Сообщение отредактировал Vofka - 13.10.25, 15:35

bohdan_t Подменю пользователя
сообщение 14.10.25, 11:48
Сообщение #8

Общительный
**
Группа: Пользователи
Сообщений: 23
Спасибо сказали: 1 раз
Рейтинг: 1

Зробив по іншому, вивожу сповіщення після закриття і коли нажимають НІ, видаляю запис. А коли нажимають просто Записати - то виводиться повідомлення. Так і не знайшов рішення для ПередЗаписью

Код:

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


Функция ЕстьДубликатШтрихкода(Штрихкод, Номенклатура)

    Запрос = Новый Запрос(
        "ВЫБРАТЬ ПЕРВЫЕ 1
        |   Номенклатура
        |ИЗ РегистрСведений.ШтрихкодыНоменклатуры
        |ГДЕ Штрихкод = &Штрихкод
        |   И Номенклатура <> &Номенклатура"
    );
    Запрос.УстановитьПараметр("Штрихкод", Штрихкод);
    Запрос.УстановитьПараметр("Номенклатура", Номенклатура);

    Результат = Запрос.Выполнить().Выбрать();
    Если Результат.Следующий() Тогда
        Возврат "Штрихкод вже використовується для номенклатури """
            + Результат.Номенклатура + """";
    КонецЕсли;

    Возврат "";

КонецФункции


&НаКлиенте
Процедура fix_ПриЗакрытииПосле(ЗавершениеРаботы)
    ОписаниеОшибки = ЕстьДубликатШтрихкода(Запись.Штрихкод, Запись.Номенклатура);

    Если НЕ ПустаяСтрока(ОписаниеОшибки) Тогда

        ПоказатьВопрос(
            Новый ОписаниеОповещения("ПродолжитьЗаписьДубля", ЭтаФорма),
            ОписаниеОшибки + Символы.ПС + "Продовжити запис незважаючи на збіг?",
            РежимДиалогаВопрос.ДаНет
        );

    КонецЕсли;
    
    Отказ = Истина;

КонецПроцедуры    

&НаКлиенте
Процедура fix_ПередЗаписьюПосле(Отказ, ПараметрыЗаписи)
    ОписаниеОшибки = ЕстьДубликатШтрихкода(Запись.Штрихкод, Запись.Номенклатура);

    Если НЕ ПустаяСтрока(ОписаниеОшибки) Тогда

        Сообщить(ОписаниеОшибки);
        
    КонецЕсли;
КонецПроцедуры

andytg Подменю пользователя
сообщение 14.10.25, 12:22
Сообщение #9

Завсегдатай
****
Группа: Пользователи
Сообщений: 135
Из: Киев
Спасибо сказали: 40 раз
Рейтинг: 36.9

ну или так...

Спасибо сказали: bohdan_t,

Не нашли ответа на свой вопрос?
Зарегистрируйтесь и задайте новый вопрос.


Ответить Новая тема
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 

RSS Текстовая версия Сейчас: 17.10.25, 2:54
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!