1с скопировать элемент формы программно
Как программно скопировать элемент справочника, т.е. сделать те же самые действия что и нажатие кнопки "Скопировать" на панели инструментов в 1С?
Хочешь облегчить задачу? Воспользуйся методами метаданных. Организуй цикл в пять строк и легко и быстро симитируешь нажатие на конпу "скопировать". (блин - что реклама с людьми делает)
To : Пока в форуме общаюсь уже начал писать через установку всех атрибутов вручную (естественно через метаданные), просто для меня было сюрпризом, что нельзя просто программно скопировать элемент :((Или все-таки можно?
Ну, тут есть спецы, которые могут написать ВК, которая например, сможет вызывать системное копирование, но наверная запросят бабки :-))
а что будешь с переодическими, ну это ладно, а с элементами подчиненных справочников, а с неопределенными, а ежли какое расширение типа доков в справочнике, а если.
вот и приходим к тому, чтоб на прямую копировать запись(и) в таблице(ах), но при этом ИД, номер и что там исче нужно уникальное.
а как это: "атрибутов вручную (естественно через метаданные)", т.е. что ты имел ввиду посредством этой фразы? хотелось пример кода.
Чего к словам придираетесь :)), говорю же хотел найти как можно скопировать элемент справочника одной,двумя командами, оказалось что никак, поэтому перешел к сложному варианту - перебор реквизитов через метаданные и их установка.
Да не придираюсь я , оно мне зачем? просто хочу понять что значит "вручную через метаданные". тебе сложно пример кода?
если дбф-э, да и то ид надо поминять и номер и если связанные справочники то и там добавить записи а ид тот новый, но в общем как говорят этт дело техники.
это когда ты не прописываешь каждое поле спр. а перебираешь их из списка, список берешь в Метаданные.Справочник("ВидСпр"). ищи хелп от Пит'а
не надо мне азы объяснять - знаю я это все, я хочу код поглядеть у , а он что-то не хочет его показывать
Если открыта форма списка справочника,то копирование элемента сделать элементарно через нажатие кнопки F9 используя методы ВК для виртуального нажатия клавиш.Если форма не открыта, ее можно открыть программно,затем активизировать строку списка с элементом-образцом для копирования.
Для виртуального нажатия клавиш можно использовать WindowsScriptHost (метод SendKeys), или FormEx 1.9.8.1, объект сервис, метод "ЭмулироватьКлавиатуру", или 1С++, начиная с версии 1.8.1.3
эээ, ты это того, этого не безабразничай. уж я наскока люблю всяческие скрипты, но там же может выскачить типа "а копировать ли такието такието элементы подчиненных справочников" да исчо всякая лабуда, да и чел видать хочет ПРОГРАММНО копировать
Т.к. часто возникают вопросы по программному созданию/копированию/обработке объектов 1С:Предприятие в режиме "Управляемые формы", то решил скомпоновать в данной публикации примеры решения таких задач, с комментариями по каждому действию. Поначалу кажется все достаточно запутанно, но если по шагам все разложить и немного вникнуть, то всё должно встать на свои места.
При переходе с "обычных форм" на "управляемые формы" нужно понимать, что теперь имеем клиент-серверной вариант работы программы.
А это означает что то что мы могли ранее программно напрямую изменять объекты в "обычных формах" и видеть на экране результат наших действий, то в "управляемых формах" объект на сервере и объект на клиенте (видимый пользователю) разделены. Так же частично разделены функции и процедуры которые можно выполнять на сервере и на клиенте. Так например на сервере выполняются в основном сложные вычисления и функции связанные с изменениями в базе данных, а на клиенте выполняются не сложные расчеты и функции юзабилити.
ПРИМЕРЫ:
Ниже я приведу пример как создавать/копировать/изменять документы. Данный пример досконально разобран и позволит понять клиент-серверную архитектуру работы и распространить эти знания на другие объекты 1С (справочники, отчеты. ).
Задача была такая: есть справочник номенклатуры, в которые заведены блюда (общепит). Каждое блюдо имеет свою калькуляцию (состав продуктов). Калькуляции хранятся в периодическом регистре сведений. В форме элемента размещен динамический список с калькуляциями, принадлежащими открытому блюду (это могла быть любая другая таблица данных). Необходимо было добавить две кнопки "Создать калькуляцию" (новую) и "Скопировать калькуляцию" (активную из списка).
Для этого я создал соответствующие команды и разместил их на форме.
1. "Создать калькуляцию".
В данном варианте все просто: мы создаем на клиенте процедуру и все действия выполняем прямо на клиенте, т.к. ничего требующего вызова сервера не делаем. Создаем/получаем форму объекта, передаем в переменную ДанныеФормы Объект формы, выполняем элементарные действия с ДанныеФормы и открываем уже заполненную форму.
2. "Скопировать калькуляцию".
С данной операцией уже немного сложнее, часть процедур выполняется на клиенте, а часть на сервере.
Порядок действий таков: Мы на клиенте создаем форму нужного нам объекта и сразу открываем её (ОткрытьФорму. ). Далее как и ранее мы передаем в переменную ДанныеФормы Объект открытой формы.
Т.к. задача состоит в том чтобы скопировать уже существующий в базе документ (старую калькуляцию, которую выбрал пользователь в динамическом списке), то действия с данными ДБ можно производить только на сервере. Таким образом, мы получаем необходимые параметры из формы номенклатуры (в моем случае старую калькуляцию) и передаем через Структуру эти параметры в серверную процедуру без контекста вместе с переменной ДанныеФормы: СкопироватьОбъектДокументаНаСервере(ДанныеФормы, СтруктураДанных).
Уже на сервере мы с помощью функции ДанныеФормыВЗначение() преобразуем ДанныеФормы в привычный нам из "обычных форм" объект документа и работаем с ним с использованием серверных процедур. Копируем данные из другого документа, запускаем экспортные процедуры из модуля объекта, дозаполняем прочие реквизиты.
Функция ДанныеФормыВЗначение() требует указания соответствия (типа получаемого объекта): Тип("ДокументОбъект.Калькуляция").
Далее процедурой ЗначениеВДанныеФормы(Док, ДанныеФормы) выполняем обратную операцию: преобразуем объект Документ в переменную ДанныеФормы - понятную для "клиента".
При этом измененные на сервере ДанныеФормы сами не попадут в нашу созданную и открыую в самом начале форму, поэтому мы выполняем процедуру КопироватьДанныеФормы(ДанныеФормы, Форма.Объект) - тем самым запихаем изменения в видимую для пользователя форму документа Калькуляция (обновим в ней данные) .
Выше приведённые примеры решения задач, не являются единственными и в каждом индивидуальном случае могут быть оптимизированы или решены иным способом.
Думаю, начинающим познавать клиент-серверную архитектуру 1С пригодится данная статья )
Однажды я столкнулся с необходимостью открыть форму ЛЮБОГО документа с определенными изменениями, не зависящими от структуры объекта (например, заблокировать все кнопки). В интернете решения я не нашел. Обычно на форумах на запросы подобного рода отвечают чем-то вроде "покажи первоначальную задачу, а не спрашивай как реализовать то, что ты придумал". Тем не менее, мне стало интересно, как это можно сделать.
Возможные варианты использования:
- У вас есть документ, вам надо что-то в нем поменять, но срабатывает событие "при изменении" и едут суммы. Во внешней форме можно это сделать без обработчиков событий.
- Вам нужно заполнить реквизит формы (не объекта). Групповое изменение реквизитов работает с объектами, а не с данными формы.
- Нужно изменить заблокированные реквизиты формы (серенькие).
Изначально идея была такова (упрощенно):
Но такой подход оказался нежизнеспособным. Для того чтобы скопировать элементы одной формы на другую, нужно иметь к ним обеим одновременный доступ. А из-за того, что метод ПолучитьФорму() доступен только на клиенте, управлять копированием можно только с клиента. Но на клиенте недоступно свойство ПутьКДанным элементов формы, не доступен метод ПолучитьРеквизиты(). Они доступны только в серверном контексте. А к нему есть доступ только у самой формы.
Поместить форму во временное хранилище и передать через клиента адрес тоже не получится, потому что она не сериализуется. Единственный выход - сериализовать форму самостоятельно.
Можно предположить, что форму все-таки можно получить из метаданных на сервере и там же обработать, но в синтаксис-помощнике на это написано:
ОбъектМетаданных: Форма (MetadataObject: Form)
Объект мы передаем для того чтобы можно было отличить добавленные на форму колонки табличных частей от тех которые были в объекте изначально.
В форме-приемнике нужно будет прописать процедуру заполнения по переданному описанию:
В обработке для копирования остается только выполнить код:
Вообще говоря, этого достаточно. Но если мы копируем уже открытую форму документа, хотелось бы чтобы в нее переносились данные которые уже есть на форме. Для этого делаем так:
Obj - это объект, который будет хранить копию объекта источника в форме приемника. Использовать объект приемника не получится, т.к. он будет с другим типом (вероятно, ВнешняяОбработкаОбъект).
Примечание: Если вы хотите побыстрее воспользоваться обработкой - идите в конец статьи. Там под спойлером я спрятал код, который копируется в общий модуль, и выложил пару примеров, демонстрирующих решение. Далее я поясняю как всё работает и почему так сделано.
Структура передается через временное хранилище чтобы уменьшить количество передаваемых между клиентом и сервером данных. К тому же, системные перечисления, которые используются в качестве свойств элементов, не сериализуются, и с ними пришлось бы возиться отдельно.
С добавлением элементов в структуру тоже есть некоторые нюансы, которые следует учесть:
Во-первых, элементы формы не помещаются во временное хранилище, поэтому их тоже придется сериализовать самостоятельно.
Во-вторых, если мы возьмем просто список элементов, то отсортированы они будут по алфавиту, и может так получиться, что подчиненный элемент будет добавляться раньше родителя, что вызовет ошибку.
В-третьих, в зависимости от типов и видов элементов меняется набор имеющихся свойств.
Для добавления свойства в структуру используется отдельная процедура. Свойств у элементов очень много, и если копировать их через "ОписаниеЭлемента.Вставить()" то имя свойства придется указывать дважды. Процедура просто сокращает объем текста.
И вызывается она как то так:
В зависимости от типа элемента меняется его набор свойств.
Для получения коллекций (подчиненных элементов или командной панели) создана отдельная процедура, добавляющая элементы в цикле.
Заполнение описания в зависимости от типов элементов можно посмотреть в коде в конце статьи. Интеллектуальной нагрузки оно не содержит, только долгую кропотливую работу.
Аналогичные действия производятся и в обратном порядке.
Заполнение свойств выделено в отдельную процедуру с той же целью - уменьшить количество текста.
И вызывается она так:
Что касается архитектуры загрузки, то она немного изменена. Обусловлено это тем, что когда мы заполняли описание из формы, то работали и с отдельными элементами/группами и с коллекциями (подчиненными элементами). В структуре же содержатся только массивы описаний, поэтому отталкиваться следует не от процедуры заполнения свойств по одному элементу, а от обработки массива.
И уже в процедуре заполнения делается ветвление в зависимости от типа элемента:
Как и при заполнении описания, заполнение свойств элементов в зависимости от типа интереса не представляет и можно найти в полной версии кода (тремя абзацами ниже).
Для демонстрации кода я сделал две простые обработки. Их краткое описание:
Заполнение из внешней формы. Подключаемая к подсистеме дополнительных отчетов и обработок БСП обработка заполнения. В документах, указанных в списке назначений появляется кнопка "Заполнение->Заполнение из внешней формы (С)". При нажатии на кнопку открывается копия формы со всеми данными, но отключенными событиями. При нажатии на кнопку "Перенести в документ" введенные данные копируются в первоначальную форму. ВАЖНО. Для работы обработки в форме документа должна быть процедура с_ПолучитьОписаниеФормы(), которую можно найти в модуле объекта обработки.
Копирование форм. Демонстрирует работу описанного в статье подхода. Имеет форму источник и форму приемник. Весь код находится в них, изменять конфигурацию не нужно.
Возвращает копию текущей таблицы значений
Метод Скопировать() имеет несколько вариантов синтаксиса:
Вариант синтаксиса 1: копирование по строкам и колонкам
Синтаксис метода, позволяющий скопировать определенные строки таблицы значений, выглядит так:
А также альтернативный англоязычный синтаксис:
Параметры
Описание параметров метода Скопировать() :
Имя параметра | Тип | Описание |
---|---|---|
Строки (необязательный) | Массив | Массив строк для копирования. Если параметр не указан, копируются все строки таблицы значений |
Колонки (необязательный) | Строка | Перечисление имен копируемых колонок через запятую. Если параметр не указан, будут скопированы все колонки |
Жирным шрифтом выделены обязательные параметры |
Возвращаемое значение
Описание варианта 1
Метод Скопировать() возвращает копию текущей таблицы значений. Если указан параметр Строки , то копируются только указанные строки. Если указан параметр Колонки , то копируются значения только для указанных колонок. Если оба параметра опущены, создается полная копия текущей таблицы значений.
Вариант синтаксиса 2: копирование по отбору
Синтаксис метода, позволяющий скопировать строки по настроенному отбору, выглядит так:
А также альтернативный англоязычный синтаксис:
Параметры
Описание параметров метода Скопировать() :
Имя параметра | Тип | Описание |
---|---|---|
ПараметрыОтбора (необязательный) | Структура | Ключ структуры — идентификатор колонки, а значение структуры — значение отбора. |
Колонки (необязательный) | Строка | Перечисление имен копируемых колонок через запятую. Если параметр не указан, будут скопированы все колонки |
Жирным шрифтом выделены обязательные параметры |
Возвращаемое значение
Описание варианта 2
Метод Скопировать() возвращает копию текущей таблицы значений. Если указан параметр ПараметрыОтбора , то копируются только строки, удовлетворяющие условиям отбора. Если указан параметр Колонки , то копируются значения только для указанных колонок. Если оба параметра опущены, создается полная копия текущей таблицы значений.
Доступность
Сервер, толстый клиент, внешнее соединение, мобильное приложение(сервер).
Добрый день. Проблема такая:
Я программно создаю на форме декорацию с видом картинка.
Действия устанавливаются нормально, а вот строки с разрешением операций перетаскивания выдают ошибку, что поле объекта не обнаружено. Хотя при написании кода с помощью Ctrl + Пробел эти свойства видны.
Как можно программно созданной декорации разрешить перестаскивание?
Программное разрешение автозагрузки приложений
Имеются несколько телефонов: Lenovo k5 plus & Lenovo vibe p1m. Разрабатывается приложение.
Программное разрешение/запрет доступа к реестру
знаю что есть для этого 2 функции: RegGetKeySecurity и RegSetKeySecurity. Например, есть ветка в.
Запрет на ручное редактирование и разрешение на программное редактирование
Добрый день, коллеги. Вопрос следующий. Возможно ли инструментами VBA установить запрет на ручное.
В СП написано что у добавляемого элемента на форму нету свойств (РазрешитьНачалоПеретаскивания, РазрешитьПеретаскивание)
Вариант с копированием созданного на форме "вручную" не рассматривал?
Придется наверное писать тебе в 1С с просьбой предоставить программное изменение свойств "Расширение декорации формы для картинки"
В СП написано, что доступ "Чтение и Запись", но для декорации формы такое свойство отсутствует при программном доступе
Добавлено через 14 секунд
На мисту писал?
Я на мисту уже запостил, но раньше чем завтра ответа не будет.
Добавлено через 16 секунд
Серьезно. Это походу ошибка платформы
Добавлено через 42 секунды
Элемент на форме с типом декорация, не предоставляет программного доступа к "расширению элемента декорации формы картинка"
Добавлено через 1 минуту
Хотя в СП, написано об обратном!
Расширение декорации формы для картинки (Form decoration extension for a picture)
РазрешитьНачалоПеретаскивания (EnableStartDrag)
Использование:
Чтение и запись.
Описание:
Тип: Булево.
Разрешает начало операции перетаскивания у источника.
Тонкий клиент, веб-клиент, сервер, толстый клиент.
Примечание:
Истина - перетаскивание разрешено; Ложь - запрещено.
Добавлено через 49 секунд
Причем если на форму добавить, например "таблицу формы", то свойство доступно и на запись и на чтение
Добавлено через 8 минут
PatrickX3, Ты знаешь какое максимально количество декораций может быть использовано?
Читайте также: