Имя: Пароль:
1C
 
НайтиСтроки() и партионный учет
0 Franchiser
 
гуру
07.12.19
14:05
Появилась необходимость использовать метод ТЗ НайтиСтроки() в алгоритме партионного списания.
Почитал информацию на форумах: 1с не гарантирует сохранение порядка сортировки строк в массиве из исходной ТЗ, то есть для уверенности требуется дополнительная сортировка через отдельную ТЗ.
Как решить вопрос без сортировки?
P.s. строки в документе группируются по номенклатуре и цене. Из-за цены получаются связь с остатками многие ко многим, поэтом одним запросом получить результат не получится.
1 Franchiser
 
гуру
07.12.19
14:11
Смотрел код в типовых конфигурациях, не нашел чтобы 1с как то обрабатывала ситуацию результата поиска этим методом в таблицах остатков с партиями.
2 RomanYS
 
07.12.19
14:12
Делай запрос с итогами, обходи по группировка.

Про цены не очень понятно зачем группировка или это учет по розничным ценам? Для списания партий по идее без разницы цена их реализации
3 Franchiser
 
гуру
07.12.19
14:17
(2) в регистр для списания должна идти Цена из ТЧ, сумма = Цена*количество.
Такая постановка задачи.
По одной номенклатуре может быть в ТЧ более одной цены и их все нужно сохранить.
4 RomanYS
 
07.12.19
14:18
(3) Цена - это измерение регистра?
5 Franchiser
 
гуру
07.12.19
14:23
Реквизит.
6 Franchiser
 
гуру
07.12.19
14:25
Сумма тоже реквизит
7 Franchiser
 
гуру
07.12.19
14:26
Количество - ресурс
8 RomanYS
 
07.12.19
14:27
(6) может ресурс?
(5) Тогда некорректна или постановка задачи или архитектура регистра
9 Franchiser
 
гуру
07.12.19
14:29
(8) ну, партионноый учет не совсем стандартный. Если не хватает количества, то списывается минимум из остатка и количества в документе.
10 Franchiser
 
гуру
07.12.19
14:39
Кто нибудь знает в каком случае может метод НайтиСтроки() выдавать неправильный порядок строк, влияет ли индекс в ТЗ?
11 hhhh
 
07.12.19
15:56
(10) индекс не влияет
12 Franchiser
 
гуру
07.12.19
21:03
(11) почему в типовых не обращают внимание  на то что порядок может быть другой в НайтиСтроки() при партионноый списаниях ?
13 RomanYS
 
07.12.19
21:07
(12) Может они не читают форумов?
14 Franchiser
 
гуру
07.12.19
21:46
Не знаю, может нудно наоборот делать: обходить строки остатков с партиями и искать номенклатуру в таблице документа - тогда уже порядок не важен.
15 vicof
 
08.12.19
02:42
(14) неоптимально. Ну используй не найтистроки(), а передавай таблицу в запрос и там уже сортируй как хочешь.
16 d4rkmesa
 
08.12.19
12:02
(0) Старая тема. =) В старых типовых, к примеру, списание по сериям идет тупо через НайтиСтроки, это по FEFO. Думаю, в большинстве случаев это срабатывает правильно. Конечно, исходная ТЗ при этом создается запросом и никаких манипуляций с ней не производится, тогда ВОЗМОЖНО в большинстве случаев порядок сохранится. По крайней мере, пока на это никто не жаловался за много лет.
17 azernot
 
08.12.19
12:21
Где-то на мисте подсмотрел:



Функция НайтиСтроки(ТЗ, Структура) Экспорт

       М = ТЗ.НайтиСтроки(Структура);

       ПослеНайтиСтроки(М, ТЗ);

       Возврат М;
КонецФункции
Процедура ПослеНайтиСтроки(М, ТЗ = Неопределено) Экспорт

       Если М.Количество() = 0 Тогда
             Возврат;
       КонецЕсли;

       //Для совместимости с 1с80
       Если ТЗ = Неопределено Тогда
             ТЗ = М[0].Владелец();
       КонецЕсли;


       ТЗ2 = Новый ТаблицаЗначений();
       ТЗ2.Колонки.Добавить("Индекс");
       ТЗ2.Колонки.Добавить("Строка");

       Для Каждого Эл ИЗ М Цикл
             НСтр = ТЗ2.Добавить();
             НСтр.Индекс = ТЗ.Индекс(Эл);
             НСтр.Строка = Эл;
       КонецЦикла;

       ТЗ2.Сортировать("Индекс");

       М.Очистить();

       Для Каждого Стр2 ИЗ ТЗ2 Цикл
             М.Добавить(Стр2.Строка);
       КонецЦикла;

КонецПроцедуры
18 Franchiser
 
гуру
08.12.19
14:40
(17) да это это процедура гения 1с, я ее добавил себе. Но создавать из в цикле - очень затратно.
(16) вот это и странно, что считают , что будет работать в большинстве случаев.
19 Ненавижу 1С
 
гуру
08.12.19
15:06
20 Franchiser
 
гуру
08.12.19
15:22
(19) не походит : у меня связь многие ко многим
21 Franchiser
 
гуру
08.12.19
15:24
(19) это запрос в цикле будет?
22 Ненавижу 1С
 
гуру
08.12.19
15:24
(21) нет конечно
23 Franchiser
 
гуру
08.12.19
15:26
(22) там параметр оплата
24 H A D G E H O G s
 
08.12.19
15:30
(19) Хреновый пример.
25 Ненавижу 1С
 
гуру
08.12.19
15:31
(23) это все легко переделывается на множество
26 H A D G E H O G s
 
08.12.19
15:31
(0) НайтиСтроки() в цикле?

Ну сделай ты MergeJoin кодом 1С и не парься.
27 Franchiser
 
гуру
08.12.19
15:33
(26) найтистроки циклом по индексированной таблице. В чем проблема?
Что за mergejoin, можно пример?
28 Franchiser
 
гуру
08.12.19
15:36
Таблица остатков:
Номенклатура1, Партия1,ГТД1, количество1
Номенклатура1, Партия2,ГТД2, количество2

Таблица в документе после группировки:
Номенклатура1, цена1, количество 1
Номенклатура1, цена2, количество2
29 H A D G E H O G s
 
08.12.19
15:37
(28) По каким колонкам поиск?
30 Franchiser
 
гуру
08.12.19
15:39
Поиск по номенклатуре
В регистр для списания нужно писать Цену и сумму = Количество списано х Цену
31 Ненавижу 1С
 
гуру
08.12.19
15:40
(30) и что это за документ и откуда цена берется изначально?
32 H A D G E H O G s
 
08.12.19
15:49
А нет, отбой.
Глупый 1С не даст сравнить 2 номенклатуры на больше-меньше:
Если Номенклатура1>Номенклатура2 Тогда

Операции сравнения на больше-меньше допустимы только для значений совпадающих примитивных типов (Булево, Число, Строка, Дата)
33 H A D G E H O G s
 
08.12.19
15:57
Ну тогда я бы массив строк выгружал бы в копию ТЗ и досортировывал бы.
34 Franchiser
 
гуру
08.12.19
16:16
(31) реализация
35 Franchiser
 
гуру
08.12.19
16:18
(33) ну я пока сделал той процедурой которую здесь привели. Но не нравится этот вариант по  созданию из в цикле и досортировке в ТЗ
36 H A D G E H O G s
 
08.12.19
16:49
(35) Мне тоже

МассивСтрок=ТаблицаИсточника.НайтиСтроки();
ТекущаяТаблицаИсточника=ТаблицаИсточника.Скопировать(,МассивСтрок);
ТекущаяТаблицаИсточника.Сортировать(КлючиСортировки,Новый СравнениеДанных);
Закон Брукера: Даже маленькая практика стоит большой теории.