Имя: Пароль:
1C
1С v8
Удаления движений группы документов.
, ,
0 aptomilov
 
05.02.19
14:00
Я ребят озадачился такой проблемкой.
Все знают процедуру закрытия смены в УТ
в зависимости от настройки кассы чеки либо архивируются либо удаляются непосредственно.

И то и то медленно если чеков переваливает за  пару тройку сотен.
И подумал а что если удалять просто движения  у документа но не у одного а сразу кучей и вот к чему я пришел

НаборЗаписей = РегистрыНакопления.ТоварыНаСкладах.ПолучитьФормуСписка("формаСписка");
            //НаборЗаписей=ФормаРегистра.ЭлементыФормы.РегистрНакопленияСписок.Данные;            
            
            НаборЗаписей.Отбор.Регистратор.ВидСравнения = ВидСравнения.ВСписке;
            НаборЗаписей.Отбор.Регистратор.Значение = СписокЧеков;
            НаборЗаписей.Отбор.Регистратор.Использование = Истина;

Поясню  - нельзя отобрать по условию в списке из регистра так уж они сделали но зато можно отобрать в из формы. Но вот ВОПРОС как получить результат этого отбора  и как потом его завалить из регистра.
Подозреваю что скорость удаления будет быстрой.
1 OldCondom
 
05.02.19
14:14
>> Все знают процедуру закрытия смены в УТ
Я не знаю.

НаборЗаписей = форма. Сильно.
2 aptomilov
 
05.02.19
14:14
Или может кто знает другой способ похерить движения по регистру кучкой ?
3 aptomilov
 
05.02.19
14:15
(1) это полет мысли опыты я прост переменные не поменял
4 OldCondom
 
05.02.19
14:16
Прочитать и записать пустой набор для 300 регистраторов в цикле - это долго?
5 aptomilov
 
05.02.19
14:16
да это реально долг залипает минуты на  2-3
6 aptomilov
 
05.02.19
14:17
а когда  17 магазинов закрывает ровно в  18-00
сам знаш чо будет ))
7 hhhh
 
05.02.19
14:22
(5) ну значит это в процедурах ПриЗаписи и ПередЗаписью ваши чудо-программеры нафигачили всякой всячины, поэтому и тормозит. В эту сторону копайте, будет летать за пару секунд.
8 OldCondom
 
05.02.19
14:28
+
Если я не ошибаюсь, форма списка - это записи регистра, не путать с формой набора записей, которой можно манипулировать.
9 aptomilov
 
05.02.19
14:32
ну а если абстрагироваться то как можно завалить записи из регистра кучей
10 OldCondom
 
05.02.19
14:34
(9) Давай абстрагироваться дальше. Как вообще можно удалить записи чего-либо кучей? Есть пример?
11 RomanYS
 
05.02.19
14:36
(9) нет. Средствами 1с только запись набора с отбором по регистратору
12 aptomilov
 
05.02.19
14:50
вот огорчил тоа
у меня была мысля что  в списке можно завалить будет из формы
13 RomanYS
 
05.02.19
14:59
(12) смотри (7)
14 aptomilov
 
05.02.19
15:09
ТЗ = Новый ТаблицаЗначений;
    ТЗ = Товары.Выгрузить(,);
    
    СписНом = Новый СписокЗначений;
    Для Каждого Стр Из Товары Цикл
        СписНом.Добавить(Стр.Номенклатура);
    КонецЦикла;
    Если Склад.ВидСклада = Перечисления.ВидыСкладов.Розничный Тогда
        ВидРегистра = "РегистрНакопления.ТоварыВРознице";
    Иначе
        ВидРегистра = "РегистрНакопления.ТоварыНаСкладах";
    КонецЕсли;
    
    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    ОстаткиТоваров.Номенклатура КАК Номенклатура,
        |    ОстаткиТоваров.СерияНоменклатуры,
        |    ОстаткиТоваров.КоличествоОстаток,
        |    ЕСТЬNULL(ОстаткиТоваров.СерияНоменклатуры.СрокГодности, ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)) КАК СрокГодности,
        |    ОстаткиТоваров.ХарактеристикаНоменклатуры
        |ИЗ
        |    " + ВидРегистра + ".Остатки(&ДатаОст, ) КАК ОстаткиТоваров
        |ГДЕ
        |    ОстаткиТоваров.Склад = &Склад
        |    И ОстаткиТоваров.Качество = &Качество
        |    И ОстаткиТоваров.Номенклатура В(&СписНом)
        |    И ОстаткиТоваров.СерияНоменклатуры <> &ПустаяСерия
        |    И ОстаткиТоваров.КоличествоОстаток > 0
        |
        |УПОРЯДОЧИТЬ ПО
        |    Номенклатура,
        |    СрокГодности УБЫВ";

    Запрос.УстановитьПараметр("ДатаОст", Дата);
    Запрос.УстановитьПараметр("Качество", Справочники.Качество.Новый);
    Запрос.УстановитьПараметр("Склад", Склад);
    Запрос.УстановитьПараметр("СписНом", СписНом);
    Запрос.УстановитьПараметр("ПустаяСерия", Справочники.СерииНоменклатуры.ПустаяСсылка());
    
    ТЗРез = Новый ТаблицаЗначений;
    ТЗРез = Запрос.Выполнить().Выгрузить();
    
    Товары.Очистить();
    Для Каждого СтрТов Из ТЗ Цикл
        Колво = СтрТов.Количество;
        КолвоСтрок = ТЗРез.Количество();
        Для Сч = 1 По КолвоСтрок Цикл
            Строчка = ТЗРез.Получить(КолвоСтрок - Сч);
            Если НЕ Строчка.Номенклатура = СтрТов.Номенклатура Тогда
                Продолжить;
            КонецЕсли;
            Если НЕ СтрТов.СерияНоменклатуры = Справочники.СерииНоменклатуры.ПустаяСсылка() Тогда
                Если Не СтрТов.СерияНоменклатуры = Строчка.СерияНоменклатуры Тогда
                    Продолжить;
                КонецЕсли;
            КонецЕсли;
            
            НоваяСтрока = Товары.Добавить();
            НоваяСтрока.Номенклатура = СтрТов.Номенклатура;
            НоваяСтрока.ЕдиницаИзмерения = СтрТов.ЕдиницаИзмерения;
            НоваяСтрока.Коэффициент = СтрТов.Коэффициент;
            НоваяСтрока.Цена = СтрТов.Цена;
            НоваяСтрока.ПроцентСкидкиНаценки = СтрТов.ПроцентСкидкиНаценки;
            НоваяСтрока.ХарактеристикаНоменклатуры = Строчка.ХарактеристикаНоменклатуры;
            НоваяСтрока.СерияНоменклатуры = Строчка.СерияНоменклатуры;
            НоваяСтрока.Количество = ?(Строчка.КоличествоОстаток <= Колво, Строчка.КоличествоОстаток, Колво);
            НоваяСтрока.ПроцентАвтоматическихСкидок = СтрТов.ПроцентАвтоматическихСкидок;
            НоваяСтрока.УсловиеАвтоматическойСкидки = СтрТов.УсловиеАвтоматическойСкидки;
            НоваяСтрока.ЗначениеУсловияАвтоматическойСкидки = СтрТов.ЗначениеУсловияАвтоматическойСкидки;
            НоваяСтрока.Артикул = СтрТов.Артикул;
            НоваяСтрока.Штрихкод = СтрТов.ШтрихКод;
            
            
            Сумма = СтрТов.Цена * ?(Строчка.КоличествоОстаток <= Колво, Строчка.КоличествоОстаток, Колво)    ;
            СуммаСкидки = 0;
            СуммаСкидки = Сумма * СтрТов.ПроцентАвтоматическихСкидок / 100;
            СуммаСкидки = СуммаСкидки + (Сумма * СтрТов.ПроцентСкидкиНаценки / 100);
            НоваяСтрока.Сумма = Сумма - СуммаСкидки;
            
            Колво = Колво - ?(Строчка.КоличествоОстаток <= Колво, Строчка.КоличествоОстаток, Колво);
            Остаток = Строчка.КоличествоОстаток - ?(Строчка.КоличествоОстаток <= Колво, Строчка.КоличествоОстаток, Колво);
            Если Остаток = 0 Тогда
                ТЗРез.Удалить(КолвоСтрок - Сч);
            Иначе
                Строчка.Установить(3, Остаток);
            КонецЕсли;
            Если Колво = 0 Тогда
                Прервать;
            КонецЕсли;
            
        КонецЦикла;
        
        Если Колво > 0 Тогда
            НоваяСтрока = Товары.Добавить();
            НоваяСтрока.Номенклатура = СтрТов.Номенклатура;
            НоваяСтрока.ЕдиницаИзмерения = СтрТов.ЕдиницаИзмерения;
            НоваяСтрока.Коэффициент = СтрТов.Коэффициент;
            НоваяСтрока.Цена = СтрТов.Цена;
            НоваяСтрока.ПроцентСкидкиНаценки = СтрТов.ПроцентСкидкиНаценки;
            НоваяСтрока.Количество = Колво;
            НоваяСтрока.ПроцентАвтоматическихСкидок = СтрТов.ПроцентАвтоматическихСкидок;
            НоваяСтрока.УсловиеАвтоматическойСкидки = СтрТов.УсловиеАвтоматическойСкидки;
            НоваяСтрока.ЗначениеУсловияАвтоматическойСкидки = СтрТов.ЗначениеУсловияАвтоматическойСкидки;
            НоваяСтрока.Артикул = СтрТов.Артикул;
            НоваяСтрока.Штрихкод = СтрТов.ШтрихКод;
            
            
            Сумма = СтрТов.Цена * Колво;
            СуммаСкидки = 0;
            СуммаСкидки = Сумма * СтрТов.ПроцентАвтоматическихСкидок / 100;
            СуммаСкидки = СуммаСкидки + (Сумма * СтрТов.ПроцентСкидкиНаценки / 100);
            НоваяСтрока.Сумма = Сумма - СуммаСкидки;
        КонецЕсли;
    КонецЦикла;
15 aptomilov
 
05.02.19
15:09
вот такой вот грешок
16 aptomilov
 
05.02.19
15:11
Перед записью
17 RomanYS
 
05.02.19
15:17
(16) перед записью чего? ты же регистры только записывать собирался
18 OldCondom
 
05.02.19
15:17
Здесь гениально почти все.
19 FIXXXL
 
05.02.19
15:50
(6) сделай узел, регай на нем ссылки к удалению, ночью запускай регламент по удалению зареганных ссылок
20 aptomilov
 
05.02.19
16:53
УдалитьОбъекты(МассивЧековККМ, Ложь);

чеки валятся этой командой
21 aptomilov
 
05.02.19
16:54
передзаписью объекта
22 FIXXXL
 
05.02.19
17:08
(21) ну так вместо удаления сделай регистрацию на узел
а удаляй потом, регламентным заданием
23 aptomilov
 
05.02.19
17:11
ЗапросПоЧекам.Текст ="
    |ВЫБРАТЬ
    |    Док.Ссылка КАК Ссылка
    |ИЗ
    |    Документ.ЧекККМ КАК Док
    |ГДЕ
    |    Док.Дата МЕЖДУ &НачДата И &КонДата
    |    И Док.КассаККМ = &КассаККМ
    |    И Док.Проведен
    |   И Не Док.Архивный

этот запрос не может выполниться
конфликт блокировок
непонятно тока нахера блокировать таблицу аж  на чтение
24 Вафель
 
05.02.19
17:12
у тебя ут 10.3?
25 aptomilov
 
05.02.19
17:14
да
26 aptomilov
 
05.02.19
17:14
(22) не все так просто
ибо если чеки на завалить или их движения то отчет о рознице не проведется
27 aptomilov
 
05.02.19
17:16
таблица чеков ккм сильно занята все время
28 unregistered
 
05.02.19
17:21
(14) Какая жеэээээсть!...
Оторвите руки вашему программисту и приделайте их ему к плечам.
29 FIXXXL
 
05.02.19
17:23
(28) это типовая залепуха :)
30 FIXXXL
 
05.02.19
17:25
(29) сорри, не туда смотрел
31 unregistered
 
05.02.19
17:25
(18) Не хватает только парочки запросов внутри циклов.
32 unregistered
 
05.02.19
17:26
(30) Фуууууф.... Напугал! Я уж грешным делом подумал, что такое творчество уже прям "из коробки" идёт.
33 FIXXXL
 
05.02.19
17:31
(32) на (23) смотрел :)
34 unregistered
 
05.02.19
17:32
Короче, автор!
Сделай замер производительности и посмотри на чём конкретно больше всего тупит. Учитывая (14), подозреваю, что запись в регистры - не самое узкое место в процедуре удаления чеков.
И если я прав, то для начала надо избавиться от *авнокода типа (14). В качестве временного решения можно хотя бы сделать залепу, чтобы этот код из (14) не выполнялся в ходе регламентной процедуры удаления чеков.