1с зарегистрироватьизменения недопустимое значение параметра 2
Добрый день, Эльза!
Похоже, у вас, как минимум, две ошибки после удаления подразделения.
Судя по всему, у вас уже был настроен обмен с ЗУП 3.1, когда вы стали удалять лишнее подразделение. А это нужно было сделать ДО первого запуска обмена, т.е. как только вы перешли на Бухгалтерию 3.0.
Логика обмена в 3.0 отличается от той, что была в 2.0.
Там объекты сопоставлялись по коду и/или наименованию и нам было достаточно изменить эти данные в обоих базах обмена, чтобы получить результат выгрузки и загрузки.
Сейчас все не так. Объекты синхронизируются по внутреннему UID — внутреннему идентификатору.
Это строчка со многими символами, совершенно уникальная в рамках базы. Другой такой нет.
UID записывается при создании объекта. И сколько бы мы не меняли наименование и код для сопоставления объектов в базах обмена, это нам в 3.0 уже не поможет. UID у них все равно будут разные. А значит, программа не сможет корректно выполнить обмен.
За сопоставление данных в базах отвечает специальный регистр Соответствия объектов информационных баз. Посмотреть его можно через Главное меню — Все функции.
Отберите информацию по подразделениям и посмотрите, соответствуют ли внутрение идентификаторы баз источников и приема.
Если там есть несоответветствие, то придется узнать UID источника в ЗУП (наверное, там либо тоже было два подразделения с уникальными UID или вы тоже удалили там до одного. Возможно, UID остались разные).
Поэтому вам нужно для начала сделать копию рабочих баз, настроить там обмен.
Все действия выполнять в них, чтобы не испортить ничего.
1. В ЗУП и БУХ у вас должно быть одинаковое количество подразделений, т.е. если в БУХ одно, то и в ЗУП — тоже должно быть одно. Проследите за одинаковым наименованием у них.
2. Проверьте в регистре Соответствия объектов информационных баз UID по оставшимся подразделениям.
3. Попробуйте сопоставить их вручную в обеих базах. Просто отредактируйте запись. Регистр дает это делать.
4. Выполните обмен. Если сопоставление вручную прошло корректно, скорее всего, проблема решилась.
Если нет, то придется привлекать к решению программиста.
Также есть еще один вариант, который можно попробовать выполнить на копии базы.
Например, удалите все записи в регистре сведений Соответствие объектов информационных баз (CTRL+A и правой кнопкой мыши вызвать контекстное меню — команда Удалить)
После этого снова выполните обмен.
Программа должна попытаться автоматически состыковать данные обеих баз.
Внимательно следите за Предупреждениями при обмене.
Все что программа не сможет состыковать автоматически, она предложит сделать вам вручную.
Смотрите ссылку Предупреждения. Переходите по вкладкам и проверяйте информацию.
Обращаю внимание, что это нужно выполнить сначала в копии базы, чтобы убедиться, что так можно решить проблему.
У вас должно быть так.
А то, что при попытке открыть подразделение в табличной части документа Отражение зарплаты в бухучете у вас возникает ошибка — это следствие удаление подразделения.
UID «приехавшего» из ЗУП объекта нет в Бухгалтерии.
А при открытии карточки Подразделения происходит поиск указанного объекта в базе.
Операция открытия включает два параметра: первый — собственно тип открываемого справочника — это справочник Подразделения организаций и второй — это ссылка на него в базе — уникальный UID, которого в базе нет. Вы его удалили.
У нас есть очень хорошая статья и видео по синхронизации ЗУП и БУХ:
Синхронизация между 1С ЗУП 3 и 1С Бухгалтерией 3.0
Я вам рекомендую его посмотреть, оно может снять многие вопросы по обмену.
Автоматически при уже установленном обмене не всегда получается пересопоставить автоматически объекты разных баз, не понятно по какой причине, но у клиентов такое бывало.
Тогда просто настраивали обмен заново и уже при новой настройке сопоставлялись только те объекты, что уже есть в базе.
Эльза, сейчас проверила этот вариант, не делайте его.
Я в тестовой базе удалила записи, но это не помогло. У вас остается два варианта, после приведения в соответствия подразделений в обеих базах: у вас в ЗУП Обобособленное и Главное, а в БУХ, как я понимаю, только одно — Главное.
1. Ручная корректировка регистра (когда войдете — увидите наверняка, что в подразделении-источнике нет соответствия в подразделении-приемнике. Там или незаполненные поля будут или лишние строки)…
Поколдуйте с этим. Есть высокая вероятность решить проблему сопоставив объекты вручную.
2. Это просто настроить новый обмен по кнопке Новая Синхронизация данных.
Я сейчас создала новую синхронизацию по обмену БУХ с ЗУП. Заняло 30 минут. Старую синхронизацию не удаляла, оставила. Но в этом случае нужно менять префиксы по обмену, например Было БП — стало ББ, было ЗП — стало ЗЗ.
Все работает нормально, хотя перед этим удалила все соответствия из регистра. Программа при новой настройке все создала автоматически.
В окне настройки на стороне ЗУП открылась специальная ссылка для сопоставления.
И регистр Соответствие объектов информационных баз заполнился заново. 🙂
Ирина, спасибо Вам большое за развернутый ответ! Попробую. Результат сообщу
Удачи, Эльза! Пусть все получится. 🙂
Вы можете задать еще вопросов
Доступ к форме "Задать вопрос" возможен только при оформлении полной подписки на БухЭксперт8
Нажимая кнопку "Задать вопрос", я соглашаюсь с
регламентом БухЭксперт8.ру >>
Спасибо, Марина Аркадьевна. Ваш семинар, как всегда великолепен.
С уважением,
Римма
Вы можете задать еще вопросов
Доступ к форме "Задать вопрос" возможен только при оформлении полной подписки на БухЭксперт8
Нажимая кнопку "Задать вопрос", я соглашаюсь с
регламентом БухЭксперт8.ру >>
Почему возникает ошибка? Вторым параметром я передаю ссылку на справочник.
: Ошибка при вызове метода контекста (ЗарегистрироватьИзменения)
ПланыОбмена.ЗарегистрироватьИзменения(Узел, ВыборкаСпр.Ссылка);
по причине:
Недопустимое значение параметра (параметр номер '2')
Для каждого Спр Из Метаданные.Справочники Цикл
ВыборкаСпр = Справочники[Спр.Имя].Выбрать(, , , );
ВыборкаСпр.Следующий();
ПланыОбмена.ЗарегистрироватьИзменения(Узел, ВыборкаСпр.Ссылка);
Сообщить(Спр.Имя);
Сообщить(ВыборкаСпр.Ссылка);
КонецЦикла;
Также почему ошибка "Получение элемента по индексу для значения не определено" ?
И вообще какая задача? Зачем метаданные справочников перебираешь, а внутри получаешь значения справочников?
(2) Мне нужен 1 элемент справочника, зачем все?
А мне пишется ошибка "Получение элемента по индексу для значения не определено" .
Смотрю в отладчике там все верно!
(9) ругается вот на этом
получение элемента по индексу не определено, но тут же все верно.
(14) так ты не индекс передаешь, посмотри в отладчике что за коллекция Метаданные.Справочники. И вообще сделай точно так как в синтаксис помощнике.
(15) вот так сработало
(22) Проблема была в том что у меня на форме был флаг Справочники. И он перекрывал метаданные. Переименовал его во ФлагСправочники и все встало на свои места.
Сейчас вопрос в
все же как нужно! Но, по проходу строки выдает ошибку:
по причине:
Недопустимое значение параметра (параметр номер '2')
все как в синтакс помощнике, но почему то параметр 2 не воспринимается ( в нем идет ссылка, все нормально вроде
(26) Я же стою на точке останова на этой строке
(28) Зачем это?
Я же смотрю в отладчике что передается, и у меня не воспринимает второй параметр, а в нем передается ссылка на элемент справочника
(28) ну согласен, полезная возможно проверка
Но в данный момент у меня все нормально с параметрами, а ошибка выдается (
Это условие точно выполняется?
Из СП: Объект метаданных, соответствующий данным, должен входить в состав всех планов обмена всех узлов, указанных в первом параметре.
(32) Открыл обработку регистрация изменений для обмена,
выбрал этот узел. В ней же можно это увидеть?
На первый взгляд не нашел там этого справочника.
А можно как то программно проверять входит ли в состав плана обмена этот объект или нет?
(34+) Если нельзя программно проверять включен объект в план обмена или нет, что бы не было ошибки, поставить тогда
Попытка
Исключение
КонецПопытки ?
А в чем смысл перебора объектов метаданных в цикле?
Не проще зарегистрировать все объекты одной строкой
ПланыОбмена.ЗарегистрироватьИзменения(Узел)?
Содержит (Contains)
Синтаксис:
Объект метаданных, наличие которого необходимо проверить в составе плана обмена.
Тип параметра - ОбъектМетаданных, описывающий объекты конфигурации, которые могут входит в состав плана обмена (например: ОбъектМетаданных: Справочник, ОбъектМетаданных: Документ и т.д.).
Возвращаемое значение:
Тип: Булево.
Истина - указанный объект входит в состав плана обмена; Ложь - в противном случае.
Описание:
Определяет, содержит ли состав плана обмена указанный объект метаданных.
Сервер, толстый клиент, внешнее соединение, мобильное приложение(сервер).
(38) Так словесно была поставлена формулировка и я начал делать.
То есть (37) не имеет смысла? Если все можно сделать одной строкой на весь узел?
Не спеша обновлял розницу, 1С 8.3.15.1656, розница ПРОФ. Без дописок, абсолютно стандартная конфигурация. 1 пользователь, 1 компьютер нет РИБ, нет работы по сети, файловая версия. При обновлении с релиза 2.2.12.30 на релиз 2.3.1.30 при запуске предприятия и процедуры обновления версии программы вывалилась следующая ошибка:
Недопустимое значение параметра (параметр номер '2')
: ПланыОбмена.УдалитьРегистрациюИзменений(Выборка.Узел);
: ЗаполнитьДанныеДляПараллельногоОтложенногоОбновления(СведенияОбОбновлении, Параметры);
: Результат = ВыполнитьОбновлениеИнформационнойБазы(ПараметрыОбновления);
:ОбновлениеИнформационнойБазыСлужебный.ВыполнитьОбновлениеИнформационнойБазыВФоне(Параметры[0],Параметры[1])
: Выполнить ИмяМетода + "(" + ПараметрыСтрока + ")";
: ОбщегоНазначения.ВыполнитьМетодКонфигурации(ИмяПроцедуры, ПараметрыПроцедуры);
: ВыполнитьПроцедуру(ВсеПараметры.ИмяПроцедуры, ВсеПараметры.ПараметрыПроцедуры);
по причине:
Недопустимое значение параметра (параметр номер '2')
Соответственно дальнейшая работа не возможна, подскажите куда копать.
Запустил ТиИ. Процедура заняла порядка 4х часов. Все отработало и обновилось. Запуск 1С предприятия показал, что все из 50 процедур обновления отработали штатно.
А на каком основании вы обновляли релиз 2.2.12.30 на релиз 2.3.1.30 .
Просто захотелось?
Ну так и получили .
Допустиммые релизы извините ограничены 1
(3) вообще-то я обновлял с релиза 1.0.16.04, но перечислять всю цепочку обновлений посчитал не разумным. Последний рабочий релиз без ошибок был 2.2.12.30 потому его и написал. Естественно, что перед 2.3.1.30 было обновление 2.2.13.12
(5) Резервных копий ранних релизов не делал, все шло как по маслу :(( Так что с откатом жестоко. Можно поднять только ранние промежуточные 2.2.5.27 или 2.2.9.20
(4) Ну уж извините - что написали то и анализируем! Телепаты в отпуске как говорится.
Тогда платформу озвучьте уж пожалуйста.
И еще вопрос - вы запускали базу в режиме 1С Предприятия после каждого обновления?
(6) платформа написана в шапке (8.3.15.1656), единственное упустил что она х64. В том, то и дело, что на релизе 2.2.13.12 не запускал предприятие, сразу обновил до 2.3.
(7) ну вот и решение.
После каждого обновления - обязательна процедура запуска 1С Предприятия, если обновляетесь из конфигуратора.
У вас же не выполнялись процедуры обновления из 2.2.13.12 и никаких нужных изменений в базе не сделали.
(8) Так не в первый раз обновление на несколько релизов проходило без проблем. Т.е. вообще без проблем на 5-8 релизов без запуска предприятия. Конфигурацию БД то обновлял в конфигураторе сразу после обновления релиза. Или я не допонимаю технологию обновлений релизов 1С?
(8)Я и на этой базе перешел сразу от 2.2.5 на 2.2.9 без запуска 1С Предприятия. И все работало без всяких сбоев - произвел выгрузку файла на ККМ, произвел загрузку с ККМ, проверил остатки и движения, проверил чеки и смены. Удалил движения и продолжил обновление.
Об обязательности процедуры запуска 1С предприятия после обновления релиза в конфигураторе читаю в первый раз. Вполне возможно, что мои знания имеют огромный пробел.
(11)по хорошему нужно после каждого релиза смотреть результат обновления и те процедуры которые не отработали , в последующих релизах умертвят базу.
(13)не , после обновление , лезешь в администрирование - результат обновления - там смотриш сколько процедур из скольки отработало , если числа равны = всё ок , а если нет , ломаешь конфу , убиваешь что не понятно , до обновляешься в предприятии , накатываешь типовой релиз и после этого можно следующие версии обновления . либо можно без взрыва конфы , но нужно тогда тщательней ковырять данные.
(14)Так это в случае удачного обновления, а не так как у меня сейчас. НО в любом случае спасибо, буду знать и пользоваться.
(15) рисковый вы человек. После каждого обновления надо запускать конфу в режиме предприятия и дожидаться полного обновления. А перед обновлением обязательный бэкап. А если доработки какие есть, то обновлять сначала на копии и проверять работоспособность по чеклисту доработок.
(13) Вы напоминаете слепого на минном поле! Который не видит ни таблички с предупреждениями, но еще не взорвался и утверждающего, что видите - можно же ходить и НИЧЕГО!
Вы видимо в принципе не понимаете механизма обновления и процесса изменения структур и данных в процессе этого обновления.
Это до первой серьезной потери!
Примерно такие же "1С-ники" не делают вообще архивных копий, играя в русскую рулетку.
Отвечаю на ваш вопрос
с очевидностью вашей неосведомленности, которая позволила мне столь резкие выражения выше:
Совершенно обязательно именно убедиться что отработали ВСЕ процедуры обновления из 1С Предприятия ибо именно они выполняют действия с данными, которые вы в последствие запросто можете просто потерять.
Смотреть -Администрирование- Обслуживание- Сведения об обновлении
там выводятся подробные сведения о всех процедурах и их времени выполнения, собственно вас должно интересовать только сам факт выполнения.
Ну и напоследок вам пример -история из будущего -"КАК вы можете потерять свою базу"
-В документе Х есть реквизит Сотрудник , который содержит информацию ясно о сотруднике (ссылка на сотрудника) .
Документ содержит информацию о стаже сотрудника. (Это кстати почти реальная история из ЗУП 2.5)
-В результате обновления 1С изменила структуру данных и теперь после обновления вся информация о стаже будет храниться не в документе , а в регистре сведений. Процедуры обновления в процессе выполнения переносят информацию из документов в РС и при успешном обновлении никто даже не заметит, что данные переехали. Данные в документе X больше не нужны . Мало того сам документ вполне может совсем исчезнуть из базы за ненадобностью в следующих релизах. Но база то как работала так и работает. Просто когда подойдет отчетный период и Бух кинется сдавать отчетность вдруг обнаружится, что данных то нету за весь период ДО обновления, ибо после обновления данные писались уже в регистр и все прекрасно. А данные, если повезет (архивы то хоть делались), нужно тащить из архива. А если еще и архива вдруг не окажется как назло?
- Если все процедуры обновления не выполнить, то вы запросто получите в этой ситуации совершенно рабочую базу, но без старых данных по стажу и счастя полные штаны! Но самое главное заметить это можете аж через несколько месяцев!
Суть проблемы в следующем: Необходимо сформировать начальную выгрузку, для этого надо зарегистрировать все данные которые учавствуют в обмене, по логике программы мне необходимо выгрузить только часть записей регистра сведений, его режим записи Независимый, переодичность В пределах дня. Вот код программы регистрации: Получается ошибка: Ошибка при вызове метода контекста (ЗарегистрироватьИзменения): Недопустимое значение параметра (параметр номер "2") ПланыОбмена.ЗарегистрироватьИзменения(Узел, НаборЗаписей); Помогите пожалуйста, заклился.
Регистр сведений не входит в состав плана обмена. Галочку нужно поставить и снять авторегистрацию (если ты регистрацию делаешь сам).
Тогда это возможно проявляет себя глюк 12 релиза. Попробуй снять галочку из плана обмена и обновить БД. Если вылетела с ошибкой "ссылочная константа содержит недопустимую ссылку на таблицу (pos=12)" или нечто подобное, то поздравляю - у тебя глюк в базе. Есть мысль, что он проявляется только на SQL-версиях, но я не уверен. Предлагаю тебе пересоздать этот регистр (с переносом данных, конечно). Это может помочь. Но может быть такая вещь - эта ошибка переместится на другой регистр! Есть еще вариант - пересоздать план обмена. Должно помочь на 90%. Но может и не помочь. Перед пересозданием плана обмена нужно произвести последний сеанс обмена, остановить работу в базах и обновить конфигурацию БД за 2 релиза: 1-й - удаление плана обмена 2-й - создание новых планов обмена После 1-го релиза крайне рекомендуется обновить конфигурации во всех периферийных базах (если получится). После 2-го релиза периферийная база может ругаться, что принимаются изменения от неизвестной конфигурации. В этом случае ее лучше пересоздать через начальный образ или путем копирования основной базы и переустановки главного узла методом УстановитьГлавныйУзел.
А чему равно Узел в регистрации изменений? Может он равен текущему (главному) узлу? Тогда вполне правильный глюк. Наталкивался уже. Пора уже Нуралиева бить. То на 9 релизе обмен становился невозможным по УРБД, то теперь эта хрень на 12.
В типовой УТ, кстати, часто записываются наборы по регистрам КонтактнаяИнформация, ЗначенияСвойствОбъектов, КатегорииОбъектов с отбором, не соответствующим основному отбору регистра. Будьте осторожны при ручной регистрации изменений!
Почему возникает ошибка? Вторым параметром я передаю ссылку на справочник. <ВнешняяОбработка.ЗарегистрироватьИзменения.Форма.Форма.Форма>: Ошибка при вызове метода контекста (ЗарегистрироватьИзменения) ПланыОбмена.ЗарегистрироватьИзменения(Узел, ВыборкаСпр.Ссылка); по причине: Недопустимое значение параметра (параметр номер '2') Для каждого Спр Из Метаданные.Справочники ЦиклВнешняяОбработка.ЗарегистрироватьИзменения.Форма.Форма.Форма>
И вообще какая задача? Зачем метаданные справочников перебираешь, а внутри получаешь значения справочников?
Мне нужен 1 элемент справочника, зачем все? И ошибка идет на этой строке но тут же все верно! Получаю справочник по имени. А мне пишется ошибка "Получение элемента по индексу для значения не определено" . Смотрю в отладчике там все верно!
обычное приложение, обычная форма но в конфигурации есть и обычные и управляемые формы в чем может быть подвох?
ругается вот на этом Справочники[Спр.Имя] получение элемента по индексу не определено, но тут же все верно.
так ты не индекс передаешь, посмотри в отладчике что за коллекция Метаданные.Справочники. И вообще сделай точно так как в синтаксис помощнике.
сейчас пишет метод, Выбрать не обнаружен ВыборкаСпр = Метаданные.Справочники[Спр.Имя].Выбрать(, , , );
Проблема была в том что у меня на форме был флаг Справочники. И он перекрывал метаданные. Переименовал его во ФлагСправочники и все встало на свои места. Сейчас вопрос в ПланыОбмена.ЗарегистрироватьИзменения(Узел, ВыборкаСпр.Ссылка); То что в .
Стою в отладчике на строке Узел - план обмена ссылка ВыборкаСпр.Ссылка - справочник ссылка все же как нужно! Но, по проходу строки выдает ошибку: <ВнешняяОбработка.ЗарегистрироватьИзменения.Форма.Форма.Форма>: Ошибка при вызове метода контекста (ЗарегистрироватьИзменения) ПланыОбмена.ЗарегистрироватьИзменения(Узел, ВыборкаСпр.Ссылка); по причине: Недопустимое значение параметра (параметр номер '2')ВнешняяОбработка.ЗарегистрироватьИзменения.Форма.Форма.Форма>
все как в синтакс помощнике, но почему то параметр 2 не воспринимается ( в нем идет ссылка, все нормально вроде
Я же стою на точке останова на этой строке передается 1 параметр узел ссылка второй справочник ссылка как пустой?
Зачем это? Я же смотрю в отладчике что передается, и у меня не воспринимает второй параметр, а в нем передается ссылка на элемент справочника
ну согласен, полезная возможно проверка Но в данный момент у меня все нормально с параметрами, а ошибка выдается (
Это условие точно выполняется? Из СП: Объект метаданных, соответствующий данным, должен входить в состав всех планов обмена всех узлов, указанных в первом параметре.
Открыл обработку регистрация изменений для обмена, выбрал этот узел. В ней же можно это увидеть? На первый взгляд не нашел там этого справочника. А можно как то программно проверять входит ли в состав плана обмена этот объект или нет?
(34+) Если нельзя программно проверять включен объект в план обмена или нет, что бы не было ошибки, поставить тогда Исключение КонецПопытки ?
А в чем смысл перебора объектов метаданных в цикле? Не проще зарегистрировать все объекты одной строкой ПланыОбмена.ЗарегистрироватьИзменения(Узел)?
Содержит (Contains) Синтаксис: Содержит(<Метаданные>) Параметры: Объект метаданных, наличие которого необходимо проверить в составе плана обмена. Тип параметра - ОбъектМетаданных, описывающий объекты конфигурации, которые могут входит в состав плана обмена (например: ОбъектМетаданных: Справочник, ОбъектМетаданных: Документ и т.д.). Возвращаемое значение: Тип: Булево. Истина - указанный объект входит в состав плана обмена; Ложь - в противном случае. Описание: Определяет, содержит ли состав плана обмена указанный объект метаданных. Доступность: Сервер, толстый клиент, внешнее соединение, мобильное приложение(сервер).Метаданные>
Так словесно была поставлена формулировка и я начал делать. То есть не имеет смысла? Если все можно сделать одной строкой на весь узел?
"пока зависло на этой строке, стоит, и не отвисает. " - СП не читаем из принципиальных соображений? Если это не противоречит твоей религии, процитирую отрывок про второй параметр: ". Если указано Неопределено или не указан, то в качестве первого параметра может быть указан только одиночный узел. И в этом случае будет выполнена регистрация изменений для всех объектов, метаданные которых входят в состав плана обмена, к которому относится узел, указанный в качестве первого параметра."
Смысл в том что бы проверить обмен на 1 объекте каждого вида. Ваше предложение же похоже будет перегружать всю базу. Что у меня сейчас и делается похоже (
Обмен проверить что бы. Убедиться что он выполняется без ошибок. Уже отказались от обмена по OLE, посыпал ошибками постоянно и каждый раз новыми. Делаю через файловый обмен. Нужно это для проверки обмена на всех включенных в него объектах.
подскажите как убрать регистрацию изменений со всех объектов? И долго ли это делать? А то благодаря у меня база висит выгружается. Дождаться выгрузки, когда регистрация изменения сама снимется, или можно сбросить процесс и сделать это принудительно?
Если надо зарегистрировать все элементы справочника, то есть 2 варианта 1. простой: ПланыОбмена.ЗарегистрироватьИзменения(Узел,Метаданные.Справочники[ИмяСправочника]); 2. более сложный запросом вытаскиваем выборку и в цикле по обходу ПланыОбмена.ЗарегистрироватьИзменения(Узел,Выборка.Ссылка);
Читайте также: