Як видалити з вибірки дублі по двох полях. Шукав відповідь в мережі, нічого знайти не зміг, довелося робити самому, можливо кому - то це стане в нагоді.
Шукав відповідь в мережі, нічого знайти не зміг, довелося робити самому, можливо кому - то це стане в нагоді.
Контекст завдання: писав обробку для УТ 11.1, яка заповнювала допоміжний періодичний незалежний регістр відомостей за даними з проведених документів ПоступленіеТоваровУслуг. Вимірювання регістра - Номенклатура, ресурс - ціна. Специфіка бізнесу така, що постачальники в одному прибутковому документі ставили одну і ту ж номенклатуру за різними цінами. Було потрібно вибрати з пакета записів по полях «Дата» і «Номенклатура» запис з максимальною ціною. Інакше регістр відмовлявся сприймати дані. Заодно потрібно було виключити послуги.
Мета роботи - швидко одноразово отримати потрібні для задач управлінського обліку цифри з "запущених" і бази.
Код процедури що виконується на сервері.
Процедура НаСервереЗаполняемРегістрЦениЗакупа (НашаДата)
// Очищаємо регістр.
НаборЗапісей = РегістриСведеній. ЦениЗакупаАнадо. СоздатьНаборЗапісей ();
НаборЗапісей. Записати ();
// Заповнюємо реєстр даними
Поки Результат. Наступний () Цикл
Якщо (Результат.Номенклатура = НоменклатураДляПроверкі) І (Результат.Дата = ДатаДляПроверкі) Тоді
продовжити;
інакше
НоменклатураДляПроверкі = Результат. номенклатура;
ДатаДляПроверкі = Результат. Дата;
НовЗапісь = НаборЗапісей. Додати ();
НовЗапісь.Період = Результат. Дата;
НовЗапісь. Номенклатура = Результат. номенклатура;
НовЗапісь. Ціна = Результат. Ціна;
КонецЕсли;
КонецЦікла;
НаборЗапісей. Записати (Істина);
Код сам по собі досить простий. У запиті я виробляю упорядкування вибірки - за датою, потім по номенклатурі і за ціною. Цiна - за зменшенням. Далі використовуючи допоміжні змінні в тілі циклу, виробляю відкидання дублів. Все працює, код читаємо.
9. Петро Івакін (Petr54-ru) 51 18.11.13 21:49 Зараз в темі
(1) sanek_gk, ви написали чудовий запит, однак мені потрібні були дещо інші дані. Як вірно тут написав ShantinTD -
в даному коді є прийом, який як раз таки може стати в нагоді. Не часто, але може.
(Про всяк випадок поясню, що прийом цей - порівняння з поточною номенклатурою на кожному кроці, і дію тільки в разі відхилення від потрібної.)
Ще раз і більш детально, я за допомогою обробки заливаю дані у допоміжний регістр відомостей - незалежний, з періодом в одну секунду. Далі я можу звідти смикати куди завгодно потрібні мені дані, використовуючи - СрезПоследніх () і СрезПервих (). На то і регістри, щоб звідти брати дані.
(5) ShantinTD, ага, ви абсолютно вірно зрозуміли про поточну номенклатуру на кожному кроці, і з вашою ідеєю про те що цикли шкодять продуктивності і що все потрібно отримувати одним запитом можна не погодитися. Ви навіть почали писати сам запит, хотілося б побачити такий запит, який би вирішував цю задачу. Я це в розумні терміни придумати не зміг.
Я на це яким чином дивлюся, якщо перед програмістом постало завдання, яку він з нальоту вирішити не зміг (кінець тижня, кінець дня, людина почала трохи тупити) і програміст поліз гуглити, знайшов чужий код, зрозумів його, свої думки в голову прийшли, написав свій код, вирішив задачу. Я як раз для подібних ситуацій написав статтю.
Що стосується рідного регістра ЦениНоменклатури. У цього регістра штатно встановлена періодичність в межах дня. Я зраджував період на в межах секунди на УТ 11.0, все нормально було, зараз УТ 11.1, є ймовірність що зміни періодичності може зламати логіку програми. Тут так просто не можна, треба тестувати. Як я вже писав, в прибутковій накладній від постачальників є одні й ті ж товари за різними цінами. Ця специфіка бізнесу не вкладається в логіку УТ 11. Так буває.
Так, параметр, який передається в процедуру він не зайвий.
дивлячись на запит з (0) так не скажеш. У запит потрібно повернути випав шматок тексту (власне параметр в тексті запиту).
Ви навіть почали писати сам запит
да його переді мною вже написав sanek_gk в (1).
хотілося б побачити такий запит, який би вирішував цю задачу
тоді не зовсім розумію, чим наведений у (1) запит не підпадає під Вашу задачу.
Що стосується рідного регістра ЦениНоменклатури
Вам запропонували скористатися регістром ЦениНоменклатуриПоставщіков, а у нього періодичність в межах секунди.
з вашою ідеєю про те що цикли шкодять продуктивності і що все потрібно отримувати одним запитом можна не погодитися
з результату запиту можна отримати вибірку, а можна - вивантаження. Вивантаження може бути таблицею або деревом. І набір записів регістру - теж таблиця. Відчуваєте? Навіщо переписувати від руки, якщо можна зробити ксерокопію?
Що стосується рідного регістра ЦениНоменклатури. У цього регістра штатно встановлена періодичність в межах дня.
У мене під руками УТ11.1.2.16 Базова (не думаю, що в цьому питанні це критично), у регістра ЦениНоменклатури періодичність в межах секунди.
якщо перед програмістом постало завдання, яку він з нальоту вирішити не зміг
згоден, бувають ситуації, коли грамотне рішення вимагає занадто багато часу, ретельного опрацювання або ще чогось, то робиш "аварійне" рішення, потім переробляєш нормально. І потрібно розділяти "проблеми" на технічні (не можеш написати хороший запит і вивантажити його результат в набір записів - пишеш запит простіше і заштовхували в регістр поштучно) і концептуальні ( "що і куди я буду записувати?"). У рішенні технічних проблем, звичайно, гугл допоможе, а ось концептуальних - далеко не завжди. Але і тут не потрібно поспішати винаходити велосипед: є Бібліотека Стандартних Підсистем, є типові конфігурації, є рекомендації, є глобальні концепції. Так що цілком може знайтися майже відповідний велосипед, до якого доведеться прикрутити свої колеса.
5. Тимофій Шантін (ShantinTD) 85 18.11.13 9:34 Зараз в темі
Як видалити з вибірки дублі по двох полях.
Тут, мабуть, покладався питання. Тоді питання зустрічний: з якої вибірки? Вибірка з результату запиту? Тоді просто запит потрібно скласти так, щоб не залишилося дублів, тобто "ЗАПИТОМ ВИДАЛИТИ дубль!". Якщо вибірка це СправочнікВиборка або ДокументВиборка (або інше), то це окрема історія.
людина писала статтю в п'ятницю ввечері. Разом з тим, що в запит передається зайвий параметр - зрозуміло, що шматок рядка із запиту просто відрізаний.
Проте, згоден, що наведений код для даного завдання абсолютно неприйнятний. Звичайно, потрібно використовувати правильно написаний запит. І обійтися без циклу, наприклад, щось типу
Варто було б розуміти чому регістр відмовляється робити записи з однаковою номенклатурою
Так варто було б розуміти взагалі що ти робиш. І що вже зробили до тебе (і для тебе в тому числі). Тоді замість ізобретанія велосипеда можна буде на ньому відразу кататися.
"Код читаємо", але "не розуміємо"
а що саме не зрозуміло?
сподіваюся нікому цей код не знадобиться хіба що для наочного посібника як не потрібно робити
в даному коді є прийом, який як раз таки може стати в нагоді. Не часто, але може.
(Про всяк випадок поясню, що прийом цей - порівняння з поточною номенклатурою на кожному кроці, і дію тільки в разі відхилення від потрібної.)
наскільки я зрозумів це проблема платформи
це не "проблема" платформи, а суть поняття "вимір" для регістра відомостей (та й не тільки відомостей).
не завадило б розібратися і попинать 1С
В якому сенсі "попинать"? У сенсі розібратися як працює 1С? Або в сенсі навчити фірму 1С, що в регістр можна складати неоднозначні записи? 0_0