Проблема блокировок при работе с планом обмена |
Я |
06.04.21 — 12:46
Доброго времени суток!
Есть план обмен, работа с которым реализована следующим образом:
1) Получение данных из узла, присвоение выбранным данным «Номера сообщения» (для последующей очистки)
Функция ЗаполнитьСтруктуруИзмененийДляУзла_Справочники(УзелПланаОбмена, ИмяТаблицы)
РезультатФункции = Новый Структура(«ДанныеРегистрации, НомерИсходящегоСообщения»);
ОтобразитьСостояние(«Выборка изменений …»);
Если Метаданные.Справочники.Найти(ИмяТаблицы) <> Неопределено Тогда
Если ЗначениеЗаполнено(УзелПланаОбмена) Тогда
Запрос = Новый Запрос;
Запрос.Текст =»ВЫБРАТЬ ПЕРВЫЕ 3000
| Изменения.Ссылка КАК Объект
|ИЗ
| Справочник.» + ИмяТаблицы + «.Изменения КАК Изменения
|ГДЕ
| Изменения.Узел = &Узел»;
Запрос.УстановитьПараметр(«Узел», УзелПланаОбмена);
ДанныеРегистрации = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку(«Объект»);
//
Если ДанныеРегистрации.Количество() > 0 Тогда
ЗаписьСообщения = ПланыОбмена.СоздатьЗаписьСообщения();
Запись = Новый ЗаписьXML;
Запись.УстановитьСтроку();
ЗаписьСообщения.НачатьЗапись(Запись, УзелПланаОбмена);
ВыборкаИзменений = ПланыОбмена.ВыбратьИзменения(ЗаписьСообщения.Получатель, ЗаписьСообщения.НомерСообщения, ДанныеРегистрации);
РезультатФункции.Вставить(«ДанныеРегистрации», ДанныеРегистрации);
РезультатФункции.Вставить(«НомерИсходящегоСообщения», ЗаписьСообщения.НомерСообщения);
ЗаписьСообщения.ЗакончитьЗапись();
Запись.Закрыть();
ВыборкаИзменений = Неопределено;
ЗаписьСообщения = Неопределено;
Запись = Неопределено;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Возврат РезультатФункции;
КонецФункции
…
2) Происходит выгрузка сведений
…
3) Удаление из плана обмена успешно выгруженных данных (и не поменявшихся за момень выгрузки)
Функция ОчиститьИзмененияДляУзла_Справочники(УзелПланаОбмена, ИмяТаблицы, НомерСообщения, ДанныеУдаляемыеИзРегистрации)
РезультатФункции = Истина;
ОтобразитьСостояние(«Очистка изменений …»);
Если Метаданные.Справочники.Найти(ИмяТаблицы) <> Неопределено Тогда
Если ЗначениеЗаполнено(УзелПланаОбмена) И ЗначениеЗаполнено(НомерСообщения) И ЗначениеЗаполнено(ДанныеУдаляемыеИзРегистрации) Тогда
Запрос = Новый Запрос;
Запрос.Текст =»ВЫБРАТЬ
| Изменения.Ссылка КАК Объект,
| Изменения.НомерСообщения КАК НомерСообщения
|ИЗ
| Справочник.» + ИмяТаблицы + «.Изменения КАК Изменения
|ГДЕ
| Изменения.Узел = &Узел
| И Изменения.НомерСообщения > 0
| И Изменения.НомерСообщения <= &НомерСообщения
| И Изменения.Ссылка В(&ДанныеУдаляемыеИзРегистрации)
|»;
Запрос.УстановитьПараметр(«Узел», УзелПланаОбмена);
Запрос.УстановитьПараметр(«НомерСообщения», НомерСообщения);
Запрос.УстановитьПараметр(«ДанныеУдаляемыеИзРегистрации», ДанныеУдаляемыеИзРегистрации);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
ПланыОбмена.УдалитьРегистрациюИзменений(УзелПланаОбмена, Выборка.Объект);
КонецЦикла;
Иначе
РезультатФункции = Ложь;
КонецЕсли;
Иначе
РезультатФункции = Ложь;
КонецЕсли;
Возврат РезультатФункции;
КонецФункции
1 — 06.04.21 — 12:48
После запуска этого механизма стала возникать ошибка блокировки:
Ошибка при вызове метода контекста (ВыбратьИзменения): Конфликт блокировок при выполнении транзакции:
Microsoft SQL Server Native Client 11.0: Транзакция (идентификатор процесса 55) вызвала взаимоблокировку ресурсов блокировка с другим процессом и стала жертвой взаимоблокировки. Запустите транзакцию повторно.
Т.е. блокировку вызывает вот эта строчка:
ВыборкаИзменений = ПланыОбмена.ВыбратьИзменения(ЗаписьСообщения.Получатель, ЗаписьСообщения.НомерСообщения, ДанныеРегистрации);
Нужна она мне для того, чтобы выбираемым данным назначить номер сообщения, по которому потом будет происходить зачистка.
2 — 06.04.21 — 12:52
Поиски в интернете показали, что Да «ПланыОбмена.ВыбратьИзменения» вызывает блокировку.
Но почему она длительная и мешает и как можно адекватно обойти ее — не понятно
3 — 06.04.21 — 12:57
Еще бы она не вызывала блокировку. Она же пишущая.
А вот почему другой процесс в нее упирается и какой именно процесс — вопрос.
Релиз, платформа, режим блокировок?
4 — 06.04.21 — 13:05
(3) «Релиз, платформа, режим блокировок» — платформа 8.3.15, режим блокировок «Автоматический»
«какой именно процесс в нее упирается» — могу предположить .что механизм, который регистрирует изменения в узел.
Понятно, что она пишущая. Не понятно, почему она на столько «блокирующая».
5 — 06.04.21 — 13:06
Как лучше обойти проблему с присвоением номера выбираемым данным я не нашел. Во всех источниках применяется примерно такая же логика.
6 — 06.04.21 — 13:25
(1) сделай обмен почаще, что бы порцайки не такие большие были
таблица плана обмена блокируется вся и наглухо… очень узкое место во всей концепции обменов на Планах
7 — 06.04.21 — 13:31
В режиме блокировок «Автоматический» для дедлока достаточно, чтобы оба процесса успели параллельно прочитать что-то нужное друг-другу для записи.
В управляемых блокировках это бы возникло только если бы они успели записать что-то нужное друг-другу для записи (так как де-факто управляемые блокировки сейчас на версионнике работают).
Но даже для первого варианта вроде эти звезды свести непросто. Хотя «Автоматический» еще эскалировать любит. Такое ощущение, что у тебя какие-то массированные пишущие регламенты крутятся, которые одно и то же могут перезаписывать. В итоге и таблица изменений постоянно большая и куча изменений тех же данных постоянно прилетает. Если это так, то попробуй развести их по времени хотя бы.
(6) Если бы она блокировалась вся и наглухо — то дедлоков бы не было. Был бы просто большой тайм-аут на блокировке и в худшем случае «опоздавшая» транзакция отваливалась бы по тайм-ауту.
8 — 06.04.21 — 13:32
Добавить в
Запрос.Текст =»ВЫБРАТЬ ПЕРВЫЕ 3000
| Изменения.Ссылка КАК Объект
|ИЗ
| Справочник.» + ИмяТаблицы + «.Изменения КАК Изменения
|ГДЕ
| Изменения.Узел = &Узел»;
ДЛЯ ИЗМЕНЕНИЯ
9 — 06.04.21 — 13:33
Это просто пучок Ванги в космос в надежде, что у тебя просто дедлок по повышению уровня изоляции.
10 — 06.04.21 — 13:39
(9) Тогда надо такое сделать одним запросом по всем выгружаемым справочникам. Тогда гарантия будет.
11 — 06.04.21 — 13:41
А зачем так вообще сделано? Зачем выгружать только справочники?
Почему вообще не свести это к единственному ВыбратьИзменения()?
12 — 06.04.21 — 13:44
Автор реплику справочников базы данных делает?
13 — 06.04.21 — 13:45
А ЗаполнитьСтруктуруИзмененийДляУзла_Справочники() случаем не в транзакции вызывается?
14 — 06.04.21 — 13:47
(11) А разница?
15 — 06.04.21 — 13:48
(13) Уже проверил — программно не увидел такого.
16 — 06.04.21 — 13:49
Есть ли какой-то принципиально другой вариант выбрать данные из плана обмена с присвоением номера сообщения?
Я вот что-то не вижу альтернатив. Прям альтернатива — убрать к чертям эти планы обмена и делать все на обычном РС.
17 — 06.04.21 — 13:52
(15) Странно. Тогда действительно разницы быть не должно. Тогда действительно может помочь совет (8)
18 — 06.04.21 — 13:57
(17) Попробую (8)
«Такое ощущение, что у тебя какие-то массированные пишущие регламенты крутятся, которые одно и то же могут перезаписывать. В итоге и таблица изменений постоянно большая и куча изменений тех же данных постоянно прилетает. Если это так, то попробуй развести их по времени хотя бы.»
Эти планы для регистрации элементов к выгрузке на сайт. Регламент выгрузки стартует каждые 3 минуты. Обычно очередь не очень большая, до 1000 элементов. Но иногда бывают «большие обмены», для этого ограничил размер порции 3000 элементами.
Механизм работает уже давно и довольно стабильно, но вот нашел одну «дырку», закрыть которую решил внедрением «ВыборкаИзменений = ПланыОбмена.ВыбратьИзменения(ЗаписьСообщения.Получатель, ЗаписьСообщения.НомерСообщения, ДанныеРегистрации);» (ранее этой конструкции не было и из плана обмена удалялись все выгруженные элементы, без контроля НомераСообщения). «Дырку» закрыл, но появились ошибки блокировки.
19 — 06.04.21 — 14:02
Каждые три минуты у Вас вносятся изменения в тысячу и более записей справочников? Извини за вопрос не в тему: а что это у вас такое вообще?
20 — 06.04.21 — 14:06
(18) Только раз вышестоящей транзакции нет, то для (8) нужно запрос и регистрацию обрамить в транзакцию.
21 — 06.04.21 — 14:06
(19) К чему удивления? Ты не видел интернет-магазины у которых «новый заказ» падает каждые 2-3 секунды? В заказе от 1 до 10 единиц товара. Дальше идет обработка всего этого.
+ Розничные магазины — 30 штук.
+ Оптовый отдел.
22 — 06.04.21 — 14:06
Тьфу. Запрос и выборку изменений.
23 — 06.04.21 — 14:07
(21) Обычно при этом принято изменять документы, а не справочники.
24 — 06.04.21 — 14:07
емнип, но могу ошибаться — транзакция активна до окончания перебора выборки изменений
25 — 06.04.21 — 14:08
(19) «у Вас вносятся изменения в тысячу и более записей справочников» — не изменения вносятся в справочники, а возникают события, при которых элементы справочников нужно зарегистрировать к выгрузке во внешнюю системы.
26 — 06.04.21 — 14:09
(24) У меня вообще нет перебора выборки изменений
ЗаписьСообщения = ПланыОбмена.СоздатьЗаписьСообщения();
Запись = Новый ЗаписьXML;
Запись.УстановитьСтроку();
ЗаписьСообщения.НачатьЗапись(Запись, УзелПланаОбмена);
ВыборкаИзменений = ПланыОбмена.ВыбратьИзменения(ЗаписьСообщения.Получатель, ЗаписьСообщения.НомерСообщения, ДанныеРегистрации);
РезультатФункции.Вставить(«ДанныеРегистрации», ДанныеРегистрации);
РезультатФункции.Вставить(«НомерИсходящегоСообщения», ЗаписьСообщения.НомерСообщения);
ЗаписьСообщения.ЗакончитьЗапись();
Запись.Закрыть();
ВыборкаИзменений = Неопределено;
ЗаписьСообщения = Неопределено;
Запись = Неопределено;
27 — 06.04.21 — 14:09
Я понял, не нужно повторять.
28 — 06.04.21 — 14:11
(25) > возникают события, при которых элементы справочников нужно зарегистрировать к выгрузке во внешнюю системы
Зачем? Они поменялись? Почему? Или это банальная рекурсивная выгрузка всей используемой в заказах НСИ? Тогда зря.
29 — 06.04.21 — 14:12
(28) Сейчас не в этом вопрос. Давай не будем углубляться.
30 — 06.04.21 — 14:13
(26) значит пришло время регистрацию изменений переделать на регистр сведений
31 — 06.04.21 — 14:16
(30) Да, было бы здорово перевести на РС.
Если победить блокировки не удастся, то, видимо, придется именно так и сделать.
Вообще механизм планов обмена какой-то тупиковый. Метода написана 10 лет назад и никакой эволюции.
32 — 06.04.21 — 14:20
(29) Тогда просто попробуй (8), обрамив чтение и выборку в транзакцию. По-идее, это должно заставить процессы телебонькать таблицу изменений по очереди, а не на брудершафт.
(30) На РС у тебя тоже могут возникнуть похожие проблемы
(31) Метода была написана еще в 7.7
Эволюция автомата калашникова не может происходить бескомпромиссно. К более продвинутому инструменту у тебя будет еще больше вопросов.
33 — 06.04.21 — 14:29
(0) а зечем тебе механизм сообщений ?
Просто сам в коде удаляй регистрацию, если на сайт загрузилось и привет.
Тупо, план обмена регистрирует все изменения, ты их выгружаешь запросом на сайт и потом, по этой же выборке удаляешь регистрацию после обмена с сайтом. И Никаких номеров сообщений..
34 — 06.04.21 — 14:30
(33) а что будет, если в момент выгрузки изменений зарегистрируются новые? Без сообщений, данные изменения просто похерятся
35 — 06.04.21 — 14:30
Выбирай не по 3000, а по 1000
36 — 06.04.21 — 14:31
(34) И че ? Улетят при следующем обмене. Он отправит на сайт, только то, что запрос выгреб и по этой же выборке удалит изменения.
37 — 06.04.21 — 14:31
И ничего там не херится.
38 — 06.04.21 — 14:32
У автора есть простой выход: не пытаться втиснуть свой распухший обмен в регламент «каждые три минуты», а делать очередной обмен через три минуты после окончания предыдущего.
«Ну вот и славно! До свиданья… Да, а кислород попробуйте… и ванны.» — и запись всех изменений порциями в транзакции.
39 — 06.04.21 — 14:34
(33) У него так и было. Смотри (18). Но что-то он провтыкал, что таким образом решил полечить.
40 — 06.04.21 — 14:34
+ если по какой-то причине, на сайт загрузить не удалось, то просто не удаляешь регистрацию изменений.
Я у себя именно так и делал. И никаких номеров сообщений. Только узел обмена и привет.
41 — 06.04.21 — 14:36
(37) вот у тебя есть документ прихода, ты запустил выгрузку по плану обмена, формируешь файлик с остатками в разрезе номенклатуры и бац, в этот момент отменяют данный приход, но ты это изменение по документу не отработал и взял очистил полностью все изменения в плане обмена после успешной выгрузки. Далее ты изменения по этому документу не получишь, пока заново документ не перезапишешь. Поэтому и придумали номера сообщений, когда ты получаешь изменения, новые записи в план обмена уже попадают в разрезе нового номера сообщения.
42 — 06.04.21 — 14:38
(41) а далее весь букет неприятностей связанный с не верным остатком и отмененными заказами
43 — 06.04.21 — 14:40
(41) какой нах приход и тырнет магазин ?
44 — 06.04.21 — 14:42
*(38) хочу напомнить: автор формирует искусственно «порции» измененных данных, случайным образом попавших в выборку — имхо, на три минуты (а может быть и более) можно забыть про целостность и не противоречивость данных…
45 — 06.04.21 — 14:45
(33)(39)(40)
Возможна следующая ситуация:
В плане обмена зареганы товары «Т1», «Т2» и «Т3». Стартует обмен, выбирает все 3 элемента — посылает на выгрузку и ожидает ответа от внешней системы о успешном получении (все синхронно). Далее успешно выгруженные данные удаляются из плана обмена.
А в момент между «выбирает все 3 элемента — посылает на выгрузку» и «успешно выгруженные данные удаляются из плана обмена» возникает изменение элемента «Т2» (т.е. возникает потребность снова ег овыгрузить). И вот если НЕ использовать «номера сообщений», то в конце система просто затрет все 3 элемента. И Второй раз элемент «т2» уже не выгрузится.
46 — 06.04.21 — 14:46
(45) о чем я и писал в (41)
47 — 06.04.21 — 14:46
(46) ну да.
48 — 06.04.21 — 14:47
(45) да не вопрос, если этого боишься, то сразу грохай изменения. Потом выгружай на сайт, если не удачно — зарегь их. Все данные у тебя будут в выборке запроса.
49 — 06.04.21 — 14:47
И решить это можно либо «Номером сообщения» — если использовать планы обмена. Либо обычной «Дата регистрации в очереди», если использовать РС.
50 — 06.04.21 — 14:47
в свое время настраивал крупный хаб по обмену остатков поставщиков, где матрицы товаров исчислялись десятками тысяч. Несколько крупных оптовиков обменивались остатками между собой. Вот там номер сообщения для обмена был критически важен
51 — 06.04.21 — 14:49
(48) Плохая политика. Мне кажется так менее надежно.
52 — 06.04.21 — 14:49
(51) чем ? Что за пару мс у тебя что-то не зарегится ? У тебя там по 100’000 справочников летит всегда в обмене ?
53 — 06.04.21 — 14:50
(48) что значит удачно, неудачно? Выгрузка в основном всегда удачная, только в момент ее реализации могут быть еще изменения которые при очистке изменений в плане не попадут в следующую выгрузку, или я чего то не понимаю?
54 — 06.04.21 — 14:50
(44) Вот это вообще не понял. О какой целостности и противоречивости речь?
55 — 06.04.21 — 14:51
(53) это значит, что http запрос вернул не 200.
56 — 06.04.21 — 14:51
тырнет у тебя отвалился, еще чего
57 — 06.04.21 — 14:52
(53) Не удачная — это обработка ситуации, что на «принимающей» стороне произошел сбойошибка и данные не загрузились. Такое тоже бывает. Например, сайт «упал»
58 — 06.04.21 — 14:54
(52) Я полагаюсь на следующее — «гарантированно приняли данные — тогда удалили из очереди». А если удалять сразу, то больше вариантов потерять данные, если где-то что-то пойдет не так.
59 — 06.04.21 — 14:54
(57) в этом случае вообще никаких проблем нет, не очищаешь изменения и все. Я же говорю про случаи, когда в момент выгрузки происходят изменения, чем более нагруженная выгрузка по времени выполнения, тем больше шансов на такие моменты
60 — 06.04.21 — 14:57
(59) я прост не вижу проблемы в использовании номеров сообщений, получаешь изменения по последнему номеру, обрабатываешь их, если удачно отправил — очищаешь изменения с этим номером.
61 — 06.04.21 — 14:58
(54) Это просто для понимания: если есть изменения — то они должны быть переданы все и сразу, иначе у Вас может возникнуть ситуация, когда логически связанные между собой изменения будут «разорваны» — окажутся в различных сеансах обмена данными. Самый негативный момент — когда может возникнуть ситуация, что ранее зарегистрированное изменение не попадет ни в первую, ни во вторую «порцию» сеанса обмена — выборка таблицы изменений ведь по природе своей — случайна.
62 — 06.04.21 — 14:59
(61) это что то новенькое, первый раз такое слышу…можно на реальном примере?
63 — 06.04.21 — 15:07
(62) Это совсем не новость На реальном примере? Например, рИБ-обмен, особенность обмена: документы и их движения — автономны и независимы друг от друга. И всегда есть вероятность между обменами получить новые движения без изменения самого документа и/или измененный документ со «старыми» движениями. Само собой разумеется, что после очередного обмена всё само собой нормализуется.
64 — 06.04.21 — 15:13
(0) Блокировки управляемые у тебя?
Почитай вот эту статью, может разрешишь проблему с блокировками, тут в общих словах более менее разжевано, как работает план обмена со скулем
https://infostart.ru/1c/articles/561460/
65 — 06.04.21 — 15:16
(64) + еще вот тут есть схожая проблема и решение
https://forum.infostart.ru/forum9/topic230643/
66 — 06.04.21 — 15:34
Попытка автора читать и писать изменения «порциями» никоем образом не изменяет ситуацию с блокировками.
67 — 06.04.21 — 16:00
(66) насколько я понял, блокировка происходит при записи номера сообщения, когда получаешь выборку изменений. При управляемых блокировках, таблица не должна блокироваться, поэтому и ошибки с блокировками быть не должно
68 — 06.04.21 — 18:08
(67) Там нет единой таблицы как таковой. Имхо, в (64) об этом прямо сказано: ПланыОбмена.ВыбратьИзменения() поочередно обрабатывают каждую из таблиц изменений метаданных, а SQL Server, соответственно, для каждой из этих таблиц открывает/закрывает транзакцию — отсюда и эксклюзивные транзакционные блокировки таблицы.
69 — 06.04.21 — 18:12
(25) хрень какая то зачем сами элементы справочников повторно выгружать?
не логичнее документы?
Garykom
70 — 06.04.21 — 18:12
(69)+ или у вас остатки в номенклатуре?
-
Примерно неделю назад возникла ошибка при синхронизации:
«При загрузке сообщения обмена возникли ошибки: {Обработка.КонвертацияОбъектовИнформационныхБаз.МодульОбъекта(9152)}:Поле объекта не обнаружено (ФорматМагазина) ИначеЕсли НЕ ЭтоПараметрДляОбъекта.»База файловая.
УТ — Управление торговлей, редакция 11.1 (11.1.6.24)
РТ — Розница 8.3 Магазин автозапчастей, редакция 2.1 (2.1.2.8)До этого возникала ошибка:
«{ОбщийМодуль.ОбменДаннымиСервер.Модуль(1060)}: Ошибка при вызове метода контекста (ВыбратьИзменения)
Возврат ПланыОбмена.ВыбратьИзменения(Узел, НомерСообщения, ФильтрВыборки);
по причине:
Конфликт блокировок при выполнении транзакции:
Не удалось заблокировать таблицу ‘_ReferenceChngR3456’
по причине:
Не удалось заблокировать таблицу ‘_ReferenceChngR3456′»Которая исчезла(как я думаю) после работы в обработке «Регистрация изменений для обмена данными»
-
Скрин
Вложения:
-
-
Offline
alexburn
Модераторы
Команда форума
Модератор- Регистрация:
- 5 янв 2009
- Сообщения:
- 15.150
- Симпатии:
- 560
- Баллы:
- 204
-
Не знаю, скорее всего стандартные
-
Offline
alexburn
Модераторы
Команда форума
Модератор- Регистрация:
- 5 янв 2009
- Сообщения:
- 15.150
- Симпатии:
- 560
- Баллы:
- 204
Скорее всего ошибка в правилах
-
Попробовать другие правила? Как можно проверить правила это или нет?
-
Offline
alexburn
Модераторы
Команда форума
Модератор- Регистрация:
- 5 янв 2009
- Сообщения:
- 15.150
- Симпатии:
- 560
- Баллы:
- 204
Вам сообщение же выдало: Не найдено поле.
Вам нужны правила для вашей конфы, а не для типовой. -
Для УТ или РТ? Как тогда обмен работал до этого?
-
Offline
alexburn
Модераторы
Команда форума
Модератор- Регистрация:
- 5 янв 2009
- Сообщения:
- 15.150
- Симпатии:
- 560
- Баллы:
- 204
В смысле до этого ? До чего, этого?
-
До появления текущей ошибки.
-
Offline
alexburn
Модераторы
Команда форума
Модератор- Регистрация:
- 5 янв 2009
- Сообщения:
- 15.150
- Симпатии:
- 560
- Баллы:
- 204
Обновляли или изменяли конфигурации ?
-
Offline
alexburn
Модераторы
Команда форума
Модератор- Регистрация:
- 5 янв 2009
- Сообщения:
- 15.150
- Симпатии:
- 560
- Баллы:
- 204
Просто так ничего не бывает.
-
Возможно какая то таблица не правильно сохранилась «Конфликт блокировок при выполнении транзакции:
Не удалось заблокировать таблицу ‘_ReferenceChngR3456’ -
Offline
alexburn
Модераторы
Команда форума
Модератор- Регистрация:
- 5 янв 2009
- Сообщения:
- 15.150
- Симпатии:
- 560
- Баллы:
- 204
Тогда попробуйте ТИИ сделать, чудес не бывает
-
Offline
alexburn
Модераторы
Команда форума
Модератор- Регистрация:
- 5 янв 2009
- Сообщения:
- 15.150
- Симпатии:
- 560
- Баллы:
- 204
Можно все установить. НО перед этим обязательно сделайте копию базы
-
ТИИ сделал, ошибка сохраняется.
Вложения:
-
Offline
alexburn
Модераторы
Команда форума
Модератор- Регистрация:
- 5 янв 2009
- Сообщения:
- 15.150
- Симпатии:
- 560
- Баллы:
- 204
Попробуйте может кеш очистить, но не думаю что поможет. Сдается мне что вы обновили конфу
-
Если только конфа обновилась сама))
IKSparrow |
|
||
---|---|---|---|
|
Необходимо перетащить документ из одной конфигурации в другую. Используя планы обменов. Нарисовал схему переноса документа в КД. В правилах выгрузки данных в обработчике «Перед выгрузкой данных» написал следующий код (руководствовался этой ссылкой: ССЫЛКА
:Код 1C v 8.х
Так вот самое интересное, что если обработку «УниверсальныйОбменДаннымиВФорматеXML» (V8Exchan81.epf) с этими правилами, то всё отлично выгружается/загружается. А вот если задействовать штатный механизм «Настройки обмена данными», указать там эти правила и попытаться совершить обмен, то будет ругаться на вторую строчку: Ошибка в обработчике события ПередВыгрузкойДанных (конвертация) вышеприведённого кода. То ли я не понимаю механизма и не то и не там использую то ли… В общем, как исправить проблему? |
Yandex |
|
||
---|---|---|---|
|
IKSparrow |
|
||
---|---|---|---|
|
Вот всё настраивал согласно этому документу. Ошибка такая же. |
E_Migachev |
|
||
---|---|---|---|
|
(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
Счет-фактура для УПП
Библиотека классов для создания внешней компоненты 1С на C#
Акт об оказании услуг (со скидками) — внешняя печатная форма для Управление торговлей 11.1.10.86
Прайс-лист с артикулом в отдельной колонке
37 Comments
-
В очередной раз понадобилось, а от 1С пока ничего такого нет.
Сделал свой аналог, который был для 8.1
Reply ↓
-
Пока не качаю, но на заметку беру
Reply ↓
-
(1) Зачем людей обманывать? В релизе конвертации 2.1.2.1 все уже давно есть.
Reply ↓
-
(3) Точно? Уверены? Под 8.2 на управляемых формах?
Вы, случаем, сами никого не обманываете?
Reply ↓
-
Надо добавить и удаление регистрации, как в 8.1.
Reply ↓
-
-
(6) Посмотри обработку «ОбработкаРегистрацияИзменненийДляОбмена» типовой конфы УТ, там все есть.
Reply ↓
-
(7) Я смотрел. Что именно «Надо добавить и удаление регистрации, как в 8.1.» ?
По-моему одной произвольной регистрации запросом предостаточно.
Reply ↓
-
(8) У тебя есть удаление всей регистрации, но может надо добавить удаление отдельного элемента регистрации, который не нужен для обмена?
Я это имел в виду.
Reply ↓
-
(9) А, понятно. Сделаю произвольное снятие регистрации 🙂
Reply ↓
-
Здравствуйте. Извените, я не профи, но довольно с большим опытом самоучки… Обычно у меня не было проблем с выгрузкой/загрузкой данных в 1Сv8.1, но вот, перешла на 8.2 Версия 8.2.10.77 конф. Упр. небольшой фирмой и немогу вообще разобраться.Мне неоходимо выгрузить справочники из УТ (есть на платф. 8.1, и есть уже сконвертированная под 8.2) — неполучается, пишет ошибку: при загрузке номенклатуры — пишет не найден родитель наименования…
Reply ↓
-
(11) Этот вопрос лучше задать на форуме. Так быстрее получится.
Reply ↓
-
чёт не открывается обработка. Со всеми управляемыми формами:)
Reply ↓
-
Reaper_1C пишет:
(1) Зачем людей обманывать? В релизе конвертации 2.1.2.1 все уже давно есть.
Для управляемых форм одинес до сих пор ничего не написал.
Reply ↓
-
если пытаться зарегистрировать сразу все «Справочники» или «Документы» и т.д. — вылетает ошибка.
Reply ↓
-
У меня работает на все 100. Спасибо!
Reply ↓
-
В модуле формы после строки
Процедура ПоказатьОбъекты(ИндексСтроки = Неопределено, Уровень = 0)
добавить
Если Не ЗначениеЗаполнено(УзелОбмена) Тогда
Возврат;
КонецЕсли;
Иначе при выборе вида плана обмена выдаётся ошибка
{Форма.Форма.Форма(75)}: Ошибка при вызове метода контекста (ВыбратьИзменения)
ВыборкаИзменений = ПланыОбмена.ВыбратьИзменения(УзелОбмена, УзелОбмена.НомерОтправленного + 1);
по причине:
Недопустимое значение параметра (параметр номер ‘1’)
Reply ↓
-
Спасибо за обработку! Работает только довольно долго..
Reply ↓
-
Выявил еще один несущественный баг. Если выбрать какой-либо из типов объектов и нажать «Показать объекты», то после повторного нажатия список ниже возникающих объектов, зарегистрированных к обмену, задвоится.
В модуле формы строки кода
Если ИндексСтроки = Неопределено ИЛИ Уровень = 0 Тогда
ВыборкаИзменений = ПланыОбмена.ВыбратьИзменения(УзелОбмена, УзелОбмена.НомерОтправленного + 1);
Иначе
ТекСтрока = ДанныеОбмена.НайтиПоИдентификатору(ИндексСтроки);
Фильтр = Новый Массив;
Если Уровень = 2 Тогда
МетаданныеОбъекта = Метаданные.НайтиПоПолномуИмени(ТекСтрока.Название + «.» + ТекСтрока.Объект);
Фильтр.Добавить(МетаданныеОбъекта);
ИначеЕсли Уровень = 1 Тогда
Для Каждого Стр Из ТекСтрока.ПолучитьЭлементы() Цикл
МетаданныеОбъекта = Метаданные.НайтиПоПолномуИмени(Стр.Название + «.» + Стр.Объект);
Фильтр.Добавить(МетаданныеОбъекта);
КонецЦикла;
КонецЕсли;
ВыборкаИзменений = ПланыОбмена.ВыбратьИзменения(УзелОбмена, УзелОбмена.НомерОтправленного + 1, Фильтр);
КонецЕсли;
Показать
заменить на
Если ИндексСтроки = Неопределено ИЛИ Уровень = 0 Тогда
ВыборкаИзменений = ПланыОбмена.ВыбратьИзменения(УзелОбмена, УзелОбмена.НомерОтправленного + 1);
// очистка
Для Каждого СтрКонф Из ДанныеОбмена.ПолучитьЭлементы() Цикл
Для Каждого СтрТип Из СтрКонф.ПолучитьЭлементы() Цикл
Для Каждого Стр Из СтрТип.ПолучитьЭлементы() Цикл
Стр.ПолучитьЭлементы().Очистить();
КонецЦикла;
КонецЦикла;
КонецЦикла;
Иначе
ТекСтрока = ДанныеОбмена.НайтиПоИдентификатору(ИндексСтроки);
Фильтр = Новый Массив;
Если Уровень = 2 Тогда
МетаданныеОбъекта = Метаданные.НайтиПоПолномуИмени(ТекСтрока.Название + «.» + ТекСтрока.Объект);
Фильтр.Добавить(МетаданныеОбъекта);
// очистка
ТекСтрока.ПолучитьЭлементы().Очистить();
ИначеЕсли Уровень = 1 Тогда
Для Каждого Стр Из ТекСтрока.ПолучитьЭлементы() Цикл
МетаданныеОбъекта = Метаданные.НайтиПоПолномуИмени(Стр.Название + «.» + Стр.Объект);
Фильтр.Добавить(МетаданныеОбъекта);
// очистка
Стр.ПолучитьЭлементы().Очистить();
КонецЦикла;
КонецЕсли;
ВыборкаИзменений = ПланыОбмена.ВыбратьИзменения(УзелОбмена, УзелОбмена.НомерОтправленного + 1, Фильтр);
КонецЕсли;
Показать
Reply ↓
-
Спасибо за обработку
Reply ↓
-
trumanl пишет:
Выявил еще один несущественный баг.
Поручик пишет:
В модуле формы после строки ….
Скажите, внесены ли исправления, указанные коллегами Поручиком и trumanl? Можно ли рекомендовать
данную обработку конечным пользователям без допиливания?
Reply ↓
-
Номальная обработка, помогла)
Reply ↓
-
Классная обработка. Только не работает для снятия с плана обмена конкретного объекта конфигурации.
Reply ↓
-
С надеждой, что эта обработка выручит в тяжелой борьбе с настройкой обмена из Ут11 БП2.0
Reply ↓
-
Очень удобно настраивать обмен. Без нее никак не взлетал. Спасибо!!!
Reply ↓
-
Обработке уж два года, а от 1с до сих пор нет внятного аналога. Спасибо большое
Reply ↓
-
Сообщество не будет возражать, если выложу модифицированный вариант отдельной публикацией? Кроме исправления указанных багов, добавил изменение номеров сообщений.
Reply ↓
-
+ Добавлена возможность для регистрации обработки в справочнике «Дополнительные обработки» для конфигураций на БСП.
Reply ↓
-
(28) Поручик, конечно выкладывай, посмотрим 🙂
Reply ↓
-
(19) trumanl, да действительно очень долго выполняет …
щас исправлю этот баг
Reply ↓
-
(30) Уже год как выложено и развилось в самостоятельную работу с добавленными фичами. Луркайте поиск
Reply ↓
-
(32) Поручик, понял, спасибо большое, щас найду.
Reply ↓
-
(30) Если разуть глаза, то ссылка есть прямо в описании.
Reply ↓
-
(33) Поручик, да вижу, благодарю.
Reply ↓
-
Спасибо за обработку.
Reply ↓
-
-
При переходе на платформу 8.3.5 столкнулся с тем, что перестали выгружаться базы через выгрузку в .dt. Нашел на форумах, что дело может быть в планах обмена, если они есть,то их нужно почистить (удалить) регистрацию + предлагаются самописные обработки :). Я так понимаю, что для удаления регистрации подойдет типовая обработка «ОбработкаРегистрацияИзменненийДляОбмена» конфигураций на обычных формах УТ 10.3, ЗУП 2.5, БП 2.0. Пишу здесь, возможно кому информация пригодится…
Reply ↓
Leave a Comment
Ваш адрес email не будет опубликован. Обязательные поля помечены *