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

21.12.11

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Вступайте в нашу телеграмм-группу Инфостарт

Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

См. также

Групповая разработка (Git, хранилище) EDT Программист 1С:Предприятие 8 Россия Бесплатно (free)

Синхронизируйте свой проект EDT с хранилищем конфигурации так же легко, как в git клиенте. По кнопке Pull в проект EDT подтягиваются изменения из хранилища, по кнопке Push ваш коммит из git репозитория проекта EDT улетает в хранилище конфигурации.

09.07.2026    4436    DmitryShehovtsev    11    

25

Архивирование (backup) Групповая разработка (Git, хранилище) Системный администратор Программист Бесплатно (free)

Как дать возможность каждому разработчику 1С вести разработку, тестирование и оптимизацию на собственной полноразмерной копии базы и при этом не тратить миллиарды рублей и тысячи часов на развертывание тестового окружения, а так же экономить дисковое пространство? Расскажем о том, как с помощью инструмента Database Lab получать полноразмерные копии базы 1C на СУБД PostgreSQL за считанные секунды (даже в случае использования многотерабайтных баз).

15.12.2025    11916    nasonkin    18    

31

Инструменты администратора БД Групповая разработка (Git, хранилище) Обновление 1С Системный администратор Программист 1С:Предприятие 8 1С:Комплексная автоматизация 2.х 1С:Библиотека стандартных подсистем Абонемент ($m)

Обработка, объединяющая в себе использование инструментов БСП по администрированию кластера серверов и запуска скриптов для автоматического обновления конфигурации из хранилища.

4 стартмани

17.11.2025    3143    14    KovrovtsevAS    0    

12

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

Проектная разработка в 1С живет в условиях жестких дедлайнов, меняющихся команд и нестабильных CI/CD. В статье показываем, как быстро и без лишних затрат внедрить Git на ERP-проектах, продать идею себе и команде и избежать типичных подводных камней. Разберем ветвление, подходы к командной работе, интеграцию с таск-трекерами и особенности тяжелых конфигураций.

04.09.2025    23778    bozo    42    

13

EDT Групповая разработка (Git, хранилище) Программист 1С:Предприятие 8 Бесплатно (free)

Плагин, расширяющий функциональность EDT, предоставляя возможность работы с хранилищем конфигурации 1С без использования 1С:ГитКонвертер.

04.08.2025    16280    ZigRinat85    54    

53

DevOps и автоматизация разработки Групповая разработка (Git, хранилище) Программист 1С:Предприятие 8 1С:Библиотека стандартных подсистем Абонемент ($m)

Позволяет проектировать и выполнять сценарии, состоящие из команд 1С, Git и CMD, а также решать конфликты слияния напрямую из 1С с помощью KDiff3. Предустановлен набор команд для автоматизации сборки CFE-файлов.

1 стартмани

29.07.2025    5932    9    gorsheninsn    6    

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

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

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

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

1с v8.2.13

для других версий 8.2 и под 8.3 может не работать???
4. TMV 1 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; +5 Ответить
9. ssn5810 25.04.24 14:19 Сейчас в теме
10. ПодводныйТ 46 25.02.26 09:31 Сейчас в теме
(8)

Небольшой некропост, но спасибо тебе дружище! А то долблюсь в это хранилище и понять не могу что не так.
Для отправки сообщения требуется регистрация/авторизация