|
Загрузка в 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)
|
|||
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). Попробуй воспользоватся конструктором запросов. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |