Писала для себя. Буду рада, если кому-то пригодится.
У нас стеллажное хранение, склад разделен на группы стеллажей (Зона А, Зона Б, Зона С) В каждой из зон изначально заводились места хранения = номерам стеллажей 01, 02, 03. Далее гением пользователей была изобретена нумерация типа 01-А или 01 полка1. А потом пользователи решили проводить инвентаризацию отдельных стеллажей...
Данная обработка проходит по местам хранения выбранной зоны, отделяет в этих местах первый числовой блок (разделенный от остального текста пробелом или дефисом) и заполняет ТЧ инвентаризации списком товаров. Пользователю остается записать документ, нажать кнопку "Перезаполнить учетные количества и суммы" и установить галку "Учитывать серии".
Процедура Инициализировать(Объект, ИмяТабличнойЧасти = Неопределено, ТабличноеПолеОбъекта = Неопределено) Экспорт
ТабличнаяЧасть = Объект[ИмяТабличнойЧасти];
ФормаДопПараметров = ПолучитьФорму("Форма");
ФормаДопПараметров.ОткрытьМодально();
ТзМеста = новый ТаблицаЗначений;
ТзМеста.Колонки.Добавить("МестоХранения",Новый ОписаниеТипов("СправочникСсылка.МестаХранения"));
ЗапросМеста = новый запрос;
ЗапросМеста.Текст = "ВЫБРАТЬ
| МестаХранения.Ссылка,
| МестаХранения.Наименование
|ИЗ
| Справочник.МестаХранения КАК МестаХранения
|ГДЕ
| МестаХранения.ЭтоГруппа = ЛОЖЬ
| И МестаХранения.Родитель = &Родитель";
ЗапросМеста.УстановитьПараметр("Родитель",Склад);
Рез = ЗапросМеста.Выполнить();
Если Рез.Пустой() Тогда
Сообщить("Не найдены места на выбранном складе");
Возврат;
КонецЕсли;
НайденоЧисло = ложь;
Выборка = Рез.Выбрать();
Пока Выборка.Следующий() Цикл
Массив1=ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(Выборка.Наименование, " ");
НайденоЧисло = ложь;
Для каждого ЧастьМассив1 Из Массив1 Цикл
Массив2=ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(ЧастьМассив1, "-");
Для каждого ЧастьМассив Из Массив2 Цикл
Если ЭтоЧисло(ЧастьМассив) = истина и НайденоЧисло = ложь Тогда
НайденоЧисло = истина;
Если Число(ЧастьМассив) <= МестоПо и Число(ЧастьМассив) >= МестоС Тогда
новСтр = ТзМеста.Добавить();
новСтр.МестоХранения = Выборка.Ссылка;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецЦикла;
Если ТзМеста.Количество() = 0 Тогда
Сообщить("Не найдены места на выбранном складе");
Возврат;
КонецЕсли;
Для каждого Стр Из ТзМеста Цикл
Сообщить(Стр.МестоХранения);
КонецЦикла;
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Дата",ТекущаяДата());
Запрос.УстановитьПараметр("МестоХранения", ТзМеста);
Запрос.Текст = "ВЫБРАТЬ
| ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура,
| """" КАК ХарактеристикаНоменклатуры,
| МАКСИМУМ(ТоварыНаСкладахОстатки.СерияНоменклатуры) КАК СерияНоменклатуры,
| ТоварыНаСкладахОстатки.Номенклатура.ЕдиницаХраненияОстатков как ЕдиницаИзмерения,
| 1 КАК Коэффициент,
| МестаХраненияНоменклатуры.МестоХранения,
| 0 КАК Количество // СУММА(ТоварыНаСкладахОстатки.КоличествоОстаток)
|ИЗ
| РегистрНакопления.ТоварыНаСкладах.Остатки(&Дата, ) КАК ТоварыНаСкладахОстатки
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.МестаХраненияНоменклатуры КАК МестаХраненияНоменклатуры
| ПО ТоварыНаСкладахОстатки.Номенклатура = МестаХраненияНоменклатуры.Номенклатура
|ГДЕ
| МестаХраненияНоменклатуры.МестоХранения В(&МестоХранения)
|
|СГРУППИРОВАТЬ ПО
| ТоварыНаСкладахОстатки.Номенклатура,
| МестаХраненияНоменклатуры.МестоХранения,
| ТоварыНаСкладахОстатки.Номенклатура.ЕдиницаХраненияОстатков
|
|УПОРЯДОЧИТЬ ПО
| ТоварыНаСкладахОстатки.Номенклатура.Наименование";
Объект[ИмяТабличнойЧасти].Загрузить(Запрос.Выполнить().Выгрузить());
КонецПроцедуры
Функция ЭтоЧисло(Стр)
Попытка
Стр = Стр * 1;
Возврат истина;
Исключение
Возврат ложь;
КонецПопытки;
КонецФункции // ЭтоЧисло()
Тестировалась на "Управление торговлей", редакция 10.3 (10.3.49.1) / 1С:Предприятие 8.3 (8.3.12.1685).