Имя: Пароль:
1C
 
Пара вопросов про планы обмена.
0 1CSharp
 
26.02.19
18:48
Есть база скуля, и туда нужно выгружать изменную номенклатуру с ценой. Номенклатура регистрируется автоматом.
1. В какой момент регистририровать номенклатуру при изменении цены? Подписка на проведение документа установки цен?
2. Как правильно выбрать все изменения, обработать их, и потом очистить?
Правильно ли понимаю, что процесс такой:
а. Заблокировать узел
б. ВыбратьИзменения
в. УдалитьРегистрацию
г. Разблокировать узел?
1 palsergeich
 
26.02.19
19:23
(0) а зачем узел блокировать?
Во вторых ВыбратьИзменерия (если платформенный метод) - на больших выборках лучше не использовать, а делать это запросом (где номерСообщения is null)
2 1CSharp
 
26.02.19
19:44
(1) Вот тоже смотрю в сторону запроса.
Но не понял, как поменять номер сообщения. Пишет, что поле недоступно для записи
3 vde69
 
26.02.19
19:46
кто мешает воспользоватся штатной обработкой?
4 palsergeich
 
26.02.19
19:52
(2) ВыбратьИзменения, но 3ий параметр - конкретная ссылка, тогда для этой ссылке на этом узле установится номер сообщения, заданный в 2м параметре.
Поссылочный вариант - лучше
5 1CSharp
 
26.02.19
19:56
(2) Мой косяк был.

(4) Всё же не пойму оптимальный вариант. Выбираем запросом (#1), где NULL, обрабатываем, вызываем ВыбратьИзменения на эту ссылку (#2). Но что если между 1 и 2, это номенклатура ещё раз поменяется?
6 palsergeich
 
26.02.19
19:59
(5) между 1 и концом 2 можно установить управляемую блокировку.
Но у тебя будет заблокировано только то что надо, а не вся таблица изменений. То есть те данные которые в обмене не участвуют - с ними можно будет работать
7 1CSharp
 
26.02.19
20:01
(6) На каждую ссылку блокировку делать?
Вариант, конечно.
Ну либо можно узел заблокировать)
Ща попробую с управляемой блокировкой, смс за мысль
8 1CSharp
 
26.02.19
20:03
Так, а что блокировать то? Таблицу изменений?
"Справочник.Проекты.Изменения"?
9 palsergeich
 
26.02.19
20:03
(7) На узел не надо - смысла нет.
Ты получаешь массив измененных объектов и на него накладываешь блокировку, сразу скопом. См ИспользоватьИзИсточникаДанных.
10 palsergeich
 
26.02.19
20:04
(8) На Сам справочник.
Те объекты, которые сейчас выгружаются их можно будет прочитать, но нельзя записать до конца транзакции.
Те, которые не участвуют можно и читать и записывать
11 1CSharp
 
26.02.19
20:05
(10) Так я же ещё цену выгружаю. Таблицу изменений можно заблокировать? Ща попробую
12 1CSharp
 
26.02.19
20:06
Если нет, то узел придётся
13 palsergeich
 
26.02.19
20:07
(12) Но цена это же регистр сведений цены чего то там.
Тебе в любом случае 2 таблицы блочить
14 palsergeich
 
26.02.19
20:07
Или реальные или изменений
15 palsergeich
 
26.02.19
20:08
Но блокировка на реальные она будет меньше чем на изменения по узлу
16 1CSharp
 
26.02.19
20:08
(13) Так я при проведении установки цен буде регистрировать просто изменения номенклатуры. И если таблица измениний номенклатуры будет залочена, то всё будет гуд - цены не проведутся.
17 1CSharp
 
26.02.19
20:09
Ну либо дождутся окончания блокировки
18 palsergeich
 
26.02.19
20:10
(16) Я тебе в общем направление дал, дальше думай сам.
19 1CSharp
 
26.02.19
20:37
(18) Да, направление хорошее, спасибо.

Но есть проблемка)
Да... Мне потребовалось минут двадцать, чтобы понять, что блокировки без транзакции не работают xD
20 palsergeich
 
26.02.19
20:38
(19) Вот ты и немного прокачался.
21 1CSharp
 
26.02.19
20:39
(20) Ага, прям как три года назад, когда спеца по платформе сдал xD
Ща посмотрим, можно ли на таблицу изменений блокировку наложить...
22 1CSharp
 
26.02.19
20:42
Похоже, можна. Круть
Побольше бы таких адекватных людей на форуме) Спасибо ещё раз!
23 palsergeich
 
26.02.19
20:43
(21) Можно
24 1CSharp
 
26.02.19
21:18
Не, мой план не сработал :'(

Если блокировать таблице изменений

НачатьТранзакцию(РежимУправленияБлокировкойДанных.Управляемый);
    Блокировка = Новый БлокировкаДанных;
    ЭлементБлокировки = Блокировка.Добавить();
    ЭлементБлокировки.Область = "Справочник.номенклатура.Изменения";
    Сообщить("Справочник.номенклатура.Изменения");
    ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
    Ссыль = Справочники.Номенклатура.НайтиПоКоду("00000073078");
    Сообщить(строка(Ссыль)+" "+строка(ТекущаяДата()));
    ЭлементБлокировки.УстановитьЗначение("Ссылка", Ссыль);
    Блокировка.Заблокировать();
    Сообщить("Блок: "+ТекущаяДата());

    ТекДата = ТекущаяДата();
    Пока ТекущаяДата() - ТекДата < 30 Цикл
        Продолжить;        
    КонецЦикла;
    Сообщить("Готово: "+ТекущаяДата());


Регистрация проходит без проблем:

Процедура ПодпискаНаСобытие1ОбработкаПроведения(Источник, Отказ, РежимПроведения) Экспорт
    План = ПланыОбмена.PowerBI.НайтиПоКоду("2");
    ПланыОбмена.ЗарегистрироватьИзменения(План, Источник.Товары[0].Номенклатура);
КонецПроцедуры

Таки, придётся кодить...
25 hhhh
 
26.02.19
21:29
(24) номенклатуру грузите отдельно цены отдельно. Не надо при каждом чихе весь справочник номенклатуры фигачить. Один раз выгрузили и достаточно. Дальше только конкретные элементы, которые изменились.  Изменился элемент, регистрируйте его при записи к обмену.

то есть при выгрузки цен выгружать номенклатуру не нужно.
26 palsergeich
 
26.02.19
21:33
(24) У меня работает
27 palsergeich
 
26.02.19
21:38
(24) Я кажется понял в чем дело.
28 palsergeich
 
26.02.19
22:10
ЗарегестрироватьИзменения и УдалитьИзменения не вешают управляемую блокировку, а сразу идут в скуль
29 palsergeich
 
26.02.19
22:11
Если сделать так

НачатьТранзакцию(РежимУправленияБлокировкойДанных.Управляемый);
    Блокировка = Новый БлокировкаДанных;
    ЭлементБлокировки = Блокировка.Добавить();
    ЭлементБлокировки.Область = "Справочник.номенклатура.Изменения";
    Сообщить("Справочник.номенклатура.Изменения");
    ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
    Ссыль = Справочники.Номенклатура.НайтиПоКоду("00000073078");
    Сообщить(строка(Ссыль)+" "+строка(ТекущаяДата()));
    ЭлементБлокировки.УстановитьЗначение("Ссылка", Ссыль);
    Блокировка.Заблокировать();
    Сообщить("Блок: "+ТекущаяДата());

    ТекДата = ТекущаяДата();
    Пока ТекущаяДата() - ТекДата < 30 Цикл
        Продолжить;        
    КонецЦикла;
    Сообщить("Готово: "+ТекущаяДата());


И в это время записать справочник то видно что идет ожидание на блокировке и записть по повешенной упр блокировке в ТЖ по таблице изменений есть
30 palsergeich
 
26.02.19
22:12
а эти 2 метода ЗарегестрироватьИзменения и УдалитьИзменения в ТЖ по упр блокировкам не оставляют следов.
31 1CSharp
 
27.02.19
17:57
(30) Ну тогда и цены буду блокировать
Спасибо за инфу!
32 breezee
 
28.02.19
05:03
Во-первых прочитайте про конвертацию данных 2.
Во-вторых, зачем вам блокировка?
В-третиьх, если есть уже какой-то обмен - посмотрите как он реализован
ВЫ сейчас какой-то велосипед нагородите, а потом с ним кто-то будет ****ься
33 1CSharp
 
28.02.19
12:01
(32)
При чем тут вообще конвертация?
Во-вторых, чтобы не пропустить изменений, это должно быть очевидно.
В-третьих, как раз таки нет. Лучше написать свой простенький велосипед, чем использовать чужой потрепанный движок V8.
Велосипед получился максимально простым.
34 Serg_1960
 
28.02.19
12:18
(33) Вы из своего детского самоката быстро вырастите. Пара/тройка обновлений - и у него круглые колеса быстро станут квадратными. Впрочем мне нет никого дела до ваших граблей - прыгайте :)
35 rsv
 
28.02.19
12:48
(0) можно этот огород не городить..при условии что 1с ка на скуле...( откуда едет номенклатура ). Из базы скуля приемника (я так понял не 1с) запрос на джобе на сравнение данных в двух базах и результат insert или update  .
Программист всегда исправляет последнюю ошибку.