Ошибка при вызове метода контекста выбратьизменения

Проблема блокировок при работе с планом обмена

Я
   mzelensky

06.04.21 — 12:46

Доброго времени суток!

Есть план обмен, работа с которым реализована следующим образом:

1) Получение данных из узла, присвоение выбранным данным «Номера сообщения» (для последующей очистки)

Функция ЗаполнитьСтруктуруИзмененийДляУзла_Справочники(УзелПланаОбмена, ИмяТаблицы)

    
    РезультатФункции = Новый Структура(«ДанныеРегистрации, НомерИсходящегоСообщения»);

    
    ОтобразитьСостояние(«Выборка изменений …»);

    
    Если Метаданные.Справочники.Найти(ИмяТаблицы) <> Неопределено Тогда

        Если ЗначениеЗаполнено(УзелПланаОбмена) Тогда

            Запрос = Новый Запрос;

            Запрос.Текст =»ВЫБРАТЬ ПЕРВЫЕ 3000

            |    Изменения.Ссылка КАК Объект

            |ИЗ

            |    Справочник.» + ИмяТаблицы + «.Изменения КАК Изменения

            |ГДЕ

            |    Изменения.Узел = &Узел»;

            Запрос.УстановитьПараметр(«Узел», УзелПланаОбмена);

            
            ДанныеРегистрации = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку(«Объект»);

            
            //

            Если ДанныеРегистрации.Количество() > 0 Тогда

                
                ЗаписьСообщения = ПланыОбмена.СоздатьЗаписьСообщения();

                Запись = Новый ЗаписьXML;

                Запись.УстановитьСтроку();

                ЗаписьСообщения.НачатьЗапись(Запись, УзелПланаОбмена);

                
                ВыборкаИзменений = ПланыОбмена.ВыбратьИзменения(ЗаписьСообщения.Получатель, ЗаписьСообщения.НомерСообщения, ДанныеРегистрации);

                
                РезультатФункции.Вставить(«ДанныеРегистрации», ДанныеРегистрации);

                РезультатФункции.Вставить(«НомерИсходящегоСообщения», ЗаписьСообщения.НомерСообщения);

                
                ЗаписьСообщения.ЗакончитьЗапись();

                Запись.Закрыть();

                
                ВыборкаИзменений = Неопределено;

                ЗаписьСообщения  = Неопределено;

                Запись              = Неопределено;

                
            КонецЕсли;

        
        КонецЕсли;

    КонецЕсли;

    
    Возврат РезультатФункции;

    
КонецФункции

2) Происходит выгрузка сведений

3) Удаление из плана обмена успешно выгруженных данных (и не поменявшихся за момень выгрузки)

Функция ОчиститьИзмененияДляУзла_Справочники(УзелПланаОбмена, ИмяТаблицы, НомерСообщения, ДанныеУдаляемыеИзРегистрации)

    
    РезультатФункции = Истина;

    
    ОтобразитьСостояние(«Очистка изменений …»);

    
    Если Метаданные.Справочники.Найти(ИмяТаблицы) <> Неопределено Тогда

        Если ЗначениеЗаполнено(УзелПланаОбмена) И ЗначениеЗаполнено(НомерСообщения) И ЗначениеЗаполнено(ДанныеУдаляемыеИзРегистрации) Тогда

            
            Запрос = Новый Запрос;

            Запрос.Текст =»ВЫБРАТЬ

            |    Изменения.Ссылка КАК Объект,

            |    Изменения.НомерСообщения КАК НомерСообщения

            |ИЗ

            |    Справочник.» + ИмяТаблицы + «.Изменения КАК Изменения

            |ГДЕ

            |    Изменения.Узел = &Узел

            |    И Изменения.НомерСообщения > 0

            |    И Изменения.НомерСообщения <= &НомерСообщения

            |    И Изменения.Ссылка В(&ДанныеУдаляемыеИзРегистрации)

            |»;

            Запрос.УстановитьПараметр(«Узел», УзелПланаОбмена);            

            Запрос.УстановитьПараметр(«НомерСообщения», НомерСообщения);

            Запрос.УстановитьПараметр(«ДанныеУдаляемыеИзРегистрации», ДанныеУдаляемыеИзРегистрации);

            
            Выборка = Запрос.Выполнить().Выбрать();

            Пока Выборка.Следующий() Цикл

                ПланыОбмена.УдалитьРегистрациюИзменений(УзелПланаОбмена, Выборка.Объект);    

            КонецЦикла;    

            
        Иначе

            РезультатФункции = Ложь;    

        КонецЕсли;          

    Иначе

        РезультатФункции = Ложь;    

    КонецЕсли;

    
    Возврат РезультатФункции;

    
КонецФункции

   mzelensky

1 — 06.04.21 — 12:48

После запуска этого механизма стала возникать ошибка блокировки:

Ошибка при вызове метода контекста (ВыбратьИзменения): Конфликт блокировок при выполнении транзакции:

Microsoft SQL Server Native Client 11.0: Транзакция (идентификатор процесса 55) вызвала взаимоблокировку ресурсов блокировка с другим процессом и стала жертвой взаимоблокировки. Запустите транзакцию повторно.

Т.е. блокировку вызывает вот эта строчка:

ВыборкаИзменений = ПланыОбмена.ВыбратьИзменения(ЗаписьСообщения.Получатель, ЗаписьСообщения.НомерСообщения, ДанныеРегистрации);

Нужна она мне для того, чтобы выбираемым данным назначить номер сообщения, по которому потом будет происходить зачистка.

   mzelensky

2 — 06.04.21 — 12:52

Поиски в интернете показали, что Да «ПланыОбмена.ВыбратьИзменения» вызывает блокировку.

Но почему она длительная и мешает и как можно адекватно обойти ее — не понятно

   fisher

3 — 06.04.21 — 12:57

Еще бы она не вызывала блокировку. Она же пишущая.

А вот почему другой процесс в нее упирается и какой именно процесс — вопрос.

Релиз, платформа, режим блокировок?

   mzelensky

4 — 06.04.21 — 13:05

(3) «Релиз, платформа, режим блокировок» — платформа 8.3.15, режим блокировок «Автоматический»

«какой именно процесс в нее упирается» — могу предположить .что механизм, который регистрирует изменения в узел.

Понятно, что она пишущая. Не понятно, почему она на столько «блокирующая».

   mzelensky

5 — 06.04.21 — 13:06

Как лучше обойти проблему с присвоением номера выбираемым данным я не нашел. Во всех источниках применяется примерно такая же логика.

   FIXXXL

6 — 06.04.21 — 13:25

(1) сделай обмен почаще, что бы порцайки не такие большие были

таблица плана обмена блокируется вся и наглухо… очень узкое место во всей концепции обменов на Планах

   fisher

7 — 06.04.21 — 13:31

В режиме блокировок «Автоматический» для дедлока достаточно, чтобы оба процесса успели параллельно прочитать что-то нужное друг-другу для записи.

В управляемых блокировках это бы возникло только если бы они успели записать что-то нужное друг-другу для записи (так как де-факто управляемые блокировки сейчас на версионнике работают).

Но даже для первого варианта вроде эти звезды свести непросто. Хотя «Автоматический» еще эскалировать любит. Такое ощущение, что у тебя какие-то массированные пишущие регламенты крутятся, которые одно и то же могут перезаписывать. В итоге и таблица изменений постоянно большая и куча изменений тех же данных постоянно прилетает. Если это так, то попробуй развести их по времени хотя бы.

(6) Если бы она блокировалась вся и наглухо — то дедлоков бы не было. Был бы просто большой тайм-аут на блокировке и в худшем случае «опоздавшая» транзакция отваливалась бы по тайм-ауту.

   H A D G E H O G s

8 — 06.04.21 — 13:32

Добавить в

Запрос.Текст =»ВЫБРАТЬ ПЕРВЫЕ 3000

            |    Изменения.Ссылка КАК Объект

            |ИЗ

            |    Справочник.» + ИмяТаблицы + «.Изменения КАК Изменения

            |ГДЕ

            |    Изменения.Узел = &Узел»;

ДЛЯ ИЗМЕНЕНИЯ

   H A D G E H O G s

9 — 06.04.21 — 13:33

Это просто пучок Ванги в космос в надежде, что у тебя просто дедлок по повышению уровня изоляции.

   fisher

10 — 06.04.21 — 13:39

(9) Тогда надо такое сделать одним запросом по всем выгружаемым справочникам. Тогда гарантия будет.

   fisher

11 — 06.04.21 — 13:41

А зачем так вообще сделано? Зачем выгружать только справочники?

Почему вообще не свести это к единственному ВыбратьИзменения()?

   Serg_1960

12 — 06.04.21 — 13:44

Автор реплику справочников базы данных делает?

   fisher

13 — 06.04.21 — 13:45

А ЗаполнитьСтруктуруИзмененийДляУзла_Справочники() случаем не в транзакции вызывается?

   mzelensky

14 — 06.04.21 — 13:47

(11) А разница?

   mzelensky

15 — 06.04.21 — 13:48

(13) Уже проверил — программно не увидел такого.

   mzelensky

16 — 06.04.21 — 13:49

Есть ли какой-то принципиально другой вариант выбрать данные из плана обмена с присвоением номера сообщения?

Я вот что-то не вижу альтернатив. Прям альтернатива — убрать к чертям эти планы обмена и делать все на обычном РС.

   fisher

17 — 06.04.21 — 13:52

(15) Странно. Тогда действительно разницы быть не должно. Тогда действительно может помочь совет (8)

   mzelensky

18 — 06.04.21 — 13:57

(17) Попробую (8)

«Такое ощущение, что у тебя какие-то массированные пишущие регламенты крутятся, которые одно и то же могут перезаписывать. В итоге и таблица изменений постоянно большая и куча изменений тех же данных постоянно прилетает. Если это так, то попробуй развести их по времени хотя бы.»

Эти планы для регистрации элементов к выгрузке на сайт. Регламент выгрузки стартует каждые 3 минуты. Обычно очередь не очень большая, до 1000 элементов. Но иногда бывают «большие обмены», для этого ограничил размер порции 3000 элементами.

Механизм работает уже давно и довольно стабильно, но вот нашел одну «дырку», закрыть которую решил внедрением «ВыборкаИзменений = ПланыОбмена.ВыбратьИзменения(ЗаписьСообщения.Получатель, ЗаписьСообщения.НомерСообщения, ДанныеРегистрации);» (ранее этой конструкции не было и из плана обмена удалялись все выгруженные элементы, без контроля НомераСообщения). «Дырку» закрыл, но появились ошибки блокировки.

   Serg_1960

19 — 06.04.21 — 14:02

Каждые три минуты у Вас вносятся изменения в тысячу и более записей справочников? Извини за вопрос не в тему: а что это у вас такое вообще?

   fisher

20 — 06.04.21 — 14:06

(18) Только раз вышестоящей транзакции нет, то для (8) нужно запрос и регистрацию обрамить в транзакцию.

   mzelensky

21 — 06.04.21 — 14:06

(19) К чему удивления? Ты не видел интернет-магазины у которых «новый заказ» падает каждые 2-3 секунды? В заказе от 1 до 10 единиц товара. Дальше идет обработка всего этого.

+ Розничные магазины — 30 штук.

+ Оптовый отдел.

   fisher

22 — 06.04.21 — 14:06

Тьфу. Запрос и выборку изменений.

   fisher

23 — 06.04.21 — 14:07

(21) Обычно при этом принято изменять документы, а не справочники.

   mikecool

24 — 06.04.21 — 14:07

емнип, но могу ошибаться — транзакция активна до окончания перебора выборки изменений

   mzelensky

25 — 06.04.21 — 14:08

(19) «у Вас вносятся изменения в тысячу и более записей справочников» — не изменения вносятся в справочники, а возникают события, при которых элементы справочников нужно зарегистрировать к выгрузке во внешнюю системы.

   mzelensky

26 — 06.04.21 — 14:09

(24) У меня вообще нет перебора выборки изменений

ЗаписьСообщения = ПланыОбмена.СоздатьЗаписьСообщения();

                Запись = Новый ЗаписьXML;

                Запись.УстановитьСтроку();

                ЗаписьСообщения.НачатьЗапись(Запись, УзелПланаОбмена);

                
                ВыборкаИзменений = ПланыОбмена.ВыбратьИзменения(ЗаписьСообщения.Получатель, ЗаписьСообщения.НомерСообщения, ДанныеРегистрации);

                
                РезультатФункции.Вставить(«ДанныеРегистрации», ДанныеРегистрации);

                РезультатФункции.Вставить(«НомерИсходящегоСообщения», ЗаписьСообщения.НомерСообщения);

                
                ЗаписьСообщения.ЗакончитьЗапись();

                Запись.Закрыть();

                
                ВыборкаИзменений = Неопределено;

                ЗаписьСообщения  = Неопределено;

                Запись              = Неопределено;

   Serg_1960

27 — 06.04.21 — 14:09

Я понял, не нужно повторять.

   fisher

28 — 06.04.21 — 14:11

(25) > возникают события, при которых элементы справочников нужно зарегистрировать к выгрузке во внешнюю системы

Зачем? Они поменялись? Почему? Или это банальная рекурсивная выгрузка всей используемой в заказах НСИ? Тогда зря.

   mzelensky

29 — 06.04.21 — 14:12

(28) Сейчас не в этом вопрос. Давай не будем углубляться.

   mikecool

30 — 06.04.21 — 14:13

(26) значит пришло время регистрацию изменений переделать на регистр сведений

   mzelensky

31 — 06.04.21 — 14:16

(30) Да, было бы здорово перевести на РС.

Если победить блокировки не удастся, то, видимо, придется именно так и сделать.

Вообще механизм планов обмена какой-то тупиковый. Метода написана 10 лет назад и никакой эволюции.

   fisher

32 — 06.04.21 — 14:20

(29) Тогда просто попробуй (8), обрамив чтение и выборку в транзакцию. По-идее, это должно заставить процессы телебонькать таблицу изменений по очереди, а не на брудершафт.

(30) На РС у тебя тоже могут возникнуть похожие проблемы

(31) Метода была написана еще в 7.7

Эволюция автомата калашникова не может происходить бескомпромиссно. К более продвинутому инструменту у тебя будет еще больше вопросов.

   Ёпрст

33 — 06.04.21 — 14:29

(0) а зечем тебе механизм сообщений ?

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

Тупо, план обмена регистрирует все изменения, ты их выгружаешь запросом на сайт и потом, по этой же выборке удаляешь регистрацию после обмена с сайтом. И Никаких номеров сообщений..

   Kassern

34 — 06.04.21 — 14:30

(33) а что будет, если в момент выгрузки изменений зарегистрируются новые? Без сообщений, данные изменения просто похерятся

   Cyberhawk

35 — 06.04.21 — 14:30

Выбирай не по 3000, а по 1000

   Ёпрст

36 — 06.04.21 — 14:31

(34) И че ? Улетят при следующем обмене. Он отправит на сайт, только то, что запрос выгреб и по этой же выборке удалит изменения.

   Ёпрст

37 — 06.04.21 — 14:31

И ничего там не херится.

   Serg_1960

38 — 06.04.21 — 14:32

У автора есть простой выход: не пытаться втиснуть свой распухший обмен в регламент «каждые три минуты», а делать очередной обмен через три минуты после окончания предыдущего.

«Ну вот и славно! До свиданья… Да, а кислород попробуйте… и ванны.» — и запись всех изменений порциями в транзакции.

   fisher

39 — 06.04.21 — 14:34

(33) У него так и было. Смотри (18). Но что-то он провтыкал, что таким образом решил полечить.

   Ёпрст

40 — 06.04.21 — 14:34

+ если по какой-то причине, на сайт загрузить не удалось, то просто не удаляешь регистрацию изменений.

Я у себя именно так и делал. И никаких номеров сообщений. Только узел обмена и привет.

   Kassern

41 — 06.04.21 — 14:36

(37) вот у тебя есть документ прихода, ты запустил выгрузку по плану обмена, формируешь файлик с остатками в разрезе номенклатуры и бац, в этот момент отменяют данный приход, но ты это изменение по документу не отработал и взял очистил полностью все изменения в плане обмена после успешной выгрузки. Далее ты изменения по этому документу не получишь, пока заново документ не перезапишешь. Поэтому и придумали номера сообщений, когда ты получаешь изменения, новые записи в план обмена уже попадают в разрезе нового номера сообщения.

   Kassern

42 — 06.04.21 — 14:38

(41) а далее весь букет неприятностей связанный с не верным остатком и отмененными заказами

   Ёпрст

43 — 06.04.21 — 14:40

(41) какой нах приход и тырнет магазин ?

   Serg_1960

44 — 06.04.21 — 14:42

*(38) хочу напомнить: автор формирует искусственно «порции» измененных данных, случайным образом попавших в выборку — имхо, на три минуты (а может быть и более) можно забыть про целостность и не противоречивость данных…

   mzelensky

45 — 06.04.21 — 14:45

(33)(39)(40)

Возможна следующая ситуация:

В плане обмена зареганы товары «Т1», «Т2» и «Т3». Стартует обмен, выбирает все 3 элемента — посылает на выгрузку и ожидает ответа от внешней системы о успешном получении (все синхронно). Далее успешно выгруженные данные удаляются из плана обмена.

А в момент между «выбирает все 3 элемента — посылает на выгрузку» и «успешно выгруженные данные удаляются из плана обмена» возникает изменение элемента «Т2» (т.е. возникает потребность снова ег овыгрузить). И вот если НЕ использовать «номера сообщений», то в конце система просто затрет все 3 элемента. И Второй раз элемент «т2» уже не выгрузится.

   Kassern

46 — 06.04.21 — 14:46

(45) о чем я и писал в (41)

   mzelensky

47 — 06.04.21 — 14:46

(46) ну да.

   Ёпрст

48 — 06.04.21 — 14:47

(45) да не вопрос, если этого боишься, то сразу грохай изменения. Потом выгружай на сайт, если не удачно — зарегь их. Все данные у тебя будут в выборке запроса.

   mzelensky

49 — 06.04.21 — 14:47

И решить это можно либо «Номером сообщения» — если использовать планы обмена. Либо обычной «Дата регистрации в очереди», если использовать РС.

   Kassern

50 — 06.04.21 — 14:47

в свое время настраивал крупный хаб по обмену остатков поставщиков, где матрицы товаров исчислялись десятками тысяч. Несколько крупных оптовиков обменивались остатками между собой. Вот там номер сообщения для обмена был критически важен

   mzelensky

51 — 06.04.21 — 14:49

(48) Плохая политика. Мне кажется так менее надежно.

   Ёпрст

52 — 06.04.21 — 14:49

(51) чем ? Что за пару мс у тебя что-то не зарегится ? У тебя там по 100’000 справочников летит всегда в обмене ?

   Kassern

53 — 06.04.21 — 14:50

(48) что значит удачно, неудачно? Выгрузка в основном всегда удачная, только в момент ее реализации могут быть еще изменения которые при очистке изменений в плане не попадут в следующую выгрузку, или я чего то не понимаю?

   mzelensky

54 — 06.04.21 — 14:50

(44) Вот это вообще не понял. О какой целостности и противоречивости речь?

   Ёпрст

55 — 06.04.21 — 14:51

(53) это значит, что http запрос вернул не 200.

   Ёпрст

56 — 06.04.21 — 14:51

тырнет у тебя отвалился, еще чего

   mzelensky

57 — 06.04.21 — 14:52

(53) Не удачная — это обработка ситуации, что на «принимающей» стороне произошел сбойошибка и данные не загрузились. Такое тоже бывает. Например, сайт «упал»

   mzelensky

58 — 06.04.21 — 14:54

(52) Я полагаюсь на следующее — «гарантированно приняли данные — тогда удалили из очереди». А если удалять сразу, то больше вариантов потерять данные, если где-то что-то пойдет не так.

   Kassern

59 — 06.04.21 — 14:54

(57) в этом случае вообще никаких проблем нет, не очищаешь изменения и все. Я же говорю про случаи, когда в момент выгрузки происходят изменения, чем более нагруженная выгрузка по времени выполнения, тем больше шансов на такие моменты

   Kassern

60 — 06.04.21 — 14:57

(59) я прост не вижу проблемы в использовании номеров сообщений, получаешь изменения по последнему номеру, обрабатываешь их, если удачно отправил — очищаешь изменения с этим номером.

   Serg_1960

61 — 06.04.21 — 14:58

(54) Это просто для понимания: если есть изменения — то они должны быть переданы все и сразу, иначе у Вас может возникнуть ситуация, когда логически связанные между собой изменения будут «разорваны» — окажутся в различных сеансах обмена данными. Самый негативный момент — когда может возникнуть ситуация, что ранее зарегистрированное изменение не попадет ни в первую, ни во вторую «порцию» сеанса обмена — выборка таблицы изменений ведь по природе своей — случайна.

   Kassern

62 — 06.04.21 — 14:59

(61) это что то новенькое, первый раз такое слышу…можно на реальном примере?

   Serg_1960

63 — 06.04.21 — 15:07

(62) Это совсем не новость :( На реальном примере? Например, рИБ-обмен, особенность обмена: документы и их движения — автономны и независимы друг от друга. И всегда есть вероятность между обменами получить новые движения без изменения самого документа и/или измененный документ со «старыми» движениями. Само собой разумеется, что  после очередного обмена всё само собой нормализуется.

   Kassern

64 — 06.04.21 — 15:13

(0) Блокировки управляемые у тебя?

Почитай вот эту статью, может разрешишь проблему с блокировками, тут в общих словах более менее разжевано, как работает план обмена со скулем

https://infostart.ru/1c/articles/561460/

   Kassern

65 — 06.04.21 — 15:16

(64) + еще вот тут есть схожая проблема и решение

https://forum.infostart.ru/forum9/topic230643/

   Serg_1960

66 — 06.04.21 — 15:34

Попытка автора читать и писать изменения «порциями» никоем образом не изменяет ситуацию с блокировками.

   Kassern

67 — 06.04.21 — 16:00

(66) насколько я понял, блокировка происходит при записи номера сообщения, когда получаешь выборку изменений. При управляемых блокировках, таблица не должна блокироваться, поэтому и ошибки с блокировками быть не должно

   Serg_1960

68 — 06.04.21 — 18:08

(67) Там нет единой таблицы как таковой. Имхо, в (64) об этом прямо сказано: ПланыОбмена.ВыбратьИзменения() поочередно обрабатывают каждую из таблиц изменений метаданных, а SQL Server, соответственно, для каждой из этих таблиц открывает/закрывает транзакцию — отсюда и эксклюзивные транзакционные блокировки таблицы.

   Garykom

69 — 06.04.21 — 18:12

(25) хрень какая то зачем сами элементы справочников повторно выгружать?

не логичнее документы?

  

Garykom

70 — 06.04.21 — 18:12

(69)+ или у вас остатки в номенклатуре? :)

Страница 1 из 3

  1. Примерно неделю назад возникла ошибка при синхронизации:
    «При загрузке сообщения обмена возникли ошибки: {Обработка.КонвертацияОбъектовИнформационныхБаз.МодульОбъекта(9152)}:Поле объекта не обнаружено (ФорматМагазина) ИначеЕсли НЕ ЭтоПараметрДляОбъекта.»

    База файловая.

    УТ — Управление торговлей, редакция 11.1 (11.1.6.24)
    РТ — Розница 8.3 Магазин автозапчастей, редакция 2.1 (2.1.2.8)

    До этого возникала ошибка:
    «{ОбщийМодуль.ОбменДаннымиСервер.Модуль(1060)}: Ошибка при вызове метода контекста (ВыбратьИзменения)
    Возврат ПланыОбмена.ВыбратьИзменения(Узел, НомерСообщения, ФильтрВыборки);
    по причине:
    Конфликт блокировок при выполнении транзакции:
    Не удалось заблокировать таблицу ‘_ReferenceChngR3456’
    по причине:
    Не удалось заблокировать таблицу ‘_ReferenceChngR3456′»

    Которая исчезла(как я думаю) после работы в обработке «Регистрация изменений для обмена данными»

  2. Скрин

    Вложения:

    • Снимок.PNG

  3. alexburn

    Offline

    alexburn
    Модераторы
    Команда форума
    Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    15.150
    Симпатии:
    560
    Баллы:
    204

  4. Не знаю, скорее всего стандартные


  5. alexburn

    Offline

    alexburn
    Модераторы
    Команда форума
    Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    15.150
    Симпатии:
    560
    Баллы:
    204

    Скорее всего ошибка в правилах

  6. Попробовать другие правила? Как можно проверить правила это или нет?


  7. alexburn

    Offline

    alexburn
    Модераторы
    Команда форума
    Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    15.150
    Симпатии:
    560
    Баллы:
    204

    Вам сообщение же выдало: Не найдено поле.
    Вам нужны правила для вашей конфы, а не для типовой.

  8. Для УТ или РТ? Как тогда обмен работал до этого?


  9. alexburn

    Offline

    alexburn
    Модераторы
    Команда форума
    Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    15.150
    Симпатии:
    560
    Баллы:
    204

    В смысле до этого ? До чего, этого?

  10. До появления текущей ошибки.


  11. alexburn

    Offline

    alexburn
    Модераторы
    Команда форума
    Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    15.150
    Симпатии:
    560
    Баллы:
    204

    Обновляли или изменяли конфигурации ?


  12. alexburn

    Offline

    alexburn
    Модераторы
    Команда форума
    Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    15.150
    Симпатии:
    560
    Баллы:
    204

    Просто так ничего не бывает.

  13. Возможно какая то таблица не правильно сохранилась «Конфликт блокировок при выполнении транзакции:
    Не удалось заблокировать таблицу ‘_ReferenceChngR3456’


  14. alexburn

    Offline

    alexburn
    Модераторы
    Команда форума
    Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    15.150
    Симпатии:
    560
    Баллы:
    204

    Тогда попробуйте ТИИ сделать, чудес не бывает :)


  15. alexburn

    Offline

    alexburn
    Модераторы
    Команда форума
    Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    15.150
    Симпатии:
    560
    Баллы:
    204

    Можно все установить. НО перед этим обязательно сделайте копию базы

  16. ТИИ сделал, ошибка сохраняется.

    Вложения:


  17. alexburn

    Offline

    alexburn
    Модераторы
    Команда форума
    Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    15.150
    Симпатии:
    560
    Баллы:
    204

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

  18. Если только конфа обновилась сама))

Страница 1 из 3


1C-pro.ru - форум по 1С:Предприятию 7.7, 8.0, 8.1, 8.2, 8.3

IKSparrow
05.04.2012 15:33 Прочитано: 4650

Необходимо перетащить документ из одной конфигурации в другую. Используя планы обменов. Нарисовал схему переноса документа в КД. В правилах выгрузки данных в обработчике «Перед выгрузкой данных» написал следующий код (руководствовался этой ссылкой: ССЫЛКА
:Код 1C v 8.х

 Узел = ПланыОбмена.Обмен_УКФ_ЗУП.НайтиПоКоду("000000002");
ВыборкаИзменений = ПланыОбмена.ВыбратьИзменения(Узел,1);
Выборка = Новый Массив;
Пока ВыборкаИзменений.Следующий() Цикл
Данные = ВыборкаИзменений.Получить();
Выборка.Добавить(Данные);
КонецЦикла;

Параметры.Вставить("Выборка",Выборка);
Параметры.Вставить("Узел",Узел);

Так вот самое интересное, что если обработку «УниверсальныйОбменДаннымиВФорматеXML» (V8Exchan81.epf) с этими правилами, то всё отлично выгружается/загружается.

А вот если задействовать штатный механизм «Настройки обмена данными», указать там эти правила и попытаться совершить обмен, то будет ругаться на вторую строчку:

Ошибка в обработчике события ПередВыгрузкойДанных (конвертация)
Обработчик = ПередВыгрузкойДанных (конвертация)
ОписаниеОшибки = Ошибка при вызове метода контекста (ВыбратьИзменения): Недопустимое значение параметра (параметр номер ‘1’)
ПозицияМодуля = (2)
КодСообщения = 62

вышеприведённого кода. То ли я не понимаю механизма и не то и не там использую то ли… В общем, как исправить проблему?

Yandex
Возможно, вас также заинтересует

Реклама на портале

IKSparrow
05.04.2012 16:17 Ответ № 1

Вот всё настраивал согласно этому документу. Ошибка такая же.

E_Migachev
07.04.2012 19:00 Ответ № 2

(0) IKSparrow, хм… что тут не подскажу *11,
но предлагаю сделать так:Автоматическая выгрузка загрузка данных используя Правила конвертации и регламентное задание

Подсказка: Вы получили ответ на свой вопрос — закройте вопрос!

Согласно документации 1С в методе ВыбратьИзменения глобального контекста ПланыОбмена есть параметр «ФильтрВыборки». Общий синтаксис: ВыбратьИзменения(<Узел>, <НомерСообщения>, <ФильтрВыборки>). При использовании третьего параметра возникло затруднение. Фильтр накладывается на ряд записей регистра сведений, подчиненного регистратору. Запросом выбираются регистраторы, создаются наборы записей регистра с отбором по регистраторам и помещаются в массив. Этот массив далее используется как третий параметр. Но при этом в выборку, которая возвращается методом ВыбратьИзменения, попадают требуемые отобранные записи регистра (остальные не попадают) и ВСЕ изменения всех остальных регистров. Кто-нибудь использовал фильтр выборки? Это штатное поведение системы?

в этот массив добавь ещё Метаданные регистра

Если не ошибаюсь, то в ФильтрВыборки надо ложить не ссылки на объекты данных, а названия метаданных…

Ошибка при вызове метода контекста (ВыбратьИзменения): Фильтр изменений содержит значение неверного типа — Регистр сведений набор записей

какая религия мешает прочитать справку целиком? Все же написано <ФильтрВыборки> (необязательный) Тип: Неопределено; Объекты метаданных; СсылкаНаОбъект, НаборЗаписей, Массив. Неопределено — фильтр пуст, выбираются все изменения по узлу; Объекты метаданных — выбираются изменения в основной таблице, связанной с данным объектом метаданных; СсылкаНаОбъект — фактически, может быть выбрана только одна запись об изменении данного объекта, либо ни одной, если объект не менялся; НаборЗаписей — набор записей регистра, может быть не выбран, для фильтрации изменений используется лишь отбор набора записей; Массив — все элементы массива имеют один из перечисленных выше типов, кроме Неопределено. Условия фильтрации соединяются по ИЛИ.

согласно СП можно использовать и ссылки на конкретные объекты, и наборы записей регистров и метаданные

там же написано, что когда используешь наборы записей, от них реально используются только ОТБОРЫ

и? у автора отбор по регисратору, всё правильно. Вопрос был — с какого бодуна там записи других регистров

я так и написал. На набор записей накладывается отбор и все. Набор при этом даже не читается. И по этому конкретному регистру все ОК. Но попадают и ВСЕ записи ВСЕХ остальных регистров.

Меня смущает в СП фраза «Условия фильтрации соединяются по ИЛИ»…

меня не смущает, всё правильно. Если б было И — ничего бы не выбиралось вобще, когда в массиве больше одной записи

полагаю дело в том, что в фильтре выборки есть еще что-то, кроме набора записей

там есть только переданный массив. Он правильно показывается в отладчике

может в платформе косяк? на другой проверить бы, на 8.2 какойнить

а в массиве-то только набор записей или что-то еще? А платформа у тебя какая?

в массиве несколько элементов типа «РегистрСведенийНаборЗаписей». И все

попробуй один элемент передать, изменения остальных регистров будут в выборке? Или может там в других наборах отбора где-то нет?

пробовал. То же самое. Одна запись нужного регистра и все остальные регистры целиком

Всем спасибо. В массив фильтра выборки нужно добавлять пустые наборы записей без отборов остальных регистров, участвующих в плане обмена. Тогда работает. Фраза «Условия фильтрации соединяются по ИЛИ» стала понятной :-)

Тэги: 1С 8

Комментарии доступны только авторизированным пользователям

<?php // Полная загрузка сервисных книжек, создан 2023-01-05 12:44:55

global $wpdb2;
global $failure;
global $file_hist;

/////  echo '<H2><b>Старт загрузки</b></H2><br>';

$failure=FALSE;
//подключаемся к базе
$wpdb2 = include_once 'connection.php'; ; // подключаемся к MySQL
// если не удалось подключиться, и нужно оборвать PHP с сообщением об этой ошибке
if (!empty($wpdb2->error))
{
/////   echo '<H2><b>Ошибка подключения к БД, завершение.</b></H2><br>';
$failure=TRUE;
wp_die( $wpdb2->error );
}

$m_size_file=0;
$m_mtime_file=0;
$m_comment='';
/////проверка существования файлов выгрузки из 1С
////файл выгрузки сервисных книжек
$file_hist = ABSPATH.'/_1c_alfa_exchange/AA_hist.csv';
if (!file_exists($file_hist))
{
/////   echo '<H2><b>Файл обмена с сервисными книжками не существует.</b></H2><br>';
$m_comment='Файл обмена с сервисными книжками не существует';
$failure=TRUE;
}

/////инициируем таблицу лога
/////если не существует файла то возврат и ничего не делаем
if ($failure){
///включает защиту от SQL инъекций и данные можно передавать как есть, например: $_GET['foo']
/////   echo '<H2><b>Попытка вставить запись в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>$m_comment));
wp_die();
/////    echo '<H2><b>Возврат в начало.</b></H2><br>';
return $failure;
}
/////проверка лога загрузки, что бы не загружать тоже самое
$masiv_data_file=stat($file_hist);   ////передаем в массив свойство файла
$m_size_file=$masiv_data_file[7];    ////получаем размер файла
$m_mtime_file=$masiv_data_file[9];   ////получаем дату модификации файла
////создаем запрос на получение последней удачной загрузки
////выбираем по штампу времени создания (редактирования) файла загрузки AA_hist.csv, $m_mtime_file

/////   echo '<H2><b>Размер файла: '.$m_size_file.'</b></H2><br>';
/////   echo '<H2><b>Штамп времени файла: '.$m_mtime_file.'</b></H2><br>';
/////   echo '<H2><b>Формирование запроса на выборку из лога</b></H2><br>';
////препарируем запрос
$text_zaprosa=$wpdb2->prepare("SELECT * FROM `vin_logs` WHERE `last_mtime_upload` = %s", $m_mtime_file);
$results=$wpdb2->get_results($text_zaprosa);

if ($results)
{   foreach ( $results as $r)
{
////если штамп времени и размер файла совпадают, возврат
if (($r->last_mtime_upload==$m_mtime_file) && ($r->last_size_upload==$m_size_file))
{////echo '<H2><b>Возврат в начало, т.к. найдена запись в логе.</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>'Загрузка отменена, новых данных нет, т.к. найдена запись в логе.'));
wp_die();
return $failure;
}
}
}
////если данные новые, пишем в лог запись о начале загрузки
/////echo '<H2><b>Попытка вставить запись о начале загрузки в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>0, 'last_size_upload'=>$m_size_file, 'comment'=>'Начало загрузки'));

////очищаем таблицу
$clear_tbl_zap=$wpdb2->prepare("TRUNCATE TABLE %s", 'vin_history');
$clear_tbl_zap_repl=str_replace("'","`",$clear_tbl_zap);
$results=$wpdb2->query($clear_tbl_zap_repl);
/////   echo '<H2><b>Очистка таблицы сервисных книжек</b></H2><br>';
if (empty($results))
{
/////   echo '<H2><b>Ошибка очистки таблицы книжек, завершение.</b></H2><br>';
//// если очистка не удалась, возврат
$failure=TRUE;
wp_die();
return $failure;
}

////загружаем данные
$table='vin_history';         // Имя таблицы для импорта
//$file_hist Имя CSV файла, откуда берется информация     // (путь от корня web-сервера)
$delim=';';          // Разделитель полей в CSV файле
$enclosed='"';      // Кавычки для содержимого полей
$escaped='

Related Posts

  • Получение логина и пароля техподдержки 1С из базы
  • Класс для вывода отчета в ExcelКласс для вывода отчета в Excel
  • Счет-фактура для УПП
  • Библиотека классов для создания внешней компоненты 1С на C#
  • Акт об оказании услуг (со скидками) — внешняя печатная форма для Управление торговлей 11.1.10.86Акт об оказании услуг (со скидками) — внешняя печатная форма для Управление торговлей 11.1.10.86
  • Прайс-лист с артикулом в отдельной колонке

37 Comments

  1. В очередной раз понадобилось, а от 1С пока ничего такого нет.

    Сделал свой аналог, который был для 8.1

    Reply

  2. Пока не качаю, но на заметку беру

    Reply

  3. (1) Зачем людей обманывать? В релизе конвертации 2.1.2.1 все уже давно есть.

    Reply

  4. (3) Точно? Уверены? Под 8.2 на управляемых формах?

    Вы, случаем, сами никого не обманываете?

    Reply

  5. Надо добавить и удаление регистрации, как в 8.1.

    Reply

  6. (6) Посмотри обработку «ОбработкаРегистрацияИзменненийДляОбмена» типовой конфы УТ, там все есть.

    Reply

  7. (7) Я смотрел. Что именно «Надо добавить и удаление регистрации, как в 8.1.» ?

    По-моему одной произвольной регистрации запросом предостаточно.

    Reply

  8. (8) У тебя есть удаление всей регистрации, но может надо добавить удаление отдельного элемента регистрации, который не нужен для обмена?

    Я это имел в виду.

    Reply

  9. (9) А, понятно. Сделаю произвольное снятие регистрации 🙂

    Reply

  10. Здравствуйте. Извените, я не профи, но довольно с большим опытом самоучки… Обычно у меня не было проблем с выгрузкой/загрузкой данных в 1Сv8.1, но вот, перешла на 8.2 Версия 8.2.10.77 конф. Упр. небольшой фирмой и немогу вообще разобраться.Мне неоходимо выгрузить справочники из УТ (есть на платф. 8.1, и есть уже сконвертированная под 8.2) — неполучается, пишет ошибку: при загрузке номенклатуры — пишет не найден родитель наименования…

    Reply

  11. (11) Этот вопрос лучше задать на форуме. Так быстрее получится.

    Reply

  12. чёт не открывается обработка. Со всеми управляемыми формами:)

    Reply

  13. Reaper_1C пишет:

    (1) Зачем людей обманывать? В релизе конвертации 2.1.2.1 все уже давно есть.

    Для управляемых форм одинес до сих пор ничего не написал.

    Reply

  14. если пытаться зарегистрировать сразу все «Справочники» или «Документы» и т.д. — вылетает ошибка.

    Reply

  15. У меня работает на все 100. Спасибо!

    Reply

  16. В модуле формы после строки

    Процедура ПоказатьОбъекты(ИндексСтроки = Неопределено, Уровень = 0)

    добавить

     Если Не ЗначениеЗаполнено(УзелОбмена) Тогда
    Возврат;
    КонецЕсли;
    

    Иначе при выборе вида плана обмена выдаётся ошибка

    {Форма.Форма.Форма(75)}: Ошибка при вызове метода контекста (ВыбратьИзменения)

    ВыборкаИзменений = ПланыОбмена.ВыбратьИзменения(УзелОбмена, УзелОбмена.НомерОтправленного + 1);

    по причине:

    Недопустимое значение параметра (параметр номер ‘1’)

    Reply

  17. Спасибо за обработку! Работает только довольно долго..

    Reply

  18. Выявил еще один несущественный баг. Если выбрать какой-либо из типов объектов и нажать «Показать объекты», то после повторного нажатия список ниже возникающих объектов, зарегистрированных к обмену, задвоится.

    В модуле формы строки кода

     Если ИндексСтроки = Неопределено ИЛИ Уровень = 0 Тогда
    ВыборкаИзменений = ПланыОбмена.ВыбратьИзменения(УзелОбмена, УзелОбмена.НомерОтправленного + 1);
    Иначе
    ТекСтрока = ДанныеОбмена.НайтиПоИдентификатору(ИндексСтроки);
    Фильтр = Новый Массив;
    Если Уровень = 2 Тогда
    МетаданныеОбъекта = Метаданные.НайтиПоПолномуИмени(ТекСтрока.Название + «.» + ТекСтрока.Объект);
    Фильтр.Добавить(МетаданныеОбъекта);
    ИначеЕсли Уровень = 1 Тогда
    Для Каждого Стр Из ТекСтрока.ПолучитьЭлементы() Цикл
    МетаданныеОбъекта = Метаданные.НайтиПоПолномуИмени(Стр.Название + «.» + Стр.Объект);
    Фильтр.Добавить(МетаданныеОбъекта);
    КонецЦикла;
    КонецЕсли;
    ВыборкаИзменений = ПланыОбмена.ВыбратьИзменения(УзелОбмена, УзелОбмена.НомерОтправленного + 1, Фильтр);
    КонецЕсли;

    Показать

    заменить на

     Если ИндексСтроки = Неопределено ИЛИ Уровень = 0 Тогда
    ВыборкаИзменений = ПланыОбмена.ВыбратьИзменения(УзелОбмена, УзелОбмена.НомерОтправленного + 1);
    // очистка
    Для Каждого СтрКонф Из ДанныеОбмена.ПолучитьЭлементы() Цикл
    Для Каждого СтрТип Из СтрКонф.ПолучитьЭлементы() Цикл
    Для Каждого Стр Из СтрТип.ПолучитьЭлементы() Цикл
    Стр.ПолучитьЭлементы().Очистить();
    КонецЦикла;
    КонецЦикла;
    КонецЦикла;
    Иначе
    ТекСтрока = ДанныеОбмена.НайтиПоИдентификатору(ИндексСтроки);
    Фильтр = Новый Массив;
    Если Уровень = 2 Тогда
    МетаданныеОбъекта = Метаданные.НайтиПоПолномуИмени(ТекСтрока.Название + «.» + ТекСтрока.Объект);
    Фильтр.Добавить(МетаданныеОбъекта);
    // очистка
    ТекСтрока.ПолучитьЭлементы().Очистить();
    ИначеЕсли Уровень = 1 Тогда
    Для Каждого Стр Из ТекСтрока.ПолучитьЭлементы() Цикл
    МетаданныеОбъекта = Метаданные.НайтиПоПолномуИмени(Стр.Название + «.» + Стр.Объект);
    Фильтр.Добавить(МетаданныеОбъекта);
    // очистка
    Стр.ПолучитьЭлементы().Очистить();
    КонецЦикла;
    КонецЕсли;
    ВыборкаИзменений = ПланыОбмена.ВыбратьИзменения(УзелОбмена, УзелОбмена.НомерОтправленного + 1, Фильтр);
    КонецЕсли;

    Показать

    Reply

  19. Спасибо за обработку

    Reply

  20. trumanl пишет:

    Выявил еще один несущественный баг.

    Поручик пишет:

    В модуле формы после строки ….

    Скажите, внесены ли исправления, указанные коллегами Поручиком и trumanl? Можно ли рекомендовать

    данную обработку конечным пользователям без допиливания?

    Reply

  21. Номальная обработка, помогла)

    Reply

  22. Классная обработка. Только не работает для снятия с плана обмена конкретного объекта конфигурации.

    Reply

  23. С надеждой, что эта обработка выручит в тяжелой борьбе с настройкой обмена из Ут11 БП2.0

    Reply

  24. Очень удобно настраивать обмен. Без нее никак не взлетал. Спасибо!!!

    Reply

  25. Обработке уж два года, а от 1с до сих пор нет внятного аналога. Спасибо большое

    Reply

  26. Сообщество не будет возражать, если выложу модифицированный вариант отдельной публикацией? Кроме исправления указанных багов, добавил изменение номеров сообщений.

    Reply

  27. + Добавлена возможность для регистрации обработки в справочнике «Дополнительные обработки» для конфигураций на БСП.

    Reply

  28. (28) Поручик, конечно выкладывай, посмотрим 🙂

    Reply

  29. (19) trumanl, да действительно очень долго выполняет …

    щас исправлю этот баг

    Reply

  30. (30) Уже год как выложено и развилось в самостоятельную работу с добавленными фичами. Луркайте поиск

    Reply

  31. (32) Поручик, понял, спасибо большое, щас найду.

    Reply

  32. (30) Если разуть глаза, то ссылка есть прямо в описании.

    Reply

  33. (33) Поручик, да вижу, благодарю.

    Reply

  34. Спасибо за обработку.

    Reply

  35. При переходе на платформу 8.3.5 столкнулся с тем, что перестали выгружаться базы через выгрузку в .dt. Нашел на форумах, что дело может быть в планах обмена, если они есть,то их нужно почистить (удалить) регистрацию + предлагаются самописные обработки :). Я так понимаю, что для удаления регистрации подойдет типовая обработка «ОбработкаРегистрацияИзменненийДляОбмена» конфигураций на обычных формах УТ 10.3, ЗУП 2.5, БП 2.0. Пишу здесь, возможно кому информация пригодится…

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Понравилась статья? Поделить с друзьями:
  • Ошибка при вызове метода контекста выбрать элемент
  • Ошибка при вызове метода контекста выполнить результат запрос выполнить
  • Ошибка при вызове метода контекста выбрать несоответствие типов
  • Ошибка при вызове метода контекста выполнить при обновлении
  • Ошибка при вызове метода контекста выбрать недопустимое значение параметра