В обработке использовался коммент из публикации на инфостарте http://forum.infostart.ru/forum26/topic125338/
Первая функция подготавливает таблицу свободных штрихкодов. (на 77000 позициях работает 2.5-3 секунды). Ее нужно использовать до цикла присваивания штрихкодов.
Вторая выжимает из этой таблицы штрихкоды.
&НаСервере
Функция ПодготовитьТаблицуСвободныхШтрихкодов() Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ""0"" КАК Цифра,0 КАК Позиция, 1 КАК Вес
|ПОМЕСТИТЬ СистемаСчисления
|ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ""1"",1,10
|ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ""2"",2,100
|ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ""3"",3,1000
|ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ""4"",4,10000
|ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ""5"",5,100000
|ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ""6"",6,1000000
|ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ""7"",7,10000000
|ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ""8"",8,100000000
|ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ""9"",9,1000000000
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ""0"" + ПОДСТРОКА(ШтрихкодыНоменклатуры.Штрихкод, 8, 5) КАК Номер,
| ШтрихкодыНоменклатуры.Штрихкод
|ПОМЕСТИТЬ Дано
|ИЗ
| РегистрСведений.ШтрихкодыНоменклатуры КАК ШтрихкодыНоменклатуры
|ГДЕ
| ШтрихкодыНоменклатуры.Штрихкод ПОДОБНО &ПрефиксЕАН
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| Дано.Штрихкод,
| СУММА(СтепениДесяти.Вес * Цифры.Позиция) / МИНИМУМ(СтепениДесяти.Вес) КАК номер
|ПОМЕСТИТЬ ЗанятыеШтрихкоды
|ИЗ
| Дано КАК Дано
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ СистемаСчисления КАК СтепениДесяти
| ПО (ИСТИНА)
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ СистемаСчисления КАК Цифры
| ПО (ПОДСТРОКА(Дано.Номер, 6 - СтепениДесяти.Позиция, 1) = Цифры.Цифра)
|
|СГРУППИРОВАТЬ ПО
| Дано.Штрихкод
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| 10000 * Таб5.Позиция + 1000 * Таб4.Позиция + 100 * Таб3.Позиция + 10 * Таб2.Позиция + Таб1.Позиция + 1 КАК Число
|ПОМЕСТИТЬ ВТ_Числа
|ИЗ
| СистемаСчисления КАК Таб1,
| СистемаСчисления КАК Таб2,
| СистемаСчисления КАК Таб3,
| СистемаСчисления КАК Таб4,
| СистемаСчисления КАК Таб5
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВТ_Числа.Число КАК Номер,
| ЕСТЬNULL(ЗанятыеШтрихкоды.Штрихкод, """") КАК Штрихкод
|ПОМЕСТИТЬ ИндексШК
|ИЗ
| ВТ_Числа КАК ВТ_Числа
| ЛЕВОЕ СОЕДИНЕНИЕ ЗанятыеШтрихкоды КАК ЗанятыеШтрихкоды
| ПО (ЗанятыеШтрихкоды.Номер = ВТ_Числа.Число)
|ГДЕ
| ВТ_Числа.Число < 100000
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| Свободные.Номер
|ИЗ
| ИндексШК КАК Свободные
|ГДЕ
| Свободные.Штрихкод = """"";
Запрос.УстановитьПараметр("ПрефиксЕАН","%4590009%"); //Офиальный выданный компании префикс
ДиапазоныШтучныхШтрихкодов = Запрос.Выполнить().Выгрузить();
Если ДиапазоныШтучныхШтрихкодов.Количество() = 0 Тогда
Возврат Неопределено;
Иначе
Возврат ДиапазоныШтучныхШтрихкодов;
КонецЕсли;
КонецФункции
&НаСервере
Функция ЗанятьШтрихкод(Таблица) Экспорт
Если Таблица.Количество() = 0 Тогда
Возврат Неопределено;
КонецЕсли;
ШК = Таблица[0].Код;
Таблица.Удалить(0); //штрихкод занят. удаляем из таблицы
Возврат ШК;
КонецФункции
" |ВЫБРАТЬ РАЗЛИЧНЫЕ " использована, потому что код расчета числового ряда создает дубли через каждые 10 чисел. Обойти это ошибку не смог. Главное работает. Так же пришлось добавить к текстовому индексу "0". Почему в данном случае глючит, пусть решают авторы кода создания числового ряда в запросе. Я взял их код без изменения.
Основное преимущество данного кода: Нет необходимости создания воспомогательных сущностей(регистры, справочники и т.д.) в конфигурации 1С.