суббота, 16 апреля 2011 г.

1с v8.2 ХранилищеЗначений в Табличной части объекта

В табличных частях объектов 8.2 имеется возможность создавать реквизиты типа ХранилищеЗначений но сохранеие этих реквизитов в тонком клиенте отрабатывается некорректно, разве что каждый раз после присваивания вызывать метод записи объекта Записать(), что не очень то удобно использовать каждый раз при изменении отдельной строки. Для корректной работы с реквизитами такого типа предлагаю сохранять значения в соответствия, которое в свой черед помещается в реквизит формы типа ХранилищеЗначения. Ключем соответствия является идентификатор строки табличной части.

////////////////////////////////////////////////////////////////////////
/////////////////////// Обработчик событий на клиенте

&НаКлиенте
Процедура ПрикрепленныеФайлыПередУдалением(Элемент, Отказ)
    ТекущаяСтрока = Элементы.ПрикрепленныеФайлы.ТекущаяСтрока;
    ДанныеСтроки = Элементы.ПрикрепленныеФайлы.ДанныеСтроки(ТекущаяСтрока);

    УдалитьДанныеИзСоответствия(ДанныеСтроки.НомерСтроки);
КонецПроцедуры

////////////////////////////////////////////////////////////////////////
/////////////////////// Обработчик событий на сервере

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    Хранилище = Новый ХранилищеЗначения(Новый Соответствие);

    Индекс = -1;
    Для Каждого Строка Из Объект.ПрикрепленныеФайлы Цикл
        Индекс = Макс(Индекс, Строка.ПолучитьИдентификатор());
    КонецЦикла;
КонецПроцедуры

&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
    Соответствие = Хранилище.Получить();

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

    Хранилище = Новый ХранилищеЗначения(Соответствие);
КонецПроцедуры

////////////////////////////////////////////////////////////////////////
/////////////////////// Серверные процедуры и функции

&НаСервере
Процедура ПоместитьФайлыИзВременногоХранилищаВТЗ(МассивФайлов)
    СправочникОбъект = РеквизитФормыВЗначение("Объект");
    // ... тело модуля
    Индекс = Индекс + 1;
    НоваяСтрокаВложения = СправочникОбъект.ПрикрепленныеФайлы.Добавить();

    Соответствие = Хранилище.Получить();
    Соответствие.Вставить(Индекс, Новый ХранилищеЗначения(Файл));
    Хранилище = Новый ХранилищеЗначения(Соответствие);

    ЗначениеВРеквизитФормы(СправочникОбъект, "Объект");
КонецПроцедуры

&НаСервере
Процедура УдалитьДанныеИзСоответствия(ТекущаяСтрока);
    ИндексТекущейСтроки = Объект.ПрикрепленныеФайлы[ТекущаяСтрока-1].ПолучитьИдентификатор();

    Соответствие = Хранилище.Получить();
    Соответствие.Удалить(ИндексТекущейСтроки);
    Хранилище = Новый ХранилищеЗначения(Соответствие);
КонецПроцедуры

1 комментарий:

  1. Переменная не определена (Хранилище) Соответствие = <>Хранилище.Получить(); Скажите а хранилище это что за объект?

    ОтветитьУдалить