Нужно удалить запись из регистра накопления Товары на складах, в котором значение поля Регистратор заполнено <Объект не найден>. Как правильно указать Регистратор в отборе?
В обработке пишу:
НаборЗаписей=РегистрыНакопления.ТоварыНаСкладах.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(<Объект не найден> (55:98180080485e404011e1981c0af3e8ae));
НаборЗаписей.Прочитать();
Запись=НаборЗаписей(0);
НаборЗаписей.Удалить(Запись);
НаборЗаписей.Записать();
В обработке пишу:
НаборЗаписей=РегистрыНакопления.ТоварыНаСкладах.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(<Объект не найден> (55:98180080485e404011e1981c0af3e8ae));
НаборЗаписей.Прочитать();
Запись=НаборЗаписей(0);
НаборЗаписей.Удалить(Запись);
НаборЗаписей.Записать();
По теме из базы знаний
- Удаление записей из регистров накопления и сведений с отбором (1С 8.2)
- Удаление записей регистров накопления (с условиями отбора)
- Удаление записей регистра накопления по битым ссылкам
- Удаление записей регистров накопления с возможностью выбора режима загрузки (обмен данными), с отбором на СКД (УФ)
- Удаление и обработка записей регистров накопления
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) veyrence, Выяснять причину таких записей нудно, хотя интересно откуда они взялись.
А очистить регистр от них можно попробовать так - Сделать Тестирование и исправление, с установленными переключателями Создавать объекты. Создадутся регистраторы - документы какого-то вида (те что являются регистраторами для нужного регистра), по этим документам можно сделать запрос и получить их список. По этому списку сделать запрос к регистру, и удалить то что нужно. Воде должно получиться.
А очистить регистр от них можно попробовать так - Сделать Тестирование и исправление, с установленными переключателями Создавать объекты. Создадутся регистраторы - документы какого-то вида (те что являются регистраторами для нужного регистра), по этим документам можно сделать запрос и получить их список. По этому списку сделать запрос к регистру, и удалить то что нужно. Воде должно получиться.
(1) veyrence, а зачем писать код?
Тестирование и исправление. Очищать ссылки - удалять объекты. И от "битых" записей в регистре не останется и следа.
Можно перед этим сделать без исправления, чтобы посмотреть, какие объекты будут затронуты.
Тестирование и исправление. Очищать ссылки - удалять объекты. И от "битых" записей в регистре не останется и следа.
Можно перед этим сделать без исправления, чтобы посмотреть, какие объекты будут затронуты.
Для начала нужно определиться с типом регистратора (что это за документ).
После получить функцией ЗначениеВСтрокуВнутр (с переданной в нее пустой ссылкой на найденный тип документа) строку вида: {"#",13dbeddc-bc26-44b9-9e58-ce22c562e271,356:00000000000000000000000000000000}.
Далее вместо 356:00000000000000000000000000000000 вставляем 55:98180080485e404011e1981c0af3e8ae и то что получилось скармливаем функции ЗначениеИзСтрокиВнутр - это и будет ссылка на твой не найденный регистратор.
Ну а потом уже так (код удалит всез аписи по несуществующему регистратору! я так понял, что именно это и нужно):
После получить функцией ЗначениеВСтрокуВнутр (с переданной в нее пустой ссылкой на найденный тип документа) строку вида: {"#",13dbeddc-bc26-44b9-9e58-ce22c562e271,356:00000000000000000000000000000000}.
Далее вместо 356:00000000000000000000000000000000 вставляем 55:98180080485e404011e1981c0af3e8ae и то что получилось скармливаем функции ЗначениеИзСтрокиВнутр - это и будет ссылка на твой не найденный регистратор.
Ну а потом уже так (код удалит всез аписи по несуществующему регистратору! я так понял, что именно это и нужно):
НаборЗаписей=РегистрыНакопления.ТоварыНаСкладах.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(РегистраторСсылка);
НаборЗаписей.Записать();
Тестирование и исправление - это очень стрёмная идея в принципе. Эта штука сработает по всем объектам, в том числе может и где то там, где не стоило бы.
Более того - это лишнее. Можно ведь просто получить запросом эти объекты без этого и поправить их сразу.
Получается не сложный код:
PS В моём случае в узел магазина Розницы попали остатки других магазинов, из-за этого не адекватно показывались остатки этих других магазинов.
Так же зачистке мешала дата запрета редактирования. В приложенном коде закомментированы соответствующие участки кода. В случае РИБ предварительно надо было остановить продажи, выполнить обмен.
По датам запрета изменения процедуры:
Более того - это лишнее. Можно ведь просто получить запросом эти объекты без этого и поправить их сразу.
Получается не сложный код:
//ГлавныйУзелОбмена = ПланыОбмена.ГлавныйУзел();
//Если ГлавныйУзелОбмена = Неопределено Тогда Возврат; КонецЕсли;// мы в главной базе
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| ТоварыНаСкладах.Регистратор КАК Регистратор
|ИЗ
| РегистрНакопления.ТоварыНаСкладах КАК ТоварыНаСкладах
|ГДЕ
| ТоварыНаСкладах.Регистратор.Ссылка ЕСТЬ NULL";
РезультатЗапроса = Запрос.Выполнить();
Если РезультатЗапроса.Пустой() Тогда Возврат; КонецЕсли;
Выборка = РезультатЗапроса.Выбрать();
НЗ = РегистрыНакопления.ТоварыНаСкладах.СоздатьНаборЗаписей();
НачатьТранзакцию();
//тзДатыЗапрета = ДатыЗапретаВТЗ();
Пока Выборка.Следующий() Цикл
НЗ.Отбор.Регистратор.Установить(Выборка.Регистратор);
НЗ.Записать();
КонецЦикла;
//ПланыОбмена.УдалитьРегистрациюИзменений(ГлавныйУзелОбмена, Метаданные.РегистрыНакопления.ТоварыНаСкладах);
//ВосстановитьДатыЗапрета(тзДатыЗапрета);
ЗафиксироватьТранзакцию();
ПоказатьPS В моём случае в узел магазина Розницы попали остатки других магазинов, из-за этого не адекватно показывались остатки этих других магазинов.
Так же зачистке мешала дата запрета редактирования. В приложенном коде закомментированы соответствующие участки кода. В случае РИБ предварительно надо было остановить продажи, выполнить обмен.
По датам запрета изменения процедуры:
Функция ДатыЗапретаВТЗ(пУдалить = Истина) Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ДатыЗапрета.Раздел,
| ДатыЗапрета.Объект,
| ДатыЗапрета.Пользователь,
| ДатыЗапрета.ДатаЗапрета,
| ДатыЗапрета.ОписаниеДатыЗапрета,
| ДатыЗапрета.Комментарий
|ИЗ
| РегистрСведений.ДатыЗапретаИзменения КАК ДатыЗапрета";
РезультатЗапроса = Запрос.Выполнить();
Если пУдалить Тогда
НЗ = РегистрыСведений.ДатыЗапретаИзменения.СоздатьНаборЗаписей();
НЗ.Записать();
КонецЕсли;
Возврат РезультатЗапроса.Выгрузить();
КонецФункции
Процедура ВосстановитьДатыЗапрета(ТЗ) Экспорт
НЗ = РегистрыСведений.ДатыЗапретаИзменения.СоздатьНаборЗаписей();
НЗ.Загрузить(ТЗ);
НЗ.Записать();
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПоМагазину.Ссылка
|ИЗ
| ПланОбмена.ПоМагазину КАК ПоМагазину
|ГДЕ
| НЕ ПоМагазину.ЭтотУзел";
РезультатУзлы = Запрос.Выполнить();
Узлы = РезультатУзлы.Выгрузить().ВыгрузитьКолонку("Ссылка");
ПланыОбмена.УдалитьРегистрациюИзменений(Узлы, Метаданные.РегистрыСведений.ДатыЗапретаИзменения);
КонецПроцедуры
Показать
(8) kitaevay,
Стесняюсь спросить, какие объекты вы имели ввиду под
Тестирование и исправление - это очень стрёмная идея в принципе. Эта штука сработает по всем объектам, в том числе может и где то там, где не стоило бы.
- ТИИ, вообще то, штатный инструмент, а не стрёмная идея, и при правильном использовании даёт правильный результат. Как минимум проверить результат на копии предварительно можно всегда.
Стесняюсь спросить, какие объекты вы имели ввиду под
и где то там, где не стоило бы.
.?
Кто может помочь?
У нас есть центральная база и риб по магазину. При их обмене центральная база ругается:
Ошибка при чтении изменений при обмене РИБ: Ошибка при вызове метода контекста (ПрочитатьИзменения): Запись не верна! Не совпадает активность записей (Регистр накопления: Товары на складах; Номер строки: 2)
Чтение данных из файла обмена завершено с ошибками!
и больше не загружает документы с перефирийной базы.
Кто может нам помочь убрать эту ошибку?
У нас есть центральная база и риб по магазину. При их обмене центральная база ругается:
Ошибка при чтении изменений при обмене РИБ: Ошибка при вызове метода контекста (ПрочитатьИзменения): Запись не верна! Не совпадает активность записей (Регистр накопления: Товары на складах; Номер строки: 2)
Чтение данных из файла обмена завершено с ошибками!
и больше не загружает документы с перефирийной базы.
Кто может нам помочь убрать эту ошибку?
Если проблема актуальна.
Запросом вытягиваем все "битые" ссылки, и потом по одному вырезаем.
Запросом вытягиваем все "битые" ссылки, и потом по одному вырезаем.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ТоварыНаСкладахОбороты.Регистратор,
|ИЗ
| РегистрНакопления.ТоварыНаСкладах.Обороты(, , Регистратор, ) КАК ТоварыНаСкладахОбороты
|ГДЕ
| ТоварыНаСкладахОбороты.Регистратор.Ссылка Есть null";
Результат = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = Результат.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Набор = РегистрыНакопления.ТоварыНаСкладах.СоздатьНаборЗаписей();
Набор.Отбор.Регистратор.Установить(ВыборкаДетальныеЗаписи.Регистратор);
Набор.Записать();
ОбработкаПрерыванияПользователя();
КонецЦикла;
Показать
(11)
Спасибо помогло,
ОбработкаПрерыванияПользователя() правда не понял, для чего тут.
Набор = РегистрыНакопления.ТоварыНаСкладах.СоздатьНаборЗаписей(); Набор.Отбор.Регистратор.Установить(ВыборкаДетальныеЗаписи.Регистратор); Набор.Записать(); ОбработкаПрерыванияПользователя();
Спасибо помогло,
ОбработкаПрерыванияПользователя() правда не понял, для чего тут.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот