Как передать таблицу значений через клиента на управляемых формах

10.09.18

Разработка - Универсальные функции

При выполнении одной из задач возникла передать между клиентскими частями обработки данные таблицы значений. Может, и есть какие либо другие решения, но мне не попадались, да и искать не захотелось. Накидал по-быстрому свой вариант. Для небольших таблиц работает без каких либо существенных нагрузок на систему. Может, кому и пригодится данное решение.

Задача. Получить данные из таблицы объекта, поместить эти данные в параметры оповещения
для открываемой формы. Загрузить эти данные в таблицу открывшейся формы.

Получение данных. Данные решено было поместить в массив структур. Структура описывает данные строки таблицы значений.

// ВыгрузитьТаблицуЗначенийВМассив:
// Выгружает данные из таблицы значений в массив структур.
// Структура содержит данные строки. Ключами являются имена колонок

&НаСервере
Функция ВыгрузитьТаблицуЗначенийВМассив(ИмяТаблицыОбъекта)
	
	ТаблицаОбъекта = Объект[ИмяТаблицыОбъекта].Выгрузить();
	
	МассивСтрок = Новый Массив;
	
	Для Каждого СтрокаДанных Из ТаблицаДанных Цикл
		
		СтруктураСтроки = Новый Структура;
		
		Для Каждого Колонка Из ТаблицаДанных.Колонки Цикл
			
			ИмяКолонки = Колонка.Имя; 
			СтруктураСтроки.Вставить(ИмяКолонки, СтрокаДанных[ИмяКолонки]);
			
		КонецЦикла;
		
		МассивСтрок.Добавить(СтруктураСтроки);
		
	КонецЦикла;
	
	Возврат МассивСтрок;
	
КонецФункции	

 

Получение данных из массива запись их в таблицу значений

///////////////////////////////////////////////////////////////////////////////
// ЗагрузитьТаблицуЗначенийИзМассива:
// Загружает данные из массива структур в таблицу значений.
// Таблица значений може быть как реквизитом объекта, так и
// реквизитом формы.

&НаСервере
Процедура ЗагрузитьТаблицуЗначенийИзМассива(МассивСДанными, ИмяТаблицыОбъекта)
	
	ТаблицаОбъекта = Объект[ИмяТаблицыОбъекта].Выгрузить();
	ТаблицаОбъекта.Очистить();
	
	Для Каждого ЭлементМассива Из МассивСДанными Цикл
		
		СтрокаТаблицы = ТаблицаОбъекта.Добавить();
		ЗаполнитьЗначенияСвойств(СтрокаТаблицы, ЭлементМассива);
		
	КонецЦикла;
	
	Объект[ИмяТаблицыОбъекта].Загрузить(ТаблицаОбъекта);
	
КонецПроцедуры

 

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

См. также

Универсальные функции Работа с интерфейсом Программист 1С:Предприятие 8 Бесплатно (free)

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

14.05.2025    5410    DeerCven    15    

57

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

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

21.05.2024    46328    dimanich70    83    

164

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    6846    6    John_d    13    

59

Универсальные функции Программист Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    57371    atdonya    31    

68

Универсальные функции Программист 1С:Предприятие 8 Бесплатно (free)

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    8615    ke.92@mail.ru    17    

68

WEB-интеграция Универсальные функции Механизмы платформы 1С Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    22769    YA_418728146    8    

174
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. harmer 1 10.09.18 11:46 Сейчас в теме
Можно было избавиться от внутреннего цикла при преобразовании данных в массив. Для этого предварительно получаем список колонок в виде строки "Колонка1,Колонка2,...", а после создания структуры использовать "ЗаполнитьЗначенияСвойств".
monkbest; kiruha; ilya.rudziak; A_Max; CyberCerber; valerasv; +6 Ответить
2. valerasv 136 10.09.18 11:47 Сейчас в теме
Спасибо... Воспользуюсь. Так даже красивей выйдет.
3. independ 1535 10.09.18 11:55 Сейчас в теме
Если все крутится на одном сервере и ТЗ идентичные можно попробовать старый дедовский способ: ЗначениеВФайл, ЗначениеИзФайла. Строк кода минимум.
4. valerasv 136 10.09.18 11:56 Сейчас в теме
Можно, почему бы и нет. Но возникают накладные расходы на запись файла, а потом на его удаление....
5. Stepa86 1535 10.09.18 11:58 Сейчас в теме
Вообще то такие вещи принято делать через ВременноеХранилище. ПоместитьВоВременноеХранилище( и ПолучитьИзВременногоХранилища( . А через клиент только адрес проходит
VyacheslavShilov; Revachol; Mechanik21; JohnConnor; ixijixi; gigapevt; jaroslav.h; Isakov_Artem; Гриффин; Anchoret; TreeDogNight; Ditron; docerman; strange2007; Stref75; fancy; acanta; A_Max; HAMMER_59; denisros; dandykry; dsdred; RocKeR_13; alex-l19041; CyberCerber; valerasv; +26 Ответить
6. valerasv 136 10.09.18 11:59 Сейчас в теме
(5) Спасибо. Теперь буду грамотным....
7. Stepa86 1535 10.09.18 12:00 Сейчас в теме
(6) Смотри как в типовых реализовано. Там есть особенности.
12. RocKeR_13 1460 10.09.18 12:07 Сейчас в теме
13. dsdred 4139 10.09.18 12:13 Сейчас в теме
(5)Я уж хотел черкнуть про это, а то очень удивился прочитав статью))
20. kiruha 389 11.09.18 10:13 Сейчас в теме
У
(5)
ПолучитьИзВременногоХранилища


Часто требуется перекидывать не только на сервер, но и на клиент.
На клиенте ТЗ недоступна


ТаблицаЗначений
Доступность:

Сервер, толстый клиент, внешнее соединение, мобильное приложение(сервер).


А способ автора - сто лет в обед
21. valerasv 136 11.09.18 10:19 Сейчас в теме
(20)Суть была не передать ТЗ на клиента, а прокинуть через клиента...
А про временное хранилище - просветили.
22. valerasv 136 11.09.18 14:16 Сейчас в теме
(20)...Может, и есть какие либо другие решения, но мне не попадались, да и искать не захотелось. Накидал по-быстрому свой вариант....

Читай аннотацию, а не ерничай...
23. kiruha 389 11.09.18 15:32 Сейчас в теме
(22)
http://infostart.ru/public/80361/
http://infostart.ru/public/240022/

ну еще много ссылок в комментах

Да и мееседж был к (5), не к Вам
Isakov_Artem; anchovy; valerasv; +3 Ответить
24. Stepa86 1535 11.09.18 16:59 Сейчас в теме
(20) Ну так вопрос "Как получить ТЗ на клиенте" в принципе не корректен, т.к. ТЗ на клиенте не существует. Сперва нужно определится зачем таблица на клиенте, затем определится где ее хранить, а уже затем - как ее получить. Почти всегда это заполнение таблицей значений на сервере реквизита формы или объекта. Иногда нужно и преобразование в массив структур или структуру массивов, например для конвертации в JSON. Но первично - определить, а во что положить то на клиенте.

Для задачи передачи ТЗ через клиент - лучший вариант через временное хранилище, но он не единственный и бывают ситуации, когда можно обойтись другим подходом. Именно про это я и говорю в (5)
VyacheslavShilov; +1 Ответить
25. valerasv 136 11.09.18 17:04 Сейчас в теме
(24)У меня задача стояла именно прокинуть ТЗ через клиента. Об этом и писал в самом начале.
И ни слова о том, что ее нужно получить на клиенте. Все остальное не мои додумки... :-)

...Как передать таблицу значений через клиента...
milov.aleksey; +1 Ответить
27. Dementor 1062 12.09.18 09:50 Сейчас в теме
(24)
т.к. ТЗ на клиенте не существует.

Вообще-то существует, но почему-то исключительно в качестве реквизита формы, что очень неудобно. И практически точно такой же объект СписокЗначений не имеет такого глупого ограничения. Может к 8.4 разработчики сдадутся и вернут привычный функционал, как это было с переходом на элемент в списке и прочими пропавшими, а потом возвращенными фишками.
8. CyberCerber 892 10.09.18 12:03 Сейчас в теме
Так в БСП же, в модуле ОбщегоНазначения есть функция ТаблицаЗначенийВМассив
gigapevt; Isakov_Artem; sbcode; A_Max; +4 Ответить
9. valerasv 136 10.09.18 12:04 Сейчас в теме
(8)Честно скажу, не "слизывал".
10. CyberCerber 892 10.09.18 12:06 Сейчас в теме
(9) Ну да, там оптимальней сделано, без лишнего цикла, как писали в (1) ;-)
16. valerasv 136 10.09.18 12:27 Сейчас в теме
(8)Не всегда находишь нужное решение в уже готовых. Быстрее бывает написать что то свое...
Может это и не эффективный путь...
17. valerasv 136 10.09.18 13:29 Сейчас в теме
(8)Там только эта функция, ответной же части пока не нашел....
11. RocKeR_13 1460 10.09.18 12:07 Сейчас в теме
А как же ПоместитьВоВременноеХранилище?
14. 🅵🅾️🆇 526 10.09.18 12:23 Сейчас в теме
Вариантов куча.
Можно сериализовать в json, в xml, во внутренне значение строкой, поместить во временное хранилище, преобразовать в массив структур.
15. valerasv 136 10.09.18 12:25 Сейчас в теме
(14)
преобразовать в массив структур

Именно это и делается... :-)
18. bulpi 217 10.09.18 16:00 Сейчас в теме
19. valerasv 136 10.09.18 22:42 Сейчас в теме
(18)А ни кто на оригинальность и не претендует. Читай аннотацию внимательнее...
26. caponid 12.09.18 09:29 Сейчас в теме
Если простые типы, то и JSON можно использовать

Сохранить значение
ЗаписьXML=Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку();
СериализаторXDTO.ЗаписатьXML(ЗаписьXML,Значение);
ПредставлениеЗначения =ЗаписьXML.Закрыть();

Восстановить значение
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(ПредставлениеЗначения);
Значение= СериализаторXDTO.ПрочитатьXML(ЧтениеXML);
VyacheslavShilov; Lubocka; +2 Ответить
28. Healer 1 13.09.18 16:50 Сейчас в теме
Я для подобной задачи использовал архаичную функцию "ЗначениеВСтрокуВнутр" и "ЗначениеИзСтрокиВнутр". Они были созданы 1С-цами для перехода с клюшек на 8-ку и не рекомендуются к применению, но работают шустро и чётко :-)
29. Healer 1 13.09.18 16:53 Сейчас в теме
То есть при передаче пишем просто:
Параметр = ЗначениеВСтрокуВнутр(НашаТЗ);
А на форме в обработчике оповещения пишем:
ЗначениеИзСтрокиВнутр(Параметр)
30. Healer 1 13.09.18 16:55 Сейчас в теме
Я таким манером передавал в клюшки ответ веб-сервисов из 8-ки, а это ТЗ с сотнями тысяч строк. Работает мегашустро.
31. milov.aleksey 384 20.09.22 15:10 Сейчас в теме
(25) Валерий, добрый день.
Столкнулся с подобной задачей. Заполнить ТЧ документа из ТЧ обработки.
Решил передачей параметра-коллекции ДанныеФормыКоллекция.
С формы на форму с клиента на сервер

&НаКлиенте //форма обработки, кнопка обработки Заполнить
ЗначенияЗаполнения = Новый Структура;
ЗначенияЗаполнения.Вставить("КоллекцияСотрудники", Объект.ТЧСотрудники); //ТЧ обработки
ПараметрыОткрытия.Вставить("ЗначенияЗаполнения", ЗначенияЗаполнения);
ОткрытьФорму("Документ.ДокументПриемник.ФормаОбъекта", ПараметрыОткрытия, ЭтотОбъект);

&НаСервере //форма документа
ПриСозданииНаСервере
//очищаем приемник
Объект.ТабличнаяЧасть.Очистить();

//заполняем приемник перебором полученной коллекции
Если КоллекцияСотрудники<>Неопределено Тогда
Для каждого СтрокаКоллекции Из КоллекцияСотрудники Цикл
СтрДок = Объект.ТЧСотрудники.Добавить();
ЗаполнитьЗначенияСвойств(СтрДок,СтрокаКоллекции);
КонецЦикла;
////////////////////////////////////////////////
Для отправки сообщения требуется регистрация/авторизация