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

Хранилище

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

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



> Поиск подобных товаров по артикулам из перечня артикулов          
Talkman Подменю пользователя
сообщение 26.02.24, 13:47
Сообщение #1

Завсегдатай
****
Группа: Пользователи
Сообщений: 192
Из: Черкассы
Спасибо сказали: 10 раз
Рейтинг: 0

Добрый день. Нужен совет. Есть документ. В документе в ТЧ список товаров. Каждый товар имеет реквизит артикул типа ххххх/уууууу/сссссс. Тип строка, в значении реквизита несколько разных артикула разделенные слешем. Артикул может быть и один, тогда слеш отсутствует. Задача. При сохранении документа проверять есть ли на остатке товары с пересекающимися артикулами. Например, если в документе есть товар с артикулом 2222/5555 и на остатке в базе есть товар с артикулом 5555/7777, то это нужно сообщить.
Остановился на том, что заполнил массив артикулами из документа. ххххх/уууууу/сссссс = ххххх, уууууу, сссссс , а дальше стопорнулся. Как сделать в запросе, чтобы массив значений проверялся на подобие реквизита артикула?

 Запрос.Текст = 
        "ВЫБРАТЬ
        |   ТоварыНаСкладахОстатки.Номенклатура,
        |   ТоварыНаСкладахОстатки.КоличествоОстаток,
        |   ТоварыНаСкладахОстатки.Номенклатура.Артикул
        |ИЗ
        |   РегистрНакопления.ТоварыНаСкладах.Остатки(&Дата, &мАртикулов ПОДОБНО ""%"" + Номенклатура.Артикул + ""%"") КАК ТоварыНаСкладахОстатки";
    
    Запрос.УстановитьПараметр("Дата", Док.Дата);
    Запрос.УстановитьПараметр("мАртикулов", мАртикулы);


Это же явный бред, да?

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

AnryMc Подменю пользователя
сообщение 26.02.24, 14:20
Сообщение #2

Оратор
Иконка группы
Группа: Местный
Сообщений: 410
Спасибо сказали: 116 раз
Рейтинг: 118.8

КолвоЭл = мАртикулы .Количество;

Запрос.Текст =
        "ВЫБРАТЬ РАЗРЕШЕННЫЕ
        |   ТоварыНаСкладахОстатки.Номенклатура,
        |   ТоварыНаСкладахОстатки.КоличествоОстаток,
        |   ТоварыНаСкладахОстатки.Номенклатура.Артикул
        |ИЗ
        |   РегистрНакопления.ТоварыНаСкладах.Остатки(&Дата, Номенклатура.Артику ПОДОБНО ""%"" + мАртикулов + ""%"") КАК ТоварыНаСкладахОстатки";

Запрос.УстановитьПараметр("мАртикулов", мАртикулы[0]);

Ном= 1;

Пока Ном <= КолвоЭл  Цикл

Запрос.Текст = Запрос.Текст +
        "ОБЪЕДИНИТЬ
        |ВЫБРАТЬ
        |   ТоварыНаСкладахОстатки.Номенклатура,
        |   ТоварыНаСкладахОстатки.КоличествоОстаток,
        |   ТоварыНаСкладахОстатки.Номенклатура.Артикул
        |ИЗ
        |   РегистрНакопления.ТоварыНаСкладах.Остатки(&Дата, Номенклатура.Артику ПОДОБНО ""%"" + мАртикулов + ""%"") КАК ТоварыНаСкладахОстатки";

Запрос.УстановитьПараметр("мАртикулов", мАртикулы[Ном ]);

Ном = Ном + 1;

КонецЦикла;
    
    Запрос.УстановитьПараметр("Дата", Док.Дата);


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

Talkman Подменю пользователя
сообщение 26.02.24, 14:31
Сообщение #3

Завсегдатай
****
Группа: Пользователи
Сообщений: 192
Из: Черкассы
Спасибо сказали: 10 раз
Рейтинг: 0

Цитата(AnryMc @ 26.02.24, 15:20) *
КолвоЭл = мАртикулы .Количество;

Запрос.Текст =
        "ВЫБРАТЬ РАЗРЕШЕННЫЕ
        |   ТоварыНаСкладахОстатки.Номенклатура,
        |   ТоварыНаСкладахОстатки.КоличествоОстаток,
        |   ТоварыНаСкладахОстатки.Номенклатура.Артикул
        |ИЗ
        |   РегистрНакопления.ТоварыНаСкладах.Остатки(&Дата, Номенклатура.Артику ПОДОБНО ""%"" + мАртикулов + ""%"") КАК ТоварыНаСкладахОстатки";

Запрос.УстановитьПараметр("мАртикулов", мАртикулы[0]);

Ном= 1;

Пока Ном <= КолвоЭл  Цикл

Запрос.Текст = Запрос.Текст +
        "ОБЪЕДИНИТЬ
        |ВЫБРАТЬ
        |   ТоварыНаСкладахОстатки.Номенклатура,
        |   ТоварыНаСкладахОстатки.КоличествоОстаток,
        |   ТоварыНаСкладахОстатки.Номенклатура.Артикул
        |ИЗ
        |   РегистрНакопления.ТоварыНаСкладах.Остатки(&Дата, Номенклатура.Артику ПОДОБНО ""%"" + мАртикулов + ""%"") КАК ТоварыНаСкладахОстатки";

Запрос.УстановитьПараметр("мАртикулов", мАртикулы[Ном ]);

Ном = Ном + 1;

КонецЦикла;
    
    Запрос.УстановитьПараметр("Дата", Док.Дата);



Выглядит изящно. Пробую. Спасибо.

Talkman @ Сегодня, 15:26 * ,
Вопрос к параметру запроса мАртикулов. Он при выполнении запроса не будет иметь значение последнего элемента для всех подзапросов? Его в тексте запроса нумеровать не нужно?

AnryMc Подменю пользователя
сообщение 26.02.24, 14:43
Сообщение #4

Оратор
Иконка группы
Группа: Местный
Сообщений: 410
Спасибо сказали: 116 раз
Рейтинг: 118.8

Цитата(Talkman @ 26.02.24, 15:31) *
Вопрос к параметру запроса мАртикулов. Он при выполнении запроса не будет иметь значение последнего элемента для всех подзапросов? Его в тексте запроса нумеровать не нужно?



Нумерация в массиве с 0, т.е. на 1 меньше количества в массиве

Пока Ном < КолвоЭл  Цикл





Цитата(Talkman @ 26.02.24, 15:31) *
"ОБЪЕДИНИТЬ


Надо
"|ОБЪЕДИНИТЬ

Писал на "вскидку" могут быть "очепатки"

Talkman Подменю пользователя
сообщение 26.02.24, 14:50
Сообщение #5

Завсегдатай
****
Группа: Пользователи
Сообщений: 192
Из: Черкассы
Спасибо сказали: 10 раз
Рейтинг: 0

|   РегистрНакопления.ТоварыНаСкладах.Остатки(&Дата, Номенклатура.Артику ПОДОБНО ""%"" + мАртикулов + ""%"") КАК ТоварыНаСкладахОстатки";


Данная строка в цикле. Я правильно понимаю, что параметр в цикле нужно номеровать по текущему "Ном"? Или запрос при выполнении установки параметра не будет трогать параметры установленые ранее?

Talkman @ Сегодня, 15:49 * ,
|   РегистрНакопления.ТоварыНаСкладах.Остатки(&Дата, Номенклатура.Артику ПОДОБНО ""%"" + мАртикулов"+Ном+" + ""%"") КАК ТоварыНаСкладахОстатки";

?

nik389 Подменю пользователя
сообщение 26.02.24, 14:55
Сообщение #6

Завсегдатай
****
Группа: Пользователи
Сообщений: 162
Из: Украина
Спасибо сказали: 39 раз
Рейтинг: 36

Talkman @ Сегодня, 14:47 * ,
я б зробив дещо по-іншому. Артикули зберігав не у рядку, а зробив би табличну частину "артикули" в довіднику товарів. Це набагато спрощує побудову запитів

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

Оратор
Иконка группы
Группа: Местный
Сообщений: 410
Спасибо сказали: 116 раз
Рейтинг: 118.8

Цитата(Talkman @ 26.02.24, 15:31) *
ПОДОБНО ""%"" + &мАртикулов + ""%""



Мне больще нравится:
Номенклатура.Артику ПОДОБНО &мАртикулов

Запрос.УстановитьПараметр("мАртикулов", "%"+СокрЛП(мАртикулов[Ном])+"%");

Talkman Подменю пользователя
сообщение 26.02.24, 15:12
Сообщение #8

Завсегдатай
****
Группа: Пользователи
Сообщений: 192
Из: Черкассы
Спасибо сказали: 10 раз
Рейтинг: 0

nik389 @ Сегодня, 15:55 * ,
Воно то так і є, тільки проблема в користувачах, які давним давно забили вводити новий артикул через табличну частину. Їм мабудь зручніше зламати структуру даних чим вводити все по правилам.

AnryMc @ Сегодня, 15:55 * ,
Это я понял. Я о том, что в листинге запроса я сделал
ВЫБРАТЬ РАЗРЕШЕННЫЕ
   ТоварыНаСкладахОстатки.Номенклатура,
   ТоварыНаСкладахОстатки.КоличествоОстаток,
   ТоварыНаСкладахОстатки.Номенклатура.Артикул
ИЗ
   РегистрНакопления.ТоварыНаСкладах.Остатки(&Дата, Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов0 + "%" И НЕ Номенклатура.Ссылка в (&МТов)) КАК ТоварыНаСкладахОстатки
ОБЪЕДИНИТЬ
ВЫБРАТЬ
   ТоварыНаСкладахОстатки.Номенклатура,
   ТоварыНаСкладахОстатки.КоличествоОстаток,
   ТоварыНаСкладахОстатки.Номенклатура.Артикул
ИЗ
   РегистрНакопления.ТоварыНаСкладах.Остатки(&Дата, Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов1+ "%" И НЕ Номенклатура.Ссылка в (&МТов)) КАК ТоварыНаСкладахОстатки
ОБЪЕДИНИТЬ
ВЫБРАТЬ
   ТоварыНаСкладахОстатки.Номенклатура,
   ТоварыНаСкладахОстатки.КоличествоОстаток,
   ТоварыНаСкладахОстатки.Номенклатура.Артикул
ИЗ
   РегистрНакопления.ТоварыНаСкладах.Остатки(&Дата, Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов2+ "%" И НЕ Номенклатура.Ссылка в (&МТов)) КАК ТоварыНаСкладахОстатки
ОБЪЕДИНИТЬ
ВЫБРАТЬ
   ТоварыНаСкладахОстатки.Номенклатура,
   ТоварыНаСкладахОстатки.КоличествоОстаток,
   ТоварыНаСкладахОстатки.Номенклатура.Артикул
ИЗ
   РегистрНакопления.ТоварыНаСкладах.Остатки(&Дата, Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов3+ "%" И НЕ Номенклатура.Ссылка в (&МТов)) КАК ТоварыНаСкладахОстатки


И вносил параметр как
Запрос.УстановитьПараметр("мАртикулов"+Ном, мАртикулы[Ном]);


Ну и добавил условие, чтобы найденые товары не являлись товарами из документа. Вроде работает, но не быстро... И никак же не ускоришь...

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

Оратор
Иконка группы
Группа: Местный
Сообщений: 410
Спасибо сказали: 116 раз
Рейтинг: 118.8

Цитата(Talkman @ 26.02.24, 15:50) *
| РегистрНакопления.ТоварыНаСкладах.Остатки(&Дата, Номенклатура.Артику ПОДОБНО ""%"" + мАртикулов"+Ном+" + ""%"") КАК ТоварыНаСкладахОстатки";



Так правильно
Ну и устанавливать параметр тоже с Ном.

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

Talkman Подменю пользователя
сообщение 26.02.24, 15:17
Сообщение #10

Завсегдатай
****
Группа: Пользователи
Сообщений: 192
Из: Черкассы
Спасибо сказали: 10 раз
Рейтинг: 0

AnryMc @ Сегодня, 15:55 * ,
Вот я как раз про это. Как работает установить параметр? Если в запросе всегда мАртикулов и он устанавливается в цикле, не будет такого, что на последней итерации циклом параметр мАртикулов установиться значением последней итерации для всех(!) подзапросов?

Цитата(AnryMc @ 26.02.24, 15:55) *
Мне больще нравится:
Номенклатура.Артику ПОДОБНО &мАртикулов

Запрос.УстановитьПараметр("мАртикулов", "%"+СокрЛП(мАртикулов[Ном])+"%");


Параметр передается 33333. Артикул 33333/2222/7777.
33333/2222/7777 ПОДОБНО "%"+33333+"%" разве сработает?

AnryMc Подменю пользователя
сообщение 26.02.24, 15:29
Сообщение #11

Оратор
Иконка группы
Группа: Местный
Сообщений: 410
Спасибо сказали: 116 раз
Рейтинг: 118.8

Цитата(Talkman @ 26.02.24, 16:12) *
Вроде работает, но не быстро... И никак же не ускоришь..



Если у вас фиксированное количество параметров то можно попробовать написать 1 запрос (одна выборка)
и условие давать в "ГДЕ"
ГДЕ
Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов1+ "%"
ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов2+ "%"
ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов3+ "%"
ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов4+ "%"

а НЕ Номенклатура.Ссылка в (&МТов)
оставить в условиях таблицы выборки

P.S. Лишне условия потом можно убрать от реального количества параметров

Если КоличествоПараметров = 2 Тогда

Запрос.Текст = СтрЗаменить(Запрос.Текст, "ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов3+ "%", "");
Запрос.Текст = СтрЗаменить(Запрос.Текст, "ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов4+ "%", "");

ИначеЕсли КоличествоПараметров = 3 Тогда

Запрос.Текст = СтрЗаменить(Запрос.Текст, "ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов4+ "%", "");

Т.е. сделать "исходный" запрос по максимуму а патом от размера массива лишнее убрать

Сообщение отредактировал AnryMc - 26.02.24, 15:34

Talkman Подменю пользователя
сообщение 26.02.24, 16:05
Сообщение #12

Завсегдатай
****
Группа: Пользователи
Сообщений: 192
Из: Черкассы
Спасибо сказали: 10 раз
Рейтинг: 0

AnryMc @ Сегодня, 16:29 * ,
Ну, фиксированное оно условно только. Размерностью массива артикулов...

ВЫБРАТЬ РАЗРЕШЕННЫЕ
   ТоварыНаСкладахОстатки.Номенклатура,
   ТоварыНаСкладахОстатки.КоличествоОстаток,
   ТоварыНаСкладахОстатки.Номенклатура.Артикул
ИЗ
   РегистрНакопления.ТоварыНаСкладах.Остатки(&Дата, (Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов0+ "%" ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов1+ "%" ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов2+ "%"
ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов3+ "%" ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов4+ "%" ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов5+ "%" ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов6+ "%"
ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов7+ "%" ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов8+ "%" ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов9+ "%" ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов10+ "%"
ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов11+ "%"
ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов12+ "%" ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов13+ "%" ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов14+ "%" ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов15+ "%"
ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов16+ "%" ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов17+ "%" ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов18+ "%" ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов19+ "%"
ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов20+ "%" ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов21+ "%" ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов22+ "%" ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов23+ "%"
ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов24+ "%" ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов25+ "%" ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов26+ "%" ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов27+ "%"
ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов28+ "%" ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов29+ "%" ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов30+ "%" ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов31+ "%"
ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов32+ "%" ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов33+ "%" ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов34+ "%" ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов35+ "%"
ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов36+ "%" ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов37+ "%" ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов38+ "%" ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов39+ "%"
ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов40+ "%" ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов41+ "%" ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов42+ "%" ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов43+ "%"
ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов44+ "%" ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов45+ "%" ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов46+ "%" ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов47+ "%"
ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов48+ "%" ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов49+ "%" ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов50+ "%" ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов51+ "%"
ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов52+ "%" ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов53+ "%" ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов54+ "%" ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов55+ "%"
ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов56+ "%" ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов57+ "%" ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов58+ "%" ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов59+ "%"
ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов60+ "%" ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов61+ "%" ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов62+ "%" ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов63+ "%"
ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов64+ "%" ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов65+ "%" ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов66+ "%" ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов67+ "%"
ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов68+ "%" ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов69+ "%" ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов70+ "%" ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов71+ "%"
ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов72+ "%" ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов73+ "%" ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов74+ "%" ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов75+ "%"
ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов76+ "%" ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов77+ "%" ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов78+ "%" ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов79+ "%"
ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов80+ "%" ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов81+ "%" ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов82+ "%" ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов83+ "%"
ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов84+ "%" ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов85+ "%" ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов86+ "%" ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов87+ "%"
ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов88+ "%" ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов89+ "%" ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов90+ "%" ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов91+ "%"
ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов92+ "%" ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов93+ "%") И НЕ Номенклатура.Ссылка в (&МТов)) КАК ТоварыНаСкладахОстатки



Вот так вроде существенно быстрее. Извиняюсь за формат листинга.

Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ РАЗРЕШЕННЫЕ
        |   ТоварыНаСкладахОстатки.Номенклатура,
        |   ТоварыНаСкладахОстатки.КоличествоОстаток,
        |   ТоварыНаСкладахОстатки.Номенклатура.Артикул
        |ИЗ
        |   РегистрНакопления.ТоварыНаСкладах.Остатки(&Дата, &УсловиеАртикулов И НЕ Номенклатура.Ссылка в (&МТов)) КАК ТоварыНаСкладахОстатки "+Символы.ПС;
    
    УсловиеАртикулов = "(Номенклатура.Артикул ПОДОБНО ""%"" + &мАртикулов0+ ""%""";
    //Запрос.УстановитьПараметр("мАртикулов0", мАртикулы[0]);
    
    Ном=1;
    
    Пока Ном < КолвоЭл  Цикл
        
        УсловиеАртикулов = УсловиеАртикулов + " ИЛИ Номенклатура.Артикул ПОДОБНО ""%"" + &мАртикулов"+Ном+"+ ""%""";
        //Запрос.УстановитьПараметр("мАртикулов"+Ном, мАртикулы[Ном]);
        Ном = Ном + 1;
        
    КонецЦикла;
    УсловиеАртикулов = УсловиеАртикулов+")";
    Запрос.Текст = СтрЗаменить(Запрос.Текст,"&УсловиеАртикулов",УсловиеАртикулов);
    Запрос.УстановитьПараметр("мАртикулов0", мАртикулы[0]);
    Ном=1;
    Пока Ном < КолвоЭл  Цикл
        
        Запрос.УстановитьПараметр("мАртикулов"+Ном, мАртикулы[Ном]);
        Ном = Ном + 1;
        
    КонецЦикла;
    
    Запрос.УстановитьПараметр("мТов", мТовары);
    Запрос.УстановитьПараметр("Дата", Док.Дата);    
    тРез = Запрос.Выполнить().Выгрузить();


Теперь бы еще парсинг артикулов для товаров из документа ускорить...

AnryMc Подменю пользователя
сообщение 26.02.24, 16:20
Сообщение #13

Оратор
Иконка группы
Группа: Местный
Сообщений: 410
Спасибо сказали: 116 раз
Рейтинг: 118.8

Цитата(Talkman @ 26.02.24, 17:05) *
еперь бы еще парсинг артикулов для товаров из документа ускорить...



А артикул фиксированной (одинаковой) длины всегда?

Talkman Подменю пользователя
сообщение 26.02.24, 16:30
Сообщение #14

Завсегдатай
****
Группа: Пользователи
Сообщений: 192
Из: Черкассы
Спасибо сказали: 10 раз
Рейтинг: 0

AnryMc @ Сегодня, 17:20 * ,
Нет, к несчастью. Он может быть вида %X%/%Y%/%Z%, может вида ХХХХХ, может ХХХХХ-12, может %X%/%Y%. Я не вижу вариантов как по другому, кроме посимвольно. При том, что если в артикуле есть "-", к примеру МММММ-12/ООООО58 артикулы брать МММММ и ООООО58.

Сейчас так.
Для каждого Зап Из ТЗ Цикл
        Зап.Артикул = Зап.Номенклатура.Артикул;
        СтрокаАртикулы = "";
        Если Зап.Артикул <> "" Тогда
            Если Найти(Зап.Артикул,"-") > 0 ИЛИ Найти(Зап.Артикул,"/") > 0 Тогда
                СтрокаАртикулы = "";
                ПредСимвол = 0;
                Для Инд = 1 По СтрДлина(Зап.Артикул) Цикл
                    Симв = Сред(Зап.Артикул,Инд,1);
                    Если Симв = "/" ТОгда
                        Если ПредСимвол <> -1 Тогда
                            СтрокаАртикулы = СтрокаАртикулы + Сред(Зап.Артикул,ПредСимвол+1,Инд - 1 - ПредСимвол)+" ";
                            мАртикулы.Добавить(Сред(Зап.Артикул,ПредСимвол+1,Инд - 1 - ПредСимвол));
                            НовЗапАрт = тАрт.Добавить();
                            НовЗапАрт.Номенклатура = Зап.Номенклатура;
                            НовЗапАрт.Артикул = Сред(Зап.Артикул,ПредСимвол+1,Инд - 1 - ПредСимвол);
                            ПредСимвол = Инд;
                        Иначе    
                            ПредСимвол = Инд;
                        КонецЕсли;    
                    КонецЕсли;
                    Если Симв = "-" Тогда
                        СтрокаАртикулы = СтрокаАртикулы + Сред(Зап.Артикул,ПредСимвол+1,Инд - 1 - ПредСимвол)+" ";
                        мАртикулы.Добавить(Сред(Зап.Артикул,ПредСимвол+1,Инд - 1 - ПредСимвол));
                        НовЗапАрт = тАрт.Добавить();
                        НовЗапАрт.Номенклатура = Зап.Номенклатура;
                        НовЗапАрт.Артикул = Сред(Зап.Артикул,ПредСимвол+1,Инд - 1 - ПредСимвол);
                        ПредСимвол = -1;
                    КонецЕсли;
                КонецЦикла;
                Если ПредСимвол <> -1 Тогда
                    СтрокаАртикулы = СтрокаАртикулы + Сред(Зап.Артикул,ПредСимвол+1,СтрДлина(Зап.Артикул)-ПредСимвол)+" ";
                    мАртикулы.Добавить(Сред(Зап.Артикул,ПредСимвол+1,СтрДлина(Зап.Артикул)-ПредСимвол));
                    НовЗапАрт = тАрт.Добавить();
                    НовЗапАрт.Номенклатура = Зап.Номенклатура;
                    НовЗапАрт.Артикул = Сред(Зап.Артикул,ПредСимвол+1,СтрДлина(Зап.Артикул)-ПредСимвол);
                КонецЕсли;
            Иначе    
                СтрокаАртикулы = Зап.Артикул;
                мАртикулы.Добавить(Зап.Артикул);
                НовЗапАрт = тАрт.Добавить();
                НовЗапАрт.Номенклатура = Зап.Номенклатура;
                НовЗапАрт.Артикул = Зап.Артикул;
            КонецЕсли;
            Зап.Рез = СтрокаАртикулы;
        КонецЕсли;
    КонецЦикла;


Talkman @ Сегодня, 17:26 * ,
1. Если нет "-" и "/" берем весь артикул.
2. Парсим посимвольно. Если есть "-" - берем артикул до"-" от предыдущего начального символа. Запоминаем что следующая "/" будет начальной.
3. Если "/", тогда проверяем, не было ли раньше "-". Если не было - берем артикул от начального символа до "/". Ставим нач символ на позицию "/". Если "-" был, просто ставим нач. символ на позицию "/".
и т.д
4. -1 - показатель, что артикул уже взят и его еще раз брать не нужно.

AnryMc Подменю пользователя
сообщение 26.02.24, 16:51
Сообщение #15

Оратор
Иконка группы
Группа: Местный
Сообщений: 410
Спасибо сказали: 116 раз
Рейтинг: 118.8

СтрокаАртикулов = Зап.Номенклатура.Артикул;

мАртикулов = НОВЫЙ ТалицаЗначений;
мАртикулов.Колонки.Добавить("Артикул");

ЕстьРазделитель = СтрНайти(СтрокаАртикулов , "/");

Пока ЕстьРазделитель  > 0 Цикл

//выделяем текущий артикул

текАртикул = Лев(СтрокаАртикулов , ЕстьРазделитель - 1);

//Проверим и обработаем "-"

ЕстьДефис = СтрНайти(текАртикул , "-");

Если ЕстьДефис > 0 Тогда

текАртикул = Лев(текАртикул, ЕстьДефис -1);

КонецЕсли;

нс = мАртикулов.Добавить(текАртикул );

нс.Артикул = текАртикул;

СтрокаАртикулов = ПРав(СтрокаАртикулов, СтрДлина(СтрокаАртикулов) - ЕстьРазделитель;

ЕстьРазделитель = СтрНайти(СтрокаАртикулов, "/");

КонецЦикла;

//Удалим повторы артикулов
мАртикулов.Свернуть("Артикул");

//Если надо преобразуем в массив

МойМассив = мАртикулов.ВыгрузитьКолонку("Артикул")


Как то так....

Сообщение отредактировал AnryMc - 26.02.24, 17:04

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

Talkman Подменю пользователя
сообщение 26.02.24, 17:02
Сообщение #16

Завсегдатай
****
Группа: Пользователи
Сообщений: 192
Из: Черкассы
Спасибо сказали: 10 раз
Рейтинг: 0

AnryMc @ Сегодня, 17:51 * ,
Звучит отлично. Немного позже попробую. Спасибо. Вопрос только в том насколько быстрее будет smile.gif

AnryMc Подменю пользователя
сообщение 26.02.24, 17:19
Сообщение #17

Оратор
Иконка группы
Группа: Местный
Сообщений: 410
Спасибо сказали: 116 раз
Рейтинг: 118.8

Цитата(Talkman @ 26.02.24, 18:02) *
Вопрос только в том насколько быстрее будет


Думаю быстрее чем посимвольный перебор

Talkman Подменю пользователя
сообщение 26.02.24, 18:38
Сообщение #18

Завсегдатай
****
Группа: Пользователи
Сообщений: 192
Из: Черкассы
Спасибо сказали: 10 раз
Рейтинг: 0

AnryMc @ Сегодня, 18:19 * ,
Что то пошло не так. Последний алгоритм находит существенно меньше товаров. Видимо последнюю запись после "/" не видит. И не учтен вариант, когда "/" нет вообще. Что то придумаю smile.gif

AnryMc Подменю пользователя
сообщение 27.02.24, 9:42
Сообщение #19

Оратор
Иконка группы
Группа: Местный
Сообщений: 410
Спасибо сказали: 116 раз
Рейтинг: 118.8

Цитата(Talkman @ 26.02.24, 19:38) *
Видимо последнюю запись после "/" не видит. И не учтен вариант, когда "/" нет вообще


Да, не учёл это

AnryMc Подменю пользователя
сообщение 27.02.24, 14:25
Сообщение #20

Оратор
Иконка группы
Группа: Местный
Сообщений: 410
Спасибо сказали: 116 раз
Рейтинг: 118.8

Talkman @ Вчера, 19:38 * ,

После окончания цикла:

Если СокрЛП(СтрокаАртикулов ) <> "" Тогда


Это будет часть после последнего "/" или вся строка без "/"

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


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

 

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