Работаем с дополнительными реквизитами на форме
Разработка - Универсальные функции
Вот пара задач на размышление:
-
Как называются дополнительные реквизиты на форме и в какой момент они появляются на форме?
- Как проверить корректность заполнения пользователем дополнительного реквизита, если значение некорректно – уведомить и отказать в записи объекта? Напоминаю, что до записи объекта в ТЧ Дополнительные реквизиты – данных еще нет, а на форме – уже есть.
- Как заполнить значение дополнительного реквизита при записи (или по другому событию) и обновить данные на форме?
- Как расположить дополнительный реквизит в указанном месте на форме?
Далее привожу решение этих задач - поковыряться с отладчиком пришлось изрядно…
Итак, вот решение:
- Для начала смотрим с отладчиком, появились ли Допреквизиты на форме после ПриСозданииНаСервере? Нет. А после ПриОткрытии? Тоже нет. А вот после активизации закладки «Дополнительно» - появились со страшными именами как на скриншоте. Это было создано типовой процедурой УправлениеСвойствами.ЗаполнитьДополнительныеРеквизитыВФорме(ЭтотОбъект), которая создала реквизиты на форме
ОписаниеСвойства.ИмяУникальнаяЧасть =
СтрЗаменить(ВРег(Строка(ОписаниеСвойства.Набор.УникальныйИдентификатор())), "-", "x")
+ "_"
+ СтрЗаменить(ВРег(Строка(ОписаниеСвойства.Свойство.УникальныйИдентификатор())), "-", "x");
ОписаниеСвойства.ИмяРеквизитаЗначение =
"ДополнительныйРеквизитЗначение_" + ОписаниеСвойства.ИмяУникальнаяЧасть;
После чего Система располагает реквизиты на форме

Добавление /изменение реквизитов на форме возможно благодаря следующей интересной конструкции.
Реквизит = Новый РеквизитФормы(ОписаниеСвойства.ИмяСсылочногоРеквизитаЗначение, ФорматированнаяСтрока, , ОписаниеСвойства.Наименование, Истина);
ДобавляемыеРеквизиты.Добавить(Реквизит);
Форма.ИзменитьРеквизиты(ДобавляемыеРеквизиты);
Но это нам сейчас все не нужно, так, для любопытства.
А вот чтобы работать с реквизитами нужно научиться получать их имена на форме по имени дополнительного реквизита. На радость разработчикам при работе с допреквизитами на форме Система создает служебный реквизит «Свойства_ОписаниеДополнительныхРеквизитов» который содержит на форме коллекцию данных, где есть все необходимы нам данные, можно найти и по имени, и найти соответствующее свойство ПланаВидаХарактеристик

Далее дело техники. По имени дополнительного реквизита получаем Поле дополнительного реквизита, и делаем с ним что хотим
Функция ПолучитьПолеДополнительногоРеквизитаНаФорме(Форма, ИмяРеквизита) Экспорт
Список = Форма.Свойства_ОписаниеДополнительныхРеквизитов;
Свойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту("Имя", ИмяРеквизита);
Если ЗначениеЗаполнено(Свойство) Тогда
НайденныеСтроки = Список.НайтиСтроки(Новый Структура("Свойство", Свойство));
Если НайденныеСтроки.Количество() > 0 Тогда
Возврат НайденныеСтроки[0];
КонецЕсли;
КонецЕсли;
КонецФункции
- Используя функцию из п1 - нужно проверить значение поля дополнительного реквизита на форме
Функция ПолучитьЗначениеДополнительногоРеквизитаНаФорме(Форма, ИмяРеквизита) Экспорт
Перем ЗначениеРеквизита;
ПолеДополнительногоРеквизитаНаФорме = ПолучитьПолеДополнительногоРеквизитаНаФорме(Форма, ИмяРеквизита);
Если не ПолеДополнительногоРеквизитаНаФорме = Неопределено Тогда
Возврат Форма[ПолеДополнительногоРеквизитаНаФорме.ИмяРеквизитаЗначение];
КонецЕсли;
КонецФункции
3. Используя функцию из п1 - нужно установить значение поля дополнительного реквизита на форме
Процедура УстановитьЗначениеДополнительногоРеквизитаНаФорме(Форма, ИмяРеквизита, ЗначениеРеквизита) Экспорт
ПолеДополнительногоРеквизитаНаФорме = ПолучитьПолеДополнительногоРеквизитаНаФорме(Форма, ИмяРеквизита);
Если не ПолеДополнительногоРеквизитаНаФорме = Неопределено Тогда
Форма[ПолеДополнительногоРеквизитаНаФорме.ИмяРеквизитаЗначение] = ЗначениеРеквизита;
КонецЕсли;
КонецПроцедуры
4. Используя функцию из п1 – нужно выполнить волшебную процедуру «Переместить» для коллекции Элементов формы
Процедура ПереместитьДополнительныйРеквизит(Форма, ИмяРеквизита, ИмяГруппы, Доступность = Истина) Экспорт
Попытка
Поле = ПолучитьПолеДополнительногоРеквизитаНаФорме(Форма, ИмяРеквизита);
Группа = Форма.Элементы.Найти(ИмяГруппы);
ПолеФормы = Форма.Элементы[Поле.ИмяРеквизитаЗначение];
Если не ПолеФормы = Неопределено Тогда
Форма.Элементы.Переместить(ПолеФормы, Группа);
ПолеФормы.Доступность = Доступность;
КонецЕсли;
Исключение
КонецПопытки;
КонецПроцедуры
В итоге, можно управлять дополнительными реквизитами на форме – почти так же комфортно, как и собственными. И ничего менять в конфигурации – не пришлось – все управление находится в расширении

Вывод: таким образом, не меняя конфигурацию, и используя механизмы дополнительных реквизитов и расширений всех типовых конфигураций, мы управляем расположением реквизитов и программно контролируем их заполнение и содержание.
Проверено на КА 2.4.2.132, но вполне универсально для всех БСП неустановленной версии
Вот собственно и все, чем хотел поделиться, ставим лайк, если полезно
INFOSTART DataFormWizard: управление данными и формами в 1С 8.3
Решение INFOSTART DataFormWizard обеспечивает проверки ввода данных, скрывает от пользователя недоступную информацию и выполняет код в обработчиках — без изменения конфигурации. Легко устанавливается и работает практически с любой конфигурацией на управляемых формах.
Вступайте в нашу телеграмм-группу Инфостарт
1с расширение конфигурации БСП дополнительные реквизиты дополнительные реквизиты на форме
Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».
- 0% комиссии — оплата напрямую исполнителю;
- Исполнители любого масштаба — от отдельных специалистов до команд под проект;
- Прямой обмен контактами между заказчиком и исполнителем;
- Безопасная сделка — при необходимости;
- Рейтинги, кейсы и прозрачная система откликов.
См. также
Универсальные функции 1С 8.3 1С:Документооборот Россия Платные (руб)
ДО+ — расширение конфигурации, в котором собран постоянно пополняемый набор из 33 востребованных доработок для 1С:Документооборот КОРП 3.0: согласование задач прямо из мессенджеров MAX и Telegram, отзыв согласования и исполнения, гибкие повторные круги, эскалация с точностью до минут, контроль исполнительской дисциплины, выгрузка вложений в ZIP и склейка PDF, реестр документов в Excel, проверка дублей контрагентов и регистрационных номеров. Каждая возможность активируется отдельным флажком в режиме предприятия — включается только то, что нужно конкретной организации. Список функций расширяется с каждым релизом — текущая версия 2.1.0. Режим AddOn: типовая конфигурация не модифицируется, обновления ДО ставятся штатно, дополнительные лицензии и внешние компоненты не требуются. Внедрение силами администратора — около часа.
30000 руб.
09.07.2026 1455 1 0
Загрузка и выгрузка в Excel Универсальные функции Разработчик 1С:Предприятие 8 Россия Бесплатно (free)
Описанный ниже подход позволяет в три шага заполнять формулы в Excel файлы, вне зависимости от ОС сервера (MS Windows Server или Linux). Подход подразумевает отказ от работы с COM-объектом в пользу работы через "объектную модель документа" (DOM).
30.10.2025 8808 Abysswalker 11
Универсальные функции Работа с интерфейсом Разработчик 1С:Предприятие 8 Бесплатно (free)
Порой необходимо временно отключить расширение 1С, не удаляя его, чтобы не потерять данные. Но в этом случае при каждом запуске всем будет лезть уведомление о неактивном расширении, хотя очевидно, это техническая информация, которой не стоит лишний раз пугать пользователей.
14.05.2025 14588 DeerCven 16
Инструментарий разработчика Универсальные функции Запросы Разработчик 1С:Предприятие 8 1C:Бухгалтерия 1С:Бухгалтерия 3.0 1С:Зарплата и Управление Персоналом 3.x Бесплатно (free)
Внешняя обработка для создания запроса на основании табличных данных.
22.07.2024 11990 278 ixijixi 10
Универсальные функции Разработчик 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)
Благодаря этим пяти строчкам можно больше не заморачиваться с загрузкой из внешних файлов. Пользуюсь везде, всегда и постоянно.
21.05.2024 68955 dimanich70 87
Универсальные функции Разработчик 1С:Предприятие 8 1C:Бухгалтерия Абонемент ($m)
Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.
1 стартмани
18.03.2024 9340 7 John_d 13
Универсальные функции Разработчик Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)
Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.
12.02.2024 85995 atdonya 31
Универсальные функции Разработчик 1С:Предприятие 8 Бесплатно (free)
На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.
30.11.2023 13515 ke.92@mail.ru 18
Если организация решила сэкономить на программисте 1С, то этот вариант ей подойдет до момента пока им не понадобится этот дополнительный реквизит использовать где-то еще.
еще сложнее когда начнутся зависимости друг от друга. например в примере автора можно водителя закреплять за определенным авто в определенные дни, и поступит требование чтобы водителя можно было выбрать в зависимости от этой связки.
кстати вроде есть функционал упаковок в программе. зачем было городить доп реквизиты Количество мест и тип упаковки?
Сама по себе тема необходимости и оптимальности использования дополнительных реквизитов заслуживает целой серии статей и сотен сломанных копий )). Я тут - пас
Эта статья для самых ленивых, не способных воспользоваться отладчиком любого справочника с доп. реквизитом.
Вот рабочий код с формы с вызовом серверных модулей из статьи
&НаСервере
Процедура СвойстваВыполнитьДополнительнуюИнициализацию();
пп_Сервер.ПереместитьДополнительныйРеквизит(ЭтаФорма,"СерийныеНомера_ЗаданиеНаПеревозку", "пп_ГруппаДопРеквизиты", Истина);
пп_Сервер.ПереместитьДополнительныйРеквизит(ЭтаФорма,"Комплектовщик_ЗаданиеНаПеревозку", "пп_ГруппаДопРеквизиты", Истина);
КонецПроцедуры
&НаСервере
Процедура УстановитьДоступностьЭлементовФормы(Доступность)
Элементы.МаршрутДобавитьРаспоряжение.Доступность = Доступность;
ПолеСерийныеНомера = пп_Сервер.ПолучитьПолеДополнительногоРеквизитаНаФорме(ЭтаФорма, "СерийныеНомера_ЗаданиеНаПеревозку");
Элементы[ПолеСерийныеНомера.ИмяРеквизитаЗначение].Доступность = Истина;
ПолеКомплектовщик = пп_Сервер.ПолучитьПолеДополнительногоРеквизитаНаФорме(ЭтаФорма, "Комплектовщик_ЗаданиеНаПеревозку");
Элементы[ПолеКомплектовщик.ИмяРеквизитаЗначение].Доступность = Доступность;
Элементы.Маршрут.Доступность = Доступность;
КонецПроцедуры
&НаКлиенте
Процедура пп_ПриОткрытииПосле(Отказ)
//СвойстваВыполнитьОтложеннуюИнициализацию();
//УправлениеСвойствамиКлиент.ПослеЗагрузкиДополнительныхРеквизитов(ЭтотОбъект);
СвойстваВыполнитьДополнительнуюИнициализацию();
Если ПризнакЗаданиеНаОтборНапечатано Тогда
//ТолькоПросмотр = Истина;
УстановитьДоступностьЭлементовФормы(Ложь);
Состояние("Сформирована печатная форма ""Задания на отбор"", редактирование ограничено");
КонецЕсли;
КонецПроцедуры Показать&НаКлиенте
Процедура ДТ_ПриОткрытииПосле(Отказ)
Если Строка(Объект.ВидДокумента) = "Акт выполненных работ" Тогда
МожноМенятьАкт = ПроверитьИзменениеАкта();
КонецЕсли;
ДопРеквизитНаФорме = ПолучитьПолеДополнительногоРеквизитаНаФорме(ЭтаФорма, "Номер заказа в SAP");
Если МожноМенятьАкт Тогда
Элементы.ДопРеквизитНаФорме.Доступность = Истина;
Иначе
Элементы.ДопРеквизитНаФорме.Доступность = Ложь;
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция ПолучитьПолеДополнительногоРеквизитаНаФорме(Форма, ИмяРеквизита) Экспорт
Список = Форма.Свойства_ОписаниеДополнительныхРеквизитов;
Свойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту("Наименование", ИмяРеквизита);
Если ЗначениеЗаполнено(Свойство) Тогда
НайденныеСтроки = Список.НайтиСтроки(Новый Структура("Свойство", Свойство));
Если НайденныеСтроки.Количество() > 0 Тогда
Возврат НайденныеСтроки[0];
КонецЕсли;
КонецЕсли;
КонецФункции ПоказатьУТ(11.3.4.47)
Мне надо, чтобы поле доп. реквизита имело вид "ПолеНадписи"
В расширении в процедуре формы
Процедура Расш1_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
Вызываю:
УправлениеСвойствами.ЗаполнитьДополнительныеРеквизитыВФорме(ЭтотОбъект,,Истина); \\Параметр ПоляНадписей = Истина
Но поле все равно имеет вид "ПолеВвода", да еще в список значений попадают лишние значения.
Что то делаю не так или это ошибка в конфигурации?
PS: Попытался в УправлениеСвойствами.ЗаполнитьДополнительныеРеквизитыВФорме
Исправить
Если ПоляНадписей Тогда
Элемент.Вид = ВидПоляФормы.ПолеВвода;На
Если ПоляНадписей Тогда
Элемент.Вид = ВидПоляФормы.ПолеНадписи;Заработало ....
помогло, только для нужной конфигурации (ЭДО вер. 2.1.12.2) пришлось изменить в функции
ПолучитьПолеДополнительногоРеквизитаНаФорме
строку
у Вас :
Свойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту("Имя", ИмяРеквизита);
заработало
Свойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию(ИмяРеквизита);
А не могли бы вы полностью привести пример работающей функции для 1С ДО ?
И как к ней обращаться, какие параметры в неё передать, чтобы получить значение интересующего доп. реквизита?
Посмотрел - в ДО у реквизита "Имя " ПВХ ДополнительныеРеквизитыИСведения не выставлен признак индексирования, в отличие от ЕРП образных. Для универсальности нужно запросом получать
Попытка ПолучитьЗначениеДопРеквизита(Контрагенты.Ссылка, ИмяРеквизита); // Если существует ДопРеквизит
ЕстьДопРеквизит = ЗначениеЗаполнено(Контрагенты.Ссылка.ДополнительныеРеквизиты.Найти(Свойство)); // Истина / Ложь
// Исключение
//
КонецПопытки;Очень-очень полезно тем, кто допиливает 1С:Документооборот v2.1
Необходимо добавить реквизит в справочник.
Используются доп реквизиты но нельзя добавить доп реквизит с нужным мне типом,
поэтому добавляю реквизит непосредственно в объект конфигурации.
Программно добавил реквизит на форму.
Нужно разместить новый реквизит между старыми доп реквизитами.
Делаю так:
ИмяРеквизита = "Заявка";
Поле = ПолучитьПолеДополнительногоРеквизитаНаФорме(Форма, ИмяРеквизита);
АктОтбораОбразцов = Форма.Элементы.Найти("АктОтбораОбразцов");
Группа = Форма.Элементы.Найти("ГруппаДополнительныеРеквизиты");
ПолеФормы = Форма.Элементы[Поле.ИмяРеквизитаЗначение];
Форма.Элементы.Переместить(АктОтбораОбразцов, Группа, ПолеФормы); //перемещаемый элемент, новый родитель, перед которымФункция ПолучитьПолеДополнительногоРеквизитаНаФорме(Форма, ИмяРеквизита)
Список = Форма.Свойства_ОписаниеДополнительныхРеквизитов;
Свойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию(ИмяРеквизита);
Если ЗначениеЗаполнено(Свойство) Тогда
НайденныеСтроки = Список.НайтиСтроки(Новый Структура("Свойство", Свойство));
Если НайденныеСтроки.Количество() > 0 Тогда
Возврат НайденныеСтроки[0];
КонецЕсли;
КонецЕсли;
КонецФункции Показатьа размещается в начале групппы, если не казывать что нужно поместить перед полем «Заявка», помещается в конце группы доп реквизитов(что правильно).
Ну вот оно либо вначале либо в конце, а в середину не перемещается.
Пробовал отследить дальше где оно может перемещается, но не нашел.
Ещё не понятно как в режиме отладки посмотреть порядок полей? Есть просто список Форма.Элементы, а где зраниться их порядок?
Тогда обращение к ним будет проводить и на клиенте и на сервере. Пример: "ЭтаФорма[ЭтаФорма.ФиксированоеСоответствиеДопреквизитов["Контрагент"]].
в функции: Функция ПолучитьЗначениеДополнительногоРеквизитаНаФорме(Форма, ИмяРеквизита) Экспорт
Может её убрать из функции?
Ошибка отображения типов:
Отсутствует отображение для типа "УправляемаяФорма"
Процедура Пуск(Команда)
НаименованиеДляПечатиПолное = "НПП;
НаименованиеДляПечатиСокращенное = "НПС";
ИмяРеквизита = НаименованиеДляПечатиПолное;
ЗначениеРеквизита = "111";
Форма = ЭтаФорма;
УстановитьЗначениеДополнительногоРеквизитаНаФорме(Форма, ИмяРеквизита, ЗначениеРеквизита);
КонецПроцедуры
&НаКлиенте
Процедура УстановитьЗначениеДополнительногоРеквизитаНаФорме(Форма, ИмяРеквизита, ЗначениеРеквизита) Экспорт
ПолеДополнительногоРеквизитаНаФорме = ПолучитьПолеДополнительногоРеквизитаНаФорме(Форма, ИмяРеквизита);
Если не ПолеДополнительногоРеквизитаНаФорме = Неопределено Тогда
Форма[ПолеДополнительногоРеквизитаНаФорме.ИмяРеквизитаЗначение] = ЗначениеРеквизита;
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция ПолучитьПолеДополнительногоРеквизитаНаФорме(Форма, ИмяРеквизита) Экспорт
Список = Форма.Свойства_ОписаниеДополнительныхРеквизитов;
Свойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию(ИмяРеквизита);
Если ЗначениеЗаполнено(Свойство) Тогда
НайденныеСтроки = Список.НайтиСтроки(Новый Структура("Свойство", Свойство));
Если НайденныеСтроки.Количество() > 0 Тогда
Возврат НайденныеСтроки[0];
КонецЕсли;
КонецЕсли;
КонецФункции
Разобрался
&НаКлиенте
Процедура Пуск()
УстановитьЗначениеДополнительногоРеквизитаНаФорме(ИмяРеквизита, ЗначениеРеквизита);
КонецПроцедуры
&НаСервере
Процедура УстановитьЗначениеДополнительногоРеквизитаНаФорме(ИмяРеквизита, ЗначениеРеквизита) Экспорт
ПолеДополнительногоРеквизитаНаФорме = ПолучитьПолеДополнительногоРеквизитаНаФорме(ЭтаФорма, ИмяРеквизита);
Если не ПолеДополнительногоРеквизитаНаФорме = Неопределено Тогда
ЭтаФорма[ПолеДополнительногоРеквизитаНаФорме.ИмяРеквизитаЗначение] = ЗначениеРеквизита;
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция ПолучитьПолеДополнительногоРеквизитаНаФорме(Форма, ИмяРеквизита) Экспорт
Список = Форма.Свойства_ОписаниеДополнительныхРеквизитов;
Свойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию(ИмяРеквизита);
Если ЗначениеЗаполнено(Свойство) Тогда
НайденныеСтроки = Список.НайтиСтроки(Новый Структура("Свойство", Свойство));
Если НайденныеСтроки.Количество() > 0 Тогда
Возврат НайденныеСтроки[0];
КонецЕсли;
КонецЕсли;
КонецФункции ПоказатьПроцедура УстановитьЗначениеДополнительногоРеквизитаНаФорме(Форма, ИмяРеквизита, ЗначениеРеквизита) Экспорт
ПолеДополнительногоРеквизитаНаФорме = ПолучитьПолеДополнительногоРеквизитаНаФорме(Форма, ИмяРеквизита);
Если ПолеДополнительногоРеквизитаНаФорме = Неопределено Тогда
ПараметрыОтбора = Новый Структура;
ПараметрыОтбора.Вставить("Свойство",
ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту("Имя", ИмяРеквизита));
НайденныеСтроки = Объект.ДополнительныеРеквизиты.НайтиСтроки(ПараметрыОтбора);
Если НайденныеСтроки.Количество() = 0 Тогда
Возврат Неопределено;
Иначе
Возврат НайденныеСтроки[0].Значение;
КонецЕсли;
Иначе
Форма[ПолеДополнительногоРеквизитаНаФорме.ИмяРеквизитаЗначение] = ЗначениеРеквизита;
КонецЕсли;
КонецПроцедуры ПоказатьДействительно пока документ не отрисовал доп реквизиты, нужно проводить манипуляции с табличной частью документа, а как только доп реквизиты отрисованы, то нужно уже проводить манипуляции с ними на форме.
и так и эдак. с помощью БСП (УправлениеСвойствами.ЗаписатьСвойстваУОбъекта) не получалось.
все, что нужно передавал в параметры, но всё улетало куда-то в нирвану, форма с документом не открывалась.
получилось с помощью описанных в статье процедур и функций .
но осталась проблемка.
вижу вроде бы заполненный реквизит, но если ставлю ему в свойства
отображать в виде гиперссылки, то он не заполняется с помощью функции, описанной в статье. буду дальше разбираться, но вдруг у кого-то есть ответ.
тип реквизита строка ограниченной длины, которая хранит веб-ссылку.
Помогите, пожалуйста, разобраться как "разбросать" дополнительные реквизиты в документе ЗаказПоставщику по разным группам. В расширении создана дополнительная вкладка (страница) ГруппаЛогистика и в нее из ГруппаДополнительно перетянута "вручную" ГруппаДополнительныеРеквизиты. Т.е. сейчас все дополнительные реквизиты размещены на вкладке Логистика (ГруппаЛогистика).
На этой же вкладке создана группа нн_ГруппаЗадачи. Необходимо некоторые допреквизиты разместить в этой группе. Пытаюсь, в частности, переместить сюда допреквизит НачалоПроизводства, но он так и не "запихивается" в подчиненную группу.
&НаКлиенте
Процедура нн_ГруппаСтраницыПриСменеСтраницыВместо(Элемент, ТекущаяСтраница)
//Перемещаем поля
ПереместитьДопРеквизиты();
//END Перемещаем поля
КонецПроцедуры
&НаСервере
Процедура ПереместитьДопРеквизиты();
нн_ДопХарактеристики.ПереместитьДополнительныйРеквизит(ЭтаФорма,"НачалоПроизводства","нн_ГруппаЗадачи", Истина);
КонецПроцедуры ПоказатьКак можно разбросать допреквизиты по разным группам на вкладке, чтобы они отображались более логично и сгруппированно?
Это что за бред?
// серверный модуль ХХХ_УправлениеСвойствами
// Возвращает свойство по имени.
// Использовать в тех случаях, когда нет других методов для поиска.
//
// Параметры:
// ИмяСвойства - Строка - Уникальное имя дополнительного свойства.
// ЭтоДополнительноеСведение - Булево - Искомое свойство должно быть дополнительным сведением, а не реквизитом. (опционально)
// ВызватьИсключениеЕслиСвойствоНеНайдено - Булево - Признак того, нужно ли вызывать исключение, если свойство не найдено, по умолчанию Ложь. (опционально)
//
// Возвращаемое значение
// ПланыВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения - Найденное свойство или пустая ссылка, если свойство не найдено.
//
Функция ПолучитьСвойствоПоИмени(ИмяСвойства, ЭтоДополнительноеСведение = Ложь,
ВызватьИсключениеЕслиСвойствоНеНайдено = Ложь) Экспорт
Возврат ХХХ_УправлениеСвойствамиПовтИсп.ПолучитьСвойствоПоИмени(
ИмяСвойства, ЭтоДополнительноеСведение, ВызватьИсключениеЕслиСвойствоНеНайдено);
КонецФункции
// Устанавливает значение свойства объекту. Пустые значения свойств удаляются.
// ВНИМАНИЕ! Процедура не проверяет корректность установки реквизитов
// и могут ли они быть использованы в данном типе объектов или нет!!!
//
// Параметры:
// ИзменяемыйОбъект - СправочникОбъект, ДокументОбъект - Объект в котором нужно задать свойства
// Свойство - ПланыВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения - Свойство
// Значение - Произвольный - Значение свойства
//
Процедура УстановитьЗначениеДополнительногоРеквизита(ИзменяемыйОбъект, Свойство, Значение) Экспорт
Если Не ЗначениеЗаполнено(Свойство) Тогда
ВызватьИсключение СтрШаблон("Не удалось установить значение дополнительного реквизита для объекта %1! Свойство не задано!", ИзменяемыйОбъект);
КонецЕсли;
СтрокаРеквизита = ИзменяемыйОбъект.ДополнительныеРеквизиты.Найти(Свойство, "Свойство");
Если ЗначениеЗаполнено(Значение) Тогда
Если СтрокаРеквизита = Неопределено Тогда
СтрокаРеквизита = ИзменяемыйОбъект.ДополнительныеРеквизиты.Добавить();
СтрокаРеквизита.Свойство = Свойство;
КонецЕсли;
СтрокаРеквизита.Значение = Значение;
Иначе
Если СтрокаРеквизита <> Неопределено Тогда
ИзменяемыйОбъект.ДополнительныеРеквизиты.Удалить(СтрокаРеквизита);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
// Возвращает значение дополнительного свойства объекту.
// ВНИМАНИЕ! Не делается проверка на корректнось существования свойства в данном типе объектов.
//
// Параметры:
// ОбъектВПамяти - СправочникОбъект, ДокументОбъект - Объект в котором нужно найти значение свойства
// Свойство - ПланыВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения - Свойство
//
// Возвращаемое значение
// Произвольный - Заданное значение свойства или ЗначениеПоУмолчанию, если никакого значение не удалось найти.
//
Функция ПолучитьЗначениеДополнительногоРеквизита(ОбъектВПамяти, Свойство, ЗначениеПоУмолчанию = Неопределено) Экспорт
Если Не ЗначениеЗаполнено(Свойство) Тогда
ВызватьИсключение СтрШаблон("Не удалось получить значение дополнительного реквизита для объекта %1! Свойство не задано!", ОбъектВПамяти);
КонецЕсли;
СтрокаРеквизита = ОбъектВПамяти.ДополнительныеРеквизиты.Найти(Свойство, "Свойство");
Если СтрокаРеквизита = Неопределено Тогда
Возврат ЗначениеПоУмолчанию;
Иначе
Возврат СтрокаРеквизита.Значение;
КонецЕсли;
КонецФункции
Функция ПолучитьПолеДополнительногоРеквизитаНаФормеПоИмениРеквизита(Форма, ИмяРеквизита) Экспорт
Свойство = ПолучитьСвойствоПоИмени(ИмяРеквизита, Ложь, Истина);
Возврат ПолучитьПолеДополнительногоРеквизитаНаФорме(Форма, Свойство);
КонецФункции
Функция ПолучитьПолеДополнительногоРеквизитаНаФорме(Форма, Свойство) Экспорт
Список = Форма.Свойства_ОписаниеДополнительныхРеквизитов;
Если ЗначениеЗаполнено(Свойство) Тогда
НайденныеСтроки = Список.НайтиСтроки(Новый Структура("Свойство", Свойство));
Если НайденныеСтроки.Количество() > 0 Тогда
Возврат НайденныеСтроки[0];
КонецЕсли;
КонецЕсли;
Возврат Неопределено;
КонецФункции
Функция ПолучитьЗначениеДополнительногоРеквизитаНаФормеПоИмениРеквиз ита(Форма, Объект, ИмяРеквизита, ЗначениеПоУмолчанию = Неопределено) Экспорт
Свойство = ПолучитьСвойствоПоИмени(ИмяРеквизита, Ложь, Истина);
Возврат ПолучитьЗначениеДополнительногоРеквизитаНаФорме(Форма, Объект, Свойство, ЗначениеПоУмолчанию);
КонецФункции
Функция ПолучитьЗначениеДополнительногоРеквизитаНаФорме(Форма, Объект, Свойство, ЗначениеПоУмолчанию = Неопределено) Экспорт
ПолеДополнительногоРеквизитаНаФорме = ПолучитьПолеДополнительногоРеквизитаНаФорме(Форма, Свойство);
Если ПолеДополнительногоРеквизитаНаФорме = Неопределено Тогда
Возврат ПолучитьЗначениеДополнительногоРеквизита(Объект, Свойство, ЗначениеПоУмолчанию);
Иначе
Возврат Форма[ПолеДополнительногоРеквизитаНаФорме.ИмяРеквизитаЗначение];
КонецЕсли;
КонецФункции
Процедура УстановитьЗначениеДополнительногоРеквизитаНаФормеПоИмениРекв изита(Форма, Объект, ИмяРеквизита, ЗначениеРеквизита) Экспорт
Свойство = ПолучитьСвойствоПоИмени(ИмяРеквизита, Ложь, Истина);
УстановитьЗначениеДополнительногоРеквизитаНаФорме(Форма, Объект, Свойство, ЗначениеРеквизита)
КонецПроцедуры
Процедура УстановитьЗначениеДополнительногоРеквизитаНаФорме(Форма, Объект, Свойство, ЗначениеРеквизита) Экспорт
ПолеДополнительногоРеквизитаНаФорме = ПолучитьПолеДополнительногоРеквизитаНаФорме(Форма, Свойство);
Если ПолеДополнительногоРеквизитаНаФорме = Неопределено Тогда
УстановитьЗначениеДополнительногоРеквизита(Объект, Свойство, ЗначениеРеквизита);
Иначе
Форма[ПолеДополнительногоРеквизитаНаФорме.ИмяРеквизитаЗначение] = ЗначениеРеквизита;
КонецЕсли;
КонецПроцедуры
Процедура ПереместитьДополнительныйРеквизитПоИмениРеквизита(Форма, ИмяРеквизита, ИмяГруппы, Доступность = Истина) Экспорт
Свойство = ПолучитьСвойствоПоИмени(ИмяРеквизита, Ложь, Истина);
ПереместитьДополнительныйРеквизитНаФорме(Форма, Свойство, ИмяГруппы, Доступность);
КонецПроцедуры
Процедура ПереместитьДополнительныйРеквизитНаФорме(Форма, Свойство, ИмяГруппы, Доступность = Истина) Экспорт
Попытка
Поле = ПолучитьПолеДополнительногоРеквизитаНаФорме(Форма, Свойство);
Группа = Форма.Элементы.Найти(ИмяГруппы);
ПолеФормы = Форма.Элементы[Поле.ИмяРеквизитаЗначение];
Если Не ПолеФормы = Неопределено Тогда
Форма.Элементы.Переместить(ПолеФормы, Группа);
ПолеФормы.Доступность = Доступность;
КонецЕсли;
Исключение
КонецПопытки;
КонецПроцедуры
// серверный модуль ХХХ_УправлениеСвойствамиПовтИсп с повторным использованием
// Возвращает свойство по имени.
// Использовать в тех случаях, когда нет других методов для поиска.
//
// Параметры:
// ИмяСвойства - Строка - Уникальное имя дополнительного свойства.
// ЭтоДополнительноеСведение - Булево - Искомое свойство должно быть дополнительным сведением, а не реквизитом. (опционально)
// ВызватьИсключениеЕслиСвойствоНеНайдено - Булево - Признак того, нужно ли вызывать исключение, если свойство не найдено, по умолчанию Ложь. (опционально)
//
// Возвращаемое значение
// ПланыВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения - Найденное свойство или пустая ссылка, если свойство не найдено.
//
Функция ПолучитьСвойствоПоИмени(ИмяСвойства, ЭтоДополнительноеСведение = Ложь,
ВызватьИсключениеЕслиСвойствоНеНайдено = Ложь) Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| ДополнительныеРеквизитыИСведения.Ссылка КАК Ссылка
|ИЗ
| ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения КАК ДополнительныеРеквизитыИСведения
|ГДЕ
| ДополнительныеРеквизитыИСведения.ЭтоДополнительноеСведение = &ЭтоДополнительноеСведение
| И ДополнительныеРеквизитыИСведения.Имя = &ИмяСвойства";
Запрос.УстановитьПараметр("ИмяСвойства", ИмяСвойства);
Запрос.УстановитьПараметр("ЭтоДополнительноеСведение", ЭтоДополнительноеСведение);
Результат = Запрос.Выполнить().Выбрать();
Если Результат.Следующий() Тогда
Возврат Результат.Ссылка;
Иначе
Если ВызватьИсключениеЕслиСвойствоНеНайдено Тогда
ВызватьИсключение СтрШаблон("Не удалось найти дополнительное свойство '%1'.", ИмяСвойства);
Иначе
Возврат Неопределено;
КонецЕсли;
КонецЕсли;
КонецФункции
ПоказатьСпасибо большое.
Для тех кто в танке или в заказе клиента УТ11. Допреквизиты в некоторых формах инициализируются отдельно при открытии вкладки и до этого не видны.
Поэтому я сделал так (код для расширения):
&НаСервере
Процедура АРИАН_СвойстваВыполнитьДополнительнуюИнициализацию()
Свойство = ХХХ_УправлениеСвойствами.ПолучитьСвойствоПоИмени("ОснованиеОбщее",,,Истина);
ХХХ_УправлениеСвойствами.ПереместитьДополнительныйРеквизитНаФорме(ЭтаФорма, Свойство, "ГруппаДополнительныхРеквизитов");
КонецПроцедуры
&НаКлиенте
Процедура ARIAN_ПриОткрытииПосле(Отказ)
// ТУТ выполняем отложенную инициализацию
СвойстваВыполнитьОтложеннуюИнициализацию();
УправлениеСвойствамиКлиент.ПослеЗагрузкиДополнительныхРеквизитов(ЭтотОбъект);
АРИАН_СвойстваВыполнитьДополнительнуюИнициализацию();
КонецПроцедуры
ПоказатьЧтобы не мучиться с именем свойства добавил возможность запроса по идентификатору
Функция ПолучитьСвойствоПоИмени(ИмяСвойства, ЭтоДополнительноеСведение = Ложь,
ВызватьИсключениеЕслиСвойствоНеНайдено = Ложь, ЗапросПоИдентификатору = Ложь) Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| ДополнительныеРеквизитыИСведения.Ссылка КАК Ссылка
|ИЗ
| ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения КАК ДополнительныеРеквизитыИСведения
|ГДЕ
| ДополнительныеРеквизитыИСведения.ЭтоДополнительноеСведение = &ЭтоДополнительноеСведение
| И ДополнительныеРеквизитыИСведения.Имя = &ИмяСвойства";
Если ЗапросПоИдентификатору Тогда
Запрос.Текст = СтрЗаменить(Запрос.Текст,
"И ДополнительныеРеквизитыИСведения.Имя",
"И ДополнительныеРеквизитыИСведения.ИдентификаторДляФормул");
КонецЕсли;
//.......//.........
ПоказатьСейчас пытаюсь решить проблему исключения дополнительных реквизитов из контроля заполнения при закрытии формы. У полей формы, связанных с дополнительными реквизитами, АвтоОтметкаНезаполненного и ОтметкаНезаполненного ставлю в Ложь, визуально красный пунктир пропадает, но при попытке закрытия формы проверка все равно срабатывает и дополнительный реквизит становится обязательным. Почему платформа не отрабатывает этот нюанс непонятно.
Пока подсказали попробовать использование собственного алгоритма в ОбработкаПроверкиЗаполненияНаСервере, сформировать массив ПроверяемыеРеквизиты в зависимости от необходимости проверки тех или иных реквизитов (включая дополнительные).
&После("ОбработкаЗаполнения")
Процедура XXX_ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
ТЗ = ДанныеЗаполнения.ДополнительныеРеквизиты.Выгрузить();
ЭтотОбъект.ДополнительныеРеквизиты.Загрузить(ТЗ);
КонецПроцедурыесть один момент, может кому поможет:
Если вы хотите заполнять допреквизиты программно в обработчике ПриЗаписиНаСервере - не работает.
Получилось только в процедуре ПередЗаписьюНаСервере в начале процедуры или если используете расширение, тогда обязательно Перед основной процедурой (см. скрин)
Документооборот 3.0
&НаКлиенте
Процедура ОТ_ГруппаСтраницыПриСменеСтраницыПеред(Элемент, ТекущаяСтраница)
Если ТекущаяСтраница.Имя = "СтраницаДоставка" Тогда
Если Не ЭтотОбъект.ПараметрыСвойств.ВыполненаОтложеннаяИнициализация Тогда
СвойстваВыполнитьОтложеннуюИнициализацию();
УправлениеСвойствамиКлиент.ПослеЗагрузкиДополнительныхРеквизитов(ЭтотОбъект);
КонецЕсли;
ПереместитьДополнительныйРеквизит("ГруппаДоставкаДоПолучателяДопИнфо", Истина);
КонецЕсли;
КонецПроцедуры
Показать&НаСервере
Процедура ЗКПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
Если Не ЭтотОбъект.ПараметрыСвойств.ВыполненаОтложеннаяИнициализация Тогда
СвойстваВыполнитьОтложеннуюИнициализацию();
КонецЕсли;
Для Каждого Эл Из ЭтотОбъект.Свойства_ОписаниеДополнительныхРеквизитов Цикл
Если Эл.Наименование = "Адрес доставки" Тогда
ИмяДопРек = Эл.ИмяРеквизитаЗначение;
ЭтаФорма.Элементы[ИмяДопРек].КнопкаВыбора = Истина;
ЭтаФорма.Элементы[ИмяДопРек].УстановитьДействие("НачалоВыбора","Расш_ЗаполнитьАдресНаКлиенте");
КонецЕсли;
КонецЦикла;
КонецПроцедуры ПоказатьРейтинг: 682
Вы можете заказать платную консультацию или разработку у автора. Будет создан приватный заказ на «Бирже заказов» для автора.
№ 867282
Создание 15.07.18 23:32
Обновление 15.07.18 23:32
Просмотры 133509
Загрузки 0
Рейтинг
325
Комментарии 94
Код открыт Да
Рубрики Универсальные функции
Кому Разработчик
Тип файла Нет файла
Платформа 1С:Предприятие 8
Конфигурация Универсальные
Операционная система Не имеет значения
Страна Не имеет значения
Отрасль Не имеет значения
Налоги Не имеет значения
Вид учета Не имеет значения
Доступ к файлу Бесплатно (free)