Управляемое приложение: правильное программное открытие форм
Разработка - Работа с интерфейсом
23:07:17Для начала небольшое лирическое отступление. Расскажу о том, как НЕ НАДО открывать формы.
Нельзя использовать метод ПолучитьФорму(). Это нельзя делать по двум причинам. Первая причина — это то, что этот метод отрабатывает на порядок медленнее, чем методы ОткрытьФорму() или ОткрытьФормуМодально(). Вторая причина кроется в том, почему собственно такой метод используется. Это обычно делается, когда нужно как-то программно обработать форму перед открытием. Например, нужно установить отбор динамического списка в форме выбора. Давайте рассмотрим, как обычно используется метод «ПолучитьФорму()» и чем ошибка использования такого метода. Программный код открытия формы выбора с отбором выглядит примерно так:

Ошибка здесь заключается в том, что код программной обработки формы вполне может вступить в конфликт с кодом события «ПриСозданииНаСервере» формы. Это может произойти не сразу. Например, в модуль формы внесли изменения гораздо позже. Причем тот разработчик, который вносил изменения в модуль формы окажется прав. Откуда ему знать, что его форма откуда-то вызывается таким образом?
Если вы хотите, чтобы ваше приложение работало в Web-Интерфейсе, то лучше воздержаться от открытия форм в Модальном режиме. В таком режиме они реализованы как всплывающие окна, которые по умолчанию отключены в большинстве браузеров. Вместо Модального режима можно использовать свойство управляемой формы РежимОткрытияОкна = "Блокировать окно владельца".
Про запреты все, расскажу, как правильно открывать формы
1. Как открыть форму объекта имея ссылку на него
Если нужно открыть основную форму объекта, то все очень просто
&НаКлиенте
Процедура ОткрытьФорму(Команда)
ОткрытьЗначение(СсылкаНаОбъект);
КонецПроцедуры
2. Как открыть форму выбора произвольного объекта
Простой вариант открытия: никакой дополнительной программной обработки формы не требуется. Нужно просто открыть основную форму выбора и получить выбранное значение. Используем метод «ВвестиЗначение». Синтаксис следующий:
&НаКлиенте
Процедура Команда1(Команда)
Перем ВыбЗнач;
Массив = Новый Массив;
Массив.Добавить(Тип("СправочникСсылка.Контрагенты"));
ОписаниеТиповК = Новый ОписаниеТипов(Массив);
Если ВвестиЗначение(ВыбЗнач, "Введите значение", ОписаниеТиповК) Тогда
Сообщить(ВыбЗнач);
КонецЕсли;
КонецПроцедуры
Если задать несколько возможных типов, то программа перед выбором значения предложит пользователю выбрать тип.
Использование метода ОткрытьФорму()
Сначала нужно разобраться с параметрами метода «ОткрытьФорму». Полный список параметров выглядит так:
ИмяФормы, Параметры, Владелец, Уникальность, Окно
С параметром «ИмяФормы» все более или менее понятно. А вот про то, что за загадочная штука «Параметры» (тип – Структура), в справке 1С написано очень мало. Передать туда можно все, что можно передать с клиента на сервер. Однако этой информации явно недостаточно. Попробую разобрать все возможные варианты.
3. Как открыть форму существующего объекта ссылочного типа
У формы любого объекта или записи регистра есть так называемый ключевой реквизит. В списке реквизитов формы он выделен полужирным. Чтобы открыть форму объекта, нужно в параметрдобавить элемент с Ключом «Ключ» и значением — ссылкой на нужный объект. Например:
&НаКлиенте
Процедура ОткрытьФормуПроекта(Команда)
П = Новый Структура;
П.Вставить("Ключ", Проект);
ОткрытьФорму("Справочник.Проекты.ФормаОбъекта", П);
КонецПроцедуры
4. Открыть форму существующей записи регистра
Очень похоже на открытие формы объекта ссылочного типа, однако в элементе «Ключ» вместо ссылки мы передаем Ключ записи регистра. Например:
&НаКлиенте
Процедура ОткрытьФормуРегистра(Команда)
КлючЗаписи = Новый Структура;
КлючЗаписи.Вставить("Период", ТекущаяДата());
КлючЗаписи.Вставить("ФизЛицо", Сотрудник);
МассивКлюча = Новый Массив;
МассивКлюча.Добавить(КлючЗаписи);
КлючЗаписиРегистра = Новый("РегистрСведенийКлючЗаписи.ФИОФизЛиц", МассивКлюча);
П = Новый Структура("Ключ", КлючЗаписиРегистра);
ОткрытьФорму("РегистрСведений.ФИОФизЛиц.ФормаЗаписи", П);
КонецПроцедуры
5. Как открыть форму нового объекта с обработкой заполнения
Это даже проще, чем открыть форму существующего. Мы просто не указываем в параметрах «Ключ».
&НаКлиенте
Процедура ОткрытьФорму(Команда)
П = Новый Структура;
ОткрытьФорму("Справочник.Проекты.ФормаОбъекта", П);
КонецПроцедуры
В это случае вызывается процедура «ОбработкаЗаполнения» модуля объекта. Эта процедура имеет единственный параметр «Основание». Если мы в параметры вставим ключ «Основание», то он будет передан в процедуру «ОбработкаЗаполнения». Например,
&НаКлиенте
Процедура ОткрытьФорму(Команда)
П = Новый Структура;
П.Вставить("Основание", Проект);
ОткрытьФорму("Справочник.Проекты.ФормаОбъекта", П);
КонецПроцедуры
6. Как правильно организовать выбор (подбор) в табличную часть
Стоит знать, что все параметры, указанные в параметреметода открыть форму, доступны в событии «ПриСозданииНаСервере» открываемой формы. Например:
&НаКлиенте
Процедура ОткрытьФорму(Команда)
П = Новый Структура;
П.Вставить("Основание", Проект);
ОткрытьФорму("Справочник.Проекты.ФормаВыбора", П);
КонецПроцедуры
Тогда в событии «ПриСозданииНаСервере» формы элемента справочника Проекты можно будет получить «НашПараметр». Однако форма справочника проекты может открываться, откуда угодно и этого параметра может и не быть. Поэтому лучше проверить, что параметр действительно передан при помощи такой конструкции:
&НаСервере
Процедура ПриСозданииНаСервере()
Если Параметры.Свойство("НашПараметр") Тогда
ПереданныйПараметр = Параметры.НашПараметр;
//Программная обработка формы
КонецЕсли;
КонецПроцедуры
Чтобы организовать выбор, нужно знать еще пару моментов. Первое, это параметр метода «ОткрытьФорму». В качестве владельца может выступать другая форма или элемент управления. Этот параметр, во-первых будет доступен в свойстве «ВладелецФормы» открываемой формы, а во-вторых, после совершения пользователем выбора стандартным способом (т.е. через форму выбора, по нажатии кнопки «Выбрать»), у Владельца сработает событие «ОбработкаВыбора».
&НаКлиенте
Процедура ОткрытьФорму(Команда)
П = Новый Структура;
П.Вставить("НашПараметр", Проект);
ВладелецФормыПодбора = Элементы.ПодчиненныеПроекты;
ОткрытьФорму("Справочник.Проекты.ФормаВыбора", П, ВладелецФормыПодбора);
КонецПроцедуры
В том случае, если выбор происходит не стандартным способом, т.е. открывается не форма выбора, а какая-то произвольная форма, то стоит использовать метод ОповеститьОВыборе(), при этом установив через параметры свойство открываемой формы ЗакрыватьПриВыборе = Истина. Например,
&НаКлиенте
Процедура ОткрытьФорму(Команда)
П = Новый Структура;
П.Вставить("НашПараметр", Склад);
П.Вставить("ЗакрыватьПриВыборе", Истина);
ВладелецФормыПодбора = Элементы.Товары;
ОткрытьФорму("Обработка.ПодборНоменклатуры.Форма", П, ВладелецФормыПодбора);
КонецПроцедуры
В самой форме организуем программно выбор таким образом:
&НаКлиенте
Процедура Выбрать(Команда)
РезультатВыбора = ПодготовитьРезультатВыбора();
ОповеститьОВыборе(РезультатВыбора);
КонецПроцедуры
&НаСервере
Функция ПодготовитьРезультатВыбора()
//Готовим результат выбора
КонецФункции
В результате выполнения метода ОповеститьОВыборе форма подбора закроется и вызовется событие «ОбработкаВыбора» элемента управления «Товары».
Прочие полезности. В случае подбора в форму можно передать параметры, чьи названия говорят сами за себя: «ЗакрыватьПриВыборе», МножественныйВыбор, ЗакрыватьПриЗакрытииВладельца. Все параметры имеют тип Булево. Их названия говорят сами за себя.
7. Как открыть форму и установить в ней отбор
Простая ситуация: простой отбор по одному или нескольким реквизитам. Например, что-то вроде такого
Контрагент = ВыбранныйКонтрагент И Организация = ВыбраннаяОрганизация
Для организации такого отбора нужно использовать параметр «Отбор», тип Структура, где Ключ – это Имя поля динамического списока, а значение это собственно то, почему нужно фильтровать данные. Например:
&НаКлиенте
Процедура ОткрытьФорму(Команда)
П = Новый Структура;
Отбор = Новый Структура;
Отбор.Вставить("Владелец", Контрагент);
П.Вставить("Отбор", Отбор);
ОткрытьФорму("Справочник.ДоговорыКонтрагентов.ФормаВыбора", П);
КонецПроцедуры
В том случае если отбор сложный и его можно установить только программно, то можно пойти двумя путями:
Первый путь: не самый удачный. Открываем форму, передаем в нее параметр
&НаКлиенте
Процедура ОткрытьФорму(Команда)
П = Новый Структура;
П.Вставить("Подразделение", Подразделение);
ВладелецФормыПодбора = Элементы.Сотрудник;
ОткрытьФорму("Справочник.СотрудникиОрганизаций.ФормаВыбора", П, ВладелецФормыПодбора);
КонецПроцедуры
В самой форме в событии «ПриСозданииНаСервере» задаем отбор списка:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Параметры.Свойство("Подразделение") Тогда
СписокСотрудников = ПодготовитьСписокСотрудниковПодразделения(Параметры.Подразделение);
НовыйЭлемент = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
НовыйЭлемент.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Ссылка");
НовыйЭлемент.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке;
НовыйЭлемент.ПравоеЗначение = СписокСотрудников;
НовыйЭлемент.Применение = ТипПримененияОтбораКомпоновкиДанных.Элементы;
КонецЕсли;
КонецПроцедуры
Второй путь - это использование Параметов Выбора и поэтому он лучше. Пример:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
Подразделение = Объект.Подразделение;
НовыйПараметр = Новый ПараметрВыбора("Подразделение ", Подразделение);
НовыйМассив = Новый Массив;
НовыйМассив.Добавить(НовыйПараметр);
НовыеПараметры = Новый ФиксированныйМассив(НовыйМассив);
Элементы.Сотрудник.ПараметрыВыбора = НовыеПараметры;
КонецПроцедуры
Почему параметры выбора использовать лучше:
1) Мы не отказываемся от стандартной обработки выбора: меньше кода
2) Параметры выбора будут доступны в процедуре «ОбработкаПолученияДанныхВыбора» модуля менеджера выбираемого объекта. Поэтому мы сможем ограничить список доступных значений выбора при вводе по строке.
Уникальность формы
Т.к. форму нельзя открывать модально, то вполне вероятно, что пользователь может несколько раз нажимать одну и ту же кнопку, открывающую форму. Чтобы форма не открывалась каждый раз, а активизировалась уже открытая форма, нужно заполнить параметр. Тип значения этого параметра произвольный, т.е. в него можно передать все, что угодно. Удобно в него передавать УникальныйИдентификатор формы, из которой производится открытие. Например,
ВладелецФормы = Элементы.Сотрудники;
ОткрытьФорму("Справочник.СотрудникиОрганизаций.Форма", , ВладелецФормы, ЭтаФорма.УникальныйИдентификатор);
Платформа будет искать открытые окна с таким ключом уникальности. В том случае, если она их найдет, то будет активировано существующее окно. В противном – открыто новое.
ТОП-6 инструментов для разработчика 1С
Подборка лучших инструментов для разработчика 1С включает Toolkit, DCT, OneDebugger, PrintWizard, DataFormWizard и Infostart MCP. Любой инструмент со скидкой 20% при покупке от двух решений.
Вступайте в нашу телеграмм-группу Инфостарт
Открыть форму программно открыть управляемую форму как открыть форму документа управляемые формы как открытьформу как открытьформу() как получить форму объекта как получить форму в 8.2
Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».
- 0% комиссии — оплата напрямую исполнителю;
- Исполнители любого масштаба — от отдельных специалистов до команд под проект;
- Прямой обмен контактами между заказчиком и исполнителем;
- Безопасная сделка — при необходимости;
- Рейтинги, кейсы и прозрачная система откликов.
См. также
Работа с интерфейсом Анализ учета Мониторинг 1С:Предприятие 8 1С 8.3 1C:Бухгалтерия 1С:Бухгалтерия 3.0 1С:ERP Управление предприятием 2 1С:Управление холдингом 1С:Зарплата и Управление Персоналом 3.x 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Управление торговлей 11 Платные (руб)
Создайте свой функциональный интерфейс в любой конфигурации 1С с помощью расширения Infostart Dashboard. Настраивайте панели виджетов с метриками, индикаторами и показателями на начальном экране. Узнайте возможность внедрения подсистемы у себя в конфигурации с помощью бесплатной обработки "Анализ внедрения подсистемы 1С Infostart Dashboard"!
31720 руб.
27.03.2025 92360 69 44
Консолидация данных Работа с интерфейсом Разработчик Пользователь 1С:Предприятие 8 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 1C:ERP Узбекистан Беларусь Кыргызстан Россия Казахстан Платные (руб)
Знакомая ситуация? Пользователи, особенно менеджеры, уверены: отборов много не бывает. Идут пожелания добавить в форму списка еще один быстрый фильтр, еще два, еще пять... В итоге интерфейс превращается в нагромождение полей отбора, а потребность в «самом главном» отборе, который «вот прямо сейчас нужен», все равно не закрыта. Универсальное расширение, которое решает эту проблему элегантно и технологично. С его помощью в любую форму списка можно легко добавить панель настраиваемых кнопок-закладок, каждая из которых применяет сложный фильтр-запрос, а так же показывает актуальное количество элементов в реальном времени.
6088 руб.
17.10.2025 3673 3 0
Разработка Инструментарий разработчика Работа с интерфейсом Адаптация типовых решений Нейросети 1C:Бухгалтерия 1C:ERP 1С:ЗУП 1С:КА 1С:УНФ 1С:УТ 1С:Розница 1С:ДО 1С:ERP Управление предприятием 2 Платные (руб)
Разработка "Дизайнер форм 1С" реализована в виде расширения 1С и является универсальным инструментом для разработки прототипа форм с целью демонстраций, технических заданий и т.д. Без участия разработчика с возможностью экспорта в файл внешней обработки и генерации формы используя искусственный интеллект.
36600 руб.
28.08.2025 10372 2 2
Работа с интерфейсом Разработчик Стажер 1С:Предприятие 8 Бесплатно (free)
Это инструкция по дизайну форм в среде 1С. Гайд охватывает рекомендации и стандарты для оптимизации пользовательского интерфейса. В гайде содержатся указания по использованию элементов интерфейса, включая как основные, так и продвинутые аспекты. Предоставляются также примеры и антипримеры для наглядного понимания принципов дизайна
20.08.2024 57451 mrXoxot 44
Работа с интерфейсом Разработчик 1С:Предприятие 8 Бесплатно (free)
Пример простого и симпатичного прогресс-бара в динамическом списке, без картинок, используя редактирование запроса.
27.05.2024 30015 smielka 39
Инструментарий разработчика Работа с интерфейсом Разработчик 1С 8.3 Абонемент ($m)
Подходит для создания web-страниц для замены управляемых форм 1С, красивых отчетов, интерфейса мобильного приложения на платформе 1С и для простых страниц веб-сайтов.
1 стартмани
10.04.2023 19491 190 acces969 31
Работа с интерфейсом Разработчик 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)
Питничная фантазия на возможности в разработке интерфейсов формы с помощью Платформы 1С - делаем свою подсказку. Публикация содержит готовую библиотеку программного формирования данной подсказки.
12.08.2022 16982 top_1c 39
Работа с интерфейсом Разработчик 1С:Предприятие 8 1C:Бухгалтерия Абонемент ($m)
"MVC плохо применима в 1С" - познакомьтесь с моделью состояния и, возможно, ваше мнение поменяется! Представленное решение является эволюционным развитием идеи реализации MVC для 1С. В новой версии добавлены DSL для описания модели состояния, а также параметризация свойств параметров и элементов формы.
1 стартмани
05.07.2022 17979 kalyaka 8
Синтакс-помощник еще надо уметь читать и понимать.
Автор молодец. понятным языком наглядно объяснил то, что "и так понятно" спесивым фыркающим "профи".
Мне понравилось.
З.Ы. Эх если бы фыркающие так же понятно свой код комментировали.....
Благо, встроенный язык 1С не ограничивает нас идиотскими требованиями к именам переменных типа "не более 8 английских букв".
(8) Famza, можно использовать шаблоны текста. Хороший пример - у Павла Чистова. Потом можно и свои шаблоны настроить.
Лично мне шаблоны реально помогают ускорить написание и оформление кода. В том числе - вписывание развернутых комментариев.
Кто на 8.2 - есть еще Снегопат, на 8.3 пока что только бета-версия, и та, говорят, падает (сам не проверял).
(12) а я так и написал, что когда нужен только один тип. Если нужно несколько - то через описание типов.
(30) Yashazz,
МОЛОДЕЖЬ!!! Я не готов платить такие деньги тому, кто будет три дня придумывать как сохранить текст из ПолеТекстовогоДокумента в файл формата txt. Тут всех дел-то на 15 минут с тестированием! Адекватнее нужно оценивать свои способности (на текущий момент)!
И напоследок про "штудирование и читание книжек". Пара примеров из личного опыта:
Прошел официальный курс от 1С по СКД, сел писать одну фишку. Уперся. Нутром чую - дел на три минуты. Синтакс-помощник не дает ответа, методичек по курсу не полагается, пошел искать. Нашел ответ на Инфостарте, а не на Мисте или ДевТрейне.
Перешел на 8.3.3, снял режим совместимости. Перестали работать динамические списки с преднастроенными отборами - отборы перенесли в компоновщик настроек. Книжек еще нет, синтакс-помощник оказался синтакс-непомощником.
Так что делиться опытом и знаниями нужно. А для жадных есть вариант проведения платных консультаций. =)
По поводу зарплаты в 40к... Да, пока мы от Украины не откусили, и доллар не подняли вдвое, 40 тыщ было неплохо
Сейчас это даже не 600 баксов
По поводу книг и помощника согласен, в помощнике не полная инфа зачастую, и нет примеров на некоторые вещи неочевидные, заметил уже, приходится гуглить чтобы понять как и чего делать. А книг по 1С ничтожно мало. Странно что сторонние авторы перестали издавать книги по платформе. Типа Бартеньева в свое время по 7.7 и тд. Был Кашаев, тоже от него чего - то с 15 года нет ничего. 1С по ходу, монополию установили на издание литературы по своему продукту? Нужен наверно сертификат 1С Совместимо)))))))
а вот авторские комментарии вида "я, Вася Неизвестный, в такое время такой даты по задаче такой" внутри своего кода уже нет.
тут и вправду гит рулит.
зы а вообще поднимать темы в ветке, которой более 8 лет, весьма прикольно )
По вопросу: "Например, открыли форму нового элемента, а как потом понять, записал юзер его или отказался?"
Раз уже вы спрашиваете, то видимо у вас есть какие-то соображения на этот счет. В подобной ситуации я использовал что-то такое: Оповестить("ИзменениеСтатуса", , ЭтаФорма.ВладелецФормы); в событии "ПослеЗаписи" В таком случае в форме-владельце вызывалась обработка оповещения и там уже проверялось: отказался пользователь от записи или нет.
(2) Это сайт профи, а не "лягушатник" для новичков. Хотим - фыркаем. Мне вот совсем непонятно, почему люди упорно не хотят учиться "читать СП", а жаждут халявы, которую им разжуют и в ротик положат. И тем более мне непонятно, почему перепост из Радченки, жёлтых книжек и СП набирает столько плюсов.
Минус поставил за безапелляционное "нельзя использовать ПолучитьФорму".
(33) Фыркаю потому, что ресурс засоряется. Повторюсь, есть DevTrain, есть Миста, дофига всего. Тут-то зачем? Ну и... халявщиков не люблю и тех, кто их прикармливает, тоже. А я сам далеко-о-о не профи (особенно в УФ), так что нинада))), мне ишшо учиться и учиться.
Вообще, забавно. Вот, например, курс по 1С-Эксперт удалили, он-де нарушает авторские права 1С, а передирать в сотый раз Радченку или Хрусталёву - это не нарушение авторских прав.
Вот посещение подобных сайтов, как Инфостарт и прочих перечисленных для многих является элементом процесса штудирования. Например поштудировал СП и желтые книжки, в голове ответа не появилось. полез в гугл, набрел на инфостарт, а тут, опа!! вот же он ответ.
или предлагаете до дыр перечитывать? пока глазки не выпадут? Чтобы был повод фыркнуть потом.
Думаю лучше спросить у профессионалов, которым не в падлу поделиться своими знаниями с коллегами.
Ведь одна из целей создание подобного сайта думаю - это обмен опытом и знаниями.
ну и как побочный эффект, средство возвеличивания фыркунов и спесивых профи.
Если знанием не делиться, от него нет толку. Деньги потратишь, сам помрешь, а знания исчезнут в твоей гениальной голове.
Или вот, какие параметры из типовых-штатных являются ключевыми?
Или, например, хотите вы сделать строку текущей, пишете спокойно Параметры=Новый Структура("ТекущаяСтрока",МояСсылка), а там бац, и ВосстанавливатьТекущуюСтроку=Истина. И не сработает, потому что сначала отрабатываются параметры, а потом восстанавливается позиция.
Ну итд.
опять фыркает -))
Ну ладно, не удержался и подколол
А серьезно, ответьте себе на вопрос "а зачем я зашел на инфостарт и на эту страницу в частности?"
1. за опытом, новыми сведениями
2. убедиться, что я до сих пор самый умный
3. опустить очередного графомана
4. свой вариант
Впрочем, конечно, это к суппорту скорее вопросы.
(43) И то верно. Прикладной выхлоп всё ж побольше.
Кстати, маленький оффтоп про не-управляемые формы. Желающим извратиться предлагаю поиграть с формой в режиме рабочего стола, максимизированно раскрытой и модально вызванной. В ряде случаев даже Alt+Tab не спасает. )))
Ну и вопросы автору (ответов не знаю): когда в типизированном поле находится битая ссылка этого типа, что сделает УФ при щелчке на поле лупы - откроет форму нового объекта? И можно ли будет её потом подхватить через опрос окон?
Для обычных форм - пишет "объект не найден". Новый создавать не предлагает.
(55) AlX0id, работает в обычном приложении. В управляемом приложении работает на сервере.
Конкретный пример кода отрабатывает в толстом клиенте обычного приложения, толстом клиенте управляемого приложения. В тонком клиенте не отрабатывает - не может создать документ. А это уже другая задача - задача передать незаписанный документ с сервера на клиент.
Эээ.. Ну и в каком месте это другая задача?
Я, конечно, не уточнил, что в тонком клиенте, но вроде бы автор понял. Виноват, каюсь.
Есть у меня обработка. Встроенная (или принципиально внешнюю?). Обычная форма. На ней поле выбора с типом "любая ссылка". Выбрал элемент справочника, потом удалил его (из формы списка справочника), совсем удалил. Нажимаю на лупу - пишет "объект не найден", создать новый - не предалагает.
Кстати, пробовал и не через обработку: в элементе справочника Организации выбрал ОсновнойБанковскийСчет, записал, потом удалил выбранный счет. В поле написано "Объект не найден (ссылка на объект)", при нажатии на лупу реакция такая же - пишет "объект не найден", новый создать не предлагает.
8.2.17.169 для меня уже давно не актуально (хотя если и это принципиально - найти не трудно), у меня 8.3.3 и 8.3.4.
Чтобы диалог стал еще конструктивнее - пожалуйста, опишите с каким же "совершенно другим эффектом". И на какой платформе, все-таки?
Там в 8.3 очень много фишек появилось. Правда - не всегда приятных, но это отдельный разговор.
Просто редко бываю на Инфостарте.
А тут наткнулся на сноба, который сам же заявляет, что ему ещё - "учиться и учиться".
Делиться знаниями - это основное условие общения здесь.
Иначе обсуждения вообще не нужны!
"Фыркаю потому, что ресурс засоряется. Повторюсь, есть DevTrain, есть Миста, дофига всего. Тут-то зачем? Ну и... халявщиков не люблю и тех, кто их прикармливает, тоже. А я сам далеко-о-о не профи (особенно в УФ), так что нинада))), мне ишшо учиться и учиться."
Первое: ну так сами-то не засоряйте хламом всяким бесполезным. Второе, если руководствоваться вашей логикой, то и Радченко, и Хрусталева, и Гилев - все прикармливают халявщиков. Есть же справка 1С, желтые книжки. А они тут фигню всякую пишут, даже видео какое-то снимают. Это вообще верх халявы: вместо того, чтобы книжки умные читать они видос смотрят. Лентяи!
Вообще, забавно. Вот, например, курс по 1С-Эксперт удалили, он-де нарушает авторские права 1С, а передирать в сотый раз Радченку или Хрусталёву - это не нарушение авторских прав. Послушайте, "использовать источник информации" и "передирать" это разные вещи. Свои примеры я сам придумывал, текст я сам писал. Единственная претензия ко мне - это может быть то, что я в статье не указал эти самые источники информации. Так это на сайте почти никто не делает. Если ко мне будут претензии - не вопрос, сам удалю статью и принесу свои извинения.
Типа или , которые еще вместо раздела Life спокойно помещаются в раздел рейтинговых. А модераторам - по фиг. Но это, разумеется, IMHO.
1. Я и не читаю.
2. А мой комментарий внимательно читали? Я не против существования таких статей вообще, а против их размещения в рейтинговой рубрике! Для "общих рассуждений" специально была создана рубрика Life, плюсуются, но в общий зачет по рейтингу не идут. Так что тут просто от внутренней порядочности автора зависит. Опять же - IMHO
Вот зашел на страницу поста "профи". Понял, что знает. Фыркнул и ушел.
Не нравится, не помогло, "да я и сам умный" - ставь минус или игнорируй.
Фыркать зачем? чтобы показать всем и каждому, мол я крут, я читал СП. Так?
Спесивые и фыркающие вызывают негативные эмоции ибо пользы от них ничуть.
А человек постарался и разжевал, за что ему спасибо.
Кстати, если бы желтых книжек и СП было достаточно, не было бы спроса на разжевывающие курсы разного толка.
Желтые книжки и СП как раз фыркающие и написали :-)).
Как открыть форму выбора произвольного значения?
Если допустимый тип один, то можно воспользоваться этим:
Тип: Тип; ОписаниеТипов.
Тип вводимого значения. Если параметр не указан, используется тип параметра <Значение>.
ВыбЗнач = ПредопределенноеЗначение("Справочник.Контрагенты.ПустаяСсылка");
ВвестиЗначение(ВыбЗнач);
Сообщить(ВыбЗнач);Словами автора -
А по открытию формы и установке отбора мне понравилось. Как-то раз так геморроился, когда вместо обычной формы с отбором понадобилось открывать заменившую ее управляемую и устанавливать в ней отбор.
Параметры = Новый Структура;
Параметры.Вставить("Основание", КакоеТоПроизвольноеЗначение);
ОткрытьФорму("КакаяТоФорма", Параметры);
В этом случае вызывается ОбработкаЗаполнения. Модуль Формы не меняем. Можно даже модуль объекта не менять, а впихнуть в соответствующую подписку на событие
Наверное, проще объяснить на примере: есть табличная часть, для нее сделана команда Подбора. Вот как сделать так, чтобы открывалась уже существующая форма, когда пользователь много раз тыкает на одну и ту же кнопку. У меня не получается.
с каких пор ОбработкаЗаполнения стала вызываться при копировании?! Никогда такого не было.
Даже в СП есть примечание
Примечание:
При копировании (как интерактивном, так и средствами встроенного языка), данный обработчик не вызывается.
А для копирования есть специальное событие ПриКопировании
Док = Документы.ПоступлениеТоваров.СоздатьДокумент();
Док.Комментарий = "Создан программно";
ОткрытьЗначение(Док);А то даже как-то обидно за такой "камень в огород".
Знаю, что откроется основная форма объекта. Если нужна не основная - так и нужно ставить задачу.
А Вы точно уверены, что по данному коду вообще что-нибудь откроется?
Синтаксис:
ОткрытьЗначение(<Значение>)
Параметры:
<Значение> (обязательный)
Тип: Произвольный.
Значение любого типа, который может быть показан системой в диалоге.
Описание:
Показывает в диалоге переданное значение. Вид диалога зависит от типа переданного значения.
Доступность:
Тонкий клиент, веб-клиент, толстый клиент.
Поле ввода с выбором справочника. Кнопка "открыть", которая имеет стандартную обработку. Нажимаете на кнопку - открывается форма элемента справочника. Вот ОткрытьЗначение() так же отрабатывает. Если платформа не может открыть указанное значение, то вывалится ошибка вида: "отсутсвует отображение типов по умолчанию" или что-то такое. Попробуйте число так открыть, сразу поймете
Ну раз вы считаете, что я не знаю, как пользоваться процедурой ОткрытьЗначение, то я намекну - вопрос в том, что же передать в параметр оной процедуры? Вопрос был, напомню, как открыть незаписанный документ. То бишь, ссылки нет.
А у человека в коде еще и каша из переменных, доступных только на сервере, и процедур, доступных только на клиенте. Как он хочет просунуть на клиент ДокументОбъект - вот что меня интересует.
ПараметрыЗаписи = Новый Структура("Реквизит", Реквизит);
ПараметрыЗаписи.Вставить("ЗначенияЗаполнения", ПараметрыЗаписи);
// открываем форму записи РС
ОткрытьФормуМодально("РегистрСведений." + ИмяРегистра + ".ФормаЗаписи", ПараметрыЗаписи, ФормаВладелец);
Почитайте в СП или посмотрите в типовых матчасть по поводу ЗначенияЗаполнения
И кстати, насчет "ПолучитьФорму". Его-таки можно использовать, вполне себе метод. Просто раньше он был единственно верным, а сейчас более верный - другой. Но он ни в коем случае не предан анафеме. Если вы посмотрите как работает любой стандартный отчет на СКД, то платформа открывает форму изменения варианта именно через "ПолучитьФорму", с последующей настройкой объекта Форма.
Уберите этот абзац.
Равносильно, отказаться от "Предупреждение", "Вопрос", "ВвестиЗначение"
Лечится настройкой браузера, ИМХО, кои чаще всего для работы с 1С через web как раз разрешение всплывающих окон стоит разрешать для доверенных узлов.
А вот открытие именно модальных окон иногда крайне необходимо.
Может, Вам такая фраза больше понравится?
Если вы хотите, чтобы ваше приложение работало в Web-Интерфейсе, то лучше воздержаться от открытия форм в Модальном режиме. В таком режиме они реализованы как всплывающие окна, которые по умолчанию отключены в большинстве браузеров.
Признаю, что по запарке упустил из виду, что речь идет про управляемое приложение. Если бы не упустил - даже не вел бы разговора про обычное приложение.
2. Я за конструктивную критику, но против "фырканья".
Дважды спросил "что не так?" Дважды получил неконструктивные ответы типа "где оно будет работать?" или "ну ерунда же!". Хотя можно было сразу указать на то, в каком месте это "ерунда". А это все таки фырканье, а не критика.
3. Мне достаточно "подопечных" плохо разбирающихся пользователей (которые говорят просто "не работает!"), их плохо формализованных рабочих процессов, и изменений в платформе 8.3 (относительно 8.2), чтобы не вести неконструктивные споры.
4. Я умею учиться на своих и чужих ошибках, и не кидаюсь "с шашкой наголо". Естесственно, приведенный мной код я проверял, он работает. С поправкой на то, в каких режимах я его проверял (смотри выше).
Расширение поля формы для поля ввода (Form field extension for a text box)
ПараметрыВыбора (ChoiceParameters)
Использование:
Чтение и запись.
Описание:
Тип: ФиксированныйМассив.
Определяет параметры выбора. Фиксированный массив из элементов типа ПараметрВыбора.
И что здесь можно понять? А благодаря этой статье я теперь знаю.
П2 сокращается раза в три(для того, что бы открыть форму выбора нам нужно описание одного типа, массив здесь лишний):
Выбзнач = "";
Если ВвестиЗначение(ВыбЗнач, "Введите значение", Новый ОписаниеТипов("СправочникСсылка.Контрагенты")) Тогда
Сообщить(ВыбЗнач);
КонецЕсли;
п 3.
Что это такое, и для чего он нужен, нужно тоже указать, раз уж решили так элегантно на него опереться. С моей точки зрения было проще написать:
...
Или
То есть либо раскрываем мысль, либо говорим строго по существу.
п6
первая процедура тоже сокращается до одной строчки, без потери читабельности. Далее читаем:
Но в примере который приведен выше, нет структуры с таким ключом, вы не тот кусок кода кода скопировали, исправьте.
Так же в п6. после
следует добавить:
если пожелаете конечно.
Это так на беглый взгляд, ибо почти не пишу под УФ. Точнее сказать вообще не пишу.
&НаКлиенте
Процедура ПриОткрытии(Отказ)
Подразделение = Объект.Подразделение;
НовыйПараметр = Новый ПараметрВыбора("Подразделение ", Подразделение);
Если это событие открываемой формы справочника , то тогда "Объект" - это что?
Оганизация выбора приложения во многом зависит от того, какой тип значения выбирается в результате в таблицу значений. Например, если вам нужно добавить строку и заполнить в ней 1 ячейке примитивным типом (строка, булево, число) или ссылкой, то все очень просто
В форме договора пишите такой код:
П = Новый Структура;
П.Вставить("ЗакрыватьПриВыборе", Истина);
П.Вставить("РежимВыбора", Истина);
ОткрытьФорму("ИмяФормы", П, ЭлементВладелец);
Где ЭлементВладелец это ваша таблица значений.
В Форме приложения добавьте кнопочку. В обработчике команды кнопки вставьте следующий код:
&НаКлиенте
Процедура ЗавершитьИЗакрыть(Команда)
РезультатВыбора = ПолучитьРезультатВыбора();
ОповеститьОВыборе(РезультатВыбора)
КонецПроцедуры
Этого достаточно.
Если передается более сложный тип. Например, вам нужно добавить строку в таблицу и заполнить несколько ее ячеек данными из результата выбора, то все немного сложнее. Все тоже, что и в первом примере, только в событии ОбработкаВыбора таблицы вставляете следующий код:
&НаКлиенте
Процедура Таблица1ОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
//Заполнение таблицы
КонецПроцедуры
В параметр ВыбранноеЗначение будет передано то, что вы вставили в параметр РезультатВыбора метода ОповеститьОВыборе.
И может быть совсем сложная ситуация. Возникает она когда результат выбора нельзя передать с клиента на сервер. Тогда В Форме приложения, в серверной функции, помещаете ваш результат во временное хранилище:
&НаСервере
Функция ПолучитьРезультатВыбора()
....
Адрес = ПоместитьВоВременноеХранилище(РезультатВыбора);
Возврат Адрес;
КонецФункции
В Форме приложения добавьте кнопочку. В обработчике команды кнопки вставьте следующий код:
&НаКлиенте
Процедура ЗавершитьИЗакрыть(Команда)
РезультатВыбора = ПолучитьРезультатВыбора();
ОповеститьОВыборе(РезультатВыбора)
КонецПроцедуры
В событии ОбработкаВыбора таблицы:
&НаКлиенте
Процедура Таблица1ОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Таблица1ОбработкаВыбораНаСервере(ВыбранноеЗначение);
КонецПроцедуры
&НаСервере
Процедура Таблица1ОбработкаВыбораНаСервере(ВыбранноеЗначение)
РезультатВыбора = ПолучитьИзВременногоХранилища(ВыбранноеЗначение);
....
КонецПроцедуры
там надо не "Основание" а "ЗначениеЗаполнения", т.е.
ПараметрыОткрытияЗаписиРегистра = Новый Структура();
ПараметрыОткрытияЗаписиРегистра.Вставить("Подключение",Ключ.Подключение);
ПараметрыОткрытияЗаписиРегистра.Вставить("Регламент",Ключ.Регламент);
П = Новый Структура("ЗначенияЗаполнения", ПараметрыОткрытияЗаписиРегистра);
ОткрытьФорму("РегистрСведений.СостоянияЭтапов.ФормаЗаписи", П, ЭтотОбъект,,,,,РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);по крайней мере в платформе 8.3.6
&НаКлиенте
Процедура ПриходнаяНакладная(Команда)
СсылкаНаДокумент = СоздатьНовыйДокумент();
ОткрытьЗначение(СсылкаНаДокумент);
КонецПроцедуры
&НаСервере
Функция СоздатьНовыйДокумент()
НовыйДокумент = Документы.ПриходнаяНакладная.СоздатьДокумент();
НовыйДокумент.Номер = "111";
НовыйДокумент.Дата = ТекущаяДата();
НовыйДокумент.Записать();
Возврат НовыйДокумент.Ссылка;
КонецФункции
ПоказатьПроще говоря, в документе определяю контрагента, заполняю табличную часть, заношу в регистр сведений. И впреть новые документы фильтруются исходя из того, что было заполнено в табличной части предыдущих и по контрагенту.
Что удобно, пользователь делает документ, выбирает контрагента, сразу фильтр по контрагенту, потом исходя из выбранных в первой колонке табличной части значений, фильр накладывается на выбор для 2й колонки и последующих. Данные для фильтра берутся из среза последних регистра.
Провильно:
-----------------------------------------------------------------------------------------------------------------------
П = Новый Структура;
ОткрытьФорму("Отчет.ПечатьЕжедневнойСводки_УАТ_3_0.Форма.ФормаОтчета", П);
------------------------------------------------------------------------------------------------------------------------
Не правильно:
П = Новый Структура;
ОткрытьФорму("Отчет.ПечатьЕжедневнойСводки_УАТ_3_0.ФормаОтчета", П);
------------------------------------------------------------------------------------------------------------------------
(что называется - найдите 10 отличий....)
1. Нужно открыть форму выбора физлица так чтобы были видны только элементы в определенной группе справочника (и как вариант сама эта группа).
2. Было бы отлично если пользователь попытается создать из формы выбора новое физлицо то оно автоматом попало бы в группу, с отбором по которой открыта форма выбора.
Пробовал в коде формы на которой размещено поле выбора физлица писать такой код:
&НаСервере
Процедура гаПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
гаПриСозданииНаСервереПослеУстановкаПараметрыВыбораВодителя();
КонецПроцедуры
&НаСервере
Процедура гаПриСозданииНаСервереПослеУстановкаПараметрыВыбораВодителя()
Перем НовыеПараметры, НовыйМассив, ПараметрОтборПоРодителю, ПараметрОтборЭтоГруппа;
//Отбор по папке Водители при выборе водителя
НовыйМассив = Новый Массив();
ПараметрОтборПоРодителю = Новый ПараметрВыбора("Отбор.Родитель", Константы.ггГруппаФизЛицВодители.Получить());
ПараметрОтборЭтоГруппа = Новый ПараметрВыбора("Отбор.ЭтоГруппа",Ложь);
НовыйМассив.Добавить(ПараметрОтборПоРодителю);
НовыйМассив.Добавить(ПараметрОтборЭтоГруппа);
НовыеПараметры = Новый ФиксированныйМассив(НовыйМассив);
Элементы.гаВодитель.ПараметрыВыбора = НовыеПараметры;
//__________________________________________________________ ___
КонецПроцедуры
ПоказатьВ итоге форма открывается. Физлиц кроме как в нужной группе не выводится, но видна ещё одна группа.
//В статье написано:
ВыбранноеЗначение = Форма.Открыть();
//А имелось в виду, видимо так:
ВыбранноеЗначение = Форма.ОткрытьМодально();
И, соответственно, не раскрыта тема замены работы без модального режим (т.е. через "Обработку оповещения")
, п.4: "Имена переменных не должны состоять из одного символа. Использование односимвольных имен переменных допускается только для счетчиков циклов. "
Статья для изучающих, кто-то будет копировать примеры. Нехорошо, что допущены такие отклонения.
ПараметрыОткрытия = Новый Структура("ЗакрыватьПриВыборе,РежимВыбора",Истина,Истина);
// простой отбор
ПараметрыОткрытия.Вставить("Отбор",Новый Структура("Сотрудник",Объект.Сотрудник));
// открываем форму, получаем ее ссылку
ФормаВыбора = ОткрытьФорму("Документ.Отпуск.ФормаВыбора",ПараметрыОткрытия,,ЭтаФорма.УникальныйИдентификатор);
// тут же добавляем в нее нужные отборы
// сложный отбор
ЭлементОтбора = ФормаВыбора.Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ИсправленныйДокумент");
ЭлементОтбора.ПравоеЗначение = ПредопределенноеЗначение("Документ.Отпуск.ПустаяСсылка");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.НеРавно;
ЭлементОтбора.Использование = Истина;
Единственное, что я не заметил, это открытие общей формы для подбора а-ля подбор номенклатуры в УТ или ТиС, когда выбирался и товар и количество и они потом сразу же переносились в документ. Вот этого нет и обработки входящих данных в форме владельце.
ОткрытьФорму("ОбъектКонфы.Форма.ФормаНеОсновная", Новый Структура("Параметры, ...", П1, П2, ..), ...);То есть по сути просто поменять значения на форме по определенному алгоритму. А записывать документ или нет решит пользователь.
Справочник имеет три реквизита типа Булево - Клиент, Поставщик, Прочее
Необходимо организовать правильный подбор с условием Клиент ИЛИ Поставщик
По-старинке делаем получение формы, создание группы отбора ИЛИ, добавление двух отборов в группу... Затем открытие формы
При таком подходе может возникать накладка с логикой формы в процедуре ПриОткрытии (если там что-то с отборами делается - самый первый абзац публикации)
Более правильный подход в ответе ()
Но даже при таком подходе в интерфейсе Такси работает выбор из списка при произвольном вводе строки - в этом случае подбор выполняется без требуемых правил...
Как же правильно реализовать логику отбора ИЛИ для любого подбора?
(догадываюсь, что необходимо использовать ПараметрыВыбора и ОбработкаПолученияДанныхВыбора модуля менеджера... но как наиболее универсально реализовать?)
Настройки = Новый НастройкиКомпоновкиДанных;
ЭлементОтбора = Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Дата.ДатыНачала.НачалоМесяца");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = НачалоМесяца(ТекущаяДата());
Параметры.Вставить("ФиксированныеНастройки", Настройки);
Немного критики. Перед первым пунктом вы пишете, что лучше отказаться от модальных окон. Но первый и второй пункт и есть открытие модальных окон. Логичнее тогда вместо ОткрытьЗначение и ВвестиЗначение использовать ОткрытьЗначениеАсинх и ВвестиЗначениеАсинх. Ну, или чтобы не сильно пугать новичков, хотя бы упомянуть, что такие методы есть.
Если во ВладельцаФормы передать Элемент текущей формы и открыть форму выбора, то он автоматически заполнится без всякой доработки типа ОповеститьОВыборе или ОбработкиВыбора. Это срабатывает если элемент имеет видимость на форме, что логично
Так вот вопрос - можно ли как-то провернуть такой же финт для поля строки таблицы? У меня есть ТЗ на форме и я хочу программно добавлять в него строку и сразу запрашивать у пользователя доп. информацию и писать в нужные колонки. Если бы это были обычные реквизиты формы - то без проблем, а вот с таблицей не получается
Может кто сталкивался. Заранее благодарен за ответ!
Вы можете заказать платную консультацию или разработку у автора. Будет создан приватный заказ на «Бирже заказов» для автора.
№ 236382
Создание 10.11.13 22:42
Обновление 12.11.13 17:43
Просмотры 679733
Загрузки 0
Рейтинг
913
Комментарии 184
Код открыт Да
Рубрики Работа с интерфейсом
Кому Разработчик
Тип файла Нет файла
Платформа 1С:Предприятие 8
Конфигурация Универсальные
Операционная система Не имеет значения
Страна Не имеет значения
Отрасль Не имеет значения
Налоги Не имеет значения
Вид учета Не имеет значения
Доступ к файлу Бесплатно (free)