Добрый день. Нужен совет. Есть документ. В документе в ТЧ список товаров. Каждый товар имеет реквизит артикул типа ххххх/уууууу/сссссс. Тип строка, в значении реквизита несколько разных артикула разделенные слешем. Артикул может быть и один, тогда слеш отсутствует. Задача. При сохранении документа проверять есть ли на остатке товары с пересекающимися артикулами. Например, если в документе есть товар с артикулом 2222/5555 и на остатке в базе есть товар с артикулом 5555/7777, то это нужно сообщить. Остановился на том, что заполнил массив артикулами из документа. ххххх/уууууу/сссссс = ххххх, уууууу, сссссс , а дальше стопорнулся. Как сделать в запросе, чтобы массив значений проверялся на подобие реквизита артикула?
Talkman @ Сегодня, 15:26
, Вопрос к параметру запроса мАртикулов. Он при выполнении запроса не будет иметь значение последнего элемента для всех подзапросов? Его в тексте запроса нумеровать не нужно?
Группа: Местный
Сообщений: 410
Спасибо сказали: 116 раз
Рейтинг: 118.8
Цитата(Talkman @ 26.02.24, 15:31)
Вопрос к параметру запроса мАртикулов. Он при выполнении запроса не будет иметь значение последнего элемента для всех подзапросов? Его в тексте запроса нумеровать не нужно?
Нумерация в массиве с 0, т.е. на 1 меньше количества в массиве
| РегистрНакопления.ТоварыНаСкладах.Остатки(&Дата, Номенклатура.Артику ПОДОБНО ""%"" + мАртикулов + ""%"") КАК ТоварыНаСкладахОстатки";
Данная строка в цикле. Я правильно понимаю, что параметр в цикле нужно номеровать по текущему "Ном"? Или запрос при выполнении установки параметра не будет трогать параметры установленые ранее?
Talkman @ Сегодня, 15:49
,
| РегистрНакопления.ТоварыНаСкладах.Остатки(&Дата, Номенклатура.Артику ПОДОБНО ""%"" + мАртикулов"+Ном+" + ""%"") КАК ТоварыНаСкладахОстатки";
Группа: Пользователи
Сообщений: 162
Из: Украина
Спасибо сказали: 39 раз
Рейтинг: 36
Talkman @ Сегодня, 14:47
, я б зробив дещо по-іншому. Артикули зберігав не у рядку, а зробив би табличну частину "артикули" в довіднику товарів. Це набагато спрощує побудову запитів
nik389 @ Сегодня, 15:55
, Воно то так і є, тільки проблема в користувачах, які давним давно забили вводити новий артикул через табличну частину. Їм мабудь зручніше зламати структуру даних чим вводити все по правилам.
AnryMc @ Сегодня, 15:55
, Это я понял. Я о том, что в листинге запроса я сделал
ВЫБРАТЬ РАЗРЕШЕННЫЕ ТоварыНаСкладахОстатки.Номенклатура, ТоварыНаСкладахОстатки.КоличествоОстаток, ТоварыНаСкладахОстатки.Номенклатура.Артикул ИЗ РегистрНакопления.ТоварыНаСкладах.Остатки(&Дата, Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов0 + "%" И НЕ Номенклатура.Ссылка в (&МТов)) КАК ТоварыНаСкладахОстатки ОБЪЕДИНИТЬ ВЫБРАТЬ ТоварыНаСкладахОстатки.Номенклатура, ТоварыНаСкладахОстатки.КоличествоОстаток, ТоварыНаСкладахОстатки.Номенклатура.Артикул ИЗ РегистрНакопления.ТоварыНаСкладах.Остатки(&Дата, Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов1+ "%" И НЕ Номенклатура.Ссылка в (&МТов)) КАК ТоварыНаСкладахОстатки ОБЪЕДИНИТЬ ВЫБРАТЬ ТоварыНаСкладахОстатки.Номенклатура, ТоварыНаСкладахОстатки.КоличествоОстаток, ТоварыНаСкладахОстатки.Номенклатура.Артикул ИЗ РегистрНакопления.ТоварыНаСкладах.Остатки(&Дата, Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов2+ "%" И НЕ Номенклатура.Ссылка в (&МТов)) КАК ТоварыНаСкладахОстатки ОБЪЕДИНИТЬ ВЫБРАТЬ ТоварыНаСкладахОстатки.Номенклатура, ТоварыНаСкладахОстатки.КоличествоОстаток, ТоварыНаСкладахОстатки.Номенклатура.Артикул ИЗ РегистрНакопления.ТоварыНаСкладах.Остатки(&Дата, Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов3+ "%" И НЕ Номенклатура.Ссылка в (&МТов)) КАК ТоварыНаСкладахОстатки
AnryMc @ Сегодня, 15:55
, Вот я как раз про это. Как работает установить параметр? Если в запросе всегда мАртикулов и он устанавливается в цикле, не будет такого, что на последней итерации циклом параметр мАртикулов установиться значением последней итерации для всех(!) подзапросов?
Цитата(AnryMc @ 26.02.24, 15:55)
Мне больще нравится: Номенклатура.Артику ПОДОБНО &мАртикулов
Группа: Местный
Сообщений: 410
Спасибо сказали: 116 раз
Рейтинг: 118.8
Цитата(Talkman @ 26.02.24, 16:12)
Вроде работает, но не быстро... И никак же не ускоришь..
Если у вас фиксированное количество параметров то можно попробовать написать 1 запрос (одна выборка) и условие давать в "ГДЕ" ГДЕ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов1+ "%" ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов2+ "%" ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов3+ "%" ИЛИ Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов4+ "%"
а НЕ Номенклатура.Ссылка в (&МТов) оставить в условиях таблицы выборки
P.S. Лишне условия потом можно убрать от реального количества параметров
ВЫБРАТЬ РАЗРЕШЕННЫЕ ТоварыНаСкладахОстатки.Номенклатура, ТоварыНаСкладахОстатки.КоличествоОстаток, ТоварыНаСкладахОстатки.Номенклатура.Артикул ИЗ РегистрНакопления.ТоварыНаСкладах.Остатки(&Дата, (Номенклатура.Артикул ПОДОБНО "%" + &мАртикулов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; Пока Ном < КолвоЭл Цикл
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 @ Сегодня, 18:19
, Что то пошло не так. Последний алгоритм находит существенно меньше товаров. Видимо последнюю запись после "/" не видит. И не учтен вариант, когда "/" нет вообще. Что то придумаю
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!