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

21.12.11

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

См. также

Разработка Инструментарий разработчика Групповая разработка (Git, хранилище) Разработчик Платные (руб)

Практический курс по работе с AI-агентами для разработчиков 1С уровня middle и senior, а также тимлидов команд: от постановки задач и передачи контекста до создания расширений, интеграций, MCP-инструментов, тестов и проверки готового решения.

50000 руб.

10.09.2026    13572    124    0    

81

DevOps и автоматизация разработки Групповая разработка (Git, хранилище) Системный администратор Разработчик 1С 8.3 1С 8.5 Бесплатно (free)

В прошлой статье у ERP оставалось 89 отказов загрузки, у ЗУП — 19. Теперь обе конфигурации совпали с эталонами, а собранные файлы прошли круг через платформу. Развертка выделена в открытый репозиторий cf-unwrapper: библиотека на Rust и консольная утилита. Показываю результаты, объясняю границы «100%» и приглашаю к проверкам и развитию проекта.

02.11.2026    282    oyti    1    

1

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

Практическое руководство для команд, которые хотят уйти с хранилища конфигурации на git, не переходя на новую среду разработки. Подойдёт разработчикам и тимлидам, которые настраивают командную разработку на типовых и собственных конфигурациях.

02.11.2026    549    vanya_gonchar    2    

6

Файловый обмен (TXT, XML, DBF), FTP DevOps и автоматизация разработки Групповая разработка (Git, хранилище) Системный администратор Разработчик 1С 8.5 Бесплатно (free)

В прошлой статье я выгрузил Бухгалтерию в XML байт в байт и спросил, на чем проверить дальше. Вы ответили: ERP, старые релизы, зарплата. Прогнал пять конфигураций, от клиента ЭДО до ERP на 120 тысяч файлов. Рассказываю, что сломалось после Бухгалтерии, почему эталону платформы нельзя верить на слово, как выгрузить одну конфигурацию в формат трех версий платформы - и почему cf-конвертер становится отдельным продуктом, Разверткой.

02.11.2026    367    oyti    2    

3

Инструментарий разработчика Групповая разработка (Git, хранилище) Разработчик Стажер 1С 8.3 Абонемент ($m)

Два разработчика, по десять правок «Нано-УТ 2.0» в git: длинные ветки против слияния после каждой правки, 22 слияния с загрузкой main в чистую базу. ConfigDumpInfo.xml конфликтовал в 11 слияниях из 11, построчное объединение ломало XML и модули. Показываю, что убрать строкой в .gitattributes, что разбирать целыми вставками и как увидеть конфликты до слияния. Прилагаются инструмент с 38 тестами и материалы опыта.

1 стартмани

29.10.2026    388    Ninel_S    3    

-1

DevOps и автоматизация разработки Групповая разработка (Git, хранилище) Файловый обмен (TXT, XML, DBF), FTP Системный администратор Разработчик 1С 8.5 Бесплатно (free)

Выгрузка типовой Бухгалтерии в XML через базу занимает больше четырёх минут. Я написал движок, который читает файл конфигурации напрямую и выгружает его за 35 секунд, совпадая с выгрузкой платформы байт в байт во всех 90 385 файлах. Загрузка обратно тоже работает: круг через платформу совпадает полностью. Рассказываю, как ускоряли, как проверяем и что при загрузке XML теряет сама платформа. А в конце спрашиваю, нужно ли это кому-то, кроме меня, и на какой конфигурации проверить следующей.

27.10.2026    925    oyti    20    

16

Рефакторинг и качество кода Групповая разработка (Git, хранилище) Разработчик 1С 8.3 Абонемент ($m)

Скрипт на Python посчитал метрики 2711 общих модулей УТ 11.5: 26 модулей длиннее 10 000 строк кода. Проверила счёт на синтетических модулях и показала, где рейтинг ошибается: самый длинный модуль оказался в нём ниже девяти коротких. Для разработчиков 1С. В архиве скрипт, тесты и журналы.

1 стартмани

26.10.2026    419    Ninel_S    8    

-3

Групповая разработка (Git, хранилище) Разработчик 1С 8.3 Абонемент ($m)

Общие модули 1С вынесла в подмодуль Git и подключила к двум проектам на выгрузке «Нано-УТ» и платформе 8.3.27. Подмодуль на весь каталог CommonModules загружается; клон без --recursive даёт код 1, а забытый указатель и смена ветки молча дают базу не той версии. Переименованная процедура прошла /CheckModules при 28 вызовах. В архиве скрипты, диагностика подмодулей, тесты и журналы.

1 стартмани

26.10.2026    407    Ninel_S    0    

-1
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
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)

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