Имя: Пароль:
1C
1С v8
Загрузка в 1С
,
0 on2
 
10.12.19
20:38
Написала загрузку данных из файла.
Фишка  в том что там из файла приходится 20 000 строк грузить во временную таблицу и циклическим запросом по каждой строке искать данные.
Подскажите ГУРУ 1С как оптимизировать это можно? у меня выходит часто ошибка " MS SQL Server Транзакция (идентификатор процесса 76)вызвала взаимоблокировку ресурсов поток | буфер связи с другим процессом и стала жертвой взаимоблокировки".

Понимаю, что какой то процесс запустился, но может как то можно возобновить или продолжить процесс? что нужно использовать в  таком случае? я ни транзакций ни попыток не использую....

Кто что посоветует?
1 ДенисЧ
 
10.12.19
20:53
"Кто что посоветует?"
Традиционно - срочно замуж!! ))
2 dka80
 
10.12.19
21:07
Например, засунуть в "попытку" и при наличии ошибки подождать N секунд
3 Amra
 
10.12.19
21:08
(0) Какие данные массово записываются?
4 Dno1C
 
10.12.19
21:09
Что за циклический запрос? Сделать в одном не предлагать?
5 HawkEye
 
10.12.19
21:17
(0) катя, катя, катерина... не используй "циклический запрос" чтобы "по каждой строке искать данные".
6 Сияющий в темноте
 
10.12.19
21:39
если поиск идет по индексированной таблице,то другого решения нет,а если запросом,то переходите на индексированную таблицу.
7 План счетов
 
10.12.19
22:03
(0) Индекс на колонку по которой выполняется поиск
8 palsergeich
 
11.12.19
02:20
20000 строк совершенно спокойно можно поместить в память.
Например в ТЗ.
А потом одним запросом найти данные, возможно придётся напрячься что бы это сделать, но как правило возможно.
9 palsergeich
 
11.12.19
02:21
(8) к сожалению исходных данных мало, а фантазировать на тему того, что все таки надо, можно достаточно долго.
Будьте любезны покорректнее задачку поставьте.
10 on2
 
11.12.19
13:16
В файле список номенклатуры с ценой.
Нужно найти номенклатуру по артикулу и создать документ с ценами.
все просто
11 pechkin
 
11.12.19
13:19
но откуда взаимоблокировки то?
12 Ximov
 
11.12.19
13:20
(0) Катя, не хочешь поучаствовать в конкурсе: OFF: Мисс/миссис бюст мисты 2019 (отбор). Призовой фонд 15402 руб
фотка в профиле - супер!)
13 on2
 
11.12.19
13:47
(2) как это реализовать?
14 Масянька
 
11.12.19
13:49
(10) Документ один? На всю.
15 dka80
 
11.12.19
13:50
В какой момент блокировка возникает?
16 on2
 
11.12.19
13:52
(14) да один документ формируется в самом конце.
(15) блокировка в разное время
17 unbred
 
11.12.19
13:52
(12) одной фотки в профиле хватит, чтобы в призы залезть))
18 dka80
 
11.12.19
13:55
(16) блокировка может быть во время записи. Что ты пишешь постоянно?
19 on2
 
11.12.19
13:56
(17) этой фотке 10 лет)))
20 Масянька
 
11.12.19
13:56
(16) И зачем временная таблица?
Новый документ, перебор строк (поиск, добавление новой строки строку ТЧ), запись документа
21 on2
 
11.12.19
13:56
(16) постоянно ничего не пишу - запросом смотрю справочник
22 unbred
 
11.12.19
13:56
(19) самое время обновить))
23 on2
 
11.12.19
13:57
(20) - как вариант
24 dka80
 
11.12.19
14:15
Текст запроса большой? Покажи, если не большой
25 WhiteDragon93
 
11.12.19
14:35
(10) можно что-то подобное попробовать, если я верно понял постановку. Ну, либо, запрос переписать :)

    ТабличныйДокумент = Новый ТабличныйДокумент;
    Попытка
        ТабличныйДокумент.Прочитать(ФайлИмпорта, СпособЧтенияЗначенийТабличногоДокумента.Значение);
    Исключение
        Сообщение = Новый СообщениеПользователю;
        Сообщение.Текст = ОписаниеОшибки();
        Сообщение.Сообщить();
    КонецПопытки;    
    
    ПЗ = Новый ПостроительЗапроса;
    ПЗ.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТабличныйДокумент.Область());
    ПЗ.ДобавлениеПредставлений = ТипДобавленияПредставлений.НеДобавлять;
    ПЗ.ЗаполнитьНастройки();
    ПЗ.Выполнить();
    
    ТаблицаПромежуточныхДанных = ПЗ.Результат.Выгрузить();
    
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
    |    ВТ_ПромежуточныеДанные.Артикул,
    |    ВТ_ПромежуточныеДанные.Цена
    |ПОМЕСТИТЬ ВТ_ПромежуточныеДанные
    |ИЗ
    |    &ПромежуточныеДанные КАК ВТ_ПромежуточныеДанные
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |    Номенклатура.Ссылка КАК Номенклатура,
    |    ВТ_ПромежуточныеДанные.Цена
    |ИЗ
    |    ВТ_ПромежуточныеДанные КАК ВТ_ПромежуточныеДанные
    |        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номенклатура
    |        ПО ВТ_ПромежуточныеДанные.Артикул = Номенклатура.Артикул
    |ГДЕ
    |    НЕ Номенклатура.Ссылка ЕСТЬ NULL";
    Запрос.УстановитьПараметр("ПромежуточныеДанные", ТаблицаПромежуточныхДанных);
26 on2
 
11.12.19
14:44
Мне дали задачу использовать менеджер вр. таблиц и к ней я должна обращаться по запросу...

(25) запрос ищет по номеру артикула элемент в справочнике в КОНКРЕТНОЙ группе :( и в цикле таких номенклатур 20000
27 spiller26
 
11.12.19
15:00
(26) Кто вам даёт такие задачи? Вгоняйте в ТЗ не мучайтесь.
28 Skylark
 
11.12.19
15:20
(26)
Из файла грузишь в ТЗ (ТЗ нужно предварительно создать с типизированными колонками).
ТЗ помещаешь в параметр запроса, в запросе из этого параметра получаешь данные по временную таблицу запроса.
Соединяешь временную таблицу запроса с чем там тебе надо.
Выполняешь запрос и обрабатываешь результат.
PROFIT!
29 Ник080808
 
11.12.19
15:31
(0) "Кто что посоветует?" принять участие в конкурсе было?
30 dka80
 
11.12.19
15:35
А не кто не видит, что проблемы не с записью, а с чтением данных из базы? Думаете это как-то связано с запросом в цикле?
31 on2
 
11.12.19
15:38
(28) ВАУУУУУ!!! Класс рассписал!
32 on2
 
11.12.19
15:41
(28) теперь надо разобраться с этими временными таблицами
33 on2
 
11.12.19
15:53
(28)Вот данные из экселя гружу.

        ТЗВрем = Новый ТаблицаЗначений;
        ТЗВрем.Колонки.Добавить("КодВнутренний");
        ТЗВрем.Колонки.Добавить("Артикул");
        ТЗВрем.Колонки.Добавить("Наименование");
        ТЗВрем.Колонки.Добавить("Цена", новый ОписаниеТипов("число"));
        
        Сч=1;
        Пока ЗначениеЗаполнено(Excel.Cells(Сч,1).Text) Цикл
            ОбработкаПрерыванияПользователя();
            Стр = ТЗВрем.Добавить();
            Стр.КодВнутренний       = Excel.Cells(Сч,НомерКолонкиВнутреннийКод).Text;
            Стр.Артикул             = Excel.Cells(Сч,НомерКолонкиАртикул).Text;
            Стр.Наименование        = Excel.Cells(Сч,НомерКолонкиНаименование).Text;
            Стр.Цена                = СокрЛП(Лист.Cells(Сч,НомерКолонкиЦена).Value) ;
            
            Состояние(Сч);        
            Сч = Сч + 1;        
        КонецЦикла;    
        Excel.Quit();
34 on2
 
11.12.19
15:55
(28) дальше я выбирают одним запросом всю номенклатуру справочника из конкретной группы. Так я понимаю?
Запрос.Текст = "ВЫБРАТЬ
        |Номенклатура.Родитель.Родитель.Родитель как Верх,
        |Номенклатура.Ссылка,
        |Номенклатура.Артикул,
        |Номенклатура.ЕдиницаХраненияОстатков
        |ИЗ
        |Справочник.Номенклатура КАК Номенклатура
        |ГДЕ
        |Номенклатура.Артикул = &ВыбАртикул И    
        |НЕ Номенклатура.ЭтоГруппа
        |И Номенклатура.Ссылка В ИЕРАРХИИ(&Список)";

(28) Параметр куда и на что вносить? (туплю))
35 ГдеСобака Зарыта
 
11.12.19
16:18
Купили бы уже у Мани Мегапрайс и не мучались.
36 Skylark
 
11.12.19
16:22
(34) в (25) пример того, что я расписал, но в виде кода
37 ikea
 
11.12.19
16:31
1. Excel грузишь сразу.

        ТЗ_Данные =  Новый ТаблицаЗначений;    
    Эксель = Новый COMОбъект("Excel.Application");
    Попытка
        Книга = Эксель.WorkBooks.Open(ПутьКФайлу);
    Исключение
        Книга = "";
        Эксель.Quit();
        Эксель = "";
        Предупреждение("Не удается открыть файл "+ПутьКФайлу+". Возможно он уже открыт. повторите попытку позже!");
        Возврат;
    КонецПопытки;
    ТекущийЛист=Книга.Sheets(1);        
    ВсегоКолонок = ТекущийЛист.Cells.SpecialCells(11).Column;
    ВсегоСтрок = ТекущийЛист.Cells.SpecialCells(11).Row;
    Область = ТекущийЛист.Range(ТекущийЛист.Cells(НомерСтрокиНачалаЧтенияФайла,1), ТекущийЛист.Cells(НомерСтрокиОкончанияЧтенияФайла,ВсегоКолонок));
    Данные = Область.Value.Выгрузить();    
    ТЗ  =  Новый ТаблицаЗначений;
    Для Счетчик = 1 По ВсегоКолонок Цикл
        ТЗ.Колонки.Добавить("Колонка"+Счетчик, Новый ОписаниеТипов("Строка"));
    КонецЦикла;
    Для Счетчик = 1 По ВсегоСтрок Цикл
        НоваяСтрока = ТЗ.Добавить();
    КонецЦикла;    
    Для Счетчик = 0 По ВсегоКолонок-1 Цикл
        ТЗ.ЗагрузитьКолонку(Данные[Счетчик], Счетчик);
    КонецЦикла;        
    Если ТЗ_Данные.Количество()=0 Тогда
        ТЗ_Данные=ТЗ.Скопировать();
    КонецЕсли;
    Эксель.Quit();
    Эксель = "";
    Книга = "";
    ТекущийЛист = "";

2. Далее загружаешь всю номенклатура в ТЗ запросом.

Запрос.Текст = "ВЫБРАТЬ
        |Номенклатура.Родитель.Родитель.Родитель как Верх,
        |Номенклатура.Ссылка,
        |Номенклатура.Артикул,
        |Номенклатура.ЕдиницаХраненияОстатков
        |ИЗ
        |Справочник.Номенклатура КАК Номенклатура
        ";
    ТЗ_Номенклатура = Запрос.Выполнить().Выгрузить();

Затем проходишь циклом по ТЗ_Данные и ищешь в ТЗ что надо с фильтрами по группе и артикулу:


    Для Каждого ТекСтрокаТЗ_Данные ИЗ ТЗ_Данные Цикл

        Фильтр = Новый Структура;    
        Фильтр.Вставить("Верх",ТекСтрокаТЗ_Данные.НужнаяГруппаНоменклатуры);
        Фильтр.Вставить("Артикул",ТекСтрокаТЗ_Данные.Артикул );
        НС = ТЗ_Номенклатура.НайтиСтроки(Фильтр);

        Если НС.Количество()>0 Тогда
                   /// нашли номенклатуру и делаем с ней что надо
            ТекСсылка = НС[0].Ссылка;
        Иначе    
            ///ничего не нашли что-то с этим делаем
        КонецЕсли;

        КонецЦикла;
38 Skylark
 
11.12.19
16:33
(37)

……………………………………..________
………………………………,.-‘"……………….``~.,
………………………..,.-«……………………………..»-.,
…………………….,/………………………………………..":,
…………………,?………………………………………………\,
………………./…………………………………………………..,}
……………../…………………………………………………,:`^`..}
……………/……………………………………………,:"………/
…………..?…..__…………………………………..:`………../
…………./__.(….."~-,_…………………………,:`………./
………../(_…."~,_…….."~,_………………..,:`…….._/
……….{.._$;_……"=,_……."-,_…….,.-~-,},.~";/….}
………..((…..*~_……."=-._……";,,./`…./«…………../
…,,,___.\`~,……»~.,………………..`…..}…………../
…………(….`=-,,…….`……………………(……;_,,-"
………….\`~.*-,……………………………….|,./…..\,__
,,_……….}.>-._\……………………………..|…………..`=~-,
…..`=~-,_\_……`\,……………………………\
……………….`=~-,,.\,………………………….\
…………………………..`:,,………………………`\…………..__
……………………………….`=-,……………….,%`>--==``
…………………………………._\……….._,-%…….`\
……………………………..,<`.._|_,-&``…………….`\
39 Garykom
 
гуру
11.12.19
16:34
Эксель подключается как внешний источник данных или сразу в ТабДок его в новых платформах, нахрена COM ?
40 dezss
 
11.12.19
16:35
(38) класс...в мемориз)))
41 WhiteDragon93
 
11.12.19
16:46
(26) Менеджер временных таблиц принципиально использовать?

Может тогда алгоритм такой?
1) Выбираем конкретный список номенклатуры (по условиям задачи) в ВТ;
2) Читаем эксель, выгружаем в ТЗ;
3) Делаем запрос к ТЗ и соединяем с ВТ из п.1;
4) Заполняем документ полученными данными.

Получим тот же результат, но с использованием менеджера.

Есть конкретная постановка задачи? Или она на словах была?
42 dezss
 
11.12.19
17:24
Так использовать именно менеджер или просто временные?
Я вот не понимаю нафига тут менеджер отдельный.
43 Skylark
 
11.12.19
17:38
(42) Если у запроса не объявлен менеджер временных таблиц, то после его выполнения доступен только результат.
А если объявлен, то все временные таблицы будут в коллекции Запрос.МенеджерВременныхТаблиц.Таблицы. И там их можно посмотреть методом ПолучитьДанные().
44 on2
 
13.12.19
06:45
(41)Конкретная постановка следующая: есть файл эксель в нем есть артикул и цена. Нужно найти по артикулу в справочнике эту номенклатуру и занести в документ. все.
по п.1 "Выбираем конкретный список номенклатуры (по условиям задачи) в ВТ;" непонятно что вы имели ввиду...
45 Злопчинский
 
13.12.19
07:42
немножко в сторону
Стр.Цена = СокрЛП(Лист.Cells(Сч,НомерКолонкиЦена).Value);

- если в Value сидит число - то зачем здесь СокрЛП?
а если в value сидит например строка типа "1234,56" - то такая конструкция приведет к тому что в цену будет вписано неверное значение с отсечением копеек (?), а если в вэлью что-то типа 12'345,78 - то в цене вообще окажется число 12.
(м.б. я несу ахинею)
46 on2
 
13.12.19
08:11
(45) я это уже поправила
47 HawkEye
 
13.12.19
08:12
(34) надо не
  "|ГДЕ
        |Номенклатура.Артикул = &ВыбАртикул И

а
  "|ГДЕ
        |Номенклатура.Артикул В (&СписокАртикулов) И"
48 on2
 
13.12.19
08:21
Вот смотрите у меня 2 таблицы значений:
В первой - список номенклатуры из файла (артикул, цена)
Во второй - список из справочника конкретной группы или групп (ссылка, артикул)

Так вот используя менеджер временных таблиц как можно эти номенклатуры в запросе найти по артикулу :) Может как то я сложно объясняю :(
49 arsik
 
гуру
13.12.19
08:49
(48)

"ВЫБРАТЬ
|    ВЫРАЗИТЬ(тзАртикулСЦеной.Артикул КАК СТРОКА(25)) КАК Артикул,
|    ВЫРАЗИТЬ(тзАртикулСЦеной.Цена КАК ЧИСЛО) КАК Цена
|ПОМЕСТИТЬ втАртикулСЦеной
|ИЗ
|    &тзАртикулСЦеной КАК тзАртикулСЦеной
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
|    Номенклатура.Ссылка КАК Номенклатура,
|    втАртикулСЦеной.Цена КАК Цена
|ИЗ
|    Справочник.Номенклатура КАК Номенклатура
|        ВНУТРЕННЕЕ СОЕДИНЕНИЕ втАртикулСЦеной КАК втАртикулСЦеной
|        ПО Номенклатура.Артикул = втАртикулСЦеной.Артикул"
50 on2
 
13.12.19
10:46
(49) ВАУ! это что еще за монстр!! ВЫРАЗИТЬ
51 on2
 
13.12.19
10:48
(49) написано необычно...я так не делала еще
52 _Дайвер_
 
13.12.19
10:58
(50) Типизация
53 _Дайвер_
 
13.12.19
11:04
(44) Я бы добавил команду в документ "Регистрация цен",
открытие доп.формы с ТЗ,
загрузил туда номенклатуру из экселя,
Сопоставил бы ее с номенклатурой из 1С,
Те что уже есть можно записывать, а те позиции которых нет можно создать и зарегистрировать их цены.
Оставил бы возможность вручную сопоставлять номенклатуру, если вдруг артикулы отличаются, такое случается
Еще можно добавить сопоставление по другим полям.
Как выше писали возьмите мегапрайс, он это все умеет, можете грузить любые форматы эскель файлов с номенклатурами
54 Skylark
 
13.12.19
11:53
(51)

|    Справочник.Номенклатура КАК Номенклатура
|        ВНУТРЕННЕЕ СОЕДИНЕНИЕ втАртикулСЦеной КАК втАртикулСЦеной

Вот из-за этого всё. И это уже было в (25) сразу же рассказано.

Суть в том, что не надо искать номенклатуру по артикулу в цикле, а нужно поместить артикулы загруженные из Эксель во временную таблицу, и соединить эту временную таблицу со справочником номенклатуры, тогда в результате запроса будет получена таблица с номенклатурой и ценой
55 on2
 
13.12.19
13:44
(49)
{(11, 1)}: Синтаксическая ошибка "ВНУТРЕННЕЕ"
<<?>>ВНУТРЕННЕЕ СОЕДИНЕНИЕ
56 on2
 
13.12.19
13:45
Где накосячила?
  Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
    |ВЫРАЗИТЬ(ТЗ_Данные.Артикул КАК СТРОКА(25)) КАК Артикул,
    |ВЫРАЗИТЬ(ТЗ_Данные.Цена КАК ЧИСЛО) КАК Цена
    |ПОМЕСТИТЬ втАртикулСЦеной
    |ИЗ
    |    &ТЗ_Данные КАК ТЗ_Данные";
    
   Запрос2 = Новый Запрос;
  
    Запрос2.Текст = "ВЫБРАТЬ
    |    Номенклатура.Ссылка КАК Номенклатура1,
    |    Номенклатура.Артикул как Артикул1,
    |    втАртикулСЦеной.Артикул как Артикул2,
    |    втАртикулСЦеной.Цена КАК Цена2
    |ИЗ
    |    Справочник.Номенклатура КАК Номенклатура
    |ГДЕ
    |    НЕ Номенклатура.ЭтоГруппа
    |    И Номенклатура.Ссылка В ИЕРАРХИИ(&Список)
    |ВНУТРЕННЕЕ СОЕДИНЕНИЕ
    |втАртикулСЦеной.Артикул КАК Артикул 2 ПО втАртикулСЦеной.Артикул=Номенклатура.Артикул";
    
    Запрос2.УстановитьПараметр("Список", Список);

    РезультатЗапроса = Запрос2.Выполнить().Выгрузить();
57 ДенисЧ
 
13.12.19
14:16
Где и соединение местами поменяй
58 arsik
 
гуру
13.12.19
14:59
(56) Глупость какая то
Зачем разными запросами. Как без использования менеджера ременных таблиц у тебя один запрос увидит результаты другого?

Делай все одним запросом ну и (57).
Попробуй воспользоватся конструктором запросов.
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший