Программирование в 1С для всех
В этой статье разберем, как задать заголовок конфигурации в 1С 8.3, а также как задать заголовок управляемой формы.
Если вы создаете конфигурацию с нуля, то заголовок программы 1С простой – «Конфигурация».
Для того, чтобы изменить заголовок 1С нужно зайти в палитру свойств конфигурации. Для этого необходимо выделить корень дерева конфигурации с названием «Конфигурация», вызывать контекстное меню, в котором выполнить команду «Свойства».
В открывшейся палитре свойств нас интересуют поля Имя и Синоним.
Имя конфигурации должно быть из одного слова, без пробелов и не содержать спецсимволов кроме подчеркивания «_». Синоним может быть любым.
Зададим имя конфигурации, синоним и комментарий. После выполнения этих действий, у нас сразу же изменится название конфигурации в дереве метаданных, но название конфигурации в окне программы останется прежнем.
Это потому что, мы не обновили конфигурацию базы данных. После того, как мы обновим конфигурацию базы данных, заголовок программы 1С станет таким же, как в свойстве Синоним конфигурации.
Если запустить «1С: Предприятие» в пользовательском режиме, то текст из свойства Синоним конфигурации будет и в заголовке окна, и в окне «О программе». Иногда, этот заголовок еще называют Заголовок базы 1С.
Заголовок формы 1С
Заголовок формы 1С можно задать несколькими способами. Когда нет форм объекта (они в этом случае генерируется платформой автоматически), то для заполнении заголовков форм, используются свойства объекта: Синоним, Представление объекта и Представление списка.
Рассмотрим случай, когда у объекта нет форм. Создадим справочник Номенклатура, и установим у него синоним «Товары».
Тогда у нас текст «Товары» будет везде: в меню, на форме списка и на форме элемента.
Если же мы изменим свойства Представление объекта и Представление списка.
Тогда название команды в интерфейсе и название формы списка будет браться из свойства Представление списка, а название в форме элемента из свойства Представление объекта.
Причем, если мы откроем окно «Функции для технического специалиста» (для платформы 8.3.14 и ниже — «Все функции»), то в нем название справочника будет такое, как указано в свойстве Синоним.
Принцип работы свойств Синоним, Представление объекта и Представление списка будет справедлив и для документа в 1С. Заголовок документа задается точно также.
Если же мы создадим, к примеру, собственную форму элемента справочника, то заголовок у этой формы будет такой как это указанно в свойстве Представление объекта справочника 1С.
Мы можем самостоятельно изменить заголовок управляемой формы, для этого следует ввести нужный текст в свойство Заголовок формы.
Но, если мы так сделаем, то на форме в пользовательском режиме будет комбинация нашего заголовка и заголовка, который платформа «подтягивает» из свойства объекта Представление объекта.
Если же мы хотим, чтобы заголовок формы был полностью такой, как мы его задали, то нужно снять флаг у свойства АвтоЗаголовок формы.
Тогда заголовок формы будет такой, как мы его задали в свойстве Заголовок.
Тоже самое, справедливо и для формы списка справочника:
Изменили свойство Заголовок формы.
Сняли флаг АвтоЗаголовок.
Заголовок такой, как мы задали.
Более подробно и основательно начальные вопросы программирования в 1С вы можете изучить в
Изучайте программирование в 1С в месте с моей книгой «Программировать в 1С за 11 шагов»
Книга написана понятным и простым языком — для новичка.
О том как разрабатывать под управляемым приложением 1С, читайте в книге Книга «Основы разработки в 1С: Такси»
Отличное пособие по разработке в управляемом приложении 1С, как для начинающих разработчиков, так и для опытных программистов.
Промо-код на скидку в 15% — 48PVXHeYu
Эти книги, плюс книга по программированию оперативного учета имеются в едином комплекте: комплект книг по разработке в 1С.
Только для читателей моего блога,
промо-код на скидку в 300 рублей на весь комплект: blog
Если Вам понравился этот урок, был полезен или помог решить какую-нибудь проблему, то Вы можете поддержать мой проект, перечислив любую сумму.
можно оплатить вручную:
Яндекс.Деньги — 410012882996301
Web Money — R955262494655
Базовый принцип программирования управляемой формы в 1С
Цель статьи – показать применение шаблонов Remote Facade и Data Transfer Object к структуризации кода, управляемой формы в среде 1С 8.2.
Введение
Начнем с небольшого описания понятия «управляемая форма» и связанных концепций платформы 1С. Знатоки платформы могут пропустить этот раздел.
Все дальнейшие рассуждения будут о правой части иллюстрации, о том, как структурировать код модуля и какие принципы позволят реализовать эффективное клиент-серверное взаимодействие.
Обозначим проблему
Прошло уже несколько лет как новая версия платформы 1С активно используется и выпущено множество решений (конфигураций) как фирмой 1С, так и ее многочисленными партнерами.
Сложилось ли за это время у разработчиков единое понимание принципов клиент-серверного взаимодействия при создании форм, и изменился ли подход к реализации программных модулей в новых архитектурных реалиях?
Рассмотрим структуру кода (модуль формы) в нескольких формах одной типовой конфигурации и попробуем найти закономерности.
Под структурой будем понимать секции кода (чаще всего это блоки комментариев) выделенные разработчиком для группировки методов и директивы компиляции этих методов.
Пример 1:
Зачем нужна структура кода?
Почему существующий стандарт разработки от фирмы 1С не помогает?
Шаблоны проектирования или мудрость поколений
Примеры шаблонов в платформе 1С
Прикладной программный интерфейс доступный разработчику при разработке управляемой формы, содержит много примеров данных принципов.
Например метод ОткрытьФорму(), типичный «огрубленный» интерфейс.
Сравните с принятым в v8.1 стилем.
Структурируем код
Как быстро программно сформировать заголовки полей СКД
Пример приведем на отчете для УТ 11, в котором выводится вид цены, номенклатура и цена номенклатуры. Вид цены пользователь должен обязательно задать, а заголовок именно для цены нужно сформировать в соответствии с валютой вида цены, которую выбрал пользователь.
Пример запроса приводить не стану. Приведу код, который был написан в модуле отчета, а именно код функции ПриКомпоновкеРезультата.
// Получаем основную валюту вида цены
ПараметрВидЦены = ПолучитьЗначениеПараметра ( «ВидЦены» );
ВалютаВидыЦены = ПараметрВидЦены. ВалютаЦены ;
// Програмная установка заголовка нужных полей СКД
ПолеЦена = СхемаКомпоновкиДанных.НаборыДанных.НаборДанных1.Поля.Найти ( «Цена» );
Если ПолеЦена <> Неопределено Тогда
ПолеЦена.Заголовок = «Цена, » + Строка ( ВалютаВидыЦены ) + «» ;
КонецЕсли;
//Создадим и инициализируем процессор вывода результата
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент ;
ПроцессорВывода.УстановитьДокумент ( ДокументРезультат );
Если ЭлементРезультата = Неопределено Тогда
Иначе
// Зафиксируем шапку
Если Не ТаблицаЗафиксирована
И ЭлементРезультата.ЗначенияПараметров.Количество () > 0
И ТипЗнч ( КомпоновщикНастроек.Настройки.Структура [ 0 ]) <> Тип ( «ДиаграммаКомпоновкиДанных» ) Тогда
Функция ПолучитьЗначениеПараметра ( ИмяПараметра )
ПараметрДанных = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти ( ИмяПараметра );
Если ПараметрДанных <> Неопределено Тогда
ПараметрПользовательскойНастройки = КомпоновщикНастроек.ПользовательскиеНастройки.Элементы.Найти ( ПараметрДанных.ИдентификаторПользовательскойНастройки );
Если ПараметрПользовательскойНастройки <> Неопределено Тогда
Возврат ПараметрПользовательскойНастройки.Значение ;
Иначе
Возврат ПараметрДанных.Значение ;
КонецЕсли;
КонецЕсли;
Сначала мы получаем вид цены из параметром, которые задал пользователь, а далее из вид цены можно получить сам вид цены.
Далее в наборе данных НаборДанных1 (здесь может быть имя вашего набора) ищем необходимое поле и устанавливаем необходимый заголовок. Последующие действия – стандартный программный вывод СКД отчета.
Как видим СКД предоставляет большой и гибкий набор инструментов, которые позволяют разработчику создавать красивые отчеты легко и быстро.
Программное изменение управляемых форм
Чтобы упростить разработку изменений формы, можно воспользоваться небольшой хитростью. Все изменения можно сначала внести на форму через конфигурирование и отладить доработку формы. После преобразовать программные изменения в код. Изменения, которые нужны в форме изначально, стоит вносить в процедуре «ПриСозданииНаСервере». Для внесения изменений лучше сделать отдельную процедуру (например, «ДополнитьФормуПрограммно») и вызывать ее в штатной процедуре «ПриСозданииНаСервере», тогда изменение типовой формы 1С будет выглядеть одной строчкой.
Согласитесь, обновить доработанную таким образом форму значительно проще, чем вручную сравнивать и вносить все изменения формы при каждом обновлении. Конечно при сильном изменении типовой формы, могут потребоваться правки в процедуре программного дополнения формы, но такие случаи довольно редкие. Если в ходе разработки изменилась типовая структура объекта, то добавлять новые реквизиты на форму нет необходимости. Эти реквизиты будут доступны по пути «Объект.НовыйРеквизит».
Но иногда нужно добавить реквизит формы. Например, «Статус документа», который будет заполняться из специального регистра при открытии формы. Добавить новые реквизиты можно, открыв в 1С табличный документ, управляемая форма изменяется через команду ИзменитьРеквизиты(«ДобавляемыеРеквизиты», «УдаляемыеРеквизиты»).
«ДобавляемыеРеквизиты» и «УдаляемыеРеквизиты» – это массивы с элементами типа «РеквизитФормы». Тут все просто – «Добавляемые» добавляются, «Удаляемые» – удаляются.
Функция РеквизитФормы («ИмяРеквизита», «ТипРеквизита», «Путь», «Заголовок») создает объект типа «РеквизитФормы».
Тут важно понимать, что «ИмяРеквизита» содержит имя без точек. То есть имя без пути реквизита. Если нужно добавить реквизит, например, табличной части объекта, то уже в реквизите «Путь» указать путь к ТЧ реквизита – «Объект.Товары». «ТипРеквизита» задается через объект «ОписаниеТипов». После программного добавления реквизитов на форму нужно добавить элементы на форму или изменить свойства текущих. Для добавления новых элементов на форму есть два метода:
-Элементы.Добавить(«ИмяЭлемента», «ТипЭлемента», «Родитель»).
-Элементы.Вставить(«ИмяЭлемента», «ТипЭлемента», «Родитель», «Элемент»).
«ИмяЭлемента» должно быть уникальным в рамках элементов формы. Лучше добавить какой-то префикс, чтобы не возникло пересечений с типовыми элементами формы.
«ТипЭлемента» имеет не так уж много вариантов. Это «ПолеФормы», «ГруппаФормы», «ДекорацияФормы», «КнопкаФормы» и «ТаблицаФормы». Все остальные свойства назначаются через «Вид» создаваемого элемента. Например, поле с типом булево лучше сделать «флажком», установив вид элементу «ВидПоляФормы.ПолеФлажка».
В свойстве «Родитель» нужно указать группу или таблицу формы, в которую будет входить новый элемент. Также можно добавить элемент непосредственно на управляемую форму без подчинения другим элементам. Для функции вставить дополнительно указывается «Элемент», перед которым будет вставлен новый создаваемый элемент формы. Ну и конечно же, мало просто добавить элементы на форму. Система должна реагировать на действия пользователя с формой.
Для установки событий элементам нужно использовать процедуру УстановитьДействие («ИмяСобытия», «Действие»).
Получилась вот такая процедура программного заполнения управляемой формы:
Код для копирования:
Специальные предложения
Так оно вроде практически никогда не нужно, если я правильно понял. Плюс всегда можно выводить реквизиты на какую-то отдельную страницу если, например, не была найдена группа (программно) типовая, в которой она располагалась раньше. А вот с расширением сложнее. Я вот до сих пор не могу понять как быть в ситуации когда, например, наворотишь много изменений в одной форме или много форм в одной конфигурации, а потом при значительных изменениях типовой конфы оказывается значительно сложнее проанализировать все изменения и как-то удобно сравнить объединить. Получается даже больше работы.
И с другой стороны, как уже было подмечено, программные изменения влияют на кэширование форм. Приходится искать баланс)
Только из-за того, что расширение нельзя сравнивать с конфигурацией, у нас программное изменение формы.
После обновления запускается отладочная обработка, которая открывает все измененные формы. В коде создания есть ветки условия на отладку. Если не найден родитель или элемент перед которым нужно было разместить програмно-создаваемый (или если больше нет элемента, чьи свойства изменялись и т д.), оно информативно ругается через СообщениеПользователю. Плюсом условным оформлением подкрашиваются созданные поля. Было принято такое решение, потому что нельзя, чтобы добавленные элементы переезжали «в нарнию» и мы не знали об этом.
Я об этом читал, но когда сравнивал работу «до» и «после», разница была в 0.3 сек на самой дикоизмененной форме. (остальные с трудом набирают 0.01) Счел затраты оправданными. (Это форма сделки, она итак долго открывается, потому что при открытии проверяет бизнес-процесс на основании себя)
Когда все это хозяйство задумывал, хотел обработку, которая могла бы Сравнить типовую конфигурацию и основную. Планировалось выводить на форму дерево объектов формы (элементы, реквизиты и команды). В этом дереве подсвечивать добавленные объекты на форму в конфигураторе. Добавить команды, которые генерировали бы программный код создания этих изменений. Плюсом нужен был механизм сохранения настроек формы. Я выбрал xml. По плану в «ПриСозданииНаСервере» во временное хранилище помещается таблица со всем нужным, и дальше размещается на форме в виде дерева. А после генерации, настройки сохранялись бы в xml. (как оказалось, можно и без xml обойтись)
Собственно реализация оказалась дико сложной. Не все свойства элементов серилизуются, не все значения существуют на клиенте. иногда платформа без видимых причин просто падает в дамп (предполагаю, что остается связь значений свойств формы в этой ТЗ с формой которая после ПриСозданииНаСервере закрывается)
Поэтому я решил парсить выгрузку формы в файлы (вроде сразу xml и чего париться то, собирать что-то). Естественно это еще затратнее, а поддерживать еще затратнее).
Сейчас это просто 2 общих модуля, которые вызываются из СобытияФорм и СобытияФормКлиент.
Как настанет свободный промежуток, хочу сделать справочник, в котором будут храниться изменения форм (так же с отображением дерева объектов формы, но без сравнений с типовой). Общиймодуль с кэшированием, чтобы вся информация каждый раз не собиралась (Сначала собирается массив всего что нужно сделать с формой, а потом разом все это меняется). Это даст возможность из предприятия добавлять/изменять формы без нужды выгнать всех пользователей (Возможность применить изменения только по субботам 1 час, динамическое обновление не используем потому-что ужасы творит иногда)
И в планах сделать аналог патча. Добавить код, чтобы можно было вызывать определенные процедуры из внешней обработки, в случае косяка в процедуре команды или где-то еще.
Программное управление обычными формами документов и справочников в УПП/КА
Часть 1
Чтобы не снимать с поддержки все формы конфигурации и не вставлять свои обработчики в процедуры «ПриОткрытии», будем искать такую процедуру, которая вызывается во всех формах документах и справочников.
И так, с нимаем с поддержки общий модуль «РаботаСДиалогами».
Находим функцию «АктивизироватьРеквизитВФорме» и сразу после объявления функции добавляем строку вызова нашей процедуры:
Все. Отделались снятием с поддержки двух модуле с добавлением в них двух строк. Обновлять будет легко.
Часть 2
Теперь самое главное.
Добавляем в конфигурацию общий модуль «ИТ_РаботаСДиалогами». В свойствах ставим галочки на использование в клиенте.
В модуль помещаем вызываемые функции.
Обратите внимание, что работа с формами справочника имеет особенности. Поскольку процедура «МеханизмНумерацииОбъектов.УстановитьДоступностьПоляВводаНомера» вызывается как из формы списка справочника, так и из формы самого элемента справочника. Различить можно только по составу передаваемых метаданных или просто по имени формы.
Часть 3
Поскольку мы не хотим каждый раз писать кучу кода при размещении реквизитов на форму, мы напишем заранее разного рода функции и процедуры, которые и будем в дальнейшем использовать.
— Функция добавления поля ввода на форму (одна из ранних наших функций).
— Функция добавления флажка на форму.
Эта функция позволяет разместить на форму флажок (булево).
Правила использования такие же как у предыдущей функции. Фактически это копия предыдущей функции, только для флажка.
Код этой функции почти идентичны предыдущим, по этому убран под спойлер.
— Функция добавления надписи на форму.
Эта функция позволяет разместить на форму надпись.
Правила использования такие же как у предыдущей функции. Фактически это вырезка вывода надписи из первой функции..
Код убран под спойлер
— Универсальное добавление поля на форму. (это другой подход добавления элементов на форму, гораздо более универсальный).
Используем эту процедуру гораздо чаще тех, что указал выше.
— Процедура удаления колонки в табличной части формы.
Иногда возникает необходимость удалять колонки с формы документа. Тут все просто.
— Процедура удаления элемента формы.
Часть 4
Думаю надо показать несколько примеров, как мы добавляем новые реквизиты на форму.
Примеры добавления колонки на форме:
Еще пример с добавлением полей в отдельной закладке:
Еще пример работы с формой справочника.
Часть 5
Доработки по совместимости и универсальности.
Желательно весь код модуля «ИТ_РаботаСДиалогами» обрамить в клиента
В процедурах, прежде чем добавлять реквизиты на форму, убедитесь, что такой реквизит существует.
Например так:
Поскольку вызов функции может происходить многократно в одной форме, всегда проверяйте, выведен ли уже реквизит на форму.
Например так:
Такие проверки позволят вам копировать общий модуль «ИТ_РаботаСДиалогами» во все ваши конфигурации УПП/КА и не бояться вызова исключений.