1с как заполнить табличную часть формы на сервере без контекста
Тогда смотри (2) - на сервере конвертируешь в полноценную ТЧ, делаешь что надо, а потом обратно конвертируешь в данные формы.
Если мы в контексте этого самого документа, то в ПередЗаписьюНаСервере() в УФ уже доступен непосредственно объект и его полноценная табличная часть. Делай что хош.
ЗЫ. Упс. Был невнимателен.
Передал как параметр.
не знаю только правильно ли так передавать.
(5) TODD22, можно), только надо помнить что это не таблица значений, а данные формы - и работать с ними соответственно.
Что то не получается как я написал. Передаю значение в функцию. вроде нормально всё. Но при возвращении значения(значение типа булево). Пишет что "Нельзя изменять поле содержащее объект данных формы. Вроде в явном виде нигде ничего не меняю. Только на стороне сервера в цикле обхожу табличную часть.
Разберитесь, чем отличается &НаСервере и &НаСервереБезКонтекста, а также зачем в описании аргументов функции ставится префикс ЗНАЧ.
Либо используйте контекстный серверный вызов без аргументов, в этом случае содержимое табличной части будет доступно на сервере. Это наиболее тяжелый вариант, поскольку на сервер едет вся форма.
Либо сериализуйте и отправляйте табличную часть на сервер вручную во внеконтекстном вызове, например, в виде массива структур.
Либо (что правильнее всего) используйте платформенные события.
Ошибка "Нельзя изменять поле содержащее объект данных формы" происходит скорее всего из-за того, что Вы используете контекстный вызов, в котором передаете табличную часть по ссылке. Таким образом, у вас на сервер передается одна табличная часть в двух экземплярах, и вот тот экземпляр, который вы передали в качестве аргумента, меняется, а на клиенте после возврата обновлен быть не может.
За такой вызов следует гнать из профессии ссаными тряпками.
Разберитесь, чем отличается &НаСервере и &НаСервереБезКонтекста, а также зачем в описании аргументов функции ставится префикс ЗНАЧ.
Судя по описанной ошибке, это не так.
Если когда-нибудь Вашей основной задачей станет разбор и коррекция кода, написанного коллегами, Вы еще не так выражаться будете. Причем в матюгальник.
(12) mymyka, ПередЗаписьюНаСервере к сожалению то же не подходит.
В обработчике "ПередЗаписью" несколько вызовов клиентских процедур, в том числе открытие формы и работа с подключаемым оборудованием.
Таки (10) прав и причину хорошо расписал. Так не получится, я ошибся.
Можно на сервере (в контекстном серверном вызове) выгрузить табличную часть в таблицу значений, передать твоей функции параметром, а потом модифицированную таблицу значений загрузить обратно в табличную часть.
(14) herfis, пока решил тем что из клиентской процедуры вызываю серверную в том же модуле, там готовлю данные для передачи и затем уже вызываю функцию из общего модуля.
(15) TODD22, Ну так я про тоже самое и написал. Только "подготовка данных" заключается в методе Выгрузить().
ЗЫ. Если решается задача глобальной модификации табличной части, то это как раз тот случай, когда использование контекстного серверного вызова полностью оправдано. Альтернативы с "упаковкой" данных клиента для неконтекстного вызова и загрузкой результата на клиенте еще менее оптимальны при большом количестве строк.
Есть обработка с двумя табличными частями.
На УФ формы две таблицы отображающие эти ТЧ.
Одна заполняется при открытии по данным базы. Она большая. Пользователь в УФ может ее редактировать.
При активации строке строки в этой таблице (исходя из данных строки) заполняется вторая таблица.
Все по функционалу работает. При активации строки вызывается серверная процедура с контекстом, которая заполняет вторую таблицу.
НО! При вызове серверной процедуры с контекстом, по причине большой первой таблицы, происходит задержка на передачу контекста.
Как можно исторгнутся с серверной процедурой без контекста, чтобы передать ей данные текущей строки первой таблицы и она заполнила вторую таблицу?
Я не могу в параметры вызова функции вставить Объкт.ТЧ, так как тип "ДанныеФормыКоллекция" не передается с клиента на сервер. А с сервера Таблица значения на клиент не возвращается.
(5)Вариант возвращаемую таблицу на сервере преобразовывать в массив структур и на клиенте структуры из массива добавлять по построчно в таблицу рассматриваю, но это кажется мне костылем.
(6) Чтобы не казалось костылем, надо написать серверную и клиентскую функции, которые будут, соответственно, упаковывать переданные данные в массив структур и распаковывать этот массив, создавая строки табличной части. Дальше во всех аналогичных случаях пользоваться этими функциями.
(9) Давно ли? Я где-то с УФ с 14-й платформы не работаю, не в курсе. А на 14-й вернуть ТЗ, как она есть, с сервера на клиент не представлялось возможным.
(10)ТЗ есть только в в толстом клиенте. А загрузить ТЗ в ТЧ можно только на сервере, на клиенте доступно построчное добавление.
(13)В активации у меня идет проверка на повторный вызов, потому зацикливания нет.
(22)
Модуль _КостылиУФ
[1с]
//В Тонком клиенте и в Веб клиенте нет типа Таблица значений.
//Потмоу чтобы УФ работали и в этих клинетах для передачи Табличных частей с клиентткой процедуры УФ в серверную без контекста использую эти костыли.
//Серверные без контекста использую чтобы избежать передачю всего контекста, что происходит долго, если присутствует большая таблица.
//Клиент
Функция ПолучитьТекущиеДанныеВСтруктуре(ТекущиеДанные, СписокКолонокТЧ) Экспорт
Если ТекущиеДанные = Неопределено Тогда
Возврат Неопределено;
Иначе
СтруктураВозврата = ПолучитьСтруктуруПоСпискуКолонокТЧ(СписокКолонокТЧ);
ЗаполнитьЗначенияСвойств(СтруктураВозврата, ТекущиеДанные);
Возврат СтруктураВозврата;
КонецЕсли;
Функция ВыгрузитьКолонкуТЧВМассивБезПустых(ТабличкаяЧасть, ИмяКолонки) Экспорт
Массив = Новый Массив;
Для Каждого СтрокаТЧ Из ТабличкаяЧасть Цикл
Если ЗначениеЗаполнено(СтрокаТЧ[ИмяКолонки]) Тогда
Массив.Добавить(СтрокаТЧ[ИмяКолонки]);
КонецЕсли;
КонецЦикла;
Попытка
ТЗ = ТабличнаяЧасть.ВыгрузитьКолонки();
Исключение
Попытка
ТЗ = ТабличнаяЧасть.Выгрузить();
Исключение
ТЗ = ТабличнаяЧасть;
КонецПопытки;
КонецПопытки;
СписокВозврата = Новый СписокЗначений;
Для каждого Колонка Из ТЗ.Колонки Цикл
СписокВозврата.Добавить(Колонка.Имя);
КонецЦикла;
//Сервер
Функция ПреобразоватьТЧВМассивСтруктур(ТабличнаяЧасть) Экспорт
МассивВозврата = Новый Массив;
Для каждого СтрокаТЧ Из ТабличнаяЧасть Цикл
НоваяСтруктура = ПолучитьСтруктуруПоСпискуКолонокТЧ(СписокКолококТЧ);
ЗаполнитьЗначенияСвойств(НоваяСтруктура, СтрокаТЧ);
МассивВозврата.Добавить(НоваяСтруктура);
КонецЦикла;
//КлиентСервер
Функция ПолучитьСтруктуруПоСпискуКолонокТЧ(СписокКолонокТЧ) Экспорт
СтруктураВозврата = Новый Структура;
Для каждого ИмяКолонки Из СписокКолонокТЧ Цикл
СтруктураВозврата.Вставить(ИмяКолонки, Неопределено);
КонецЦикла;
СтруктураВозврата = Новый Структура;
//Разблокируем предыдущий, если заблокирован
Если ЗначениеЗаполнено(ПредыдущийДокумент) Тогда
РазблокироватьДанныеДляРедактирования(ПредыдущийДокумент, УникальныйИдентификатор);
КонецЕсли;
//Проверим, может уже создано в другой сессии
Если Не ЗначениеЗаполнено(ТекущиеДанныеВСтруктуре.ДокументРаспределения) Тогда
Запрос = Новый Запрос;
Запрос.Текст ;
Запрос.УстановитьПараметр("СтатьяОборотовРаспределяемое", ТекущиеДанныеВСтруктуре.СтатьяОборотовРаспределяемое);
Запрос.УстановитьПараметр("ЦФОРаспределяемое", ТекущиеДанныеВСтруктуре.ЦФОРаспределяемое);
Запрос.УстановитьПараметр("Сценарий", ТекущиеДанныеВСтруктуре.Сценарий);
Запрос.УстановитьПараметр("ПериодПланирования", ТекущиеДанныеВСтруктуре.ПериодПланирования);
РезультатЗапроса = Запрос.Выполнить().Выбрать();
Если РезультатЗапроса.Следующий() Тогда
ТекущиеДанныеВСтруктуре.ДокументРаспределения = РезультатЗапроса.Ссылка;
ТекущиеДанныеВСтруктуре.ДатаИзменения = РезультатЗапроса.Дата;
КонецЕсли;
//Заблокируем текущий
ПредыдущийДокумент = ТекущиеДанныеВСтруктуре.ДокументРаспределения;
Если ЗначениеЗаполнено(ПредыдущийДокумент) Тогда
Попытка
ЗаблокироватьДанныеДляРедактирования(ПредыдущийДокумент, ,УникальныйИдентификатор);
Исключение
КонецПопытки;
//ЗаполнимТаблицы
ТекущиеДанныеВСтруктуре.ДатаИзменения = ПредыдущийДокумент.Дата;
СтруктураВозврата.Вставить("СтатьиОборотовБазаРаспределения", _КостылиДляУФ.ПреобразоватьТЧВМассивСтруктур(ПредыдущийДокумент.СтатьиОборотовБазаРаспределения));
СтруктураВозврата.Вставить("ЦФОБазаРаспределения", _КостылиДляУФ.ПреобразоватьТЧВМассивСтруктур(ПредыдущийДокумент.ЦФОБазаРаспределения));
СтруктураВозврата.Вставить("ТаблицаПодменЗадачПроектов", _КостылиДляУФ.ПреобразоватьТЧВМассивСтруктур(ПредыдущийДокумент.ТаблицаПодменЗадачПроектов));
СтруктураВозврата.Вставить("ТаблицаРезультат", _КостылиДляУФ.ПреобразоватьТЧВМассивСтруктур(ПолучитьТаблицуРезультатСервер(ТекущиеДанныеВСтруктуре, ПредыдущийДокумент.СтатьиОборотовБазаРаспределения.ВыгрузитьКолонку("СтатьяОборотовБазаРаспределения"), ПредыдущийДокумент.ЦФОБазаРаспределения.ВыгрузитьКолонку("ЦФОБазаРаспределения"))));
Иначе
СтруктураВозврата.Вставить("СтатьиОборотовБазаРаспределения", Новый Массив);
СтруктураВозврата.Вставить("ЦФОБазаРаспределения", Новый Массив);
СтруктураВозврата.Вставить("ТаблицаПодменЗадачПроектов", Новый Массив);
СтруктураВозврата.Вставить("ТаблицаРезультат", Новый Массив);
КонецЕсли;
Контекстная и внеконтекстная передача управления на сервер
Область применения: управляемое приложение, мобильное приложение.
1. Платформа 1С:Предприятие позволяет передавать управление из клиентского в серверный код модуля формы двумя способами: контекстно и внеконтекстно.
При внеконтекстной передаче управления на сервер передаются только те данные, которые явно специфицированы разработчиком в параметрах процедуры (функции) с директивой компиляции &НаСервереБезКонтекста .
При контекстной передаче управления на сервер, помимо параметров процедуры (функции) с директивой компиляции &НаСервере , передаются еще и данные формы, которые были изменены на клиенте за период с момента предыдущего контекстного серверного вызова (см. ниже приложение). При этом на сервере выполняется ряд дополнительных действий по инициализации методов формы и серверной копии данных формы, что может увеличивать общее время, которое сервер затрачивает на обработку вызванной процедуры (функции).
2. Контекстную передачу управления следует использовать в случаях когда:
- платформа 1С:Предприятие самостоятельно оптимизирует объем передаваемых данных между клиентом и сервером (в обоих направлениях). Прежде всего, это реквизиты формы с табличными документами и коллекции элементов ( ДанныеФормыКоллекция , ДанныеФормыСтруктураСКоллекцией , ДанныеФормыДерево ). См. также: Использование объекта ДанныеФормыКоллекция .
- и при этом затраты ресурсов сервера на инициализацию контекста формы оправдываются существенным снижением трафика между клиентом и сервером и снижением числа вызовов сервера.
В остальных случаях рекомендуется использовать внеконтекстную передачу управления с клиента на сервер.
3. При передаче управления с клиента на сервер недопустимо использовать объекты типов ДанныеФормыСтруктура , ДанныеФормыКоллекция , ДанныеФормыСтруктураСКоллекцией , ДанныеФормыДерево и ТабличныйДокумент в качестве параметров функции, передаваемых по значению. При передаче таких типов по значению с клиента на сервер всегда передается полная копия объекта, а не только измененные данные.
Вести работу с этими типами следует на сервере, для чего переходить с клиента на сервер с помощью явного контекстного вызова сервера.
Например, неправильно:
// Общий серверный модуль ОбщийМодульВызовСервера
Фукнция КоличествоОтмененныхСтрок(ТабличнаяЧасть);
НайденныеСтроки = ТабличнаяЧасть.НайтиСтроки(Новый Структура("Отменено", Истина));
Возврат НайденныеСтроки.Количество();
КонецФункции
// Общий серверный модуль ОбщийМодульВызовСервера
Функция КоличествоОтмененныхСтрок(ТабличнаяЧасть);
НайденныеСтроки = ТабличнаяЧасть.НайтиСтроки(Новый Структура("Отменено", Истина));
Возврат НайденныеСтроки.Количество()
КонецФункции
Приложение
При контекстной передаче управления на сервер в платформе 1С:Предприятие действуют следующие правила передачи измененных данных формы между клиентом и сервером:
Как заполнить табличную часть формы программно? 8
Нужно по кнопке Заполнить - сформировать данные для заполнения табличных частей и заполнить их. Форма имеет вид: Рядом с кнопкой Записать и закрыть добавлена кнопка Заполнить документ , код ее команды: // Код заполнения ТЧ НаСервере П 10060 (0x0000274C): Попытка установить соединение была безуспешной 19
Установили новый терминальный сервер, на нем подняли 1С, терминальные пользователе неописуемо довольны, все просто летает :) И вот же надо было такому случиться, главному бухгалтеру не понравилось работать через терминал, а еще у нее свой ноутбук и 1C и Google Maps 21
была поставлена задача отображения на географической карте медицинских учреждений. После обзора предлагаемых решений был выбран сервис google. Но так же подобного рода подход будет работать и с картами сервиса yandex. Во время решения задачи было реш 1C медленно работает по сети с базой на SQL Server 20
Данное обстоятельство может быть обусловлено многими причинами. Одна из них - неоптимальная настройка MS SQL . Перечислим неоптимальности в настройке: 1) Неправильно указанный сетевой протокол, используемый для взаимодействия 1С с SQL Server. П COM-подключение к базе 7.7 из 8.2 1С 6
Если код выполняется на стороне клиента, то необходимо наличие базы 7.7 на локальной машине. Пример (На форме объекта присутствует реквизит Таблица(ТаблицаЗначений)): НаКлиенте Процедура Загрузки() ПутьКБазе=" D: ВашаБаза 1с77 " ; Пользователь= Посмотреть все результаты поиска похожих
Еще в этой же категории
Вывод картинки (изображения) на печать, в макет (табличный документ) 32
// 1-й вариант //Как вывести картинку в табличный документ? ТабДок = Новый ТабличныйДокумент; Макет = ОбработкаОбъект.ПолучитьМакет(" Макет" ); ОбластьКартинки = Макет.ПолучитьОбласть(" ОбластьСКартинкой" ); Картинка = Новый Картинка(ПутьККа Вывести табличный документ в PDF 18
Данный пример работает на платформе выше 8.2.13 Макет = ПолучитьМакет(" Макет" ); ОбластьШапка = Макет.ПолучитьОбласть(" Шапка" ); ТабДок = Новый ТабличныйДокумент; ОбластьШапка.Параметры.НомерДок = Номер; ОбластьШапка.Параметры.ДатаДок = Как программно изменить текст, цвет, фон ячейки или области табличного документа? 7
Ниже приведено несколько полезных шаблонов кода по работе с табличным документом: //Пример получения текста ячейки ПолеТабДок = ЭлементыФормы.тдПолеТабличногоДокумента; ПолеТабДок.Область("R1C2").Текст = спрНоменклатура.Наименование; ПолеТабДок Как в отобразить картинку в табличной части 7
В табличной части есть документы заявки от покупателя, нам нужно добавить картинку для отображения статуса документов заявка - проведен , не проведен, помечен на удаление. //Отобразим картинку Процедура СписокПриВыводеСтроки(Элемент, Оформление Вывод колонтитулов программно ВерхнийКолонтитул, НижнийКолонтитул 6
Колонтитул является специальным текстом, выводимым вверху или внизу каждой страницы при выводе документа на печать. В тексте колонтитула можно использовать следующие управляющие конструкции: > ( >) - при печати в данном месте будет выведен номер ст Посмотреть все в категории Табличный документ
Нужно по кнопке Заполнить - сформировать данные для заполнения табличных частей и заполнить их.
Форма имеет вид:
Рядом с кнопкой Записать и закрыть добавлена кнопка Заполнить документ, код ее команды:
Второй вариант заполнения: Имеем ТЧ на форме, которую необходимо программно заполнить
и код в модуле документа:
Похожие FAQ
PostgreSQL: установка, настройка, обслуживание 11
PostgreSQL напрямую "из коробки" применяться для использования с 1С Предприятем не может. Необходима именно адаптированная версия от 1С, превращающая PostgreSQL в блокировочник, причем нужно понимать, что блокировки будут накладываться на всю таблиц Автоматическое резервное копирование 1С:Предприятия в облако с помощью ПО Effector Saver 3
Всем известно, для большей гарантии восстановления важных данных, необходимо копировать архивы в несколько мест хранения. Отдельный диск может помочь в случае порчи основного, но в случае если устройство будет потеряно или украдено, он будет так же Автоматическое резервное копирование 1С:Предприятия в облако с помощью ПО Effector Saver 0
Всем известно, для большей гарантии восстановления важных данных, необходимо копировать архивы в несколько мест хранения. Отдельный диск может помочь в случае порчи основного, но в случае если устройство будет потеряно или украдено, он будет так же Ввод договоров ГПХ в ЗУП (счет 76) 9
Часто меня спрашивают: Как правильно отразить договор ГПХ в ЗУП? Ниже небольшая, последовательная инструкция: Прием на работу Сведения о физическом лице, выполняющем работы по договору подряда, должны быть внесены в справочник Сотрудники организ Вывод в поле Наименование справочника Штатное список значений из справочника Подразделения? 0
Есть два справочника Штатное и Подразделения. В справочнике Штатное есть автоматически генерируемое поле Наименование. Как программно сделать так чтобы в поле Наименование справочника Штатное выводились списком значений из поля Наименование справочн Посмотреть все результаты поиска похожих
Еще в этой же категории
Как открыть внешнюю обработку или отчет программно 1С УП? 6
В версии 8.2 и старше: приложение не работает непосредственно с локальными файлами, расположенными на компьютере. Файлы должны находиться на сервере. Поэтому для открытия внешней обработки нужно выполнить следующую последовательность действий: Ввод по строке - поиск по первым символам или в любом месте наименования 6
При разработке конфигурации, для упрощении ввода документов потребовалось настроить ввод номенклатуры по совпадению любой части наименования! В 1С 8.3 по умолчанию настройки справочника номенклатуры такие: При такой настройке, механизм поиска в Как передать таблицу значений с сервера на клиент? 5
Многие спрашиваю, как передать тз с сервера на клиент - ниже несколько вариантов как это можно реализовать: Через ЗначениеВСтрокуВнутр и ЗначениеИзСтрокиВнутр НаКлиенте Процедура ПолучитьТаблицу НаСервер(Команд а) ТЗВСтроке = ПолучитьТЗНаС РеквизитФормыВЗначение() и ДанныеФормыВзначение() - Описание и примеры использования 2
gvk2009 подробно и доходчиво описал разницу методов, за что ему огромное спасибо: В Синтаксис-Помощнике очень скупо написано о процедуре ДанныеФормыВЗначение (), чуть побольше - о РеквизитФормыВЗначение (). И совсем нет примеров использования. Вывод результата запроса на форму УП в таблицу значений (аналог СоздатьКолонки() для УП) 2
при разработке на обычных формах было удобно выводить результат запроса используя метод СоздатьКолоки(): Процедура ПоискНажатие(Элемент) Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ДокументоОборот.Этап, | ДокументоОборот.Отдел, | Докуме Посмотреть все в категории Управляемое приложение, Тонкий клиент
Читайте также: