Менеджер записи не может быть использован для регистра с режимом записи подчинение регистратору 1c
Метод можно использовать только для регистров, у которых Режим записи установлен Независимый. Вообще, строго говоря, метод СоздатьМенеджерЗаписи() обычно используется для записи новой строки в регистр или для удаления существующей строки.
Для редактирования регистра лучше использовать метод СоздатьНаборЗаписи().
Однако, можно и с помощью метода СоздатьНаборЗаписи():
Еще один пример несколько нестандартного использования метода СоздатьМенеджерЗаписи():
— при этом, как видно из этой процедуры, запись передается в обработку «РедактированиеКонтактнойИнформации», где дальше и редактируется (интерактивно):
12 thoughts on “ Как в 1С v8 изменить запись регистра сведений с помощью метода СоздатьМенеджерЗаписи (1С: v8: Программисту: Язык программирования: Регистр сведений) ”
Используя ваш пример, пытаюсь спозиционироваться на одной записи регистра и изменить один ресурс. Но почему-то не получается. В отладчике МенеджерЗаписи.Выбран() все время равно Ложь, Хотя в регистре сведений ОСОЛицевыеСчета, есть запись с измерением Объект равным Спр.Ссылка. В регистре одно измерение Объект и несколько ресурсов, в том числе СОТипПлиты. Помогите пожалуйста разобраться почему так происходит? Вот то, что я написала:
МенеджерЗаписи=РегистрыСведений.ОСОЛицевыеСчета.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Объект= Спр.Ссылка;
МенеджерЗаписи.Прочитать();
Если МенеджерЗаписи.Выбран() Тогда
МенеджерЗаписи.СОТипПлиты=ТипПлиты; Иначе
Сообщить(«Возникла проблема определения записи по лиц счету» +Спр+ » в регистре ОСОЛицевыесчета»);
КонецЕсли;
МенеджерЗаписи.Записать();
Марина, добрый день!
Уточните, пожалуйста, сколько у вашего регистра измерений?
Команда МенеджерЗаписи.Объект= Спр.Ссылка; — это определение позиции по одному измерению, т.е. у вашего регистра «ОСОЛицевыеСчета» одно измерение — «Объект»?
Если больше, то для каждого нужно задать значение аналогичной командой (через точку с запятой)
У регистра одно измерение — Объект(тип -СправочникСсылка.ЛицевыеСчета)
Спр = Справочники.ЛицевыеСчета.Выбрать();
Пока Спр.Следующий() Цикл
—-тут то, что я писала выше—-
КонецЦикла
Пока идей нет, почему так происходит. Есть возможность выслать базу? Какой объем у базы?
С удовольствием попробую помочь. Интересно разобраться в проблеме.
Если нужно поменять одну запись в регистре сведений то лучше воспользоваться НаборомЗаписей.
работать будет быстрее, особенно на больших объемах данных.
Наверное, уже никого здесь нет, но точно такая же проблема:
У регистра одно измерение-Документ(Ссылка на документ) и на запись не становится, хотя она в регистре очевидно есть. Выбран() — стабильно = Ложь, хотя метод ПолучитьПоследнее прекрасно работает, но по нему я не могу узнать, каково же точное значение Периода. Какова же истина?
Александр, ваш регистр сведений подчинен регистратору? И не периодический ли регистр?
жаль, что такой удобный метод работает только с регистрами сведений с установленным параметром «Независимый»
Добавить комментарий Отменить ответ
Еще в этой же категории
Как изменить запись регистра сведений? 36
НаборЗаписей = РегистрыСведений.НумерацияДоговоров.СоздатьНаборЗаписей(); НаборЗаписей.Отбор.Период.Установить(НачалоГода(Дата)); НаборЗаписей.Отбор.Организация.Установить(Организация); НаборЗаписей.Прочитать(); Если НаборЗаписей.Количество Как добавить запись в периодический независимый регистр сведений? 16
// Добавление записей в периодический независимый регистр сведений НаборЗаписей = РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей(); НаборЗаписей.Отбор.Валюта.Установить(ТекущаяВалюта); НаборЗаписей.Отбор.Период.Установить(ТекущаяДата); НовЗапис Как добавить записи в непериодический независимый регистр сведений? 13
НаборЗаписей = РегистрыСведений.ЗначенияСвойств.СоздатьНаборЗаписей(); НаборЗаписей.Отбор.Номенклатура.Установить(ТекущаяНоменклатура); НаборЗаписей.Отбор.Свойство.Установить(ТекущееСвойство); НоваяЗапись = НаборЗаписей.Добавить(); НоваяЗапи Как добавить записи в независимый регистр сведений? 11
Для добавления отдельной записи в регистр сведений, не подчиненный регистратору, можно использовать объект РегистрСведенийМенеджерЗаписи. имя . Например, для того, чтобы в независимый регистр сведений ЗначенияСвойствОбъектов с измерениями Объект, Открыть запись регистра сведений по ключу. 10
// Создание структуры значений СтруктураФормы = Новый Структура; СтруктураФормы.Вставить(" Пользователь" , Пользователь); СтруктураФормы.Вставить(" Настройка" , Элемент.ТекущаяСтрока); // Почему-то нужно создавать запись через массив (по друго Посмотреть все в категории Регистры сведений
Какие измерения в регистре?
Ну и еще должно быть Движение.Записать(Ложь), чтобы не замещались предыдущие записи
что то я не понял. Сделал Движение.Записать(Ложь); и добавил в Процедура ПриЗаписи(Отказ) выдает ошибку что запись с такими полями уже существует и не сохраняет
Изменения Реквизита Статус. По задумки статус может постоянной менять, при изменении статуса создается новый регистр с новой датой
Вам нужно еще одно измерение, скорее всего ДатаСтатуса
Не новый регистр, а новая запись регистра
В регистре не может быть две записи с одинаковыми измерениями
я создал новое измерение ДатаСтатуса
Вот я добавил в процедуру
Когда я меняю статус, создает регистр Номер строки 2, где меняется Дата статуса, а сам статус принимает одинаковое значение в Номере строки 1 и 2, по задумки Статус должен быть разный.
Выдает ошибку: Ошибка при вызове метода контекста (Записать)
Движение.Записать(Ложь);
по причине:
Запись с такими ключевыми полями существует! : СтатусЗаявокЕдиноеОкно: 12.10.2015 0:00:00, Заявка единое окно 000000003 от 12.10.2015 0:00:00, 12.10.2015 0:00:00, Заявка единое окно 000000003 от 12.10.2015 0:00:00, 102 100 012, Ремонт плиты, фыфафа, 12.10.2015 0:00:00 (Регистр сведений: Статус заявок единое окно; Номер строки: 3)
Вы отладчиком посмотрите, в какой момент статус меняется
А период разный почему у записей? Может его нужно как дата документа устанавливать, а не тек дата?
Период исправил на дату документа, почему больше двух не создается?
Больше двух чего? и в какой момент?
На счет почему меняется Статус во всех записях регистра мне не понятно, может что то не так я в коде сделал
и второй код когда я записываю в регистр сведений
Больше двух записей в регистре сведений не создается, а задумка должна создаваться запись в регистре сведений при изменении статуса, тем самым записей может быть около 5
Статус добавлен в регистр сведений в Ресурсы, может я тут что то не правильно сделал?
Да с ресурсом это нормально.
Уберите из обработки проведения код для этого регистра
Убрал код из обработки проведения, но новую запись по прежнему не создает, теперь переписывает существующую запись.
Я исправил на Движение.Записать(Ложь);, и все равно переписывает.
Убрав код обработки проведения при создании нового документа не записывает в регистр
Скрин сделайте развернутого регистра
Так вроде все норм
Только лишние данные: заявка - это регистратор, ДатаЗаявки - это период, можно убрать лишние измерения
Вы ПриЗаписи проследите отладчиком, что с набором записей происходит, чего гадать-то.
Начиная от Прочитать - что в него попало, потом добавили - каким стал набор, потом записался - еще раз шифтф9 нажмите, там же будет видно
Либо у вас еще где-то регистр пишется - может у регистра в модуле менеджера или подписки на события, вариантов еще тьма, на самом деле
Я так понимаю код у меня правильный для создания новой записи регистра при изменении Статуса?
Я так понимаю чтобы мой код работал нужно Записать(Ложь);
У вас все там правильно, и с истиной должно все работать, потому что вы добавляете запись к набору
я решил по пробовать другим способом, я сделал регистр Независимым, создал форму в нем. Прописал код при изменении Статус
Когда изменяю статус создается новая запись в регистре, когда сохраняю регистр, то все созданные ранее записи переписывают значение Статуса на последнее, как запретить переписывать значение у ранее созданных записей?
Давай cf, так хз
Тот, где еще набор записей был
В обработке проведения у вас там пипец просто. я ж вам говорю, уберите все из нее, что касается регистра
Вы там чего сделать пытаетесь? При записи в форме у вас уже пишется этот регистр, причем независимый. какие там могут быть еще движения?
Я же писал выше что переделал регистр сведений. В документе я наворотил спору нет. Подскажите как правильно сделать
Убирайте из обработки проведения все, в форме пусть пишется ПриЗаписи, там же все правильно сделано
Убрал все из обработки проведения, документ создает при помощи обработки. Теперь когда создаю документ в регистр запись не создается.
Не создает новые записи а переписывает существующую
Нужно вернуть подчинение регистратору для РС
В модуле формы все убрать - оставить только это (записи будут при каждом изменении статуса документа)
В модуле объекта все проверьте, чтобы этот регистр нигде не упоминался
Сделал как написали. При создании документа в РС запись не создалась, при изменении статуса создается запись в РС, когда сохраняю документ запись в РС удаляется.
Процедура ПриЗаписи в модуле объекта, пишется там регистр?
Процедура ОбработкаПроведения, пишется там регистр?
Вам зачем при записи документа в регистр писать? вы при изменении статуса все пишете
А при создании какой у него статус должен быть? в этом случае можно проверить, при изменении, если набор записей пустой, тогда добавить первую запись в набор с нужным вам статусом для нового документа
Ну или при открытии формы, если ЭтоНовый, вызовите процедуру при изменении
Процедура ПриЗаписи в модуле объекта, пишется там регистр? НЕТ, ВСЕ УДАЛИЛ
Процедура ОбработкаПроведения, пишется там регистр? ННЕТ, ВСЕ УДАЛИЛ
ПриЗаписи в форме?
Что то я запутался. Почему он не создает при каждом изменении статуса новую запись в РС
ПриЗаписи в форме ВСЕ УДАЛИЛ
Свойство документа "Удаление движений" поставьте - "Не удалять"
Это где находится Свойство документа "Удаление движений"
Встаете на документе в дереве конфигурации и Alt+Enter
Я как сделать теперь чтобы при создании документа появлялась запись, а то процедура обработка проведения на данный РС нет кода
При создании она не появится, нужно записывать документ сначала, чтобы ссылка у регистратора была
Можно поставить проверку при изменении статуса - если это новый - тогда отказ - уведомить пользователя и попросить записать документ
Когда он записан, при изменении статуса ссылка уже есть, и проверить: если набор записей пустой, тогда писать запись со статусом из Ссылка.Статус, а потом уже тот код выполняется, который есть, т.е. просто добавляется запись в набор
Можете показать на примере как уведомить пользователя и попросить записать документ
Но не работает, почему?
Движения без регистра вы не запишете, а вы как раз и пытаетесь это сделать, пока документ новый, у него нет ссылки и соответственно нет регистратора
Из обработки проведения убирайте это все дело
Вот эту строку после условия нужно поставить, это тот код, который и был у вас уже
Остальнгое, также как и для других записей
Это получается не корректно, так как Дата статуса будет одинакова, что у Открытого что у Выполненного статуса, а мне надо отследить дату открытого статуса и дату когда выполнился статус
Ну сделайте переменную в модуле, которая запомнит момент создания документа
Дак у меня переменная дата статуса, и что вы имеете ввиду.
Как мне эту переменную запись в регистр, мне что то не понятно чем отличается переменная от даты статуса?
Переменных может быть очень много. Вот что я имел ввиду:
В форме событие, например, перед открытием:
Потом, в том месте при изменении статуса в условии, где проверили на количество записей в РС, вам нужно у добавленной записи ДатаСтатуса = ДатаСозданияДокумента, а не ТекДата
Спасибо большое! Все получилось
При тестировании появились вопросы, подскажите как быть, сейчас при изменении Статуса в каждый раз добавляется РС, но это не правильно, в РС должен добавляться запись если изменили Статус и сохранили или записали документ. Вот мне не понятно как это сделать. Я сделал в процедуре ОбработкаПроведения
Код 1C v 8.х Код 1C v 8.х
Но тут не проверяется изменился статус или нет, постоянно создает запись если сохранять документ а мне надо если статус изменился и сохранил документ то создалась запись в РС
Нужно сравнить Статус и Ссылка.Статус
А как это сделать, можете подсказать начала а дальше я сам
Начало уже давно у вас есть. тут вопрос в конце
Зачем вот это: Если Движение.Количество() > 0 Тогда ?
Вы теперь только в обработке проведения пишете? или также при изменении? Что происходит с регистром сейчас при проведении? Сохраняется история изменения статусов или нет?
А условие будет Если Статус <> Ссылка.Статус Тогда Делаете запись в регистр КонецЕсли
Сейчас история сохраняется при каждом сохранении документа и если документ новый то сохраняет с ДатаСозданияДок
Мне не понятно как сделать если я изменяю Статус и сохраняю документ то появляется новая запись в РС
А при изменении не появляется?
Я отключил при изменении статуса, так как при каждом изменении статуса создается новая запись в РС хотя документ еще не сохранен, вот такой код бы
Но мне нужно код статус изменили и сохранили документ, после этого появилась запись в РС, а не при каждом изменении статуса как сейчас
Тогда этот код нужно поместить при записи, и перед началом этого кода добавить условие Если Статус <> Ссылка.Статус Тогда
Вообще не создает новую запись в РС при изменении статуса
В отладчике посмотрел это условие Статус <> Ссылка.Статус не срабатывает
А вы меняете статус?
да, конечно меняю
Статус и Ссылка.Статус принимает одинаковое значение
Ссори. перед записью, в при записи они уже совпадают, т.к. запись уже состоялась
Спасибо большое! Работает
Пытаюсь сохранить значения табличного поля в РС, т.е если в ТП 2 строки с данными то в РС будет 2 записи, но у меня почему то записывает только первую строку, хотя стоит цикл, что не так
Первую только и будет, у вас условие на кол-во записей, добавляется запись только тогда, когда набор пустой.
Условие уберите или измените
Спасибо, все получилось!
Пишу условие такое, при изменении статуса в ТЧ на Отменено или Выполнено после чего статус документа принимает значение Выполнено. Сейчас я меняю статус в любой строке ТЧ сразу же меняется статус документа, но это не правильно
Не понимаю, что вам нужно.
Если неправильно, значит по-другому делайте
Не понятно почему статус документа меняется сразу же после изменения статус в одной из строки табличной части , нужно чтобы в табличной части изменил статус во всех строчках после чего изменился статус в документа
Потому что обработчик ТабОтветственныхСтатусПриИзменении на строке висит, вот и меняется
У вас цикл проверяет, если хотя бы для одной строки условие выполняется, тогда изменить статус документа
Если так нужно, тогда после изменения статуса в строке, нужно проверить, скорее всего на равенство его статусам в остальных строках и тогда уже менять статус документа
Можете на примере показать
Предлагаю статус документа и историю статусов хранить отдельно. Статус для списков, а историю, если понадобится для отчетов по срокам исполнения. У документа в конкретный момент времени может быть только один статус. Когда документов станет очень много, система офигеет перебирать по всей истории последнее значение.Вероятно, статус документа может поменять некий другой документ (например, регистрирующий факт исполнения заявки). В связи с этим регистратор не равно заявка.Измерения не ссылочного типа - зло, крадущее поля для индекса виртуальной таблицы. По этому дата смены статуса - период. И больше ни каких дат не надо.
Спасибо большое, все получилось
НЕ могу понять что случилось, почему не работает условие. Не записывает в РС когда добавляем новую строку в ТЧ ТабОтветственных
Похожие FAQ
К вопросу об оптимизации запросов v8 с использованием виртуальных таблиц (1С: v8: Язык запросов)
Вопрос Можно ли в запросах 1С v8 всегда заменять условие «ГДЕ» параметрами среза виртуальной таблицы? Ответ Часто встречающаяся рекомендация по выполнению опимизации запросов: переносить условие из конструкции ГДЕ в параметры виртуальной таблицы. Однако без понимания, как это работает, легко совершить ошибку.
Пробовал убирать с движения у Выселения. толку 0.
Но с Движения снимать Нельзя . Оно должно быть!
надо заполнить регистр сведений при проведении документа? почему не сделать это через конструктор движения в бланке документа?
Так считывается набор записей из регистра с подчинением регистратору:
ПС = РегистрыСведений.ПериодСнятия.СоздатьНаборЗаписей();
ПС.Отбор.Регистратор.Установить(ДокЗасел);
ПС.Прочитать();
А вообще, если это всё нужно для проведения из самого документа, то делать это нужно из обработчика проведения:
ПС.Комната = МестоРазмещения;
ПС.ДатаСнятия = ДатаПоселения;
ПС.ДатаВысела = ДатаВыселения;
ПС.Клиент=ВыбранныйКлиент;
я говорил о том же :-) (только сохраните где-нибудь старый текст обработчика - через конструктор текст затирается и генерируется новый текст обработки проведения
Надо в выселении не СОздавать Новую запись в Регистре сведений Период!
А НАДО ИЗМЕНИТЬ ЗАЩИЩЕННУЮ ЗАПИСЬ!
ПС = РегистрыСведений.ПериодСнятия.СоздатьНаборЗаписей();
ПС.Отбор.Регистратор.Установить(ДокЗасел);
ПС.Прочитать();
ПС.Удалить(0);
НС=ПС.Добавить();
НС.Регистратор=ДокЗасел;
НС.Комната = МестоРазмещения;
НС.ДатаСнятия = ДатаПоселения;
НС.ДатаВысела = ДатаВыселения;
НС.Клиент=ВыбранныйКлиент.Ссылка;
ПС.Записать(Истина);
вопрос можно? у тебя игорь происходит "необратимое искажение данных" что сурово карается 1С. вот скажи, а если пользователь ошибся да и провел / выселил не того. потом сказал МЛЯ и ОТМЕНИЛ проведение выселения. как будешь восстанавливать похеренную запись?
Мне кажется, что тут ошибка при разработке регистра.
Должно быть, наверное, так:
Регистр сведений "ПериодСнятия" - периодический - подчинение регистратору
Измерения:
Клиент
Комната
Ресурсы:
Состояние
Тогда движения документов будут так:
В Заселении
Но в "Выселение" желательно вначале проверить был ли заселен "Клиент" в "Комната" перед изменением "Состояние".
А так, коллеги правильно пишут: в данном случае надо использовать (10).
Посмотри как устроен РС "СостояниеРаботниковОрганизаций" в типовом решении "Зарплата и управление персоналом".
Доброго.
Удаление из подчиненного периодического регистра сведений. Помогите оптимизировать код.
Есть регистр сведений Хранилище акцизных марок.
Периодичность - По позиции регистратора.
Режим записи - Подчинение регистратору.
Измерение Марка, строка длина 160 символов, пишется туда типа такого
170300181766771018001JY3BOHGSSEHPTLU7N57B333G5QDVUZJPLXC3C57ID4X3K2SGV3BTPM5C7TISRHULGNEJ6XXDCIVKH6B6JIIPREFYDXJLMGAMYDT64AZK42ANKLL2MBSQSTSOJBHSDVOWA .
В ресурсах есть ОтметкаВыбытия – тип булево.
Остальные ресурсы в данном вопросе не важны.
У нас в основном в этом регистре одна марка может быть в двух записях.
Если производство, то это два регистратора отчет производства за смену типа ставит на баланс и ТТН где уставлен признак выбывшие.
Если мы купили и продали это два регистратора это Акт к ТТН и ТТН где уставлен признак выбывшие.
Нескорые марки могут туда - сюда кататься, будет несколько записей, главная запись последняя, по ней надо смотреть ОтметкаВыбытия.
На текущий момент в регистре 38 миллионов записей.
Задача зачистить выбывшие марки, оставив данные только за последние полгода.
Пока сделал так. За 12 часов в среднем удаляется полмиллиона записей.
Помогите оптимизировать код. Пока только в голову приходит запустить на нескольких компах с разным диапазоном дат.
Процедура Кнопка1Нажатие(Элемент)
//Удаление записей из регистра, подчиненного регистратору
Сообщить("Начало запроса - " + ТекущаяДата());
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ
| алкХранилищеАкцизныхМарокСрезПоследних.Марка
|ПОМЕСТИТЬ Марки
|ИЗ
| РегистрСведений.алкХранилищеАкцизныхМарок.СрезПоследних(, ) КАК алкХранилищеАкцизныхМарокСрезПоследних
|ГДЕ
| алкХранилищеАкцизныхМарокСрезПоследних.ОтметкаВыбытия = ИСТИНА
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| алкХранилищеАкцизныхМарок.Регистратор КАК Регистратор,
| алкХранилищеАкцизныхМарок.Марка КАК Марка
|ИЗ
| РегистрСведений.алкХранилищеАкцизныхМарок КАК алкХранилищеАкцизныхМарок
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Марки КАК Марки
| ПО алкХранилищеАкцизныхМарок.Марка = Марки.Марка
|ГДЕ
| алкХранилищеАкцизныхМарок.Период МЕЖДУ ДАТАВРЕМЯ(2018, 1, 1, 0, 0 , 1) И ДАТАВРЕМЯ(2020, 6, 1, 0, 0, 1)
|ИТОГИ ПО
| Регистратор";
СчетчикДоки = 0;
СчетчикМарки = 0;
ВыборкаРегистратор = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Сообщить("Окончание запроса - " + ТекущаяДата());
Пока ВыборкаРегистратор.Следующий() Цикл
НаборЗаписей = РегистрыСведений.алкХранилищеАкцизныхМарок.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(ВыборкаРегистратор.Регистратор);
НаборЗаписей.Прочитать();
сзУдаляемыеЗаписи = Новый СписокЗначений;
ВыборкаДетальныеЗаписи = ВыборкаРегистратор.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Для Каждого Запись Из НаборЗаписей Цикл
Если Запись.Марка = ВыборкаДетальныеЗаписи.Марка Тогда
сзУдаляемыеЗаписи.Добавить(Запись);
СчетчикМарки = СчетчикМарки + 1;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Для Каждого ЭлтСз Из сзУдаляемыеЗаписи Цикл
НаборЗаписей.Удалить(ЭлтСз.Значение);
КонецЦикла;
НаборЗаписей.Записать();
СчетчикДоки = СчетчикДоки + 1;
//Если СчетчикДоки = 100 Тогда
// Прервать;
//КонецЕсли;
Если ТекущаяДата() > Дата(2021, 02, 03, 08, 30 , 00) Тогда
Прервать;
КонецЕсли;
Сообщить("Окончание обработки - " + ТекущаяДата());
Сообщить("СчетчикДоки - " + СчетчикДоки);
Сообщить("СчетчикМарки - " + СчетчикМарки);
КонецПроцедуры
Сам запрос выполняется 20 минут.
Вот для примера последний запуск.
Начало запроса - 02.02.2021 23:10:58
Окончание запроса - 02.02.2021 23:38:54
Окончание обработки - 03.02.2021 8:31:04
СчетчикДоки - 167
СчетчикМарки - 373 695
Если регистр сведений подчинен регистратору, то для добавления записей в него необходимо создать набор записей этого регистра с установленным отбором по нужному регистратору, заполнить этот набор записей и записать его:
Код 1C v 8.х
По умолчанию запись выполняется с замещением, т. е. существующие записи этого регистратора в регистре сведений будут удалены.
Для того чтобы добавить записи к существующим записям регистратора, необходимо указывать значение Ложь параметра метода Записать() набора записей. При этом необходимо позаботиться о том, чтобы значения измерений добавляемых записей были уникальны для записей данного регистратора в регистре сведений, иначе запись выполнена не будет:
Код 1C v 8.х
admin
Next Post
Читайте также: