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    1754    18    0    

9

DevOps и автоматизация разработки Администрирование СУБД Групповая разработка (Git, хранилище) Системный администратор Программист Руководитель проекта Стажер 1С 8.3 1С:Бухгалтерия государственного учреждения 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1C:ERP Беларусь Россия Казахстан Абонемент ($m)

В четвёртой части серии SRE-Suite-for-1C-platform мы переходим к практической автоматизации развёртывания отказоустойчивого кластера PostgreSQL для высоконагруженных систем 1С на Linux. В материале подробно разбирается инженерное решение без HAProxy — с использованием виртуального IP-адреса и vip-manager от CYBERTEC, обеспечивающего прямое подключение к активному мастеру без лишних задержек и точек отказа. Показана структура Ansible-модуля: подготовка ОС, развёртывание etcd, настройка Patroni с параметрами для больших нагрузок 1С. В конфигурационный шаблон Patroni автоматически закладываются параметры, критически важные для высоконагруженных баз данных, запуск vip-manager и полная автоматизация создания трёхнодового кластера. В конце — пошаговый Quick Start и планы развития модуля, включая резервное копирование, оптимизацию ОС Linux и rolling updates PostgreSQL.

1 стартмани

11.09.2026    576    Ninel_S    0    

0

DevOps и автоматизация разработки Администрирование СУБД Групповая разработка (Git, хранилище) Системный администратор Программист Руководитель проекта Стажер 1С 8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Управление холдингом 1С:Зарплата и Управление Персоналом 3.x 1С:Предприятие 8. Транспортная логистика, экспедирование и управление автотранспортом КОРП 1C:ERP Беларусь Россия Казахстан Абонемент ($m)

В корпоративных инсталляциях «1С:Предприятие 8.3» под управлением PostgreSQL всё чаще проявляются архитектурные пределы масштабирования: рост числа пользователей, обязательная маркировка, плотный поток API-интеграций и высокая стоимость простоя. Вводная часть цикла разбирает ключевые факторы современной эксплуатационной нагрузки и формирует инженерную методологию эволюционной модернизации без остановки продуктивного контура. Материал основан на практическом кейсе «Торговый контур» и показывает, как определить целевые метрики (p95, MTTR, APDEX), выстроить наблюдаемость, стабилизировать работу кластера и подготовить инфраструктуру к дальнейшему масштабированию. Публикация задаёт фундамент для последующих частей, посвящённых телеметрии, оптимизации PostgreSQL, CI/CD и архитектурному росту.

1 стартмани

10.09.2026    654    Ninel_S    0    

5

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

Системный анализ архитектурных границ масштабирования учетных систем «1С:Предприятие 8.3» под управлением PostgreSQL в ОС Linux. Формулирование инженерной методологии сквозного проекта «Торговый контур», определение измеримых целевых показателей (p95, MTTR, APDEX) и стратегии поэтапной модернизации эксплуатационного контура без остановки промышленных учетных процессов.

1 стартмани

07.09.2026    923    Ninel_S    10    

1

Linux Групповая разработка (Git, хранилище) Администрирование СУБД Системный администратор Программист 1С 8.3 Абонемент ($m)

Декларативный pipeline в GitHub Actions, тонкости лицензирования в Docker (--net=host), изоляция RUN_ID и интеграция со сборочным конвейером SRE-Suite-for-1C-platform. Вторая часть практического руководства (https://infostart.ru/public/2779597): от первого коммита до детерминированного синтаксического гейта на headless-раннере Linux

1 стартмани

03.09.2026    1237    Ninel_S    0    

3

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

Четыре года в интеграторе я работал с git и EDT. Git после хранилища полюбил сразу: видно, кто и что менял. С EDT сложнее: тормозит, ошибки при обновлении ERP, автономный сервер внутри него работает только с файловой базой. На новой работе команда захотела перейти на git, я развернул EDT, и оно на второй день разрушило проект при загрузке расширения. Тогда я решил дать команде git с привычным Конфигуратором и инструмент, который за минуту доносит коммит до базы через ibcmd, вместо получасовой загрузки из файлов. На новой работе разрешили ИИ, и я написал это приложение с его помощью: от чтения документации и первого ТЗ до идей в электричке. Впервые за годы снова почувствовал себя творцом, а не закрывателем задач. По дороге приросли выгрузка, объединение и проверка конфигурации по коммитам, YAxUnit и режим MCP-сервера. В статье: схемы, скриншоты, грабли и честный список ограничений. Ссылки пока нет: хочу понять, нужно ли это кому-то, кроме меня.

03.09.2026    10591    KatanaDragon511    28    

39

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

Пакетный запуск Конфигуратора 1С на Linux таит опасную ловушку: при критических ошибках утилита DESIGNER завершается с кодом возврата 0 - «всё хорошо». Дефект уходит на продуктив. Мы открываем проект SRE-Suite-for-1C-platform - набор специализированных инструментов для надёжной эксплуатации 1С на Linux: • пятислойный сборочный скрипт с защитой от False Success (BOM, кодировки, lock-файлы, diff с Git) • Мягкая ротация процессов "rphost" через RAS API без обрыва сеансов • EDT ; Конфигуратор: CLI-мост для CI/CD на Node.js • Готовые конфиги logcfg.xml и nethasp.ini для боевого сервера • systemd-шаблоны для фонового мониторинга кластера Проект в активной разработке, лицензия MIT. Ждём ваших тест-репортов и PR.

03.09.2026    1218    Ninel_S    0    

1

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

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

09.07.2026    6905    DmitryShehovtsev    14    

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

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