Строки в регистре создаются не сами, а через другие объекты документы или обработки. Причем две полностью одинаковые строки по принципу работы регистров не могут быть созданы с одинаковыми измерениями. Но в УПП измерения километровые, если например одно из измерений это ссылка на разные документы. Каким образом понять в чем отличие в двойных строках (измерениях) и какую из них нужно удалить. И можно ли удалять? Как определить какая из них рабочая, какая нет? Разработка ведется разными программистами и в разное время и понять причинно следственную связь бывает трудно. Как можно поступить в данной ситуации более универсально? Пометить на удаление каждую попеременно и посмотреть какая из них будет работать или так может не получиться в рабочей базе? Как бы не порушить что нибудь? Или просить у администратора развернуть архив и на копии проверить/потыкать?
(1) Пробовать все на копии, обязательно. Если в РС записи делает документ, то трогать эти записи нельзя. Есть служебные РС в них можно менять/удалять записи обдумано. Записи в РС нельзя пометить на удаление они сразу удаляются.
Вот нашелся добрый человек и написал код, как изменить запись в регистре и удалить, это я.
Процедура МенеджерЗаписиВРегистрНажатие(Элемент)
НаборПлан=РегистрыСведений.Поооооооооооооо.СоздатьНаборЗаписей();
НаборПлан.Отбор.Заооооооооо.Установить(Зооооооооо);
Если ЗначениеЗаполнено(Маоооо) Тогда
НаборПлан.Отбор.Мооооо.Установить(Мооооо);
КонецЕсли;
Если Ноооооо>0 Тогда
НаборПлан.Отбор.НомерВОчереди.Установить(Нооооооо);
КонецЕсли;
НаборПлан.Прочитать();
Для каждого ЗаписьНабора Из НаборПлан Цикл
Запись=РегистрыСведений.Поооооооооооо.СоздатьМенеджерЗаписи();
ЗаполнитьЗначенияСвойств(Запись,ЗаписьНабора);
Если СнятьАктивность Тогда
Запись.Активность=Ложь;
КонецЕсли;
Если Нооооооо>0 Тогда
Запись.Ноооооооооо=Ноооооо;
КонецЕсли;
Запись.Записать();
КонецЦикла;
НаборПлан.Очистить();
НаборПлан.Записать();
КонецПроцедуры
(1) Пробовать все на копии, обязательно. Если в РС записи делает документ, то трогать эти записи нельзя. Есть служебные РС в них можно менять/удалять записи обдумано. Записи в РС нельзя пометить на удаление они сразу удаляются.
(2) Спасибо Рустам за помощь! Да пометить на удаление нельзя, но можно сделать не активными, это в ручную можно сделать? Регистр заполняется из обработки планирования, видимо попали разные измерения. У двух одинаковых строк могут быть разные ключи записи? (правда не очень пока понимаю, что такое ключи записи регистров)
(6)Смотрю иногда курсы Павла Белоусова по платформе, там говорится, что измерение бывает одно например номенклатура и период (регистратор) и для детализации возможно еще какое-то измерение, а тут в регистрах в упп порядка 10 измерений, причем регистратор например ЗаказНаПроизводство, у которого своих[ реквизитов около 30 и ТЧ около 5. Ресурсов тоже около 5 и более и еще реквизитов более 30. Как в таком случае определить в чем отличие в двух "одинаковых" строках регистра, которые "задвоились", они же не могут задвоиться по определению.
Но в УПП измерения километровые, если например одно из измерений это ссылка на разные документы.
так они задвоились или нет?
Каким образом понять в чем отличие в двойных строках (измерениях)
Напишите обработку по сравнению строк, если вручную затрудняетесь.
А что вообще не устраивает? РС типовой? Пишут типовые документы? Тогда не делайте ничего, если проблем нет.
Первое - привести в порядок мысли и получить ответ хотя бы на один из поставленных вопросов.
Пока ваши задачи похожи на взбесившиеся приборы самолета, который попал в аномальную зону.
Я предлагаю делегировать миссию решения ваших задач Рен-Тв. Пишите туда.
Вряд ли Вам кто-то ответит на эти вопросы. Но если пишут несколько программистов, возможно есть какое-то техническое задание, где написано, что документы должны делать движения по этому регистру. Наверняка это техническое задание писал аналитик, у него и спросить, верно ли делаются движения. Если не верно, то понять какой документ делает не верно движение и кто писал этот код, и попросить исправить код и перепровести документы по этому регистру.
А вообще в коде желательно всегда писать комментарии, зачем этот код написан, кем этот код написан и когда.
(4)в том то и дело не кого спросить, кто в командировке, кто в отпуске, вот решил к специалистам обратиться.
И кстати мне на вопрос уже ответили во (2) ответе, возможно пока этого достаточно для решения задачи.
Или лучше все изменения в регистре делать менеджером регистра например из внешней обработки, нашел вот такой пример кода.
//Выберем всех регистраторов регистра
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ
| УчетНоменклатуры.Регистратор
|ИЗ
| РегистрНакопления.УчетНоменклатуры КАК УчетНоменклатуры";
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
//Обойдем регистраторов
Пока Выборка.Следующий() Цикл
Сообщить("Изменение записей по регистратору: " + Выборка.Регистратор);
//Для каждого регистратора выполним изменение набора записей
НаборЗаписей = РегистрыНакопления.УчетНоменклатуры.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Значение = Выборка.Регистратор;
НаборЗаписей.Прочитать();
Для каждого Запись Из НаборЗаписей Цикл
Запись.Реквизит1 = "Тест";
КонецЦикла;
НаборЗаписей.Записать();
КонецЦикла;
Показать
Для регистра сведений эта методика/способ тоже подойдет?
Мне в набор наверно нужно будет добавить еще одну строку
(13) ну да наверно лучше менеджером, хотя вот пример с сайта 1С можно без всякого менеджера видимо
...
НаборЗаписей = РегистрыНакопления.УчетНоменклатуры.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Значение = Выборка.Регистратор;
НаборЗаписей.Прочитать();
Для каждого Запись Из НаборЗаписей Цикл
Запись.Реквизит1 = "Тест";
КонецЦикла;
НаборЗаписей.Записать();
...
...
Запись=РегистрыСведений.Поооооооооооооооо.СоздатьМенеджерЗаписи();
ЗаполнитьЗначенияСвойств(Запись,ЗаписьНабора);
Если СнятьАктивность Тогда
Запись.Активность=Ложь;
КонецЕсли;
Если НомерВОчередиДляЗамены>0 Тогда
Запись.Номер=НомерЗамены;
КонецЕсли;
Запись.Записать();
...
Показать
уже часть обработки написал по замене все работает, осталось еще дописать по удалению через менеджер тоже, так надежнее
Ну, поздравляю вас, вы познакомились с 1С-тупизмом в терминологии.
"СоздатьМенеджерЗаписи()" - изменяет ОДНУ, и только одну запись. И то в независимых РС.
"СоздатьНаборЗаписей()" - тот же менеджер, только для набора из более чем одной записи. И применяется везде, где более одной записи. А также - строго во всех подчиненных РС, без разницы сколько в нем записей.
А все отчего? А от отсутствия понимания, что такое "ООП", и острого нежелания "видеть" его слабенькие отблески в своей поделке, отчего и избегают даже говорить об ООП, не говоря уже - внедрить его в 1С наконец полностью и к всеобщему удовлетворению (ну, за исключением ортодоксальных 1С-ников, им вообще ничего не светит).
(17) вот даже писать не хочется, по этой теме только один человек написал по честному (2) без подъездов (ебoв). Остальные просто поиздевались. И так во всех темах, 10% нормальных ответов, остальное все вода, причем грязная. Что это зависть или отсутствие ума не буду судить, могу только пожалеть.
вот даже писать не хочется, по этой теме только один человек написал по честному (2)
Давай разберем, что тебе тут твой "т-ль"? - да нет, просто студент-неуч, написал:
Пробовать все на копии, обязательно. Если в РС записи делает документ, то трогать эти записи нельзя. Есть служебные РС в них можно менять/удалять записи обдумано. Записи в РС нельзя пометить на удаление они сразу удаляются.
"Если в РС записи делает документ, то трогать эти записи нельзя." - в 1с БОЛЬШИНСТВО регистров- подчиненные. Ты вопрос задавал про что - как задвоение убрать в регистре, или так, погулять пришел?
Есть служебные РС в них можно менять/удалять записи обдумано
К служебным регистрам нет доступа на запись/изменение ни у тебя, ни у твоего студента. Их вообще в конфигурации нет. Все остальные регистры - рабочие, и в любом записи нужно удалять обдуманно. Или не лезьть туда со студентом.
"Записи в РС нельзя пометить на удаление они сразу удаляются" - введи поле-ресурс "ПометкаНаУдаление", и будет тебе пометка на удаление. Да, у 1С не предусмотрено это визуально или в виде служебного поля, как в остальных объектах - 1С считает, что тут "сразу голая таблица", без ссылок и прочего "объективизма", поэтому можно и удалять сразу.
Единственно, что верно - "Пробовать все на копии", но это, видимо, заучил. Троечка.
Вот нашелся добрый человек и написал код, как изменить запись в регистре и удалить, это я.
Процедура МенеджерЗаписиВРегистрНажатие(Элемент)
НаборПлан=РегистрыСведений.Поооооооооооооо.СоздатьНаборЗаписей();
НаборПлан.Отбор.Заооооооооо.Установить(Зооооооооо);
Если ЗначениеЗаполнено(Маоооо) Тогда
НаборПлан.Отбор.Мооооо.Установить(Мооооо);
КонецЕсли;
Если Ноооооо>0 Тогда
НаборПлан.Отбор.НомерВОчереди.Установить(Нооооооо);
КонецЕсли;
НаборПлан.Прочитать();
Для каждого ЗаписьНабора Из НаборПлан Цикл
Запись=РегистрыСведений.Поооооооооооо.СоздатьМенеджерЗаписи();
ЗаполнитьЗначенияСвойств(Запись,ЗаписьНабора);
Если СнятьАктивность Тогда
Запись.Активность=Ложь;
КонецЕсли;
Если Нооооооо>0 Тогда
Запись.Ноооооооооо=Ноооооо;
КонецЕсли;
Запись.Записать();
КонецЦикла;
НаборПлан.Очистить();
НаборПлан.Записать();
КонецПроцедуры
(31) этот пользователь, которого вы назвали неучем, а вернее оскорбили, руководит проектами, подозреваю как раз такими как вы). А Пооо и прочее в коде это сокрытие информации, суть видна. Все тему можно закрыть, спасибо всем за косвенную помощь.
(28) ужасная реализация поставленной задачи.
(32) руководители проектов тоже бывают разные, но благо нормальному руководителю проектов и не нужно знать программирование в 1С и учить кого-то писать код.
(33) вас то кто в тему позвал, все уже закрыто, опоздали. Легче всего написать и облить, а доказательства где, только голословные заявления, честно неприятно даже читать (карпик, даже не карп).
(34) я смотрю грубить вы научились, и даже переходите на личности, хотя здесь был прокомментирован именно код-пример. Видать вы "крутой" программист, но только среди своих одноклассников.
1. Вы написали в общедоступном форуме, а не в своем личном бложике, так что где хочу, там и пишу.
2. Чтобы называть код гавном не нужно доказательств, если всем итак ясно. Можно убедиться по ссылке https://www.govnokod.ru/1c , как раз найдете там такие же примеры творчества, как и у вас.
3. Лучше бы потраченное время уделили книжкам по программированию, почитали, что такое менеджер записи и набор записей регистра, а не огрызались. По факту думать не хотим, ждем чтобы разжевали и в рот положили.
4. Есть стандарты разработки 1С https://its.1c.ru/db/v8std , и для кода, что в (28) другого названия и не подобрать, кроме как говнокод.
(35) я не крутой, я начинающий, но хамство тоже не люблю и не вижу смысла в голословных утверждениях и уж тем более когда тема закрыта автором. Извините если обидел не хотел, исправлюсь.
где был код прокомментирован и в чем, что все плохо, так это я и сам знаю что не очень хорошо, хорошо приходит с опытом, а опыта пока нет. И какой смысл в таких комментариях?
это форум, где задаются вопросы, причем конкретные, если вам хочется поговорить не о чем , пишите в личку, я пойму что вам нужно выговориться, понимаю время сейчас нервное, нужно скинуть негативную энергетику
не существует такого понятия ВСЕМ, всем это значит никому, пройдите просто мимо темы, которая не подходит вашему настроению, гениями не рождаются он проходят путь от новичка до специалиста и дальше
вам нужно было всего навсего предложить эту ссылку, а не устраивать спектакль, хотя еще не смотрел, что это за ссылка, вряд ли вы способны дать что то конкретное и полезное.
Может нужно для начала определиться по измерениям, которые способствовали "задвоению".
То-есть запросом на группировку выбрать Количество( Измерение), по которому есть сомнения и если таковая строка найдется в виде 2 штук, то уже предметно с этим документом - измерением ли или еще чем и разбираться.
(36) Да я так и сделал, только записи регистра создаются не документом, а обработкой планирования и действительно попали двойные измерения. Сами измерения испрвлять уже поздно , очень много данных завязано на этот регистр. А вот предупредить такие задвоения конечно имеет смысл на будущее.Пока решил проблему задвоения строк регистра следующим образом, делаю отбор в регистре по определенным параметра и создаю Менеджером новую строку в регистре с правильными параметрами. А все строки в наборе отбора удаляю. И второй режим сделал в обработке, если одна из строк правильная, а вторая неврная копия, то удаляю только эту строку. Аналогичным способом, тоже делаю отбор именно по этой строке и удаляю эту строку в наборе. Другого решения пока не нашел. В чем код плохой не понял. И при чем тут код? Хотелось бы знать мнение специалистов, правильный ли выбран алгоритм решения проблемы?
(43) Можно проверять записи регистра перед записью в регистр в модуле набора записей регистра.
Чисто как пример из рабочего варианта
Процедура ПередЗаписью(Отказ, Замещение)
Набор = ЭтотОбъект;
для каждого ряд из Набор Цикл
ПредыдущееЗначенияЗаписи = ПолучитьПредыдущееЗначениеЗаписи(ряд);
ЕсльДубликаты= ПроверитьДуликаты(ряд);
Если ряд.ДатаОбработки = ПредыдущееЗначенияЗаписи.ДатаОбработки тогда
ряд.ДатаОбработки = ТекущаяДата();
Конецесли;
Если ЕстьДубликаты тогда
ВызватьИсключение "Дубикат записи в измерениях для " + ряд.Документ ;
Конецесли;
конеццикла;
КонецПроцедуры;
функция ПолучитьПредыдущееЗначениеЗаписи(ряд)
Запрос = Новый Запрос;
// тут запрос к данному регистру с параметрами из ряд
//......
КонецФункции;
функция ПроверитьДубликаты(ряд)
Запрос = Новый Запрос;
// тут запрос к данному регистру на проверку дубликатов измерений с параметрами из ряд
//......
КонецФункции;