Как в 1С v8 изменить запись регистра сведений с помощью метода СоздатьМенеджерЗаписи (1С: 8.1: Программисту: Язык программирования: Регистр сведений)

Вопрос Как в 1С v8 спозиционироваться на конкретной записи регистра сведений и изменить ее?
Ответ Метод можно использовать только для регистров, у которых Режим записи установлен Независимый. Вообще, строго говоря, метод СоздатьМенеджерЗаписи() обычно используется для записи новой строки в регистр или для удаления существующей строки.

Для редактирования регистра лучше использовать метод СоздатьНаборЗаписи(). Пример см.:
Как заменить значение ресурса регистра сведений — универсальная процедура

Внимание! Для замены значения измерения регистра лучше использовать универсальную процедуру, пример которой см.:
Как заменить значение измерения регистра сведений и при этом не потерять числовые ресурсы

Также можно посмотреть примеры тут:
Как в регистре сведений изменить значение какого-либо параметра по условию – универсальная процедура
Как добавить запись в регистр сведений.
несколько примеров обработки регистров сведений

Однако, можно и с помощью метода СоздатьНаборЗаписи():

// создаем менеджер записи
МенеджерЗаписи = РегистрыСведений.усШтрихКодыТоваров.СоздатьМенеджерЗаписи();

// указываем параметр, по которому определяем, где будем позиционираваться (если одно измерение)
МенеджерЗаписи.ШтрихКод = Выборка.ШтрихКод;
// либо //	ЗаполнитьЗначенияСвойств(МенеджерЗаписи, Выборка); // если много измерений
//для периодических регистров нужно указать точное значение периода, на который введена запись регистра:
МенеджерЗаписи.Период = Выборка.ДатаЗаписи;

// прочитаем эту запись (внимание, эта команда обязательна, иначе можно ненароком очистить весь регистр!)
МенеджерЗаписи.Прочитать();

Если МенеджерЗаписи.Выбран() Тогда // убедились, что спозиционироваться удалось
	// сообщаем, что именно и на какое значение нужно изменить в регистре
	МенеджерЗаписи.ПартияТовара = ПартияТовара;

	// записываем изменения в регистре
	МенеджерЗаписи.Записать();

Иначе // спозиционироваться не удалось, можно выходить
	Сообщить("Возникла проблема определения штрихкода в регистре через менеджер записи "+Выборка.ШтрихКод);
КонецЕсли;

В случае попытки использовать этот метод для регистра с методом записи «Подчинен регистратору», при попытке выполнения команды: РегистрыСведений.ИмяРегистра.СоздатьМенеджерЗаписи();  будет появляться сообщение об ошибке «Ошибка при вызове метода контекста (СоздатьМенеджерЗаписи): Менеджер записи не может быть использован для регистра с режимом записи «Подчинение регистратору»»

Еще один пример несколько нестандартного использования метода СоздатьМенеджерЗаписи():

Процедура РегистрСведенийСписокПередНачаломИзменения(Элемент, Отказ)
	Отказ = Истина;
	МенеджерЗаписи = РегистрыСведений.КонтактнаяИнформация.СоздатьМенеджерЗаписи();
	Для каждого Измерение Из Метаданные.РегистрыСведений.КонтактнаяИнформация.Измерения Цикл
		МенеджерЗаписи[Измерение.Имя] = Элемент.ТекущиеДанные[Измерение.Имя];
	КонецЦикла;
	МенеджерЗаписи.Прочитать();
	Обработки.РедактированиеКонтактнойИнформации.Создать().РедактироватьЗапись(МенеджерЗаписи, Истина);
КонецПроцедуры

— при этом, как видно из этой процедуры, запись передается в обработку «РедактированиеКонтактнойИнформации», где дальше и редактируется (интерактивно):

// Процедура инициирует редактирование записи.
//
// Параметры:
//  СтруктураЗаписи - Структура, НаборЗаписейРегистраСведений, МенеджерЗаписи, ЗаписьНабораЗаписей
//                    Данные для редактирования
//  Записывать      - Булево, Записывать данные в ИД при окончании редактирования
//  ФормаВладелец   - Форма, откуда вызывается редактирование
//  СтруктураПредустановленныхЗначений - Структура, данные для заполнения формы по умолчанию,
//                    могут отличаться от редактируемых, например, при копировании
//
Процедура РедактироватьЗапись(СтруктураЗаписи = Неопределено, Записывать = Ложь, ФормаВладелец = Неопределено, СтруктураПредустановленныхЗначений = Неопределено) Экспорт
	ЗаписыватьВРегистр = Записывать;
	мФормаВладелец = ФормаВладелец;
	Если ТипЗнч(СтруктураЗаписи) = Тип("РегистрСведенийЗапись.КонтактнаяИнформация")
	 ИЛИ ТипЗнч(СтруктураЗаписи) = Тип("РегистрСведенийМенеджерЗаписи.КонтактнаяИнформация") Тогда
		мРедактируемаяЗапись = СтруктураЗаписи;
		ЛокальнаяСтруктураЗаписи = УправлениеКонтактнойИнформацией.ПолучитьСтруктуруЗаписиРегистра(СтруктураЗаписи);
	ИначеЕсли ТипЗнч(СтруктураЗаписи) = Тип("РегистрСведенийНаборЗаписей.КонтактнаяИнформация") Тогда
		// Значит вводим нового
		Если СтруктураЗаписи.Отбор.Объект.Использование = Истина И СтруктураЗаписи.Отбор.Объект.Значение <> Неопределено Тогда
			ЛокальнаяСтруктураЗаписи = Новый Структура("Объект", СтруктураЗаписи.Отбор.Объект.Значение);
			мРедактируемаяЗапись = СтруктураЗаписи;
		КонецЕсли;
	ИначеЕсли ТипЗнч(СтруктураЗаписи) = Тип("Структура") Тогда
		ЛокальнаяСтруктураЗаписи = СтруктураЗаписи;
	КонецЕсли;

	Если СтруктураПредустановленныхЗначений <> Неопределено Тогда
		ЛокальнаяСтруктураЗаписи = СтруктураПредустановленныхЗначений;
	КонецЕсли; 

	Если ТипЗнч(ЛокальнаяСтруктураЗаписи) = Тип("Структура") Тогда
		Для каждого ЭлементСтруктуры Из ЛокальнаяСтруктураЗаписи Цикл
			ЭтотОбъект[ЭлементСтруктуры.Ключ] = ЭлементСтруктуры.Значение;
		КонецЦикла;
	КонецЕсли;

	Если НЕ ЗначениеЗаполнено(Тип) Тогда
		Меню = Новый СписокЗначений();
		Для а = 0 По (Перечисления.ТипыКонтактнойИнформации.Количество()-1) Цикл
			Меню.Добавить(Перечисления.ТипыКонтактнойИнформации[а], Перечисления.ТипыКонтактнойИнформации[а]);
		КонецЦикла; 

		ВыбранныйПункт = Меню.ВыбратьЭлемент("Выберите тип контактной информации");

		Если ВыбранныйПункт = Неопределено Тогда
			Отказ = Истина;
			Возврат;
		КонецЕсли;

		Тип = ВыбранныйПункт.Значение;
	КонецЕсли;
	ПолучитьФорму(ПолучитьИмяФормы(),мФормаВладелец).Открыть();
КонецПроцедуры

10 thoughts on “Как в 1С v8 изменить запись регистра сведений с помощью метода СоздатьМенеджерЗаписи (1С: 8.1: Программисту: Язык программирования: Регистр сведений)

  1. Используя ваш пример, пытаюсь спозиционироваться на одной записи регистра и изменить один ресурс. Но почему-то не получается. В отладчике МенеджерЗаписи.Выбран() все время равно Ложь, Хотя в регистре сведений ОСОЛицевыеСчета, есть запись с измерением Объект равным Спр.Ссылка. В регистре одно измерение Объект и несколько ресурсов, в том числе СОТипПлиты. Помогите пожалуйста разобраться почему так происходит? Вот то, что я написала:

    МенеджерЗаписи=РегистрыСведений.ОСОЛицевыеСчета.СоздатьМенеджерЗаписи();
    МенеджерЗаписи.Объект= Спр.Ссылка;
    МенеджерЗаписи.Прочитать();
    Если МенеджерЗаписи.Выбран() Тогда
    МенеджерЗаписи.СОТипПлиты=ТипПлиты; Иначе
    Сообщить(«Возникла проблема определения записи по лиц счету» +Спр+ » в регистре ОСОЛицевыесчета»);
    КонецЕсли;
    МенеджерЗаписи.Записать();

  2. Марина, добрый день!
    Уточните, пожалуйста, сколько у вашего регистра измерений?
    Команда МенеджерЗаписи.Объект= Спр.Ссылка; — это определение позиции по одному измерению, т.е. у вашего регистра «ОСОЛицевыеСчета» одно измерение — «Объект»?
    Если больше, то для каждого нужно задать значение аналогичной командой (через точку с запятой)

  3. У регистра одно измерение — Объект(тип -СправочникСсылка.ЛицевыеСчета)

    Спр = Справочники.ЛицевыеСчета.Выбрать();
    Пока Спр.Следующий() Цикл
    —-тут то, что я писала выше—-
    КонецЦикла

  4. Пока идей нет, почему так происходит. Есть возможность выслать базу? Какой объем у базы?
    С удовольствием попробую помочь. Интересно разобраться в проблеме.

  5. Если нужно поменять одну запись в регистре сведений то лучше воспользоваться НаборомЗаписей.

    РегистрыСведений.Какой_то_регистр.СознатьНаборЗаписей();

    работать будет быстрее, особенно на больших объемах данных.

  6. Наверное, уже никого здесь нет, но точно такая же проблема:
    У регистра одно измерение-Документ(Ссылка на документ) и на запись не становится, хотя она в регистре очевидно есть. Выбран() — стабильно = Ложь, хотя метод ПолучитьПоследнее прекрасно работает, но по нему я не могу узнать, каково же точное значение Периода. Какова же истина?

  7. Александр, поясните свою задачу поподробнее, что именно нужно сделать?
    Возможно, для решения вашей задачи не хватает установки отбора.
    Посмотрите пример вот тут: http://www.1c-h.ru/?p=1674

  8. Александр, ваш регистр сведений подчинен регистратору? И не периодический ли регистр?

  9. жаль, что такой удобный метод работает только с регистрами сведений с установленным параметром «Независимый»

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.