УФ: программное создание и копирование документов с использованием конструкций ДанныеФормыВЗначение, ЗначениеВДанныеФормы

20.11.18

Разработка - Механизмы платформы 1С

1С:Предприятие 8.3. Управляемые формы. Программное создание и копирование документов. Использование методов ДанныеФормыВЗначение(), ЗначениеВДанныеФормы() и КопироватьДанныеФормы().

Т.к. часто возникают вопросы по программному созданию/копированию/обработке объектов 1С:Предприятие в режиме "Управляемые формы", то решил скомпоновать в данной публикации примеры решения таких задач, с комментариями по каждому действию. Поначалу кажется все достаточно запутанно, но если по шагам все разложить и немного вникнуть, то всё должно встать на свои места.

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

А это означает что то что мы могли ранее программно напрямую изменять объекты в "обычных формах" и видеть на экране результат наших действий, то в "управляемых формах" объект на сервере и объект на клиенте (видимый пользователю) разделены. Так же частично разделены функции и процедуры которые можно выполнять на сервере и на клиенте. Так например на сервере выполняются в основном сложные вычисления и функции связанные с изменениями в базе данных, а на клиенте выполняются не сложные расчеты и функции юзабилити.

ПРИМЕРЫ:

Ниже я приведу пример как создавать/копировать/изменять документы. Данный пример досконально разобран и позволит понять клиент-серверную архитектуру работы и распространить эти знания на другие объекты 1С (справочники, отчеты...).

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

Для этого я создал соответствующие команды и разместил их на форме.

1. "Создать калькуляцию".

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

В данном варианте все просто: мы создаем на клиенте процедуру и все действия выполняем прямо на клиенте, т.к. ничего требующего вызова сервера не делаем. Создаем/получаем форму объекта, передаем в переменную ДанныеФормы Объект формы, выполняем элементарные действия с ДанныеФормы и  открываем уже заполненную форму.

2. "Скопировать калькуляцию".

С данной операцией уже немного сложнее, часть процедур выполняется на клиенте, а часть на сервере.

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

Порядок действий таков: Мы на клиенте создаем форму нужного нам объекта и сразу открываем её (ОткрытьФорму...). Далее как и ранее мы передаем в переменную ДанныеФормы Объект открытой формы.

Т.к. задача состоит в том чтобы скопировать уже существующий в базе документ (старую калькуляцию, которую выбрал пользователь в динамическом списке), то действия с данными ДБ можно производить только на сервере. Таким образом, мы получаем необходимые параметры из формы номенклатуры (в моем случае старую калькуляцию) и передаем через Структуру эти параметры в серверную процедуру без контекста вместе с переменной  ДанныеФормы: СкопироватьОбъектДокументаНаСервере(ДанныеФормы, СтруктураДанных).


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

	// Работаем с объектом (разные манипуляции)

	// вызываем экспортные процедуры из модуля объекта
	Док.ПересчитатьЦены();
	// заполняем его реквизиты
	Док.Дата = ТекущаяДата();
	
	// Передаем обратно в переменную ДанныеФормы уже измененный объект (документ)
	ЗначениеВДанныеФормы(Док, ДанныеФормы); 
	
КонецПроцедуры

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

Функция ДанныеФормыВЗначение() требует указания соответствия (типа получаемого объекта): Тип("ДокументОбъект.Калькуляция").

Далее процедурой ЗначениеВДанныеФормы(Док, ДанныеФормы) выполняем обратную операцию: преобразуем объект Документ в переменную ДанныеФормы - понятную для "клиента".

При этом измененные на сервере ДанныеФормы сами не попадут в нашу созданную и открыую в самом начале форму, поэтому мы выполняем процедуру КопироватьДанныеФормы(ДанныеФормы, Форма.Объект) - тем самым запихаем изменения в видимую для пользователя форму документа Калькуляция (обновим в ней данные) .

Выше приведённые примеры решения задач, не являются единственными и в каждом индивидуальном случае могут быть оптимизированы или решены иным способом.

Думаю, начинающим познавать клиент-серверную архитектуру 1С пригодится данная статья )

программное создание документов управляемые формы и копирование уф ДанныеФормыВЗначение ЗначениеВДанныеФормы КопироватьДанныеФормы справочников

См. также

Поинтегрируем: сервисы интеграции – новый стандарт или просто коннектор?

Обмен между базами 1C Администрирование СУБД Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

В платформе 8.3.17 появился замечательный механизм «Сервисы интеграции». Многие считают, что это просто коннектор 1С:Шины. Так ли это?

11.03.2024    4538    dsdred    53    

72

Как готовить и есть массивы

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

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

24.01.2024    5295    YA_418728146    25    

63

Планы обмена VS История данных

Обмен между базами 1C Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Вы все еще регистрируете изменения только на Планах обмена и Регистрах сведений?

11.12.2023    6410    dsdred    36    

112

1С-ная магия

Механизмы платформы 1С Бесплатно (free)

Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?». 

06.10.2023    18475    SeiOkami    46    

118

Дефрагментация и реиндексация после перехода на платформу 8.3.22

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Начиная с версии платформы 8.3.22 1С снимает стандартные блокировки БД на уровне страниц. Делаем рабочий скрипт, как раньше.

14.09.2023    12088    human_new    27    

74

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

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

28.08.2023    8824    YA_418728146    6    

141

Внешние компоненты Native API на языке Rust - Просто!

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Внешние компоненты для 1С можно разработывать очень просто, пользуясь всеми преимуществами языка Rust - от безопасности и кроссплатформенности до удобного менеджера библиотек.

20.08.2023    6279    sebekerga    54    

94

Все скопируем и вставим! (Буфер обмена в 1С 8.3.24)

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Рассмотрим новую возможность 8.3.24 и как её можно эффективно использовать

27.06.2023    15986    SeiOkami    31    

103
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. adapter 417 27.04.17 09:12 Сейчас в теме
КопироватьДанныеФормы не обязательно. Если делать с директивой &НаСервере, а не &НаСервереБезКонтекста

Или можно использовать метод УФ ОбновитьОтображениеДанных
2. alexhline 110 27.04.17 09:44 Сейчас в теме
Спорить не буду, написал сразу что это один из вариантов решения, а работать с директивой &НаСервере или &НаСервереБезКонтекста тоже нужно выбирать при решении конкретных задач - что будет более оптимально в каждом случае.
4. fritz14 22.05.18 19:40 Сейчас в теме
(2) Я правильно понимаю что в вашем случае в &Процедура СкопироватьКалькуляцию() у Калькуляции тип Строка?
5. alexhline 110 22.05.18 22:02 Сейчас в теме
(4) Нет, пример по копированию документов. Калькуляция - это текущий (выделенный/активный) документ в списке калькуляций к блюду.
user1216897; +1 Ответить
3. TODD22 18 27.04.17 09:45 Сейчас в теме
более оптимально

Это наверное как "большая половина".
6. acanta 18.10.18 23:52 Сейчас в теме
7. davdykin 25 31.10.18 05:15 Сейчас в теме
Привет! Большое спасибо за статью, очень помогла. Но, мне кажется что строка
// Получаем обычный объект на сервере по данным формы 
	Док = ДанныеФормыВЗначение(ДанныеФормы, Тип("ДокументОбъект.Калькуляция")); 

в процедуре СкопироватьОбъектДокументаНаСервере, т.к. следующей строчкой, мы все-равно затираем данные в переменной Док
user1216897; +1 Ответить
8. alexhline 110 20.11.18 17:42 Сейчас в теме
(7) Добрый день. Да, Вы правы, подкорректировал описание.
9. Vovan58 65 28.08.19 13:57 Сейчас в теме
Отличусь тупостью.

В аналогичной ситуации сделал так :

При создании нового:
&НаКлиенте
Процедура СоздатьКалькуляцию(Команда)
		ПараметрыФормы = Новый Структура("Основание", Объект.Ссылка);
		ОткрытьФорму("Документ.Калькуляция.ФормаОбъекта",ПараметрыФормы,ЭтаФорма);
КонецПроцедуры


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

КонецПроцедуры
Показать
Летяга; mark_oilbass; maksa2005; marku; RATIONAL; dmitriy_saladin; ward_ed; cleaner_it; romanagatiy; ilya4; mitia.mackarevich; funti4ek; xopbat; ayuplotnikov; +14 Ответить
10. maksa2005 530 06.03.23 13:45 Сейчас в теме
11. RustIG 1351 17.03.23 10:31 Сейчас в теме
(10) в своей разработке я использовал механизм создания и копирования - механизм взял из конфигурации. Он похож на сообщение 9.
В каждой конфигурации есть примеры, где с учетом модуля объекта и алгоритмов процедуры Заполнения срабатывает создание или копирование объекта из другой формы. вот пример обработки https://infostart.ru/public/1822965/
Дополнительно надо понимать как добавить свой алгоритм, свою функциональность в поведение формы - чтобы что-то свое добавить в механику создания или копирования.
Также надо понимать, что в каждой конфигурации алгоритм заполнения и создания нового объекта отличается от алгоритма заполнения и создания других конфигураций. В каждом конкретном случае смотреть надо.
Оставьте свое сообщение