Примеры работы с менеджером записи

Примеры работы с менеджером записи на языке программирования 1С:Предприятие. Примеры позволяют быстро разобраться в вопросе и использовать код в своих разработках

Базовое использование менеджера записи для справочника

// Простая запись элемента справочника через менеджер записи
Процедура ЗаписатьСправочникЧерезМенеджер()

    // Создаем менеджер записи для справочника Номенклатура
    Менеджер = Справочники.Номенклатура.СоздатьМенеджерЗаписи();
    
    // Заполняем реквизиты
    Менеджер.Наименование = "Новый товар";
    Менеджер.Артикул = "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. Всегда проверяйте права доступа перед записью через метод ПроверитьПраво()
Поделиться с друзьями
Smirnov code