// @strict-types
#Если Сервер Тогда
#Область ПрограммныйИнтерфейс
// См. ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке(
СтандартныеПодсистемыСервер.ВерсияБиблиотеки());
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка();
ПараметрыРегистрации.Наименование = НСтр("ru = 'Подарочный сертификат в архив'");
ПараметрыРегистрации.Информация = НСтр("ru = 'Находит полностью погашенные сертификаты нового образца (2.5),
|у которых штрихкод не начинается с ""0000"", переносит их в архив
|и создает копии для повторной продажи'");
ПараметрыРегистрации.Версия = "2026.11.03";
Команда = ПараметрыРегистрации.Команды.Добавить();
Команда.Представление = НСтр("ru = 'В архив'");
Команда.Идентификатор = "УТ_ПодарочныйСертификатВАрхив";
Команда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода();
Возврат ПараметрыРегистрации;
КонецФункции
// Переносит в архив полностью погашенные подарочные сертификаты и создает их копии для повторной продажи.
//
// Обрабатываются только сертификаты нового образца (у вида установлен признак УчетПодарочныхСертификатов2_5).
// Сертификаты для обработки находятся автоматически: рассчитанный статус "Полностью погашен"
// и штрихкод, не начинающийся со служебного префикса "0000".
// Для каждого найденного сертификата:
// - наименование дополняется пометкой "(В архиве)", а штрихкод заменяется свободным номером
// из служебного диапазона "0000...";
// - создается копия сертификата с прежними наименованием и штрихкодом, чтобы карту можно было продать снова.
//
// Сообщения пользователю не выводятся: обработка рассчитана на запуск регламентным заданием,
// ошибки по отдельным сертификатам записываются в журнал регистрации.
//
// Параметры:
// ИдентификаторКоманды - Строка - идентификатор команды из СведенияОВнешнейОбработке.
// ПараметрыВыполнения - Структура - дополнительные параметры выполнения команды (не используются).
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыВыполнения = Неопределено) Экспорт
Сертификаты = СсылкиСертификатовДляАрхивирования();
Если Сертификаты.Количество() = 0 Тогда
Возврат;
КонецЕсли;
ДанныеСертификатов = ПодарочныеСертификатыВызовСервера.ПолучитьДанныеПодарочныхСертификатов(Сертификаты);
СледующийНомер = СледующийНомерШтрихкода();
Для Каждого КлючИЗначение Из ДанныеСертификатов Цикл
Статус = ПодарочныеСертификатыКлиентСервер.ВычислитьСтатусПодарочногоСертификата2_5(КлючИЗначение.Значение);
Если Статус <> Перечисления.СтатусыПодарочныхСертификатов.ПолностьюПогашен Тогда
Продолжить;
КонецЕсли;
Попытка
ПеренестиВАрхивИСоздатьКопию(КлючИЗначение.Ключ, ШтрихкодПоНомеру(СледующийНомер));
СледующийНомер = СледующийНомер + 1;
Исключение
ЗаписатьОшибкуВЖурналРегистрации(КлючИЗначение.Ключ, ИнформацияОбОшибке());
КонецПопытки;
КонецЦикла;
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
// Переносит сертификат в архив и создает его копию в одной транзакции.
//
// Параметры:
// СертификатСсылка - СправочникСсылка.ПодарочныеСертификаты - сертификат, который надо архивировать.
// НовыйШтрихкод - Строка - служебный штрихкод для архивируемого сертификата.
Процедура ПеренестиВАрхивИСоздатьКопию(СертификатСсылка, НовыйШтрихкод)
НачатьТранзакцию();
Попытка
Сертификат = СертификатСсылка.ПолучитьОбъект();
Если Сертификат = Неопределено Тогда
ВызватьИсключение НСтр("ru = 'подарочный сертификат не найден'");
КонецЕсли;
Сертификат.Заблокировать();
Копия = Справочники.ПодарочныеСертификаты.СоздатьЭлемент();
СвойстваКопии = "Владелец, Наименование, Штрихкод, МагнитныйКод, Организация, Подразделение,"
+ " НаправлениеДеятельности, ПорядокРасчетов, НалогообложениеНДС, Комментарий";
ЗаполнитьЗначенияСвойств(Копия, Сертификат, СвойстваКопии);
Сертификат.Наименование = НаименованиеВАрхиве(Сертификат.Наименование);
Сертификат.Штрихкод = НовыйШтрихкод;
Сертификат.Записать();
Копия.Записать();
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
// Записывает ошибку обработки подарочного сертификата в журнал регистрации.
//
// Параметры:
// СертификатСсылка - СправочникСсылка.ПодарочныеСертификаты - сертификат, при обработке которого
// возникла ошибка.
// ИнформацияОбОшибке - ИнформацияОбОшибке - сведения об ошибке.
Процедура ЗаписатьОшибкуВЖурналРегистрации(СертификатСсылка, ИнформацияОбОшибке)
ЗаписьЖурналаРегистрации(
"ПодарочныеСертификаты.ПереносВАрхив",
УровеньЖурналаРегистрации.Ошибка,
Метаданные.Справочники.ПодарочныеСертификаты,
СертификатСсылка,
ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке));
КонецПроцедуры
// Возвращает сертификаты нового образца (УчетПодарочныхСертификатов2_5), которые еще не перенесены в архив.
//
// Возвращаемое значение:
// Массив из СправочникСсылка.ПодарочныеСертификаты - сертификаты с заполненным штрихкодом,
// не начинающимся с "0000".
Функция СсылкиСертификатовДляАрхивирования()
Запрос = Новый Запрос(
"ВЫБРАТЬ
| ПодарочныеСертификаты.Ссылка КАК Ссылка
|ИЗ
| Справочник.ПодарочныеСертификаты КАК ПодарочныеСертификаты
|ГДЕ
| ПодарочныеСертификаты.ПометкаУдаления = ЛОЖЬ
| И ПодарочныеСертификаты.Владелец.УчетПодарочныхСертификатов2_5
| И ПодарочныеСертификаты.Штрихкод <> """"
| И НЕ ПодарочныеСертификаты.Штрихкод ПОДОБНО ""0000%""");
Возврат Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка");
КонецФункции
// Возвращает номер, следующий за максимальным номером служебных штрихкодов, начинающихся с "0000".
//
// Возвращаемое значение:
// Число - номер для нового штрихкода.
Функция СледующийНомерШтрихкода()
Выборка = ЗапросШтрихКодов();
МаксимальныйНомер = 0;
Пока Выборка.Следующий() Цикл
Штрихкод = СокрЛП(Строка(Выборка.Штрихкод));
Если СтрНайтиПоРегулярномуВыражению(Штрихкод, "^0000\d+$").НачальнаяПозиция > 0 Тогда
Номер = Число(Штрихкод);
Если Номер > МаксимальныйНомер Тогда
МаксимальныйНомер = Номер;
КонецЕсли;
КонецЕсли;
КонецЦикла;
МаксимальныйНомерДиапазона = 9999;
СледующийНомер = МаксимальныйНомер + 1;
Если СледующийНомер > МаксимальныйНомерДиапазона Тогда
ВызватьИсключение НСтр("ru = 'Исчерпан диапазон служебных штрихкодов
|с префиксом ""0000"" (00000001 - 00009999).'");
КонецЕсли;
Возврат СледующийНомер;
КонецФункции
// Запрос штрих кодов.
//
// Возвращаемое значение:
// ВыборкаИзРезультатаЗапроса:
// * Штрихкод - Строка
Функция ЗапросШтрихКодов()
ТекстЗапроса =
"ВЫБРАТЬ
| ПодарочныеСертификаты.Штрихкод КАК Штрихкод
|ИЗ
| Справочник.ПодарочныеСертификаты КАК ПодарочныеСертификаты
|ГДЕ
| ПодарочныеСертификаты.Штрихкод ПОДОБНО ""0000%""";
Запрос = Новый Запрос(ТекстЗапроса);
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Возврат Выборка;
КонецФункции
// Преобразует номер штрихкода в 8-символьную строку с ведущими нулями.
//
// Параметры:
// Номер - Число - номер штрихкода.
//
// Возвращаемое значение:
// Строка - штрихкод, дополненный нулями до 8 символов.
Функция ШтрихкодПоНомеру(Знач Номер)
ДлинаШтрихкода = 8;
Возврат Прав("00000000" + Формат(Номер, "ЧГ=0"), ДлинаШтрихкода);
КонецФункции
// Возвращает наименование сертификата с пометкой о переносе в архив.
//
// Параметры:
// Наименование - Строка - текущее наименование сертификата.
//
// Возвращаемое значение:
// Строка - наименование с пометкой "(В архиве)" в конце.
Функция НаименованиеВАрхиве(Знач Наименование)
Пометка = НСтр("ru = '(В архиве)'");
Если СтрНайти(Наименование, Пометка) > 0 Тогда
Возврат Наименование;
КонецЕсли;
МаксимальнаяДлина = Метаданные.Справочники.ПодарочныеСертификаты.ДлинаНаименования;
Результат = СокрЛП(Наименование) + " " + Пометка;
Если МаксимальнаяДлина > 0 И СтрДлина(Результат) > МаксимальнаяДлина Тогда
ДлинаОсновнойЧасти = МаксимальнаяДлина - СтрДлина(Пометка) - 1;
Результат = Лев(СокрЛП(Наименование), ДлинаОсновнойЧасти) + " " + Пометка;
КонецЕсли;
Возврат Результат;
КонецФункции
#КонецОбласти
#КонецЕсли