Читайте дальше...
Базовое использование менеджера записи для справочника
// Простая запись элемента справочника через менеджер записи
Процедура ЗаписатьСправочникЧерезМенеджер()
// Создаем менеджер записи для справочника Номенклатура
Менеджер = Справочники.Номенклатура.СоздатьМенеджерЗаписи();
// Заполняем реквизиты
Менеджер.Наименование = "Новый товар";
Менеджер.Артикул = "ART-001";
Менеджер.БазоваяЕдиницаИзмерения = Справочники.ЕдиницыИзмерения.НайтиПоКоду("796");
// Устанавливаем родителя
Родитель = Справочники.Номенклатура.НайтиПоНаименованию("Товары");
Если Родитель <> Неопределено Тогда
Менеджер.Родитель = Родитель;
КонецЕсли;
// Выполняем запись
Попытка
Менеджер.Записать();
Сообщить("Элемент успешно записан. Ссылка: " + Строка(Менеджер.Ссылка));
Исключение
Сообщить("Ошибка записи: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Пакетная запись нескольких объектов через менеджер записи
// Пакетная запись нескольких элементов с использованием массива менеджеров
Процедура ПакетнаяЗаписьЧерезМенеджеров()
МассивМенеджеров = Новый Массив;
// Создаем несколько менеджеров записи
Для Инд = 1 По 10 Цикл
Менеджер = Справочники.Контрагенты.СоздатьМенеджерЗаписи();
Менеджер.Наименование = "Контрагент " + Строка(Инд);
Менеджер.ИНН = "770" + Формат(Инд, "ЧЦ=7; ЧВН=") + "1";
МассивМенеджеров.Добавить(Менеджер);
КонецЦикла;
// Пакетная запись в транзакции
Попытка
НачатьТранзакцию();
Для Каждого Менеджер Из МассивМенеджеров Цикл
Менеджер.Записать();
КонецЦикла;
ЗафиксироватьТранзакцию();
Сообщить("Успешно записано " + Строка(МассивМенеджеров.Количество()) + " контрагентов");
Исключение
ОтменитьТранзакцию();
Сообщить("Ошибка пакетной записи: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Менеджер записи документа с табличной частью
// Запись документа с заполнением табличной части через менеджер записи
Процедура ЗаписатьДокументЧерезМенеджер()
// Создаем менеджер записи документа
Менеджер = Документы.РеализацияТоваровУслуг.СоздатьМенеджерЗаписи();
// Заполняем шапку документа
Менеджер.Дата = ТекущаяДата();
Менеджер.Контрагент = Справочники.Контрагенты.НайтиПоНаименованию("ООО Ромашка");
Менеджер.Склад = Справочники.Склады.НайтиПоНаименованию("Основной склад");
Менеджер.Комментарий = "Документ создан через менеджер записи";
// Заполняем табличную часть "Товары"
Менеджер.Товары.Очистить();
// Первая строка
НоваяСтрока = Менеджер.Товары.Добавить();
НоваяСтрока.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию("Ноутбук");
НоваяСтрока.Количество = 2;
НоваяСтрока.Цена = 50000;
НоваяСтрока.Сумма = 100000;
// Вторая строка
НоваяСтрока = Менеджер.Товары.Добавить();
НоваяСтрока.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию("Монитор");
НоваяСтрока.Количество = 3;
НоваяСтрока.Цена = 15000;
НоваяСтрока.Сумма = 45000;
// Записываем документ
Попытка
Менеджер.Записать(РежимЗаписиДокумента.Проведение);
Сообщить("Документ проведен и записан. Номер: " + Менеджер.Номер);
Исключение
Сообщить("Ошибка записи документа: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Менеджер записи для изменения существующего объекта
// Получение существующего объекта через менеджер записи и его модификация
Процедура ИзменитьОбъектЧерезМенеджер()
// Находим существующий элемент справочника
СуществующийЭлемент = Справочники.Номенклатура.НайтиПоНаименованию("Ноутбук");
Если СуществующийЭлемент = Неопределено Тогда
Сообщить("Элемент не найден");
Возврат;
КонецЕсли;
// Получаем менеджер записи для существующего объекта
Менеджер = СуществующийЭлемент.ПолучитьМенеджерЗаписи();
// Изменяем реквизиты
Менеджер.Комментарий = "Изменен через менеджер записи " + Формат(ТекущаяДата(), "ДФ=yyyy-MM-dd HH:mm:ss");
Менеджер.СтавкаНДС = Перечисления.СтавкиНДС.НДС20;
// Сохраняем изменения
Попытка
Менеджер.Записать();
Сообщить("Объект успешно изменен");
Исключение
Сообщить("Ошибка изменения: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Менеджер записи с проверкой прав и режимом замещения
// Запись объекта с проверкой прав и выбором режима замещения
Процедура ЗаписьСПроверкойПрав()
// Создаем менеджер записи для документа
Менеджер = Документы.ЗаказПокупателя.СоздатьМенеджерЗаписи();
Менеджер.Дата = ТекущаяДата();
Менеджер.Контрагент = Справочники.Контрагенты.Выбрать().ПолучитьПервый();
Менеджер.Сумма = 150000;
// Проверяем права на запись
Если Не Менеджер.ПроверитьПраво("Запись") Тогда
Сообщить("Недостаточно прав для записи документа");
Возврат;
КонецЕсли;
// Проверяем заполненность обязательных реквизитов
Попытка
Менеджер.ПроверитьЗаполнение();
Исключение
Сообщить("Ошибка заполнения: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
// Режим записи: Истина - замещать существующие движения
// Ложь - не замещать, а добавлять
РежимЗамещения = Истина;
Попытка
Менеджер.Записать(РежимЗаписиДокумента.Запись, РежимЗамещения);
Сообщить("Документ записан с режимом замещения");
Исключение
Сообщить("Ошибка: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Использование менеджера записи для регистров сведений
// Запись в регистр сведений через менеджер записи
Процедура ЗаписатьРегистрСведенийЧерезМенеджер()
// Создаем менеджер записи для регистра сведений "КурсыВалют"
Менеджер = РегистрыСведений.КурсыВалют.СоздатьМенеджерЗаписи();
// Устанавливаем ключевые поля (измерения)
Менеджер.Период = НачалоДня(ТекущаяДата());
Менеджер.Валюта = Справочники.Валюты.НайтиПоКоду("USD");
// Устанавливаем ресурсы
Менеджер.Курс = 98.50;
Менеджер.Кратность = 1;
// Записываем
Попытка
Менеджер.Записать();
Сообщить("Курс валюты записан");
Исключение
Сообщить("Ошибка: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
// Пакетная запись нескольких записей регистра
Процедура ПакетнаяЗаписьРегистраСведений()
Валюты = Справочники.Валюты.Выбрать();
ТекущаяДатаЗаписи = НачалоДня(ТекущаяДата());
МассивМенеджеров = Новый Массив;
Пока Валюты.Следующий() Цикл
Менеджер = РегистрыСведений.КурсыВалют.СоздатьМенеджерЗаписи();
Менеджер.Период = ТекущаяДатаЗаписи;
Менеджер.Валюта = Валюты.Ссылка;
Менеджер.Курс = 70 + МатематическийСлучайноеЧисло(0, 30);
Менеджер.Кратность = 1;
МассивМенеджеров.Добавить(Менеджер);
КонецЦикла;
Попытка
НачатьТранзакцию();
Для Каждого Менеджер Из МассивМенеджеров Цикл
Менеджер.Записать(Истина); // Истина - замещать существующие записи
КонецЦикла;
ЗафиксироватьТранзакцию();
Сообщить("Записано курсов для " + Строка(МассивМенеджеров.Количество()) + " валют");
Исключение
ОтменитьТранзакцию();
Сообщить("Ошибка: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Менеджер записи с обработкой событий и подписками
// Расширенная запись с использованием событий менеджера
Процедура ЗаписьСПодпискамиНаСобытия()
// Создаем менеджер
Менеджер = Документы.ПриходнаяНакладная.СоздатьМенеджерЗаписи();
Менеджер.Дата = ТекущаяДата();
Менеджер.Поставщик = Справочники.Контрагенты.НайтиПоНаименованию("Поставщик ООО");
// Подписываемся на события менеджера записи
Менеджер.ПередЗаписью = Новый ОписаниеОповещения("ПередЗаписьюОбработчик", ЭтотОбъект);
Менеджер.ПослеЗаписи = Новый ОписаниеОповещения("ПослеЗаписиОбработчик", ЭтотОбъект);
Менеджер.ПриОтказеЗаписи = Новый ОписаниеОповещения("ПриОтказеОбработчик", ЭтотОбъект);
// Заполняем табличную часть
ЗаполнитьТабличнуюЧасть(Менеджер);
Попытка
Менеджер.Записать();
Сообщить("Документ записан с обработкой событий");
Исключение
Сообщить("Ошибка: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
// Обработчики событий
Процедура ПередЗаписьюОповещение(Менеджер, ДополнительныеПараметры) Экспорт
Сообщить("Сработало событие ПередЗаписью");
// Дополнительная проверка перед записью
Если Менеджер.СуммаДокумента <= 0 Тогда
ВызватьИсключение("Сумма документа должна быть положительной");
КонецЕсли;
КонецПроцедуры
Процедура ПослеЗаписиОповещение(Менеджер, ДополнительныеПараметры) Экспорт
Сообщить("Сработало событие ПослеЗаписи. Документ записан: " + Менеджер.Ссылка);
// Дополнительные действия после записи
ЗаписатьЛог("Создан документ " + Менеджер.Номер);
КонецПроцедуры
Процедура ПриОтказеОповещение(Менеджер, ДополнительныеПараметры) Экспорт
Сообщить("Сработало событие Отказа записи");
КонецПроцедуры
Процедура ЗаполнитьТабличнуюЧасть(Менеджер)
// Заполнение табличной части документа
Менеджер.Товары.Очистить();
// ... код заполнения
КонецПроцедуры
Процедура ЗаписатьЛог(Сообщение)
Запись = Новый ЗаписьЖурналаРегистрации;
Запись.Событие = "Работа с менеджером записи";
Запись.Комментарий = Сообщение;
Запись.Записать();
КонецПроцедуры
Менеджер записи для регистра накопления (движения)
// Создание и запись движений регистра накопления через менеджер
Процедура ЗаписатьДвиженияЧерезМенеджер()
// Создаем менеджер записи для регистра накопления
Менеджер = РегистрыНакопления.ОстаткиТоваров.СоздатьМенеджерЗаписи();
// Устанавливаем регистратор (документ-основание)
ДокументОснование = Документы.ПоступлениеТоваровУслуг.Выбрать().ПолучитьПервый();
Если ДокументОснование = Неопределено Тогда
Сообщить("Нет документа-основания");
Возврат;
КонецЕсли;
Менеджер.Регистратор = ДокументОснование;
Менеджер.Период = ТекущаяДата();
// Добавляем движения (записи набора)
НаборДвижений = Менеджер.Движения;
// Приходное движение
ДвижениеПриход = НаборДвижений.Добавить();
ДвижениеПриход.ВидДвижения = ВидДвиженияНакопления.Приход;
ДвижениеПриход.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию("Ноутбук");
ДвижениеПриход.Количество = 5;
ДвижениеПриход.Склад = Справочники.Склады.НайтиПоНаименованию("Основной склад");
// Расходное движение
ДвижениеРасход = НаборДвижений.Добавить();
ДвижениеРасход.ВидДвижения = ВидДвиженияНакопления.Расход;
ДвижениеРасход.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию("Монитор");
ДвижениеРасход.Количество = 2;
ДвижениеРасход.Склад = Справочники.Склады.НайтиПоНаименованию("Основной склад");
// Записываем движения
Попытка
Менеджер.Записать();
Сообщить("Движения регистра успешно записаны. Количество: " +
Строка(НаборДвижений.Количество()));
Исключение
Сообщить("Ошибка записи движений: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
// Модификация существующих движений через менеджер
Процедура МодифицироватьДвиженияЧерезМенеджер()
// Находим документ-регистратор
ДокументРегистратор = Документы.ПоступлениеТоваровУслуг.НайтиПоНомеру("ТД-000001");
Если ДокументРегистратор = Неопределено Тогда
Возврат;
КонецЕсли;
// Получаем менеджер записи для существующего регистратора
Менеджер = РегистрыНакопления.ОстаткиТоваров.СоздатьМенеджерЗаписи();
Менеджер.Регистратор = ДокументРегистратор;
Менеджер.ПрочитатьДвижения(); // Читаем существующие движения
// Модифицируем движения
Для Каждого Движение Из Менеджер.Движения Цикл
Если Движение.Номенклатура.Наименование = "Ноутбук" Тогда
Движение.Количество = Движение.Количество + 1;
КонецЕсли;
КонецЦикла;
// Добавляем новое движение
НовоеДвижение = Менеджер.Движения.Добавить();
НовоеДвижение.ВидДвижения = ВидДвиженияНакопления.Приход;
НовоеДвижение.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию("Клавиатура");
НовоеДвижение.Количество = 3;
НовоеДвижение.Склад = Справочники.Склады.НайтиПоНаименованию("Основной склад");
// Записываем изменения
Попытка
Менеджер.Записать();
Сообщить("Движения успешно модифицированы");
Исключение
Сообщить("Ошибка: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Комбинированная запись разнотипных объектов через менеджер записи
// Запись справочника, документа и движений в одной транзакции
Процедура КомбинированнаяЗаписьЧерезМенеджеры()
// Создаем менеджеры для разных типов объектов
МенеджерСправочника = Справочники.Контрагенты.СоздатьМенеджерЗаписи();
МенеджерДокумента = Документы.РеализацияТоваровУслуг.СоздатьМенеджерЗаписи();
МенеджерРегистра = РегистрыНакопления.ОстаткиТоваров.СоздатьМенеджерЗаписи();
// Заполняем справочник
МенеджерСправочника.Наименование = "Новый контрагент " + Формат(ТекущаяДата(), "ДФ=yyyyMMddHHmmss");
МенеджерСправочника.ИНН = "772233445566";
// Заполняем документ (пока без ссылки на контрагента, т.к. он еще не записан)
МенеджерДокумента.Дата = ТекущаяДата();
МенеджерДокумента.Склад = Справочники.Склады.НайтиПоНаименованию("Основной склад");
// Добавляем строку товара в документ
СтрокаТовара = МенеджерДокумента.Товары.Добавить();
СтрокаТовара.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию("Ноутбук");
СтрокаТовара.Количество = 2;
СтрокаТовара.Цена = 50000;
СтрокаТовара.Сумма = 100000;
// Выполняем пакетную запись в одной транзакции
Попытка
НачатьТранзакцию();
// Сначала записываем справочник
МенеджерСправочника.Записать();
// Теперь можно установить ссылку на контрагента в документе
МенеджерДокумента.Контрагент = МенеджерСправочника.Ссылка;
// Записываем документ
МенеджерДокумента.Записать(РежимЗаписиДокумента.Запись);
// Создаем движения регистра на основе документа
МенеджерРегистра.Регистратор = МенеджерДокумента.Ссылка;
МенеджерРегистра.Период = МенеджерДокумента.Дата;
Движение = МенеджерРегистра.Движения.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Номенклатура = СтрокаТовара.Номенклатура;
Движение.Количество = СтрокаТовара.Количество;
Движение.Склад = МенеджерДокумента.Склад;
МенеджерРегистра.Записать();
ЗафиксироватьТранзакцию();
Сообщить("Пакетная запись выполнена успешно");
Сообщить("Создан контрагент: " + МенеджерСправочника.Наименование);
Сообщить("Создан документ: " + МенеджерДокумента.Номер);
Исключение
ОтменитьТранзакцию();
Сообщить("Ошибка комбинированной записи: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Менеджер записи с использованием обмена данными и правил регистрации
// Запись с правилами обмена для синхронизации данных
Процедура ЗаписьСПравиламиОбмена()
// Создаем менеджер записи документа
Менеджер = Документы.ЗаказПокупателя.СоздатьМенеджерЗаписи();
// Устанавливаем параметры обмена
Менеджер.ОбменДанными.Загрузка = Истина; // Режим загрузки данных
Менеджер.ОбменДанными.УзелИнформационнойБазы = ПланыОбмена.Полный.ЭтотУзел();
// Заполняем документ из внешних данных
Менеджер.Дата = ТекущаяДата();
Менеджер.Номер = "З-" + Формат(ТекущаяДата(), "ДФ=yyyyMMddHHmmss");
// Поиск или создание контрагента по внешнему коду
ВнешнийКодКонтрагента = "CONTR_001";
Контрагент = НайтиИлиСоздатьКонтрагентаПоВнешнемуКоду(ВнешнийКодКонтрагента);
Менеджер.Контрагент = Контрагент;
// Заполняем табличную часть
ЗаполнитьИзВнешнихДанных(Менеджер);
// Устанавливаем режим записи для обмена
// Истина - регистрировать изменения для отправки в другой узел
РегистрироватьИзменения = Истина;
Попытка
Менеджер.Записать(РежимЗаписиДокумента.Запись, , РегистрироватьИзменения);
Сообщить("Документ записан с регистрацией изменений для обмена");
Исключение
Сообщить("Ошибка: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Функция НайтиИлиСоздатьКонтрагентаПоВнешнемуКоду(ВнешнийКод)
// Поиск по дополнительному реквизиту или по коду
Запрос = Новый Запрос;
Запрос.Текст = "
|ВЫБРАТЬ
| Контрагенты.Ссылка КАК Контрагент
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
|ГДЕ
| Контрагенты.Код = &ВнешнийКод";
Запрос.УстановитьПараметр("ВнешнийКод", ВнешнийКод);
Результат = Запрос.Выполнить();
Если НЕ Результат.Пустой() Тогда
Возврат Результат.Выгрузить()[0].Контрагент;
КонецЕсли;
// Создаем нового контрагента через менеджер записи
Менеджер = Справочники.Контрагенты.СоздатьМенеджерЗаписи();
Менеджер.Наименование = "Контрагент из внешней системы " + ВнешнийКод;
Менеджер.Код = ВнешнийКод;
Менеджер.Записать();
Возврат Менеджер.Ссылка;
КонецФункции
Процедура ЗаполнитьИзВнешнихДанных(Менеджер)
// Заполнение табличной части документа из внешнего источника
Менеджер.Товары.Очистить();
Строка = Менеджер.Товары.Добавить();
Строка.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию("Ноутбук");
Строка.Количество = 1;
Строка.Цена = 60000;
Строка.Сумма = 60000;
КонецПроцедуры
Примечания
// Важные особенности работы с менеджером записи:
// 1. Менеджер записи работает быстрее, чем полноценный объект, т.к. не загружает все данные
// 2. Для существующих объектов используйте метод ПолучитьМенеджерЗаписи()
// 3. Менеджер записи поддерживает события ПередЗаписью, ПослеЗаписи, ПриОтказеЗаписи
// 4. При работе с табличными частями менеджер предоставляет коллекцию для управления строками
// 5. Для регистров накопления через менеджер можно читать и модифицировать существующие движения
// 6. Менеджер записи не загружает стандартные обработчики событий формы
// 7. Для пакетной записи разнотипных объектов используйте общую транзакцию
// 8. Режим замещения (ЗамещатьСуществующиеДвижения) актуален для регистров
// 9. При обмене данными обязательно указывайте узел информационной базы
// 10. Всегда проверяйте права доступа перед записью через метод ПроверитьПраво()








