Программно добавить стандартную команду на форму 1с
Для выполнения действий пользователя 1С в системе предназначен объект конфигурации 1С команда. С его помощью разработчик 1С 8 может описывать алгоритмы работы.
Итак, как забиндить команду на кнопку? Помимо привычного способа организации связи кнопки и команды (путем ручного добавления команды на форму) возможно и программное создание проекта:
НоваяКнопкаФормы = Элементы.Вставить(ИмяКоманды, Тип(«КнопкаФормы»));
2. Программный вызов команды 1С 8.3
При необходимости программного вызова команды возможны следующие действия:
1. Если требуется вызвать 1С стандартную команду текущей формы 1С, то в процедуре модуля формы достаточно написать:
В этом случае «ИмяСтандартнойКоманды» – это соответствующее имя команды;
2. Если требуется вызвать обычную команду какой-либо формы, то для вызова необходимо сначала получить форму 1С 8.3, содержащую команду, а затем обращаться непосредственно к команде:
При этом стоит отметить, что сама команда 1С 8.3 должна быть экспортной.
Специалист компании ООО «Кодерлайн»
Вас могут заинтересовать следующие статьи:
94 [PROP_CODE] => TAGS2 [TITLE] => Вас могут заинтересовать следующие семинары: ) --> 95 [PROP_CODE] => TAGS [TITLE] => Вас могут заинтересовать следующие вебинары: ) -->
Вас могут заинтересовать следующие вебинары:
Программирование в 1С [1] => 1С:Бухгалтерия [2] => 1С:Управление производственным предприятием [3] => 1С: Розница [4] => 1С: CRM [5] => 1С: Управление торговлей [6] => Бюджетирование [7] => СКД [8] => 1С: Конвертация данных [9] => Администрирование 1С [10] => Конвертация данных [11] => Лицензии 1С [12] => Оптимизация [13] => 1С: Документооборот [14] => 1С: ERP [15] => Транспортная логистика [16] => Техническое задание [17] => Продажи [18] => Ценообразование [19] => Планирование [20] => MS SQL Server [21] => Полезные обработки [22] => МСФО [23] => Отчеты в 1С [24] => XML [25] => Внедрение ERP [26] => Перенос данных [27] => Торговое оборудование [28] => РСБУ [29] => 1С:Управление корпоративными финансами [30] => 1С: Колледж [31] => 1С: Аренда и управление недвижимостью [32] => Финансовый учет ) -->
подобный код не прокатывает. Может кто подскажет куда смотреть?!
(1) суть в том что общая команда имеет свойства к каким объектам она относится. Если она не относится к вашему объекту, то чего хотеть?
(2) хм.. если бы так. берем в качестве примера общую команду "СтруктураПодчиненности" - к каким объектам она относится?!
(4) Логично..но я специально привел пример с командой "СтруктураПодчиненности" - у нее нет никаких параметров
(6) Ок, убедили - в Ваше случае есть, в моем случае нету. Я понимаю о чем Вы говорите, но у меня это параметр пустой (смотрю типовую УТ11)
Могу еще цитату с ИТС по подсистеме привести:
"Прежде всего необходимо принять решение по поводу списка документов, справочников и ПВХ для которых требуется выводить отчет Структура подчиненности. Затем задать список типов выбранных объектов в типах параметра общей команды СтруктураПодчиненности"
(3) не каждую команду можно запихнуть.
В УТ 11.3 у данной команды нет оснований и судя по коду она через БСП добавляется!
(27) я изучил этот код до того как написать на форум :) Принцип там похож на (15) т.е. есть клиентская команда в модуле формы и далее по списку.
(15) Вся фишка именно в том, что бы имея общую команду ее вызвать, точнее добавить ее на форму (без промежуточного вызова какой-то клиентской процедуры)
(16) Если это вообще возможно, то по-идее сначала нужно добавить общую команду в коллекцию команд формы с правильным именем (которое я тебе и предложил подсмотреть) без назначения действия, а потом уже назначить ее кнопке.
Все, что мне нужно это добавить программно кнопку на форму документа (кнопку со ссылкой на общую команду), общая команда без параметров.
А у параметрически добавленных общих команд на форме имя именно такое выводит, в стиле "ОбщаяКоманда.СтруктураПодчиненности"?
Гы! По твоему скриншоту можно предположить, что нужно таки сразу создавать кнопку без редактирования коллекции команд формы, но имя должно быть без промежуточной точки:
(18) Пробовал - не работает (если создать кнопку без указания "ИмяКоманды" - она даже на форме не отразится)
(20) Странно. Ведь и в СП написано и на твоем скриншоте из (13) видно, что для общих команд в "ИмяКоманды" должна быть пустая строка.
(23) Странно не то слово.
Если в конфигураторе "кинуть" общую команду на форму то в поле "ИмяКоманды" будет заполнено как "ОбщаяКоманда.СтруктураПодчиненности" - в отладчике "ИмяКоманды" будет пустое. но когда программно создаешь кнопку и оставляешь "имя команды" пустое то эффект ровно такой же как если в конфигураторе создать кнопку и не указать "Имя команды". ее просто не будет не форме.
а СП я тоже читал. но видимо чего то не понял, или понял но нет, или не так понял.
(24) Ну, в СП буквально следующее: "Если кнопка связана не с командой формы , содержит пустую строку" (для свойства "ИмяКоманды").
А ты точно пробовал указывать имя команды БЕЗ точки после "ОбщаяКоманда"? Ну и если у тебя общая команда все-таки параметризирована, то не получится, я думаю.
ЗЫ. Ну а на том, что в конфигураторе пишет - можно особо не зацикливаться. Для ТЗ на форме, например, конфигуратор в колонке тип показывает "Таблица значений", хотя на самом деле тип - "ДанныеФормыКоллекция". Т.е. они скорее своими соображениями удобства руководствовались, чем точностью отображения сути.
У меня получилось так:
В модуле формы при создании на сервере
НоваяКоманда = Команды.Добавить(" КакаяТоКоманда ");
НоваяКоманда.Действие = "ОбщаяКоманда.КакаяТоОбщаяКоманда";
Добавляем кнопку на форму:
НоваяКнопкаОбщейКоманды = Элементы.Добавить("НоваяКнопкаОбщейКоманды", Тип("КнопкаФормы"), ЭтаФорма.КоманднаяПанель);
НоваяКнопкаОбщейКоманды.ИмяКоманды ;
(31) Пробовал: команда добавляется, но она никак не связана с общей командой и по нажатию ничего не происходит. Платформа 8.3.10.2580. Могу выгрузить банальную dt-шку, где 1 справочник, 1 команда и 1 форма, но я думаю каждый такую сможет сделать)
(32) получилось решить проблему следующим образом, через гиперссылку (вставьте свою):
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Кнопка = Элементы.Добавить("МояКнопка", Тип("ДекорацияФормы"), ЭтотОбъект);
Кнопка.Заголовок = Новый ФорматированнаяСтрока(НСтр("ru = 'Сотрудники.'"). "e1cib/command/Справочник.Команда.СотрудникиВнештатные");
the1; TuneSoft; assa; Drivingblind; fvr2000; ivakop; kondratevsergey1985; maxim_1c; Boneman; + 9 – Ответить
Обработка тестировалась на релизе платформы 8.3.13.1513.
Специальные предложения
полезные данные! удобно сразу все собрано в одном месте
для добавление реквизитов с помощью расширений очень удобно
Смысл добавлять реквизиты и элементы программно, если обработчики для них нужно прописывать в коде формы.
Было бы больше пользы - если бы показали "типовые приемы" обработки событий программно добавленных элементов.
(1) Смысл в том что элементы формы могут "слететь" при обновлении конфигурации. А если их задавать программно, то объединение кода намного проще, особенно если пользоваться KDiff например.
Я давно перешел на такой способ добавления реквизитов на форму (в шапки документа, в табличную часть). Правда основной кусок кода выносится в Общие модули.
(2)Согласен. Пришел к этому опытным путем.
Тоже элементы добавляю программно. При сравнении-объединении сразу видны изменения. И не нужно потом еще форму руками менять.
(1) В примере добавления поля ввода, показано добавление обработчика
/Можно добавить обработчик события
//См. синтакс-помощник чтобы узнать список событий
// Интерфейс (управляемый) -> Поле формы -> ПолеФормы -> События
// а так же остальные варианты расширения поля формы в зависимости от вида кнопки
// Интерфейс (управляемый) -> Поле формы -> Расширение поля ввода -> События
// и прочее
ПолеВвода.УстановитьДействие(
"ПриИзменении", //Имя события
"ПриИзмененииКомментария"); //Имя процедуры обработчика
(3) Как добавить обработчик не расположенный в форме? В тех случаях когда я из внешней (по отношению к форме) части программы хочу добавить кнопку или поле ввода. Насколько я знаю (могу и ошибаться) назначить обработчик можно только расположенный в модуле формы. А значит надо исполнять "танцы с бубном" по вызову своих обработчиков (расположенных например в общем модуле) из обработчиков расположенных на форме. И тут получается несостыковочка. Вроде бы форму можно полностью построить программно. Но не полностью . т.к. обработчики должны быть в форме заранее.
Если есть какой-то способ обойти это "ограничение" - буду рад если поделитесь со мной.
(1) в современных конфигурациях, про обработчики уже позаботились. В формах есть подключаемая процедурка
Подключаемый_ВыполнитьПереопределяемуюКоманду(Команда)
которая ведет в общий модуль СобытияФормКлиент.ВыполнитьПереопределяемуюКоманду
Там в свою очередь, есть вызов ОбщегоМодуля МодификацияКонфигурацииКлиентПереопределяемый.ВыполнитьПереопределяемуюКоманду(Форма, Команда, ДополнительныеПараметры);
где по имени команды и формы, можно определить свою, и напилить свои обработчики.
В итоге, получим абсолютно неизмененный объект, на поддержке. но в нем, программно добавленная кнопка и свой обработчик событий.
единственное, что у некоторых элементов параметров, предполагается много. и они как бы будут недоступны..но тут приходится или маневры искать, или немного усовершенствовать.. но в простых случаях, вполне себе все решаемо
(4) Так-то оно так. Если дело касается добавления какой-нибудь "некузявой" кнопочки, или чего-то незначительно-дополняющего функциональность формы или объекта который форма представляет.
Но если копнуть глубже, и рассматривать некую систему в которой есть оснастка, в которую разные модули (подсистемы) добавляют нужные им элементы управления (списки, диаграммы, таблицы со связью один ко многим и т.п.). Да еще и замахнуться на механику, когда пользователь сам решает какие модули и подсистемы ему нужны. Другими словами, разработать решение в стиле "плагинов" как во всяких там WinAmp-ах и прочих модных штуках. И тут получается нужно в форме-оснастке предусмотреть все возможные типы событий (который на ИТС кстати рекомендуют обрамлять префиксом "Подключаемый_"), а потом еще и у этих событий предусмотреть модель поведения когда нужны: а) только клиентские вызовы, б) клиентские и внеконтекстные сервеные, в) клиентские и контекстные серверные вызовы.
Поэтому да, многое можно, но навык "танец с бубном" должен быть 99lvl
И речь в данном случае не о "сферическом слоне в вакууме", а о например Рабочем Месте, которое настраивается в зависимости от роли пользователя, подразделении пользователя, полномочиям которые ему делегировали временно или постоянно и т.п.
В целом, я не пытаюсь очернить, или критиковать подходы. Просто думаю разумно было бы - побольше раскрыть нюансы именно обработки событий программно-добавленных элементов. Описать на какие подводные грабли можно наступить, как обойти.
(1) https://infostart.ru/public/1106063/ как раз заложена логика обработки событий от элементов формы. Тут нужно поиграться с именами :) и Выполнить("Кусок кода") и будет магия практически программного создания всего :)) тоже столкнулся с проблемой сначала как блин подготовить неизвестное количество событий-процедур для команд. но оказалось нужна одна, но хитровыкорчеванная, грабли конечно, но вариант имеет право на жизнь.
(1) Смысл есть. К примеру, сегодня выполнял такую задачу. Динамическое количество кнопок и у каждой кнопки была своя задача. Код для всех задач был одинаковый, но уникальность кода для каждой кнопки выполнил алгоритмически
Если УФ и платформа больше 8.3.10, то имхо, проще заюзать расширение. В нем нагляднее и конфа не снимается с поддержки.
(5) Не соглашусь, таким образом невозможно понять, какие реквизиты были добавлены в расширении, а какие уже были в исходной конфигурации.
Когда придет время обновлять расширение, эти вопросы обязательно могут возникнуть.
С расширением порядок проблем при обновлении намного меньше. С 8.3.6 их начал юзать, и функционал расширений только улучшается.
Ранее да, на ОФ именно программным кодом пользовался, и вот ни разу не визуально, и весьма проблематично. Пользовался обработкой с инфостарта по декомпиляции форм. Т.е. сперва визуально делаешь, потом в програмный код. Так вот телодвижений и в УФ осталось много. С расширением все намного проще. Мое имхо, конечно же.
Ошибочка. Добавлять элементы на форму надо с проверкой, например,
Если Элементы.Найти("Владелец") = Неопределено Тогда
ПолеВвода = Элементы.Добавить("Владелец", Тип("ПолеФормы"), ЭтаФорма);
ПолеВвода.Заголовок = "Владелец";
ПолеВвода.Вид = ВидПоляФормы.ПолеВвода;
ПолеВвода.ПутьКДанным = "Объект.Владелец";
КонецЕсли;
Они ведь иногда появляются, когда 1с-овцы трезвеют.
К тому же, если на форме много изменений, процесс перехода на расширение может занять большое время, и элемент всё ещё может присутствовать в конфигурации на форме, поэтому надо включать защиту от дурака уже заранее.
(11)Описанная проблема обычно решается установкой префикса в имени добавляемого реквизита.
Максимум, 1с-овцы могут добавить аналогичное по содержанию поле. И их будет 2 на форме.
Как добавить реквизиты/кнопки в нужное место(Форма, Группа, Командная панель) например в начало списка, по умолчанию элементы добавляются в конец
(12) Вставить вместо добавить. Пример для кнопки контекстного меню. Нам надо вставить ее в начало списка меню:
Как вариант, сначала создать список значений как реквизит формы, затем добавить поля формы и связать их с реквизитом формы, указав в пути к данным путь "ИмяРеквизитаСпискаЗначений[ИндексСтроки].Пометка" и "ИмяРеквизитаСпискаЗначений[ИндексСтроки].Представление"
Любое изменение флажка будет так же влиять и на список значений.
полезные данные! удобно сразу все собрано в одном месте
для добавление реквизитов с помощью расширений очень удобно
(33)Предлагаю проверить такой вариант, результат удивит:
Коллеги, приветствую!
Сейчас разбираюсь с подобной задачей. Но мне нужно кнопки командной панели создавать при наступлении события, а не только "однажды" "присозданиинасервере". Есть у кого-нибудь готовые алгоритмы?
В связи с развитием системы расширений многие разработчики 1С сталкиваются с проблемой: если форма захвачена и на ней произведены изменения, то после обновления в основной конфигурации формы, эти изменения не будут отражены на захваченной форме. Получается, что форму после обновления надо каждый раз проверять. Это трудно и "убивает" все плюсы расширения. Но из любой непростой ситуации есть выход, если знать, где его искать. Можно захватить форму в расширение и не изменять её, а все новые реквизиты добавить программно. Тогда при обновлении формы в основной конфигурации 1С 8.3, форма измениться в расширении, и добавленные реквизиты будут корректно отображаться в ней.
В этой статье я постараюсь собрать все основные методы создания реквизитов на форме.
1. Добавляем реквизит
Начнем с самого простого. Мы добавили реквизит "МоеРасширение_НаименованиеНаАнглийском" в справочник контрагентов.
Для того, чтобы вывести его на форму програмно, пишем код процедуры "МоеРасширение_ПриСозданииНаСервереПосле" (Отказ, Стандартная Обработка).
НовыйЭлемент = Элементы.Добавить ("МоеРасширение_НаименованиеНаАнглийском", Тип("ПолеФормы"));
НовыйЭлемент.ПутьКДанным = "Объект. МоеРасширение_НаименованиеНаАнглийском";
Теперь мы добавим на форму реквизит, которого нет в конфигурации. Например, выведем на форму текущую задолженность: реквизит "МоеРасширение_ТекущаяЗадолженность".
Сначала создадим реквизит:
ДобавляемыеРеквизиты = Новый Массив;
НовыйРеквизит = Новый РеквизитФормы("МоеРасширение_ТекущаяЗадолженность"), Новый ОписаниеТипов ("Число", "Текущая задолженность");
Затем выведем его на форму таким же образом, как и добавленный в конфигурацию реквизит, разница только в поле "ПутьКДанным" – здесь мы пишем наименование только что созданного реквизита:
НовыйЭлемент = Элементы.Добавить("МоеРасширение_НаименованиеНаАнглийском", Тип("ПолеФормы"));
Теперь переместим наши реквизиты под поле "Полное наименование". Для этого надо определить на форме место добавления, в нашем случаем – над группой "ГруппаКолонки":
Для того, чтобы отрабатывались процедуры событий для этих реквизитов, можем указать действия:
Элементы. МоеРасширение_ТекущаяЗадолженность.УстановитьДействие("ПриИзменении", "МоеРасширение_РасшифроватьЗадолженность").
2. Добавление кнопки
Для того, чтобы произвести добавление кнопки на форму, сначала надо програмно добавить команду.
НоваяКоманда.Заголовок = "Показать ОСВ".
ВАЖНО!! В поле действие пишется имя процедуры.
Теперь добавляем саму кнопку:
НоваяКнопка = Элементы.Добавить("МоеРасширение_Кнопка_ПоказатьОСВ", Тип("КнопкаФормы"));
3. Добавление группы
Для добавления группы переместим кнопку к полю "Текущая задолженность". На этом этапе нам надо создать группу и переместить в нее уже созданные наши элементы.
Создаем группу и помещаем ее под наименованием. Затем переносим в нее реквизит "Текущая задолженность" и кнопку "Показать ОСВ":
НоваяГруппа =Элементы.Добавить("МоеРасширение_ГруппаЗадолженность", Тип("ГруппаФормы"));
4. Добавляем табличную часть 1С
Добавим к контрагенту табличную часть 1С "МоеРасширение_Номенклатура" с реквизитом "Номенклатура" и выведем ее на форму.
Сначала мы добавляем табличную часть на форму, после чего описываем все колонки, которые должны отображаться на форме.
ВАЖНО! При создании реквизитов таблицы родителем указывается реквизит формы "Табличная часть".
НоваяТабличнаяЧасть = Элементы.Добавить("МоеРасширение_ТаблицаНоменклатура", Тип("ТаблицаФормы"));
НовыйРеквизитТабличнойЧасти = Элементы.Добавить("МоеРасширение_Номенклатура", Тип("ПолеФормы"),НоваяТабличнаяЧасть);
Используя этот базовый набор, можно изменить любую форму программно. И при обновлениях форма всегда будет подстраиваться под выбранный алгоритм. Если форма поменяется глобально, то расширение выдаст ошибку. Тогда, переписав несколько строчек кода, мы снова получим рабочую форму. Это быстрее и проще, чем каждый раз анализировать диалоговую форму.
Специалист компании «Кодерлайн»
Вас могут заинтересовать следующие статьи:
Как программно добавить в командную панель кнопку со стандартной функцией "Сортировать по убыванию"?
Можно, например, включить автозаполнение в ком. панели, потом при открытии создать структуру или массив с действиями, заполнить его, и после этого отключить автозаполнение
Код 1C v 8.х
Похожие FAQ
Google maps, поиск оптимального маршрута 5
В данном посте хочу коснуться основных аспектов построения оптимального маршрута с использованием API Google maps. Исходные данные для построения маршрута: * Географические координаты объектов, которые хранятся в базе; * Координаты начальной и коне База 1С при запуске уходит в дамп и вылетает 1
В последнее время частенько обращаются пользователи у которых после замены или ремонта компьютера 1С не запускается, а точнее при открытии уходит в dump и вылетает. Как правило, решение одно: Отключить аппаратное ускорение видеокарты В Window В регламентированной отчетности не печается штрих-код 1С ( EanGnivc ) 0
Установка шрифта EanGnivc В формах регламентированной отчетности, например, налоговые декларации, которые введены для предоставления отчетности, на всех листах в левом верхнем углу содержат свой уникальный штрих-код. В этих формах, которые распрос Горячие клавиши 1С Пользователю [ Предприятие] 5
Основные команды: Интерфейс: F6 - переключение между формами рабочего стола F10 - переход в главное меню окна Alt+1 - переход на панель Разделов Alt+2 - переход на панель Навигации Alt+3 - переход на панель Действий Alt+9 - переход Горячие клавиши 1С Разработчику [ Конфигуратор ] 128
Основные команды: Кодирование: Ctrl+Пробел - вызов подсказки Ctrl+Q - вызов шаблона Ctrl+F1 - поиск в синтакс-помощнике Ctrl + L - удалить текущую строку Alt+Shift+F - отформатировать код Исследование: F12 - ставим курсор на про Посмотреть все результаты поиска похожих
Читайте также: