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

21.12.11

Разработка - Групповая разработка (Git, хранилище)

В тонком и веб-клиенте имеется возможность загружать внешние файлы, но сохранение в реквизите табличной части отрабатывается некорректно. Предлагаю свой метод решения этой задачи.

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

См. также

Системы контроля версий для 1С-разработчиков.

1С-программирование DevOps и автоматизация разработки Групповая разработка (Git, хранилище) DevOps для 1С Платформа 1С v8.3 Платные (руб)

Основы командной разработки на 1С. Использование систем контроля версий при разработке на платформе 1С:Предприятие 8

4900 руб.

29.06.2022    9356    78    4    

112

Обновляемый список последних статей Инфостарт для профиля Github

Групповая разработка (Git, хранилище) Бесплатно (free)

Не знаете, чем бы таким заполнить свой профиль Github? Заполните его своими статьями на Инфостарт! Этот простой workflow сам соберет список ваших последних статей и будет периодически обновлять его для актуализации данных.

08.04.2024    891    bayselonarrend    2    

29

Процесс разработки с использованием GIT и расширений для 1С:ERP. Без EDT

Групповая разработка (Git, хранилище) Платформа 1С v8.3 1С:ERP Управление предприятием 2 Бесплатно (free)

Доработки 1С:ERP на крупных проектах можно организовать, не внося изменения в саму типовую конфигурацию, а используя только расширения и отдельные «микроконфигурации». Расскажем о том, как это сделать без EDT, используя процесс разработки GitHub Flow.

02.04.2024    4292    Begemoth80    24    

45

Особенности национального Workflow: Github Actions и OneScript

Групповая разработка (Git, хранилище) OneScript Бесплатно (free)

Сегодня мы посмотрим на Github Actions - встроенный инструментарий Github для автоматизации рабочих процессов. Разберем, что это такое, зачем и причем тут OneScript.

25.03.2024    1535    bayselonarrend    3    

38

Автоматизация процесса разработки с помощью сервиса GitFlic

Групповая разработка (Git, хранилище) Бесплатно (free)

GitFlic – первая в России полностью самостоятельная реализация сервиса для хранения репозиториев с исходным кодом. За три года разработки сервис GitFlic стал полноценным инструментом, которым можно заменить GitLab, GitHub и BitBucket. Расскажем о том, как выстроить в GitFlic процесс автоматического тестирования, статического анализа кода и сборки приложений.

05.03.2024    2039    user1989937    6    

16

OpenYellow - рейтинг открытых GitHub репозиториев для платформы 1С:Предприятие

Групповая разработка (Git, хранилище) Бесплатно (free)

Обновляемый топ GitHub репозиториев для 1С по всем языкам программирования и еще немного рассуждений про open-source.

05.02.2024    3962    bayselonarrend    15    

62

Насколько глубок 1С-ный GitHub?

Групповая разработка (Git, хранилище) Бесплатно (free)

Open-source проекты - важная часть мира программного обеспечения. 1С привычно держится немного в стороне от глобальных трендов, но бросить холодный статистический взгляд на положение дел мне показалось небезынтересным.

22.01.2024    8022    bayselonarrend    50    

87

TCP прокси-сервер хранилища конфигурации 1С

DevOps и автоматизация разработки Групповая разработка (Git, хранилище) OneScript Платформа 1С v8.3 Бесплатно (free)

Продолжение истории с прокси хранилища, но уже не на HTTP, а на TCP и без падений по памяти веб-сервера. Проверяем комментарии хранилища, вызываем веб-хуки, старты пайплайнов, gitsync по событию помещения версии в хранилище. И все это полностью на знакомом и понятном OneScript.

17.01.2024    2978    kamisov    17    

59
Комментарии
Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. yandextesting 148 22.12.11 00:12 Сейчас в теме
Если не ошибаюсь эта задача решаема через временное хранилище, вот например получение данных (присвоение делается в обратном порядке, под рукой примера сейчас нет, но тоже через АдресХранилища - ПоместитьВоВременноеХранилище):

&НаСервере 
Функция ПолучитьИзХранилища(НомерСтроки)
ЭтотОбъект=РеквизитФормыВЗначение("Объект");
Хранилище=ЭтотОбъект.Товары[НомерСтроки].Файл;
АдресХранилища=ПоместитьВоВременноеХранилище(Хранилище,ЭтаФорма.УникальныйИдентификатор);
Возврат АдресХранилища;
КонецФункции

&НаКлиенте
Процедура КнопкаНажатие(Элемент)
НомерСтроки=Элементы.Товары.ТекущаяСтрока;
Адрес=ПолучитьИзХранилища(НомерСтроки);
Хранилище=ПолучитьИзвременногоХранилища(Адрес);
КонецПроцедуры
Показать
2. kostia.ck 61 22.12.11 02:13 Сейчас в теме
Задача решаема через временное хранилище для реквизитов объекта
&НаСервере
Процедура ПоместитьФайлИзВременногоХранилищаВТЗ(МассивФайлов)
	Для Каждого ЭлементМассиваФайлов Из МассивФайлов Цикл 
		ФайлИзХранилища = ПолучитьИзВременногоХранилища(ЭлементМассиваФайлов.Хранение);
		ЭлементХранилища  = Новый ХранилищеЗначения(ФайлИзХранилища);
		
		НовыйЭлементСправочника = Справочники.Контент.СоздатьЭлемент();
		НовыйЭлементСправочника.Файл = ЭлементХранилища;
		НовыйЭлементСправочника.Записать();
	КонецЦикла;
КонецПроцедуры
Показать

Для реквизита табличной части, по идеи, тоже должно быть так, но на самом деле после выхода из процедуры помещения в реквизит именно табличной части значение "ПрикрепленныйФайл" не сохраняется.
&НаСервере
Процедура ПоместитьФайлИзВременногоХранилищаВТЗ(МассивФайлов)
	ДокументОбъект = РеквизитФормыВЗначение("Объект");
	Для Каждого ЭлементМассиваФайлов Из МассивФайлов Цикл 
		ФайлИзХранилища = ПолучитьИзВременногоХранилища(ЭлементМассиваФайлов.Хранение);
		ЭлементХранилища  = Новый ХранилищеЗначения(ФайлИзХранилища);
		
		НоваяСтрокаВложения = ДокументОбъект.ТаблицаПрикрепленныхФайлов.Добавить();
		НоваяСтрокаВложения.ПрикрепленныйФайл = ЭлементХранилища; // Не отрабатывает сохранение после выхода из процедуры
	КонецЦикла;
	ЗначениеВРеквизитФормы(ДокументОбъект, "Объект");     
КонецПроцедуры
Показать
Брекпоинт перед записью на сервере:
ТекущийОбъект.ТаблицаПрикрепленныхФайлов[0].Файл.Получить() = Неопределено
veretennikoff; +1 Ответить
3. yuraos 991 23.05.13 14:37 Сейчас в теме
А почему

1с v8.2.13

для других версий 8.2 и под 8.3 может не работать???
4. TMV 14 24.05.13 06:38 Сейчас в теме
(3) yuraos,
А почему
Может, потому что год 2011?
для других версий 8.2 и под 8.3 может не работать?
Мне кажется, преемственность здесь будет соблюдаться..
5. deutsch2008 05.10.17 10:22 Сейчас в теме
не могу понять что Это СправочникОбъект.ПрикрепленныеФайлы
6. deutsch2008 05.10.17 10:33 Сейчас в теме
СправочникОбъект.ПрикрепленныеФайлы - Это табличная часть справочника?
7. krovohlebka 2 08.04.22 17:07 Сейчас в теме
Довольно интересная ошибка. Есть две копии одной и той же базы. В одной ошибка проявляется, в другой нет. Разница только в железе - копии на разных серверах.
8. wild83 19.06.22 22:59 Сейчас в теме
Действительно непонятный глюк, не сохраняет "хранилище значения" в табличной части

Нашел более простое и понятное решение кому интересно:

В реквизите табличной части вместо "ХранилищеЗначения" используйте тип "Строка" без ограничений на длину
а далее через Base64Строка() сохраняем двоичные данные в виде обычной строки в наш реквизит, а через Base64Значение() достаем из нашего реквизита с типом строка двоичные данные


Вот пример:
На клиенте сохраняем в реквизит (у меня он называется "Base64Строка" ) с типом строка двоичные данные, а таблица называется "ДопФайлы"

НовСтр = Объект.ДопФайлы.Добавить();
НовСтр.ИмяФайла = ОписаниеФайла.СсылкаНаФайл.Файл.Имя;
НовСтр.Base64Строка = Base64Строка( ПолучитьИзВременногоХранилища(ОписаниеФайла.Адрес) );

На клиенте получаем двоичные данные и сохраняем обратно в файл

ТекСтрока = Элементы.ДопФайлы.ТекущиеДанные;
ФайлДляСохранения = Base64Значение(ТекСтрока.Base64Строка);

Как видите все происходит на клиенте на сервер обращаться не нужно, без каких либо дополнительных переменных и хранения соответствий
cleaner_it; killitch; GeterX; Dimkis; +4 Ответить
Оставьте свое сообщение