|
Откуда берется слеш? | ☑ | ||
---|---|---|---|---|
0
Масянька
24.12.19
✎
09:50
|
Доброе утро (утверждение очень спорное).
Вводная: выгрузка номенклатуры из справочника номенклатуры в файл json (полная иерархия). В справочнике есть такая группа с вложением: Энергоком -> Выключатели\розетки IP54. сразу скажу, что "\" меняла обработкой (изначально был "/"). Итак: есть код: ЭлементВыгрузки.Вставить("Родитель", РодительНоменклатуры(ТекЭлемент.ПолноеНаименование(), СокрЛП(ТекЭлемент.Наименование))); сообщить("2. - " + РодительНоменклатуры(ТекЭлемент.ПолноеНаименование(), СокрЛП(ТекЭлемент.Наименование))); Функция: Функция РодительНоменклатуры(ПолноеНаименование, Наименование) ПозицияНачалаНаименования = СтрНайти(ПолноеНаименование, Наименование, НаправлениеПоиска.СКонца); ПредРодитель = Лев(ПолноеНаименование, ПозицияНачалаНаименования - 1); ПозицияПоследнегоСлеша = СтрНайти(ПредРодитель, "/", НаправлениеПоиска.СКонца); Родитель = СокрЛП(Лев(ПредРодитель, ПозицияПоследнегоСлеша - 1)); сообщить("1. - " + Родитель); Возврат Родитель; КонецФункции На экране: https://pastenow.ru/b22a16fb8dd6b098 В файле: https://pastenow.ru/e6b68ce42eb6cd12087e197b6dd05aba Откуда берется двойной слеш? спасибо. |
|||
1
Волшебник
модератор
24.12.19
✎
09:51
|
кто-то экранирует обратный слеш обратным слешем
|
|||
2
Масянька
24.12.19
✎
09:53
|
(1) Кто и где?
|
|||
3
Волшебник
модератор
24.12.19
✎
09:57
|
(2) тот, кто пишет структуру в строку, в последний момент
|
|||
4
Масянька
24.12.19
✎
09:59
|
(3) А пояснить для блондинки можно?
|
|||
5
Масянька
24.12.19
✎
10:01
|
И почему именно в этом случае?
Вот в файле другой родитель: "Родитель": "Удаленные папкиЭ/Стяжки", Здесь все норм. |
|||
6
Волшебник
модератор
24.12.19
✎
10:02
|
(5) Здесь слэш в другую сторону
|
|||
7
Волшебник
модератор
24.12.19
✎
10:04
|
Обратный слэш считается экранириющим спецсимволом, чтобы записать в строку кавычку, например
"Пушкин написал произведение\"Руслан и Людмила\", которое очень интересное" Но чтобы в строку записать сам обратный слэш, его надо тоже экранировать и тоже обратным слэшем, например, "Папка\\ВложеннаяПапка" |
|||
8
Масянька
24.12.19
✎
10:07
|
(7) Что значить "экранировать"?
|
|||
9
Aleksey
24.12.19
✎
10:20
|
||||
10
Масянька
24.12.19
✎
10:22
|
(9) Уже доперло.
Если такие проблемы - на фига 1С разрешает их использовать? |
|||
11
ДенисЧ
24.12.19
✎
10:23
|
(8) "поставить экран" (с)
Некоторые символы в строках могут быть служебными. Например, кавычки |
|||
12
ДенисЧ
24.12.19
✎
10:23
|
(10) А кто 1с такая, чтобы это запрещать?
|
|||
13
Масянька
24.12.19
✎
13:15
|
Тут продолжу.
Конфликт блокировок. Справочник номенклатуры большой. При следующем запуске продвигается дальше. Блокировка возникает, когда в одной папке создается вложенная. Причем, далеко не сразу. База файловая. Как можно обойти? Спасибо. |
|||
14
Волшебник
модератор
24.12.19
✎
13:17
|
(13) Перейти на серверную базу, где блокировки на уровне записи (или страницы в БД), а не всей таблицы.
|
|||
15
Масянька
24.12.19
✎
13:17
|
(14) Других вариантов нет?
|
|||
16
Волшебник
модератор
24.12.19
✎
13:17
|
(13) Убрать транзакции. Или фиксировать транзакцию каждые 100 элементов.
|
|||
17
Масянька
24.12.19
✎
13:21
|
(16) Не использую.
|
|||
18
Волшебник
модератор
24.12.19
✎
13:28
|
(17) Значит это объектная блокировка, а не транзакционная.
|
|||
19
Масянька
24.12.19
✎
13:32
|
(18) Здорово. Как её обходить?
|
|||
20
Волшебник
модератор
24.12.19
✎
13:35
|
(19) Перед записью объекта пытаться его заблокировать
Попытка Объект.Заблокировать(); Объект.Записать(); Исключение //не удалось заблокировать объект, запись невозможна Сообщить(ОписаниеОшибки()); КонецПопытки; |
|||
21
Масянька
24.12.19
✎
13:43
|
(20) Пойду проверять.
|
|||
22
Волшебник
модератор
24.12.19
✎
13:49
|
(21) Давай, проверяй...
|
|||
23
Масянька
24.12.19
✎
13:55
|
(22) Спасибо! Работает!
|
|||
24
Волшебник
модератор
24.12.19
✎
13:56
|
(23) ОК
|
|||
25
Масянька
25.12.19
✎
12:18
|
(24) В общем, не все так радужно.
Файл (номенклатура из одной БД, json) - 11 375 КБ. Ополовинила - 6 523 КБ. Гружу... Попытка НоваяНоменклатура.Заблокировать(); НоваяНоменклатура.Записать(); Исключение ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Не удалось записать элемент справочника номенклатура - " + НоваяНоменклатура + "."); ВызватьИсключение; КонецПопытки; Конфликт блокировок где-то на половине файла. Как обходить? Резать еще меньше? |
|||
26
Bigbro
25.12.19
✎
12:24
|
лучше свалить все объекты по которым не удалось изменить данные в список и в конце проехать по нему еще раз, а не падать в исключение сразу.
ну а те кто и со второго раза не обработался - их вернуть, кто то блокирует видимо настойчиво. |
|||
27
Масянька
25.12.19
✎
12:28
|
(26) У меня есть ощущение, что если даже порезать меньшими файлами, то друг за другом также упадет.
|
|||
28
Йохохо
25.12.19
✎
12:33
|
(13) на какой таблице блокировка?
|
|||
29
Масянька
25.12.19
✎
12:34
|
(28) Загружаю номенклатуру.
В ошибке нет указаний. Тупо "Конфликт блокировок". |
|||
30
Йохохо
25.12.19
✎
12:35
|
(29) надо узнать на какой, справочник номенклатура не при чем 94%
|
|||
31
Йохохо
25.12.19
✎
12:36
|
или вы втроем грузите;)
|
|||
32
zva
25.12.19
✎
12:36
|
(25) Если загрузка идет монопольно в базе, то проблема в коде, а не в размере файла...
|
|||
33
Bigbro
25.12.19
✎
12:38
|
(27) так убери вызватьисключение
добавь номенклатуру в список, в массив, со всем необходимым для обновления. в конце цикла пробегись еще раз по этому списку. зачем вообще исключение? оно нужно только если у тебя незагрузка одного единственного элемента уже критична. обычно это не так. грузятся все 10-20-50 тысяч. а та сотня которая по разным причинам не загрузилась выдается на экран в лог или куда угодно и с ними ручками потом разбираются. все |
|||
34
Масянька
25.12.19
✎
12:40
|
(30) Говорю - где-то до половины файлы загрузилось. Потом - ошибка.
|
|||
35
Масянька
25.12.19
✎
12:40
|
(32) &НаСервере
Функция УстановитьРодителяНоменклатуры(СтрокаРодителя) МассивРодителей = СтрРазделить(СтрокаРодителя, "/"); Родитель = Справочники.Номенклатура.ПустаяСсылка(); Для Каждого ЭлементМассива Из МассивРодителей Цикл ЕстьТакаяПапка = Справочники.Номенклатура.НайтиПоНаименованию(ЭлементМассива, Истина, Родитель); Если (ЕстьТакаяПапка = Справочники.Номенклатура.ПустаяСсылка()) Тогда ЕстьТакаяПапка = Справочники.Номенклатура.СоздатьГруппу(); ЕстьТакаяПапка.Наименование = ЭлементМассива; Если (Родитель <> Справочники.Номенклатура.ПустаяСсылка()) Тогда ЕстьТакаяПапка.Родитель = Родитель; КонецЕсли; Попытка ЕстьТакаяПапка.Заблокировать(); ЕстьТакаяПапка.Записать(); Родитель = ЕстьТакаяПапка.Ссылка; Исключение ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Не удалось записать группу справочника номенклатура - " + ЕстьТакаяПапка + "."); ВызватьИсключение; КонецПопытки; Иначе Родитель = ЕстьТакаяПапка.Ссылка; КонецЕсли; КонецЦикла; Возврат Родитель; КонецФункции &НаСервере Процедура ЗаписатьНоменклатуру(ТекЭлемент) //Родитель = УстановитьРодителяНоменклатуры(СокрЛП(ТекЭлемент.Родитель)); ОбщегоНазначенияКлиентСервер.СообщитьПользователю("В справочнике не найдена номенклатура: " + СокрЛП(ТекЭлемент.Наименование) + ". Будет создана новая номенклатура."); НоваяНоменклатура = Справочники.Номенклатура.СоздатьЭлемент(); НоваяНоменклатура.Наименование = СокрЛП(ТекЭлемент.Наименование); НоваяНоменклатура.Родитель = УстановитьРодителяНоменклатуры(СокрЛП(ТекЭлемент.Родитель)); НоваяНоменклатура.АлкогольнаяПродукция = ЛогическиеЗначение(СокрЛП(ТекЭлемент.АлкогольнаяПродукция)); НоваяНоменклатура.ВариантОформленияПродажи = ЗначениеПеречисления("ВариантыОформленияПродажи", СокрЛП(ТекЭлемент.ВариантОформленияПродажи)); НоваяНоменклатура.ВесИспользовать = ЛогическиеЗначение(СокрЛП(ТекЭлемент.ВесИспользовать)); НоваяНоменклатура.ВесМожноУказыватьВДокументах = ЛогическиеЗначение(СокрЛП(ТекЭлемент.ВесМожноУказыватьВДокументах)); НоваяНоменклатура.ВестиУчетПоГТД = ЛогическиеЗначение(СокрЛП(ТекЭлемент.ВестиУчетПоГТД)); НоваяНоменклатура.ВестиУчетСертификатовНоменклатуры = ЛогическиеЗначение(СокрЛП(ТекЭлемент.ВестиУчетСертификатовНоменклатуры)); НоваяНоменклатура.ВидНоменклатуры = Справочники.ВидыНоменклатуры.НайтиПоНаименованию(СокрЛП(ТекЭлемент.ВидНоменклатуры)); НоваяНоменклатура.ЕдиницаИзмерения = Справочники.УпаковкиЕдиницыИзмерения.НайтиПоКоду(СокрЛП(ТекЭлемент.ЕдиницаИзмерения)); НоваяНоменклатура.ЕдиницаИзмеренияСрокаГодности = ЗначениеПеречисления("ЕдиницыИзмеренияВремени", СокрЛП(ТекЭлемент.ЕдиницаИзмеренияСрокаГодности)); НоваяНоменклатура.ЕстьТоварыДругогоКачества = ЛогическиеЗначение(СокрЛП(ТекЭлемент.ЕстьТоварыДругогоКачества)); НоваяНоменклатура.ИмпортнаяАлкогольнаяПродукция = ЛогическиеЗначение(СокрЛП(ТекЭлемент.ИмпортнаяАлкогольнаяПродукция)); НоваяНоменклатура.ДлинаИспользовать = ЛогическиеЗначение(СокрЛП(ТекЭлемент.ДлинаИспользовать)); НоваяНоменклатура.ДлинаМожноУказыватьВДокументах = ЛогическиеЗначение(СокрЛП(ТекЭлемент.ДлинаМожноУказыватьВДокументах)); НоваяНоменклатура.ИспользованиеХарактеристик = ЗначениеПеречисления("ВариантыИспользованияХарактеристикНоменклатуры", СокрЛП(ТекЭлемент.ИспользованиеХарактеристик)); НоваяНоменклатура.ИспользоватьИндивидуальныйШаблонЦенника = ЛогическиеЗначение(СокрЛП(ТекЭлемент.ИспользоватьИндивидуальныйШаблонЦенника)); НоваяНоменклатура.ИспользоватьИндивидуальныйШаблонЭтикетки = ЛогическиеЗначение(СокрЛП(ТекЭлемент.ИспользоватьИндивидуальныйШаблонЭтикетки)); НоваяНоменклатура.ИспользоватьУпаковки = ЛогическиеЗначение(СокрЛП(ТекЭлемент.ИспользоватьУпаковки)); НоваяНоменклатура.Качество = ЗначениеПеречисления("ГрадацииКачества", СокрЛП(ТекЭлемент.Качество)); НоваяНоменклатура.НаименованиеПолное = СокрЛП(ТекЭлемент.НаименованиеПолное); НоваяНоменклатура.ПодакцизныйТовар = ЛогическиеЗначение(СокрЛП(ТекЭлемент.ПодакцизныйТовар)); НоваяНоменклатура.ПоставляетсяВМногооборотнойТаре = ЛогическиеЗначение(СокрЛП(ТекЭлемент.ПоставляетсяВМногооборотнойТаре)); НоваяНоменклатура.СтавкаНДС = ЗначениеПеречисления("СтавкиНДС", СокрЛП(ТекЭлемент.СтавкаНДС)); НоваяНоменклатура.ТипНоменклатуры = ЗначениеПеречисления("ТипыНоменклатуры", СокрЛП(ТекЭлемент.ТипНоменклатуры)); НоваяНоменклатура.ОбъемИспользовать = ЛогическиеЗначение(СокрЛП(ТекЭлемент.ОбъемИспользовать)); НоваяНоменклатура.ОбъемМожноУказыватьВДокументах = ЛогическиеЗначение(СокрЛП(ТекЭлемент.ОбъемМожноУказыватьВДокументах)); НоваяНоменклатура.ПлощадьИспользовать = ЛогическиеЗначение(СокрЛП(ТекЭлемент.ПлощадьИспользовать)); НоваяНоменклатура.ПлощадьМожноУказыватьВДокументах = ЛогическиеЗначение(СокрЛП(ТекЭлемент.ПлощадьМожноУказыватьВДокументах)); НоваяНоменклатура.ЕдиницаДляОтчетов = Справочники.УпаковкиЕдиницыИзмерения.НайтиПоКоду(СокрЛП(ТекЭлемент.ЕдиницаДляОтчетов)); НоваяНоменклатура.КоэффициентЕдиницыДляОтчетов = ТекЭлемент.КоэффициентЕдиницыДляОтчетов; НоваяНоменклатура.ОбособленнаяЗакупкаПродажа = ЛогическиеЗначение(СокрЛП(ТекЭлемент.ОбособленнаяЗакупкаПродажа)); НоваяНоменклатура.ОблагаетсяНДПИПоПроцентнойСтавке = ЛогическиеЗначение(СокрЛП(ТекЭлемент.ОблагаетсяНДПИПоПроцентнойСтавке)); НоваяНоменклатура.ПродукцияМаркируемаяДляГИСМ = ЛогическиеЗначение(СокрЛП(ТекЭлемент.ПродукцияМаркируемаяДляГИСМ)); НоваяНоменклатура.КиЗГИСМ = ЛогическиеЗначение(СокрЛП(ТекЭлемент.КиЗГИСМ)); НоваяНоменклатура.УдалитьСырьевойТовар = ЛогическиеЗначение(СокрЛП(ТекЭлемент.УдалитьСырьевойТовар)); НоваяНоменклатура.ПодконтрольнаяПродукцияВЕТИС = ЛогическиеЗначение(СокрЛП(ТекЭлемент.ПодконтрольнаяПродукцияВЕТИС)); НоваяНоменклатура.АлкогольнаяПродукцияВоВскрытойТаре = ЛогическиеЗначение(СокрЛП(ТекЭлемент.АлкогольнаяПродукцияВоВскрытойТаре)); НоваяНоменклатура.ОблагаетсяНДСУПокупателя = ЛогическиеЗначение(СокрЛП(ТекЭлемент.ОблагаетсяНДСУПокупателя)); Попытка НоваяНоменклатура.Заблокировать(); НоваяНоменклатура.Записать(); Исключение ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Не удалось записать элемент справочника номенклатура - " + НоваяНоменклатура + "."); ВызватьИсключение; КонецПопытки; КонецПроцедуры &НаСервере Процедура ЗагрузитьНоменклатуру(ИмяФайла, ИННОрганиазции) Файл = Новый Файл(ИмяФайла); Чтение = Новый ЧтениеJSON; Чтение.ОткрытьФайл(Файл.ПолноеИмя); СписокЭлементов = ПрочитатьJSON(Чтение, Ложь, "Дата", ФорматДатыJSON.ISO); Для Каждого ТекЭлемент Из СписокЭлементов Цикл ТекНаименование = СокрЛП(ТекЭлемент.Наименование); ЕстьНоменклатура = НайтиЭлементСправочника(2, "Номенклатура", , ТекНаименование); Если (ЕстьНоменклатура = Справочники.Номенклатура.ПустаяСсылка()) Тогда ЗаписатьНоменклатуру(ТекЭлемент); КонецЕсли; КонецЦикла; КонецПроцедуры |
|||
36
zva
25.12.19
✎
12:45
|
(35) С иерархией так нельзя.
Можно при первой загрузке создавать элементы с пустым родителем, тогда гарантировано создадутся ВСЕ элементы, второй раз пройтись по файлу и корректно проставить только родителя. |
|||
37
bolobol
25.12.19
✎
12:48
|
Регистрация изменений?
|
|||
38
Масянька
25.12.19
✎
13:00
|
(36) Судя по всему, ты прав.
Сейчас грузится без родителя. |
|||
39
Масянька
25.12.19
✎
13:10
|
Не фига...
Дословно: {ВнешняяОбработка.СлияниеБД.Форма.Форма.Форма(1009)}: Ошибка при вызове метода контекста (Записать) НоваяНоменклатура.Записать(); по причине: Конфликт блокировок при выполнении транзакции: по причине: Конфликт блокировок при выполнении транзакции: |
|||
40
Масянька
25.12.19
✎
13:11
|
+ (39) Без родителя. Вообще. В корне всё.
Село где-то 2 трети. |
|||
41
Масянька
25.12.19
✎
13:13
|
Что не так?
|
|||
42
zva
25.12.19
✎
13:17
|
(41) Смотреть регламентные задания, если есть обмены. При загрузке номенклатуры она регистрируется в плане обмена, дальше по расписанию может срабатывать выгрузка, которая блокирует таблицу регистрации изменений и происходит блокировка.
|
|||
43
Волшебник
модератор
25.12.19
✎
13:18
|
(39) А говорила, что транзакции не используешь...
|
|||
44
Масянька
25.12.19
✎
13:18
|
(43) Код в (35).
|
|||
45
Волшебник
модератор
25.12.19
✎
13:20
|
Пробегись первым циклом, создай все группы.
Потом вторым циклом загрузи элементы |
|||
46
Масянька
25.12.19
✎
13:21
|
(42) В фоновых - 2: статистика и монитор портала.
В регламентных 35, выполняется только статистика. |
|||
47
Garykom
гуру
25.12.19
✎
13:21
|
Еще чуть чуть и Масянька начнет на JS, C++ и сама VPS и сервера настраивать и сайты поднимать...
ЗЫ Уже выяснила что такое экранирование, интересно когда раньше """" вместо """ понимала что делает? |
|||
48
Масянька
25.12.19
✎
13:22
|
(45) Сейчас тупо в корень грузила. Родителя (в коде) заремила.
|
|||
49
Йохохо
25.12.19
✎
13:22
|
можно попробовать явно начинать и фиксировать транзакцию каждые 100 элементов
|
|||
50
Масянька
25.12.19
✎
13:22
|
(47) У тебя что-то по теме? Или просто потрындеть?
|
|||
51
Масянька
25.12.19
✎
13:23
|
(49) Больше сотни село.
|
|||
52
Галахад
гуру
25.12.19
✎
13:24
|
Конфигурация доработанная? Там каких-нибудь штук "призаписи" случайно нет?
|
|||
53
Масянька
25.12.19
✎
13:24
|
А свертка резервов товаров может влиять?
|
|||
54
Масянька
25.12.19
✎
13:25
|
(52) Хороший вопрос...
Снята. Буду смотреть. |
|||
55
Garykom
гуру
25.12.19
✎
13:25
|
(50) Как думаешь можно ли в одном коде дважды заблокировать один и тот же объект?
|
|||
56
Йохохо
25.12.19
✎
13:26
|
(53) Давно бы добавила паузу в пару секунд после исключения и опять до села
|
|||
57
Масянька
25.12.19
✎
13:27
|
(56) Как?
|
|||
58
Йохохо
25.12.19
✎
13:29
|
(57) запомни позицию файла, покажи вопрос, через 2 секунды нажми да)
|
|||
59
Галахад
гуру
25.12.19
✎
13:33
|
(58) Можно предупреждение с паузой.
|
|||
60
Масянька
25.12.19
✎
13:56
|
(52) Да, вроде нет ничего.
|
|||
61
Garykom
гуру
25.12.19
✎
14:00
|
А может все же создавать/записывать группы/элементы начиная с верхнего уровня а?
Короче строишь виртуальную структуру в оперативке "с группировками" и начинаешь обходить правильно. |
|||
62
Волшебник
модератор
25.12.19
✎
14:02
|
(61) Ой, это сложно и не по-женски. Лучше обходить в бесконечном цикле, пока всё не будет создано.
|
|||
63
Масянька
25.12.19
✎
14:04
|
(61) А почему без родителя (совсем, все в корне) - тоже выдает, что блокировка?
|
|||
64
Масянька
25.12.19
✎
14:04
|
(62) Ой, всё.
|
|||
65
Масянька
25.12.19
✎
14:35
|
Такой вопрос: универсальная выгрузка-загрузка XML (стандарт, без моего вмешательства (чтобы исключить женский вопрос)):
- выгружено 11401 элементов справочника номенклатура. - загрузка: ошибка СУБД: Невосстановимая ошибка Ошибка при выполнении запроса POST к ресурсу /e1cib/logForm: по причине: Ошибка СУБД: С базой проблемы? |
|||
66
Волшебник
модератор
25.12.19
✎
14:38
|
(65) Всё. Приплыли. Баста. База разрушена.
|
|||
67
Garykom
гуру
25.12.19
✎
14:55
|
(65) Это просто слишком долго &НаСервере и решил иди ты нафик
|
|||
68
Масянька
25.12.19
✎
14:58
|
(66) (67) Петросян со Степаненко.
|
|||
69
1Сергей
25.12.19
✎
15:00
|
(68) А ты Регина Дубовитская тутошняя. Ы-ы-ы-ы :)
|
|||
70
Волшебник
модератор
25.12.19
✎
15:01
|
Пригласите специалиста. ;)
|
|||
71
Масянька
25.12.19
✎
15:02
|
(70) Тех, что УТ писали?
|
|||
72
Масянька
25.12.19
✎
15:02
|
(69) Под Галустяна косишь?
|
|||
73
Масянька
25.12.19
✎
15:44
|
Повторю вводную:
- есть три БД УТ. - нуно из двух БД УТ перенести номенклатуру (проблема) в третью. - при загрузке в третью либо блокировки, либо ошибка СУБД. Для эксперимента взяла две УТ (из которых нужно переносить), и из одной (файл 14 Гб) загрузила в другую. В общем, все норм село. Причем, вместе с родителями. Как положено. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |