Имя: Пароль:
1C
1С v8
Откуда берется слеш?
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 Гб) загрузила в другую.
В общем, все норм село. Причем, вместе с родителями. Как положено.
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший